@@ -7,6 +7,23 @@ defmodule OpenApiSpec.CastTest do
7
7
def cast ( ctx ) , do: Cast . cast ( ctx )
8
8
9
9
describe "cast/1" do
10
+ defmodule CustomValidator.EvenInt do
11
+ require OpenApiSpex
12
+
13
+ alias OpenApiSpex.Cast
14
+
15
+ OpenApiSpex . schema ( % {
16
+ description: "An even integer" ,
17
+ type: :integer ,
18
+ "x-validate": __MODULE__
19
+ } )
20
+
21
+ def cast ( context = % Cast { value: value } ) when is_integer ( value ) and rem ( value , 2 ) == 0 ,
22
+ do: Cast . ok ( context )
23
+
24
+ def cast ( context ) , do: Cast . error ( context , { :custom , "Must be an even integer" } )
25
+ end
26
+
10
27
test "unknown schema type" do
11
28
assert { :error , [ error ] } = cast ( value: "string" , schema: % Schema { type: :nope } )
12
29
assert error . reason == :invalid_schema_type
@@ -223,24 +240,7 @@ defmodule OpenApiSpec.CastTest do
223
240
end
224
241
225
242
test "cast custom error with custom validator" do
226
- defmodule EvenInt do
227
- require OpenApiSpex
228
-
229
- alias OpenApiSpex.Cast
230
-
231
- OpenApiSpex . schema ( % {
232
- description: "An even integer" ,
233
- type: :integer ,
234
- "x-validate": __MODULE__
235
- } )
236
-
237
- def cast ( context = % Cast { value: value } ) when is_integer ( value ) and rem ( value , 2 ) == 0 ,
238
- do: Cast . ok ( context )
239
-
240
- def cast ( context ) , do: Cast . error ( context , { :custom , "Must be an even integer" } )
241
- end
242
-
243
- schema = % Schema { type: :object , properties: % { even_number: EvenInt . schema ( ) } }
243
+ schema = % Schema { type: :object , properties: % { even_number: CustomValidator.EvenInt . schema ( ) } }
244
244
245
245
assert { :error , errors } = cast ( value: % { "even_number" => 1 } , schema: schema )
246
246
assert [ error ] = errors
@@ -250,6 +250,21 @@ defmodule OpenApiSpec.CastTest do
250
250
assert Error . message_with_path ( error ) == "#/even_number: Must be an even integer"
251
251
end
252
252
253
+ test "cast with custom validator from decoded schema" do
254
+ spec =
255
+ "./test/support/encoded_schema.json"
256
+ |> File . read! ( )
257
+ |> Jason . decode! ( )
258
+ |> OpenApiSpex.OpenApi.Decode . decode ( )
259
+
260
+ % {
261
+ components: % { schemas: % { "CustomValidationDecoded" => custom_validation_schema } }
262
+ } = spec
263
+
264
+ assert { :ok , % { even_num: 2 } } =
265
+ cast ( value: % { "even_num" => 2 } , schema: custom_validation_schema )
266
+ end
267
+
253
268
test "nil value with xxxOf" do
254
269
schema = % Schema { anyOf: [ % Schema { nullable: true , type: :string } ] }
255
270
assert { :ok , nil } = cast ( value: nil , schema: schema )
0 commit comments