diff --git a/lib/link_shortener/generators/link_with_random_shorten.ex b/lib/link_shortener/generators/link_with_random_shorten.ex index 53fee85..515ce3e 100644 --- a/lib/link_shortener/generators/link_with_random_shorten.ex +++ b/lib/link_shortener/generators/link_with_random_shorten.ex @@ -7,8 +7,28 @@ defmodule LinkShortener.Generators.LinkWithRandomShorten do @doc """ Generate a Link with random shorten with the length. + + ## Options + • :is_atom_based (boolean, true by default) - if a map is + atom-based, then a key for shorten will be :shorten, else + "shorten". + • :length (integer, 10 by default) - the length for + the shorten. + • :generator (function) - the shorten is generated by the + generator function. + LinkShortener.Generators.SafeString.generate/1 by default. """ - def generate_one(attrs, length \\ 10, generator \\ &SafeString.generate/1) do - Map.put(attrs, :shorten, generator.(length)) + @spec generate_one(map(), is_atom_based: boolean(), length: integer(), generator: function()) :: + [map()] + def generate_one(attrs, opts \\ []) do + is_atom_based = Keyword.get(opts, :is_atom_based, true) + length = Keyword.get(opts, :length, 10) + generator = Keyword.get(opts, :generator, &SafeString.generate/1) + + if is_atom_based do + Map.put(attrs, :shorten, generator.(length)) + else + Map.put(attrs, "shorten", generator.(length)) + end end end diff --git a/test/link_shortener/generators/link_with_random_shorten_test.exs b/test/link_shortener/generators/link_with_random_shorten_test.exs index fbec07c..d0af974 100644 --- a/test/link_shortener/generators/link_with_random_shorten_test.exs +++ b/test/link_shortener/generators/link_with_random_shorten_test.exs @@ -1,18 +1,18 @@ defmodule LinkShortener.Generators.LinkWithRandomShortenTest do use ExUnit.Case, async: true - + alias LinkShortener.Generators.LinkWithRandomShorten @name "Some name" @attrs %{ name: @name } - + test "generate/1 returns random safe string with 10 as length" do assert %{ - name: @name, - shorten: shorten - } = LinkWithRandomShorten.generate_one(@attrs) + name: @name, + shorten: shorten + } = LinkWithRandomShorten.generate_one(@attrs) assert String.length(shorten) == 10 end @@ -21,22 +21,32 @@ defmodule LinkShortener.Generators.LinkWithRandomShortenTest do expected_length = 5 assert %{ - name: @name, - shorten: shorten - } = LinkWithRandomShorten.generate_one(@attrs, expected_length) + name: @name, + shorten: shorten + } = + LinkWithRandomShorten.generate_one(@attrs, + is_atom_based: true, + length: expected_length + ) assert String.length(shorten) == expected_length end test "generate/3 returns random safe string using a lambda function" do random_generator = fn _ -> "random_shorten" end - expected_shorten = random_generator.(14) + expected_shorten = random_generator.(14) expected_length = expected_shorten |> String.length() assert %{ - name: @name, - shorten: shorten - } = LinkWithRandomShorten.generate_one(@attrs, expected_length, random_generator) + name: @name, + shorten: shorten + } = + LinkWithRandomShorten.generate_one( + @attrs, + is_atom_based: true, + length: expected_length, + generator: random_generator + ) assert String.length(shorten) == expected_length assert shorten == expected_shorten