Compare commits
3
Commits
00467d249a
...
74136c7fa7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
74136c7fa7 | ||
|
|
8ddb7da76e | ||
|
|
158dcce49b |
@@ -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
|
||||||
|
|||||||
@@ -9,8 +9,28 @@ defmodule LinkShortener.Links do
|
|||||||
|
|
||||||
def new_one(), do: Link.changeset(%Link{}, %{})
|
def new_one(), do: Link.changeset(%Link{}, %{})
|
||||||
|
|
||||||
def create_one(attrs, length \\ 10, generator \\ &LinkGenerator.generate_one/2) do
|
@doc """
|
||||||
generator.(attrs, length)
|
Create 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.LinkWithRandomShorten.generate_one/2 by
|
||||||
|
default.
|
||||||
|
"""
|
||||||
|
@spec create_one(map(), [is_atom_based: boolean(), length: integer(), generator: function()]) ::
|
||||||
|
[map()]
|
||||||
|
def create_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, &LinkGenerator.generate_one/2)
|
||||||
|
|
||||||
|
generator.(attrs, is_atom_based: is_atom_based, length: length)
|
||||||
|> insert_one()
|
|> insert_one()
|
||||||
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
|
||||||
|
|||||||
@@ -4,14 +4,13 @@ defmodule LinkShortener.Generators.SafeStringTest do
|
|||||||
alias LinkShortener.Generators.SafeString
|
alias LinkShortener.Generators.SafeString
|
||||||
|
|
||||||
@lengths [1, 2, 5, 10]
|
@lengths [1, 2, 5, 10]
|
||||||
|
|
||||||
test "generate/1 returns random safe string with same length" do
|
test "generate/1 returns random safe string with same length" do
|
||||||
for expected_length <- @lengths do
|
for expected_length <- @lengths do
|
||||||
length = expected_length
|
assert ^expected_length =
|
||||||
|> SafeString.generate()
|
expected_length
|
||||||
|> String.length()
|
|> SafeString.generate()
|
||||||
|
|> String.length()
|
||||||
assert length = expected_length
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ defmodule LinkShortener.LinksTest do
|
|||||||
test "create_one/2 with valid data creates a link", %{user: user} do
|
test "create_one/2 with valid data creates a link", %{user: user} do
|
||||||
assert {:ok, %Link{} = link} =
|
assert {:ok, %Link{} = link} =
|
||||||
with_user(@create_generated_attrs, user)
|
with_user(@create_generated_attrs, user)
|
||||||
|> Links.create_one(5)
|
|> Links.create_one(length: 5)
|
||||||
|
|
||||||
assert link.name == "some link name"
|
assert link.name == "some link name"
|
||||||
assert link.url == "https://gitlab.com/KKlochko/link_shortener"
|
assert link.url == "https://gitlab.com/KKlochko/link_shortener"
|
||||||
|
|||||||
Reference in New Issue
Block a user