You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by sg...@apache.org on 2020/11/09 18:34:00 UTC

[freemarker-generator] 02/02: FREEMARKER-163 Integrate Java Faker library for test data generation

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 <si...@gmail.com>
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,eddy.schuster@gmail.com,AT101071425404684529,2019-05-18T17:28:30+02:00
-701db208-923b-4100-a02b-4d574b0b703d,e5229102,Mark,Rogahn,mark.rogahn@gmail.com,AT491398501778297253,2014-06-16T21:48:24+02:00
-d5e99c0f-0117-42f9-83a2-33052656e9d6,g0941131,Randall,Cronin,randall.cronin@gmail.com,AT788431029877229377,2016-01-08T05:12:26+01:00
-e2b44ea6-4033-45c9-b9c3-bc9c8f6bc3fe,o4440179,Arthur,Reichel,arthur.reichel@gmail.com,AT767530622367679157,2013-04-07T12:56:13+02:00
-d0dd2806-fe11-487c-9d9b-22dd3ec1abc4,i5706274,Elroy,Sawayn,elroy.sawayn@gmail.com,AT459308883343277427,2017-02-06T01:53:34+01:00
-d36d6851-e961-4f07-9fcc-f7a0702fa6b6,s5645599,Jerald,Nitzsche,jerald.nitzsche@gmail.com,AT366350952237029663,2015-06-14T21:43:32+02:00
-6b9999cf-5aed-4e12-bc6e-e88a7973154d,n4220945,Grant,Bayer,grant.bayer@gmail.com,AT275651850312588466,2020-07-18T15:07:07+02:00
-5fd8286e-cc2f-4fe9-bf56-2245d1bf0c34,t0311536,Edison,Hoppe,edison.hoppe@gmail.com,AT847505633045057210,2017-04-23T23:26:42+02:00
-e0638c76-f130-4daa-9c62-40304101c8ab,b7209087,Nicky,Cole,nicky.cole@gmail.com,AT127017906823575933,2014-08-30T20:38:11+02:00
-c35e2b24-9b9b-4fb0-b25b-72af93301da5,a0087873,Raleigh,Leffler,raleigh.leffler@gmail.com,AT140117255798582963,2016-04-04T12:12:29+02:00
+5c3dbf2b-2957-41fe-8566-e16c91d6bba7,e6044780,Audrey,Ryan,audrey.ryan@gmail.com,DE69137185182464804325,2016-07-25T03:06:54+02:00
+34671167-92f8-46e3-874b-d488960eb320,z8394366,Herb,Lehner,herb.lehner@gmail.com,DE32993443443552974345,2019-10-11T23:27:32+02:00
+479855f6-cc98-4c46-99e4-b1d38d35a7b2,x8937857,Kirby,Wilkinson,kirby.wilkinson@gmail.com,DE12566901129220359287,2020-04-12T04:49:00+02:00
+1a3c51b9-d168-4c0a-84ae-05e79cd181b1,t3486957,Charmaine,Bergstrom,charmaine.bergstrom@gmail.com,DE98964063811726229158,2015-07-24T23:19:19+02:00
+43b9f7ad-1aec-44ff-b3c1-de7688b5a729,z9190225,Sterling,Glover,sterling.glover@gmail.com,DE47207633748672977993,2019-11-04T04:45:06+01:00
+34ce2c9f-e5bb-44f4-a71f-40b0dfa8d0bf,a4406167,George,Marquardt,george.marquardt@gmail.com,DE79342449317255392445,2016-05-15T16:33:05+02:00
+1f9bbc16-8b17-4947-ab50-4abf6aa4cc46,s6438445,Arnoldo,Herzog,arnoldo.herzog@gmail.com,DE20421444995381411375,2013-10-12T07:01:01+02:00
+30e3f7a2-7fe8-4ebf-b46b-4f59ab62ba45,o9507275,Nickie,Predovic,nickie.predovic@gmail.com,DE06666930299990216198,2019-08-01T10:51:51+02:00
+f703e93e-7bc3-42c9-a7f5-f1db84d32fd1,z8385157,Clinton,Murphy,clinton.murphy@gmail.com,DE27305002168865903990,2018-04-01T19:03:55+02:00
+7f6a8d29-2dfc-4467-b366-25b46aa5bc32,x5244747,Johnson,Blanda,johnson.blanda@gmail.com,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();
     }
 }