diff --git a/README.md b/README.md index b33cf6e..be412f8 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,13 @@ new WireMockServer(wireMockConfig().extensions(RandomExtension.class)); This will generate random first names in the `en-US` locale for every request. +You can optionally add the `seed` parameter to generate the same value for the same seed: + +{% raw %} +```handlebars +{{ random 'Name.first_name' seed=1234 }} +``` +%} ### Technical notes This library brings `net.datafaker:datafaker` as transitive dependency, which may result in conflicts at building time. diff --git a/src/main/java/org/wiremock/RandomHelper.java b/src/main/java/org/wiremock/RandomHelper.java index ea1171d..cabc99b 100644 --- a/src/main/java/org/wiremock/RandomHelper.java +++ b/src/main/java/org/wiremock/RandomHelper.java @@ -2,6 +2,7 @@ import com.github.jknack.handlebars.Options; import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.HandlebarsHelper; +import java.util.Random; import net.datafaker.Faker; /* @@ -9,6 +10,8 @@ */ public class RandomHelper extends HandlebarsHelper { + private static final String SEED_HASH = "seed"; + private final Faker faker; public RandomHelper() { @@ -17,13 +20,18 @@ public RandomHelper() { @Override public Object apply(Object context, Options options) { + + // Use a seeded Faker if seed hash exists + final var seedOption = options.hash(SEED_HASH); + var myFaker = seedOption == null ? faker : new Faker(new Random(seedOption.hashCode())); + try { // Used the `expression` method instead of `resolve` as the // resolve method is not able to resolve nested references in the yml files. For example, in // the resource file for en-US, `address.full_address` wasn't resolving because of the // `#{street_address}` nested reference, but `address.postcode_by_state.AL` would work fine. // `expression` is able to handle all cases. - return faker.expression("#{" + context + "}"); + return myFaker.expression("#{" + context + "}"); } catch (RuntimeException e) { return handleError("Unable to evaluate the expression " + context, e); } diff --git a/src/test/java/org/wiremock/RandomHelperTest.java b/src/test/java/org/wiremock/RandomHelperTest.java index 3a8a464..f7eb02d 100644 --- a/src/test/java/org/wiremock/RandomHelperTest.java +++ b/src/test/java/org/wiremock/RandomHelperTest.java @@ -6,6 +6,7 @@ import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.HandlebarsHelperTestBase; import java.io.IOException; import java.lang.reflect.Field; +import java.util.Map; import java.util.Random; import net.datafaker.Faker; import org.junit.jupiter.api.BeforeEach; @@ -40,4 +41,16 @@ public void returnsRandomValue(int seed, String expression, String expected) thr String actual = renderHelperValue(helper, expression); assertThat(actual, is(expected)); } + + @ParameterizedTest + @CsvSource( + value = { + "1, Donny", + "toto, Ethan", + }) + public void rendersSeededRandomValue(Object seed, String expected) throws IOException { + final var actual = helper.apply("Name.firstName", createOptions(Map.of("seed", seed))); + + assertThat(actual, is(expected)); + } }