Skip to content

Commit

Permalink
[#1739] Allow loading fixture whithout interpreted the file as a temp…
Browse files Browse the repository at this point in the history
…late

Add loadModels params in fixture.tag to be compatible with master version
  • Loading branch information
xael-fry authored and Notalifeform committed Nov 2, 2013
1 parent 3be799c commit 8922b98
Show file tree
Hide file tree
Showing 13 changed files with 165 additions and 14 deletions.
6 changes: 3 additions & 3 deletions documentation/cheatsheets/tests/ch24-TestDataloader.textile
@@ -1,9 +1,9 @@
h2. Test - Data loader

*==@Before public void setUp() { Fixtures.deleteAll();==*
*==Fixtures.load("data.yml");}==*
*==Fixtures.loadModels("data.yml");}==*
Fixtures is used to initialise the datastore before running a unit test

*==#{fixture delete:'all', load:'data.yml' /}==*
*==#{fixture delete:'all', load:'data.yml' /}==* or *==#{fixture delete:'all', loadModels:'data.yml' /}==*
*==#{selenium} ... #{/selenium}==*
Same idea using a Selenium test
Same idea using a Selenium test(@loadModels@ and @load@ parameters are synonyms).
@@ -1,9 +1,9 @@
h2. Test - Data loader

*==@Before public void setUp() { Fixtures.deleteAll();==*
*==Fixtures.load("data.yml");}==*
*==Fixtures.loadModels("data.yml");}==*
Fixtures はユニットテストを実行する前にデータストアを初期化するために使用します。

*==#{fixture delete:'all', load:'data.yml' /}==*
*==#{fixture delete:'all', load:'data.yml' /}==* or *==#{fixture delete:'all', loadModels:'data.yml' /}==*
*==#{selenium} ... #{/selenium}==*
Selenium テストを使うときも同様に出来ます。
Selenium テストを使うときも同様に出来ます(@loadModels@ and @load@ parameters are synonyms).
11 changes: 10 additions & 1 deletion documentation/manual/test.textile
Expand Up @@ -212,13 +212,18 @@ p(note). You can read more about Play and YAML in the "YAML manual page":yaml.
For Selenium tests, you can use the @#{fixture /}@ tag:

bc. #{fixture delete:'all', load:'data.yml' /}

#{selenium}

// Write your test here

#{/selenium}

p(note). Or you can use @loadModels@ instead of @load@, the two parameters are synonyms.

#{fixture delete:'all', loadModels:'data.yml' /}



Sometimes it is convenient to split data into several YAML files. You can load fixtures from multiple files at once:

bc. Fixtures.loadModels("users.yml", "roles.yml", "permissions.yml");
Expand All @@ -227,6 +232,10 @@ and for Selenium tests:

bc. #{fixture delete:'all', load:['users.yml', 'roles.yml', 'permissions.yml'] /}

p(note). The fixture file will be loaded as a Template by default.
To avoid this, you can use the @loadModels(String name, boolean loadAsTemplate)@ with loadAsTemplate set to @false@
or for Selenium tests @#{fixture delete:'all', loadAsTemplate:false, load:'data.yml' /}@

h2. <a name="running">Running the tests</a>

To run the tests, you must run your application in @test@ mode using the @play test@ command.
Expand Down
39 changes: 36 additions & 3 deletions framework/src/play/test/Fixtures.java
Expand Up @@ -6,6 +6,7 @@
import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor;
import org.yaml.snakeyaml.introspector.BeanAccess;
import org.yaml.snakeyaml.scanner.ScannerException;

import play.Logger;
import play.Play;
import play.classloading.ApplicationClasses;
Expand Down Expand Up @@ -37,6 +38,7 @@
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.persistence.Entity;

public class Fixtures {
Expand Down Expand Up @@ -153,12 +155,24 @@ public static void load(String name) {
loadModels(name);
}


/**
* Load Model instances from a YAML file and persist them using the underlying persistence mechanism.
* The format of the YAML file is constrained, see the Fixtures manual page
* @param name Name of a YAML file somewhere in the classpath (or conf/)
*/
public static void loadModels(String name) {
loadModels(true, name);
}


/**
* Load Model instances from a YAML file and persist them using the underlying persistence mechanism.
* The format of the YAML file is constrained, see the Fixtures manual page
* @param name Name of a YAML file somewhere in the classpath (or conf/)
* @param loadAsTemplate : indicate if the file must interpreted as a Template
*/
public static void loadModels(boolean loadAsTemplate, String name) {
VirtualFile yamlFile = null;
try {
for (VirtualFile vf : Play.javaPath) {
Expand All @@ -174,7 +188,12 @@ public static void loadModels(String name) {
throw new RuntimeException("Cannot load fixture " + name + ", the file was not found");
}

String renderedYaml = TemplateLoader.load(yamlFile).render();
String renderedYaml = null;
if(loadAsTemplate){
renderedYaml = TemplateLoader.load(yamlFile).render();
}else{
renderedYaml = yamlFile.contentAsString();
}

Yaml yaml = new Yaml();
Object o = yaml.load(renderedYaml);
Expand Down Expand Up @@ -260,8 +279,15 @@ public static void load(String... names) {
* @see loadModels(String name)
*/
public static void loadModels(String... names) {
loadModels(true, names);
}

/**
* @see loadModels(String name)
*/
public static void loadModels(boolean loadAsTemplate, String... names) {
for (String name : names) {
loadModels(name);
loadModels(loadAsTemplate, name);
}
}

Expand All @@ -276,11 +302,18 @@ public static void load(List<String> names) {
* @see loadModels(String name)
*/
public static void loadModels(List<String> names) {
loadModels(true, names);
}

/**
* @see loadModels(String name)
*/
public static void loadModels(boolean loadAsTemplate, List<String> names) {
String[] tNames = new String[names.size()];
for (int i = 0; i < tNames.length; i++) {
tNames[i] = names.get(i);
}
load(tNames);
loadModels(loadAsTemplate, tNames);
}

/**
Expand Down
6 changes: 4 additions & 2 deletions framework/templates/tags/fixture.tag
Expand Up @@ -7,8 +7,10 @@
}%

%{
if(_load) {
play.test.Fixtures.load(_load)
if( (_load || _loadModels) && _loadAsTemplate != null) {
play.test.Fixtures.loadModels(_loadAsTemplate, (_loadModels?_loadModels:_load) )
}else if(_load || _loadModels){
play.test.Fixtures.loadModels( (_loadModels?_loadModels:_load) )
}
}%

Expand Down
16 changes: 16 additions & 0 deletions samples-and-tests/just-test-cases/app/controllers/Yamls.java
@@ -0,0 +1,16 @@
package controllers;

import models.YamlModel;

import org.apache.commons.mail.EmailException;

import play.mvc.*;

public class Yamls extends Controller {

public static void viewYamlModel(Long id) {
YamlModel model = YamlModel.findById(id);
renderText(model.name);
}

}
50 changes: 49 additions & 1 deletion samples-and-tests/just-test-cases/test/YamlTest.java
Expand Up @@ -8,7 +8,7 @@ public class YamlTest extends UnitTest {
public void testYamlLoading() {
Fixtures.deleteAll();
Fixtures.load("yamlTestData.yml");
YamlModel ym = YamlModel.all().first();
YamlModel ym = YamlModel.findById(1L);
assertEquals("Morten", ym.name);

assertEquals(DataWithCompositeKey.all().fetch().size(), 2);
Expand All @@ -18,4 +18,52 @@ public void testYamlLoading() {

}

@Test
public void testYamlLoadingNewMethods() {
Fixtures.deleteDatabase();
Fixtures.loadModels("yamlTestData.yml");
YamlModel ym = YamlModel.findById(1L);
assertEquals("Morten", ym.name);

assertEquals(DataWithCompositeKey.all().fetch().size(), 2);

//check binary
assertEquals("This String is stored in yaml file using base64", new String(ym.binaryData));
}

@Test
public void testYamlLoadingAsTemplate() {
Fixtures.deleteDatabase();
Fixtures.loadModels(true, "yamlTestData.yml");
YamlModel ym = YamlModel.findById(2L);
assertEquals("message.name.yamlModel2[]-Test", ym.name);
}

@Test
public void testYamlLoadingNotAsTemplate() {
Fixtures.deleteDatabase();
Fixtures.loadModels(false, "yamlTestData.yml");
YamlModel ym = YamlModel.findById(2L);
assertEquals("&{'message.name.yamlModel2'}[${toto}]-Test", ym.name);
}

@Test
public void testMultipleYamlLoadingAsTemplate() {
Fixtures.deleteDatabase();
Fixtures.loadModels(true, "yamlTestData.yml", "yamlTestData2.yml");
YamlModel ym = YamlModel.findById(2L);
assertEquals("message.name.yamlModel2[]-Test", ym.name);
ym = YamlModel.findById(4L);
assertEquals("message.name.yamlModel4[]-Test", ym.name);
}

@Test
public void testMultipleYamlLoadingNotAsTemplate() {
Fixtures.deleteDatabase();
Fixtures.loadModels(false, "yamlTestData.yml", "yamlTestData2.yml");
YamlModel ym = YamlModel.findById(2L);
assertEquals("&{'message.name.yamlModel2'}[${toto}]-Test", ym.name);
ym = YamlModel.findById(4L);
assertEquals("&{'message.name.yamlModel4'}[${toto}]-Test", ym.name);
}
}
@@ -0,0 +1,7 @@
#{fixture delete:'all'/}
#{fixture load:'yamlTestData.yml' /}

#{selenium 'Test load file as a template'}
open('@{Yamls.viewYamlModel(2)}')
assertTextPresent('message.name.yamlModel2[]-Test')
#{/selenium}
@@ -0,0 +1,7 @@
#{fixture delete:'all'/}
#{fixture loadAsTemplate:false, load:'yamlTestData.yml' /}

#{selenium 'Test load file not as a template'}
open('@{Yamls.viewYamlModel(2)}')
assertTextPresent('${'&amp;&#123;&#39;message.name.yamlModel2&#39;&#125;[${toto}]-Test'.raw()}')
#{/selenium}
@@ -0,0 +1,9 @@
#{fixture delete:'all'/}
#{fixture loadAsTemplate:true, load:['yamlTestData.yml', 'yamlTestData2.yml'] /}

#{selenium 'Test load multiple file not as template'}
open('@{Yamls.viewYamlModel(2)}')
assertTextPresent('message.name.yamlModel2[]-Test')
open('@{Yamls.viewYamlModel(4)}')
assertTextPresent('message.name.yamlModel4[]-Test')
#{/selenium}
@@ -0,0 +1,9 @@
#{fixture delete:'all'/}
#{fixture loadAsTemplate:false, load:['yamlTestData.yml', 'yamlTestData2.yml'] /}

#{selenium 'Test load multiple file not as template'}
open('@{Yamls.viewYamlModel(2)}')
assertTextPresent('${'&amp;&#123;&#39;message.name.yamlModel2&#39;&#125;[${toto}]-Test'.raw()}')
open('@{Yamls.viewYamlModel(4)}')
assertTextPresent('${'&amp;&#123;&#39;message.name.yamlModel4&#39;&#125;[${toto}]-Test'.raw()}')
#{/selenium}
8 changes: 7 additions & 1 deletion samples-and-tests/just-test-cases/test/yamlTestData.yml
Expand Up @@ -9,4 +9,10 @@ DataWithCompositeKey(1):

DataWithCompositeKey(2):
key1: a
key2: c
key2: c

YamlModel(ym2):
id: 2
name: "&{'message.name.yamlModel2'}[${toto}]-Test"
binaryData: !!binary VGhpcyBTdHJpbmcgaXMgc3RvcmVkIGluIHlhbWwgZmlsZSB1c2luZyBiYXNlNjQ=

5 changes: 5 additions & 0 deletions samples-and-tests/just-test-cases/test/yamlTestData2.yml
@@ -0,0 +1,5 @@
YamlModel(ym4):
id: 4
name: "&{'message.name.yamlModel4'}[${toto}]-Test"
binaryData: !!binary VGhpcyBTdHJpbmcgaXMgc3RvcmVkIGluIHlhbWwgZmlsZSB1c2luZyBiYXNlNjQ=

0 comments on commit 8922b98

Please sign in to comment.