Skip to content

Commit 00bbf35

Browse files
authored
Merge pull request #97 from VoiSmart/fix_max_min_error_handling
Fix maximum and minimum error handling
2 parents 759f7f3 + c136120 commit 00bbf35

File tree

3 files changed

+44
-28
lines changed

3 files changed

+44
-28
lines changed

lib/open_api_spex/cast/error.ex

+16-6
Original file line numberDiff line numberDiff line change
@@ -265,14 +265,24 @@ defmodule OpenApiSpex.Cast.Error do
265265
"#{count} is not a multiple of #{multiple}"
266266
end
267267

268-
def message(%{reason: max, length: max, value: size})
269-
when max in [:exclusive_max, :maximum] do
270-
"#{size} is larger than maximum #{max}"
268+
def message(%{reason: :exclusive_max, length: max, value: value})
269+
when value >= max do
270+
"#{value} is larger than exclusive maximum #{max}"
271271
end
272272

273-
def message(%{reason: min, length: min, value: size})
274-
when min in [:exclusive_min, :minimum] do
275-
"#{size} is smaller than (exclusive) minimum #{min}"
273+
def message(%{reason: :maximum, length: max, value: value})
274+
when value > max do
275+
"#{value} is larger than inclusive maximum #{max}"
276+
end
277+
278+
def message(%{reason: :exclusive_min, length: min, value: value})
279+
when value <= min do
280+
"#{value} is smaller than exclusive minimum #{min}"
281+
end
282+
283+
def message(%{reason: :minimum, length: min, value: value})
284+
when value < min do
285+
"#{value} is smaller than inclusive minimum #{min}"
276286
end
277287

278288
def message(%{reason: :invalid_type, type: type, value: value}) do

lib/open_api_spex/cast/integer.ex

+12-12
Original file line numberDiff line numberDiff line change
@@ -28,37 +28,37 @@ defmodule OpenApiSpex.Cast.Integer do
2828

2929
defp cast_integer(%{value: value, schema: %{minimum: minimum, exclusiveMinimum: true}} = ctx)
3030
when is_integer(value) and is_integer(minimum) do
31-
if value < minimum do
32-
Cast.error(ctx, {:exclusive_min, minimum, value})
33-
else
31+
if value > minimum do
3432
Cast.success(ctx, [:minimum, :exclusiveMinimum])
33+
else
34+
Cast.error(ctx, {:exclusive_min, minimum, value})
3535
end
3636
end
3737

3838
defp cast_integer(%{value: value, schema: %{minimum: minimum}} = ctx)
3939
when is_integer(value) and is_integer(minimum) do
40-
if value <= minimum do
41-
Cast.error(ctx, {:minimum, minimum, value})
42-
else
40+
if value >= minimum do
4341
Cast.success(ctx, :minimum)
42+
else
43+
Cast.error(ctx, {:minimum, minimum, value})
4444
end
4545
end
4646

4747
defp cast_integer(%{value: value, schema: %{maximum: maximum, exclusiveMaximum: true}} = ctx)
4848
when is_integer(value) and is_integer(maximum) do
49-
if value > maximum do
50-
Cast.error(ctx, {:exclusive_max, maximum, value})
51-
else
49+
if value < maximum do
5250
Cast.success(ctx, [:maximum, :exclusiveMaximum])
51+
else
52+
Cast.error(ctx, {:exclusive_max, maximum, value})
5353
end
5454
end
5555

5656
defp cast_integer(%{value: value, schema: %{maximum: maximum}} = ctx)
5757
when is_integer(value) and is_integer(maximum) do
58-
if value >= maximum do
59-
Cast.error(ctx, {:maximum, maximum, value})
60-
else
58+
if value <= maximum do
6159
Cast.success(ctx, :maximum)
60+
else
61+
Cast.error(ctx, {:maximum, maximum, value})
6262
end
6363
end
6464

test/cast/integer_test.exs

+16-10
Original file line numberDiff line numberDiff line change
@@ -30,41 +30,47 @@ defmodule OpenApiSpex.CastIntegerTest do
3030
test "with minimum" do
3131
schema = %Schema{type: :integer, minimum: 2}
3232
assert cast(value: 3, schema: schema) == {:ok, 3}
33-
assert {:error, [error]} = cast(value: 2, schema: schema)
33+
assert cast(value: 2, schema: schema) == {:ok, 2}
34+
assert {:error, [error]} = cast(value: 1, schema: schema)
3435
assert error.reason == :minimum
35-
assert error.value == 2
36+
assert error.value == 1
3637
# error.length is the minimum
3738
assert error.length == 2
39+
assert Error.message(error) =~ "smaller than inclusive minimum"
3840
end
3941

4042
test "with maximum" do
4143
schema = %Schema{type: :integer, maximum: 2}
4244
assert cast(value: 1, schema: schema) == {:ok, 1}
43-
assert {:error, [error]} = cast(value: 2, schema: schema)
45+
assert cast(value: 2, schema: schema) == {:ok, 2}
46+
assert {:error, [error]} = cast(value: 3, schema: schema)
4447
assert error.reason == :maximum
45-
assert error.value == 2
48+
assert error.value == 3
4649
# error.length is the maximum
4750
assert error.length == 2
51+
assert Error.message(error) =~ "larger than inclusive maximum"
4852
end
4953

5054
test "with minimum w/ exclusiveMinimum" do
5155
schema = %Schema{type: :integer, minimum: 2, exclusiveMinimum: true}
52-
assert cast(value: 2, schema: schema) == {:ok, 2}
53-
assert {:error, [error]} = cast(value: 1, schema: schema)
56+
assert cast(value: 3, schema: schema) == {:ok, 3}
57+
assert {:error, [error]} = cast(value: 2, schema: schema)
5458
assert error.reason == :exclusive_min
55-
assert error.value == 1
59+
assert error.value == 2
5660
# error.length is the minimum
5761
assert error.length == 2
62+
assert Error.message(error) =~ "smaller than exclusive minimum"
5863
end
5964

6065
test "with maximum w/ exclusiveMaximum" do
6166
schema = %Schema{type: :integer, maximum: 2, exclusiveMaximum: true}
62-
assert cast(value: 2, schema: schema) == {:ok, 2}
63-
assert {:error, [error]} = cast(value: 3, schema: schema)
67+
assert cast(value: 1, schema: schema) == {:ok, 1}
68+
assert {:error, [error]} = cast(value: 2, schema: schema)
6469
assert error.reason == :exclusive_max
65-
assert error.value == 3
70+
assert error.value == 2
6671
# error.length is the maximum
6772
assert error.length == 2
73+
assert Error.message(error) =~ "larger than exclusive maximum"
6874
end
6975
end
7076
end

0 commit comments

Comments
 (0)