Skip to content

Commit 637d692

Browse files
committed
Validate :type for building_number and coordinate
1 parent ab5f31a commit 637d692

3 files changed

Lines changed: 67 additions & 2 deletions

File tree

lib/neo_faker/address.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@ defmodule NeoFaker.Address do
4747
Validator.validate_range!(range)
4848

4949
type = Options.get(opts, :type, :string)
50+
51+
Validator.validate_building_number_type!(type)
52+
5053
number = Number.between(range.first, range.last)
5154

5255
case type do
5356
:string -> Formatter.format_number(number, :string)
5457
:integer -> number
55-
_ -> Formatter.format_number(number, :string)
5658
end
5759
end
5860

@@ -142,6 +144,7 @@ defmodule NeoFaker.Address do
142144
type = Options.get(opts, :type, :full)
143145

144146
Validator.validate_precision!(precision)
147+
Validator.validate_coordinate_type!(type)
145148

146149
latitude = Generator.latitude(precision)
147150
longitude = Generator.longitude(precision)
@@ -150,7 +153,6 @@ defmodule NeoFaker.Address do
150153
:latitude -> latitude
151154
:longitude -> longitude
152155
:full -> {latitude, longitude}
153-
_ -> {latitude, longitude}
154156
end
155157
end
156158
end

lib/neo_faker/address/validator.ex

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,37 @@
11
defmodule NeoFaker.Address.Validator do
22
@moduledoc false
33

4+
@building_number_types [:string, :integer]
5+
@coordinate_types [:full, :latitude, :longitude]
6+
7+
@doc """
8+
Validates the `:type` option for `building_number/2`.
9+
10+
Raises `ArgumentError` if the type is not one of `#{inspect([:string, :integer])}`.
11+
"""
12+
@spec validate_building_number_type!(atom()) :: :ok
13+
def validate_building_number_type!(type) when type in @building_number_types, do: :ok
14+
15+
def validate_building_number_type!(other) do
16+
raise ArgumentError,
17+
"invalid :type for building_number/2. " <>
18+
"Expected one of #{inspect(@building_number_types)}, got: #{inspect(other)}"
19+
end
20+
21+
@doc """
22+
Validates the `:type` option for `coordinate/1`.
23+
24+
Raises `ArgumentError` if the type is not one of `#{inspect([:full, :latitude, :longitude])}`.
25+
"""
26+
@spec validate_coordinate_type!(atom()) :: :ok
27+
def validate_coordinate_type!(type) when type in @coordinate_types, do: :ok
28+
29+
def validate_coordinate_type!(other) do
30+
raise ArgumentError,
31+
"invalid :type for coordinate/1. " <>
32+
"Expected one of #{inspect(@coordinate_types)}, got: #{inspect(other)}"
33+
end
34+
435
@doc """
536
Validates that the given value is a `Range` with `first <= last`.
637

test/neo_faker/address_test.exs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ defmodule NeoFaker.AddressTest do
1111
end
1212

1313
describe "building_number/2" do
14+
test "returns a string by default" do
15+
assert is_binary(Address.building_number())
16+
end
17+
1418
test "returns a random integer building number" do
1519
assert is_integer(Address.building_number(1..100, type: :integer))
1620
end
@@ -22,6 +26,18 @@ defmodule NeoFaker.AddressTest do
2226
test "returns a random integer building number within the specified range" do
2327
assert Address.building_number(1..100, type: :integer) in 1..100
2428
end
29+
30+
test "raises ArgumentError for an unknown :type" do
31+
assert_raise ArgumentError, ~r/invalid :type for building_number\/2/, fn ->
32+
Address.building_number(1..100, type: :float)
33+
end
34+
end
35+
36+
test "raises ArgumentError for a non-atom :type" do
37+
assert_raise ArgumentError, ~r/invalid :type for building_number\/2/, fn ->
38+
Address.building_number(1..100, type: "string")
39+
end
40+
end
2541
end
2642

2743
describe "city/1" do
@@ -53,6 +69,10 @@ defmodule NeoFaker.AddressTest do
5369
end
5470

5571
describe "coordinate/1" do
72+
test "returns a {latitude, longitude} tuple by default" do
73+
assert {_lat, _lng} = Address.coordinate()
74+
end
75+
5676
test "returns a random coordinate as a tuple of floats" do
5777
{latitude, longitude} = Address.coordinate()
5878

@@ -69,5 +89,17 @@ defmodule NeoFaker.AddressTest do
6989
test "returns only a random longitude as a float" do
7090
assert is_float(Address.coordinate(type: :longitude))
7191
end
92+
93+
test "raises ArgumentError for an unknown :type" do
94+
assert_raise ArgumentError, ~r/invalid :type for coordinate\/1/, fn ->
95+
Address.coordinate(type: :altitude)
96+
end
97+
end
98+
99+
test "raises ArgumentError for a non-atom :type" do
100+
assert_raise ArgumentError, ~r/invalid :type for coordinate\/1/, fn ->
101+
Address.coordinate(type: "full")
102+
end
103+
end
72104
end
73105
end

0 commit comments

Comments
 (0)