Update the generator to use options and support a string-based map.

dev
KKlochko 8 months ago
parent 158dcce49b
commit 8ddb7da76e

@ -7,8 +7,28 @@ defmodule LinkShortener.Generators.LinkWithRandomShorten do
@doc """ @doc """
Generate a Link with random shorten with the length. 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 @spec generate_one(map(), is_atom_based: boolean(), length: integer(), generator: function()) ::
Map.put(attrs, :shorten, generator.(length)) [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
end end

@ -1,18 +1,18 @@
defmodule LinkShortener.Generators.LinkWithRandomShortenTest do defmodule LinkShortener.Generators.LinkWithRandomShortenTest do
use ExUnit.Case, async: true use ExUnit.Case, async: true
alias LinkShortener.Generators.LinkWithRandomShorten alias LinkShortener.Generators.LinkWithRandomShorten
@name "Some name" @name "Some name"
@attrs %{ @attrs %{
name: @name name: @name
} }
test "generate/1 returns random safe string with 10 as length" do test "generate/1 returns random safe string with 10 as length" do
assert %{ assert %{
name: @name, name: @name,
shorten: shorten shorten: shorten
} = LinkWithRandomShorten.generate_one(@attrs) } = LinkWithRandomShorten.generate_one(@attrs)
assert String.length(shorten) == 10 assert String.length(shorten) == 10
end end
@ -21,22 +21,32 @@ defmodule LinkShortener.Generators.LinkWithRandomShortenTest do
expected_length = 5 expected_length = 5
assert %{ assert %{
name: @name, name: @name,
shorten: shorten shorten: shorten
} = LinkWithRandomShorten.generate_one(@attrs, expected_length) } =
LinkWithRandomShorten.generate_one(@attrs,
is_atom_based: true,
length: expected_length
)
assert String.length(shorten) == expected_length assert String.length(shorten) == expected_length
end end
test "generate/3 returns random safe string using a lambda function" do test "generate/3 returns random safe string using a lambda function" do
random_generator = fn _ -> "random_shorten" end random_generator = fn _ -> "random_shorten" end
expected_shorten = random_generator.(14) expected_shorten = random_generator.(14)
expected_length = expected_shorten |> String.length() expected_length = expected_shorten |> String.length()
assert %{ assert %{
name: @name, name: @name,
shorten: shorten shorten: shorten
} = LinkWithRandomShorten.generate_one(@attrs, expected_length, random_generator) } =
LinkWithRandomShorten.generate_one(
@attrs,
is_atom_based: true,
length: expected_length,
generator: random_generator
)
assert String.length(shorten) == expected_length assert String.length(shorten) == expected_length
assert shorten == expected_shorten assert shorten == expected_shorten

Loading…
Cancel
Save