Skip to content

Commit

Permalink
fixes #20
Browse files Browse the repository at this point in the history
  • Loading branch information
rmpestano committed Apr 27, 2016
1 parent c0ea0ee commit 05a3d0b
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.logging.Level;

import com.github.dbunit.rules.api.dataset.*;
import com.github.dbunit.rules.replacer.JSReplacer;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.AmbiguousTableNameException;
import org.dbunit.database.DatabaseConnection;
Expand Down Expand Up @@ -229,7 +230,9 @@ public void executeStatements(String[] statements) {
}

private IDataSet performReplacements(IDataSet dataSet) {
return DateTimeReplacer.replace(dataSet);
IDataSet replace = DateTimeReplacer.replace(dataSet);
replace = JSReplacer.replace(replace);
return replace;
}


Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.github.dbunit.rules.replacer;

import com.github.dbunit.rules.api.replacer.*;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ReplacementDataSet;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ReplacementDataSet;

import com.github.dbunit.rules.api.replacer.*;

/**
* based on: http://marcin-michalski.pl/2012/10/22/decorating-dbunit-datasets-power-of-replacementdataset/
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.github.dbunit.rules.replacer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.dbunit.dataset.*;

import com.github.dbunit.rules.api.replacer.*;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

/**
* based on: http://marcin-michalski.pl/2012/10/22/decorating-dbunit-datasets-power-of-replacementdataset/
*/
public class JSReplacer {

private static JSReplacer instance;

private static Logger log = Logger.getLogger(JSReplacer.class.getName());

private ScriptEngine engine;

private JSReplacer() {
engine = new ScriptEngineManager().getEngineByName("js");
}

public static IDataSet replace(IDataSet dataset) {
if (instance == null) {
instance = new JSReplacer();
}
ReplacementDataSet replacementDataSet = new ReplacementDataSet(dataset);
try{
instance.replaceScripts(replacementDataSet);
}catch (Exception e){
log.log(Level.WARNING, "Could not replace dataset: " + dataset, e);
}
return replacementDataSet;
}

private void replaceScripts(ReplacementDataSet dataSet) throws DataSetException {
ITableIterator iterator = dataSet.iterator();
while (iterator.next()) {
ITable table = iterator.getTable();
for (Column column : table.getTableMetaData().getColumns()) {
for (int i = 0; i < table.getRowCount(); i++) {
String value = table.getValue(i, column.getColumnName()).toString();
if(value.startsWith("js:")){
addScriptReplacement(value,dataSet);
}
}
}
}
}

private void addScriptReplacement(String script, ReplacementDataSet replacementDataSet) {
/* format is 'js:script to execute', ex:
- id: "2"
date: "js:var date=new Date(); date.toString();"*/
String scriptToExecute = script.trim().substring(3);
String scriptResult = null;
try{
Object eval = engine.eval(scriptToExecute);
if(eval == null){
log.warning(String.format("No result for script %s. It will NOT be replaced in dataset %s.",script,replacementDataSet));
} else{
scriptResult = eval.toString();
replacementDataSet.addReplacementObject(script,scriptResult);
}
}catch (Exception e){

}
}




}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.github.dbunit.rules;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Calendar;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import com.github.dbunit.rules.api.dataset.DataSet;
import com.github.dbunit.rules.model.Tweet;

/**
* Created by pestano on 15/02/16.
*/
public class JavascripReplacementsIt {

Calendar now;

@Rule
public EntityManagerProvider emProvider = EntityManagerProvider.instance("scripts-it");

@Rule
public DBUnitRule dbUnitRule = DBUnitRule.instance("scripts-it",emProvider.getConnection());

@Before
public void setup(){
now = Calendar.getInstance();
}

@Test
@DataSet(value = "datasets/yml/js-with-date-replacements.yml",disableConstraints = true, executorId = "scripts-it")
public void shouldReplaceDateUsingJavaScriptInDataset() {
Tweet tweet = (Tweet) emProvider.em().createQuery("select t from Tweet t where t.id = '1'").getSingleResult();
assertThat(tweet).isNotNull();
assertThat(tweet.getDate().get(Calendar.DAY_OF_MONTH)).isEqualTo(now.get(Calendar.DAY_OF_MONTH));
assertThat(tweet.getDate().get(Calendar.HOUR_OF_DAY)).isEqualTo(now.get(Calendar.HOUR_OF_DAY));
}

@Test
@DataSet(value = "datasets/yml/js-with-calc-replacements.yml",disableConstraints = true, executorId = "scripts-it")
public void shouldReplaceLikesUsingJavaScriptInDataset() {
Tweet tweet = (Tweet) emProvider.em().createQuery("select t from Tweet t where t.id = '1'").getSingleResult();
assertThat(tweet).isNotNull();
assertThat(tweet.getLikes()).isEqualTo(50);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
tweet:
- id: "1"
content: "dbunit rules!"
likes: "js:(5+5)*10/2"
user_id: 1
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
tweet:
- id: "1"
content: "dbunit rules!"
date: "js:var d = new Date(); var datestring = d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();datestring.toString()"
user_id: 1

0 comments on commit 05a3d0b

Please sign in to comment.