-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
149 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 5 additions & 4 deletions
9
core/src/main/java/com/github/dbunit/rules/replacer/DateTimeReplacer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
82 changes: 82 additions & 0 deletions
82
core/src/main/java/com/github/dbunit/rules/replacer/JSReplacer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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){ | ||
|
||
} | ||
} | ||
|
||
|
||
|
||
|
||
} |
48 changes: 48 additions & 0 deletions
48
core/src/test/java/com/github/dbunit/rules/JavascripReplacementsIt.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
5 changes: 5 additions & 0 deletions
5
core/src/test/resources/datasets/yml/js-with-calc-replacements.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
5 changes: 5 additions & 0 deletions
5
core/src/test/resources/datasets/yml/js-with-date-replacements.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |