This is an automated email from the ASF dual-hosted git repository. sgoeschl pushed a commit to branch FREEMARKER-163 in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit e69b84126a274b280e24b04b0a3cfeacbb785f66 Author: Siegfried Goeschl <[email protected]> AuthorDate: Mon Nov 9 19:33:23 2020 +0100 FREEMARKER-163 Integrate Java Faker library for test data generation --- .../examples/templates/javafaker/csv/testdata.ftl | 15 +++--- .../site/markdown/cli/usage/generating-testdata.md | 58 ++++++++++++---------- .../freemarker/generator/cli/ExamplesTest.java | 2 +- .../freemarker/generator/cli/ManualTest.java | 3 +- .../generator/tools/javafaker/JavaFakerTool.java | 29 ++++++----- .../tools/javafaker/JavaFakerToolTest.java | 19 ++++++- 6 files changed, 74 insertions(+), 52 deletions(-) diff --git a/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl b/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl index 5905087..0c6fad4 100644 --- a/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl +++ b/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl @@ -1,4 +1,3 @@ -<#ftl output_format="plainText" strip_whitespace=true> <#-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -15,25 +14,25 @@ specific language governing permissions and limitations under the License. --> -<#import "/freemarker-generator/lib/commons-csv.ftl" as CSV /> -<#assign NR_OF_RECORDS = tools.system.getString("NR_OF_RECORDS","10")> -<#assign DAYS = tools.javafaker.timeUnits["DAYS"]> <#assign faker = tools.javafaker.faker> -<#assign csvTargetFormat = CSV.targetFormat()> +<#assign nrOfRecords = tools.system.getString("NR_OF_RECORDS","10")> +<#assign days = tools.javafaker.timeUnits["DAYS"]> +<#assign csvTargetFormat = tools.csv.formats["DEFAULT"].withFirstRecordAsHeader()> <#assign csvPrinter = tools.csv.printer(csvTargetFormat)> <#assign csvHeaders = ['ID','CUSTOMER_ID','FIRST_NAME','LAST_NAME','EMAIL','IBAN','CREATED_AT']> <#compress> <#if csvTargetFormat.getSkipHeaderRecord()> ${csvPrinter.printRecord(csvHeaders)}<#t> </#if> - <#list 1..NR_OF_RECORDS?number as i> + <#list 1..nrOfRecords?number as i> <#assign id = tools.uuid.randomUUID()> <#assign customerId = faker.bothify("?#######")> <#assign firstName = faker.name().firstName()> <#assign lastName = faker.name().lastName()> <#assign email = firstName + "." + lastName + "@gmail.com"> - <#assign iban = faker.finance().iban("AT")> - <#assign createAt = faker.date().past(3650, DAYS)> + <#assign iban = faker.finance().iban("DE")> + + <#assign createAt = faker.date().past(3650, days)> ${csvPrinter.printRecord( id, customerId, diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md b/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md index eedd1b9..33e2fc7 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md @@ -2,59 +2,65 @@ The generation of test data is supported by [Java Faker](https://github.com/DiUS/java-faker). -Let's assume that you need to populate a user table based on a CSV file +Let's assume that you need to populate a user table based on a CSV file with random data ``` -freemarker-generator -t examples/templates/javafaker/csv/testdata.ftl +freemarker-generator -DNR_OF_RECORDS=10 -t src/app/examples/templates/javafaker/csv/testdata.ftl ``` will generate ``` ID,CUSTOMER_ID,FIRST_NAME,LAST_NAME,EMAIL,IBAN,CREATED_AT -7e522b5c-1c7f-4195-8585-2268cc7f152a,l1671977,Eddy,Schuster,[email protected],AT101071425404684529,2019-05-18T17:28:30+02:00 -701db208-923b-4100-a02b-4d574b0b703d,e5229102,Mark,Rogahn,[email protected],AT491398501778297253,2014-06-16T21:48:24+02:00 -d5e99c0f-0117-42f9-83a2-33052656e9d6,g0941131,Randall,Cronin,[email protected],AT788431029877229377,2016-01-08T05:12:26+01:00 -e2b44ea6-4033-45c9-b9c3-bc9c8f6bc3fe,o4440179,Arthur,Reichel,[email protected],AT767530622367679157,2013-04-07T12:56:13+02:00 -d0dd2806-fe11-487c-9d9b-22dd3ec1abc4,i5706274,Elroy,Sawayn,[email protected],AT459308883343277427,2017-02-06T01:53:34+01:00 -d36d6851-e961-4f07-9fcc-f7a0702fa6b6,s5645599,Jerald,Nitzsche,[email protected],AT366350952237029663,2015-06-14T21:43:32+02:00 -6b9999cf-5aed-4e12-bc6e-e88a7973154d,n4220945,Grant,Bayer,[email protected],AT275651850312588466,2020-07-18T15:07:07+02:00 -5fd8286e-cc2f-4fe9-bf56-2245d1bf0c34,t0311536,Edison,Hoppe,[email protected],AT847505633045057210,2017-04-23T23:26:42+02:00 -e0638c76-f130-4daa-9c62-40304101c8ab,b7209087,Nicky,Cole,[email protected],AT127017906823575933,2014-08-30T20:38:11+02:00 -c35e2b24-9b9b-4fb0-b25b-72af93301da5,a0087873,Raleigh,Leffler,[email protected],AT140117255798582963,2016-04-04T12:12:29+02:00 +5c3dbf2b-2957-41fe-8566-e16c91d6bba7,e6044780,Audrey,Ryan,[email protected],DE69137185182464804325,2016-07-25T03:06:54+02:00 +34671167-92f8-46e3-874b-d488960eb320,z8394366,Herb,Lehner,[email protected],DE32993443443552974345,2019-10-11T23:27:32+02:00 +479855f6-cc98-4c46-99e4-b1d38d35a7b2,x8937857,Kirby,Wilkinson,[email protected],DE12566901129220359287,2020-04-12T04:49:00+02:00 +1a3c51b9-d168-4c0a-84ae-05e79cd181b1,t3486957,Charmaine,Bergstrom,[email protected],DE98964063811726229158,2015-07-24T23:19:19+02:00 +43b9f7ad-1aec-44ff-b3c1-de7688b5a729,z9190225,Sterling,Glover,[email protected],DE47207633748672977993,2019-11-04T04:45:06+01:00 +34ce2c9f-e5bb-44f4-a71f-40b0dfa8d0bf,a4406167,George,Marquardt,[email protected],DE79342449317255392445,2016-05-15T16:33:05+02:00 +1f9bbc16-8b17-4947-ab50-4abf6aa4cc46,s6438445,Arnoldo,Herzog,[email protected],DE20421444995381411375,2013-10-12T07:01:01+02:00 +30e3f7a2-7fe8-4ebf-b46b-4f59ab62ba45,o9507275,Nickie,Predovic,[email protected],DE06666930299990216198,2019-08-01T10:51:51+02:00 +f703e93e-7bc3-42c9-a7f5-f1db84d32fd1,z8385157,Clinton,Murphy,[email protected],DE27305002168865903990,2018-04-01T19:03:55+02:00 +7f6a8d29-2dfc-4467-b366-25b46aa5bc32,x5244747,Johnson,Blanda,[email protected],DE83757301199253406795,2012-06-23T18:04:38+02:00 ``` using the following FreeMarker template ``` -<#import "/freemarker-generator/lib/commons-csv.ftl" as csv /> -<#assign timeUnits = tools.javafaker.timeUnits> <#assign faker = tools.javafaker.faker> -<#assign csvTargetFormat = csv.targetFormat()> +<#assign nrOfRecords = tools.system.getString("NR_OF_RECORDS","10")> +<#assign days = tools.javafaker.timeUnits["DAYS"]> +<#assign csvTargetFormat = tools.csv.formats["DEFAULT"].withFirstRecordAsHeader()> <#assign csvPrinter = tools.csv.printer(csvTargetFormat)> <#assign csvHeaders = ['ID','CUSTOMER_ID','FIRST_NAME','LAST_NAME','EMAIL','IBAN','CREATED_AT']> <#compress> <#if csvTargetFormat.getSkipHeaderRecord()> ${csvPrinter.printRecord(csvHeaders)}<#t> </#if> - <#list 1..10 as i> + <#list 1..nrOfRecords?number as i> <#assign id = tools.uuid.randomUUID()> <#assign customerId = faker.bothify("?#######")> <#assign firstName = faker.name().firstName()> <#assign lastName = faker.name().lastName()> <#assign email = firstName + "." + lastName + "@gmail.com"> - <#assign iban = faker.finance().iban("AT")> - <#assign createAt = faker.date().past(3650, timeUnits["DAYS"])> + <#assign iban = faker.finance().iban("DE")> + <#assign createAt = faker.date().past(3650, days)> ${csvPrinter.printRecord( - id, - customerId, - firstName, - lastName, - email?lower_case - iban, - createAt?datetime?iso_local - )}<#t> + id, + customerId, + firstName, + lastName, + email?lower_case + iban, + createAt?datetime?iso_local)} </#list> </#compress> ``` + +Some thoughts along the line + +* [Java Faker](https://github.com/DiUS/java-faker) does not create coherent test data, e.g. each invocation of "name" creates a new random name - hence we create the email address ourselves +* The created IBAN does not use a valid bank code but structure and checksum is correct +* The "createdAt" generates a creation date from the last 10 years to have some proper distribution +* See [A Guide to JavaFaker](https://www.baeldung.com/java-faker) for a quick overview \ No newline at end of file diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index b44d94e..045bb42 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -114,7 +114,7 @@ public class ExamplesTest extends AbstractMainTest { @Test public void shouldRunJavaFakerExamples() throws IOException { - assertValid(execute("-PCSV_TARGET_DELIMITER=SEMICOLON -t src/app/examples/templates/javafaker/csv/testdata.ftl")); + assertValid(execute("-t src/app/examples/templates/javafaker/csv/testdata.ftl")); } @Test diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java index 7d12754..948ffde 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java @@ -24,7 +24,8 @@ import java.io.IOException; public class ManualTest extends AbstractMainTest { // private static final String CMD = "-V"; - private static final String CMD = "-t src/app/examples/templates/demo.ftl src/test/data"; + // private static final String CMD = "-t src/app/examples/templates/demo.ftl src/test/data"; + private static final String CMD = "-DNR_OF_RECORDS=10 -l de -t src/app/examples/templates/javafaker/csv/testdata.ftl"; @Override public String execute(String commandLine) throws IOException { diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java index 0dd2b46..b1f9765 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java @@ -17,6 +17,7 @@ package org.apache.freemarker.generator.tools.javafaker; import com.github.javafaker.Faker; +import org.apache.freemarker.generator.base.util.LocaleUtils; import java.util.HashMap; import java.util.Locale; @@ -25,24 +26,23 @@ import java.util.concurrent.TimeUnit; public class JavaFakerTool { - private Faker faker; - private Map<String, TimeUnit> timeUnitMap; - - public synchronized Faker getFaker() { - if (faker == null) { - faker = new Faker(Locale.getDefault()); - timeUnitMap = createTimeUnitMap(); - } + /** + * Create a Java Faker instance using the default locale. + */ + public Faker getFaker() { + return getFaker(Locale.getDefault()); + } - return faker; + public Faker getFaker(String localeString) { + return getFaker(LocaleUtils.parseLocale(localeString)); } - public synchronized Map<String, TimeUnit> getTimeUnits() { - if (timeUnitMap == null) { - timeUnitMap = createTimeUnitMap(); - } + public Faker getFaker(Locale locale) { + return new Faker(locale); + } - return timeUnitMap; + public Map<String, TimeUnit> getTimeUnits() { + return createTimeUnitMap(); } @Override @@ -60,5 +60,4 @@ public class JavaFakerTool { result.put("DAYS", TimeUnit.DAYS); return result; } - } diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java index e378cd6..d54395c 100644 --- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java +++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java @@ -19,9 +19,11 @@ package org.apache.freemarker.generator.tools.javafaker; import com.github.javafaker.Faker; import org.junit.Test; +import java.util.Locale; import java.util.concurrent.TimeUnit; import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -30,6 +32,16 @@ public class JavaFakerToolTest { private final Faker faker = javaFakerTool().getFaker(); @Test + public void shouldCreateFakerFromLocale() { + assertNotNull(new JavaFakerTool().getFaker(Locale.ENGLISH)); + } + + @Test + public void shouldCreateFakerFromLocaleString() { + assertNotNull(new JavaFakerTool().getFaker("de-DE")); + } + + @Test public void shouldCreateFakeData() { assertFalse(faker.name().fullName().isEmpty()); assertFalse(faker.internet().emailAddress().isEmpty()); @@ -37,7 +49,12 @@ public class JavaFakerToolTest { assertTrue(faker.finance().iban("AT").startsWith("AT")); } - private static final JavaFakerTool javaFakerTool() { + @Test + public void shouldGetTimeUnits() { + assertEquals(6, javaFakerTool().getTimeUnits().size()); + } + + private static JavaFakerTool javaFakerTool() { return new JavaFakerTool(); } }
