From a994a498cb730560f957db3d70019ba9e8c8692b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?BRAMILLE=20S=C3=A9bastien?=
 <2752200+oktapodia@users.noreply.github.com>
Date: Wed, 11 Sep 2019 14:49:17 +0100
Subject: [PATCH] Replace empty value by random value (#522)

* Update doc

* Declare option

* Permit test to handle multiple requires

* Add tests

* Add replaceEmptyByRandomValue test option

* Handle replaceEmptyByRandomValue option
---
 docs/README.md                                |  1 +
 src/class/OptionRegistry.js                   |  1 +
 src/core/traverse.js                          |  4 +++-
 .../core/option/replaceEmptyByRandomValue.js  |  7 ++++++
 tests/schema/core/option/useDefaultValue.json | 24 +++++++++++++++++++
 tests/schema/main.spec.js                     |  6 ++++-
 6 files changed, 41 insertions(+), 2 deletions(-)
 create mode 100644 tests/schema/core/option/replaceEmptyByRandomValue.js

diff --git a/docs/README.md b/docs/README.md
index 903ae34d..65fbb49a 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -123,6 +123,7 @@ jsf.locate('faker');
 - `reuseProperties` &mdash; If enabled, it will try to generate missing properties from existing ones. Only when `fillProperties` is enabled too  (default: `false`)
 - `fillProperties` &mdash; If enabled, it will try to generate missing properties to fulfill the schema definition (default: `true`)
 - `random` &mdash; Setup a custom _randonmess_ generator, useful for getting deterministic results (default: `Math.random`)
+- `replaceEmptyByRandomValue` &mdash; Remplace default empty value by a random value (default: `false`)
 
 ## Building
 
diff --git a/src/class/OptionRegistry.js b/src/class/OptionRegistry.js
index 7ed7c203..09595cd0 100644
--- a/src/class/OptionRegistry.js
+++ b/src/class/OptionRegistry.js
@@ -25,6 +25,7 @@ defaults.maxLength = null;
 defaults.resolveJsonPath = false;
 defaults.reuseProperties = false;
 defaults.fillProperties = true;
+defaults.replaceEmptyByRandomValue = false;
 
 defaults.random = Math.random;
 
diff --git a/src/core/traverse.js b/src/core/traverse.js
index f5bc8886..0f800f06 100644
--- a/src/core/traverse.js
+++ b/src/core/traverse.js
@@ -25,7 +25,9 @@ function traverse(schema, path, resolve, rootSchema) {
     }
 
     if (optionAPI('useDefaultValue') && 'default' in schema) {
-      return schema.default;
+      if (schema.default !== '' || !optionAPI('replaceEmptyByRandomValue')) {
+        return schema.default;
+      }
     }
 
     if ('template' in schema) {
diff --git a/tests/schema/core/option/replaceEmptyByRandomValue.js b/tests/schema/core/option/replaceEmptyByRandomValue.js
new file mode 100644
index 00000000..753d7db9
--- /dev/null
+++ b/tests/schema/core/option/replaceEmptyByRandomValue.js
@@ -0,0 +1,7 @@
+module.exports = {
+  register(jsf) {
+    return jsf.option({
+      replaceEmptyByRandomValue: true,
+    });
+  },
+};
diff --git a/tests/schema/core/option/useDefaultValue.json b/tests/schema/core/option/useDefaultValue.json
index 6973c7e3..6f6d5895 100644
--- a/tests/schema/core/option/useDefaultValue.json
+++ b/tests/schema/core/option/useDefaultValue.json
@@ -10,6 +10,30 @@
         },
         "equal": "Hello",
         "require": "core/option/useDefaultValue"
+      },
+      {
+        "description": "should handle useDefaultValue option with an empty default value",
+        "schema": {
+          "type": "string",
+          "default": ""
+        },
+        "equal": "",
+        "require": "core/option/useDefaultValue"
+      },
+      {
+        "description": "should handle useDefaultValue & replaceEmptyByRandomValue option",
+        "schema": {
+          "test-response": {
+            "type": "string",
+            "default": ""
+          }
+        },
+        "valid": true,
+        "notEmpty": ["test-response"],
+        "require": [
+          "core/option/useDefaultValue",
+          "core/option/replaceEmptyByRandomValue"
+        ]
       }
     ]
   }
diff --git a/tests/schema/main.spec.js b/tests/schema/main.spec.js
index 0dba88bc..88840a36 100644
--- a/tests/schema/main.spec.js
+++ b/tests/schema/main.spec.js
@@ -29,7 +29,11 @@ function seed() {
         });
 
         if (test.require) {
-          require(`./${test.require}`).register(jsf);
+          test.require = Array.isArray(test.require) ? test.require : [test.require];
+
+          test.require.map(toRequire => {
+            return require(`./${toRequire}`).register(jsf);
+          });
         }
 
         const schema = typeof test.schema === 'string'
-- 
GitLab