Skip to content

Commit

Permalink
Validate UUID formatted strings
Browse files Browse the repository at this point in the history
  • Loading branch information
zorbash committed Apr 10, 2022
1 parent d75fe06 commit 543e79b
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
71 changes: 71 additions & 0 deletions lib/open_api_spex/cast/string.ex
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,77 @@ defmodule OpenApiSpex.Cast.String do
end
end

@uuid_valid_characters [
?0,
?1,
?2,
?3,
?4,
?5,
?6,
?7,
?8,
?9,
?a,
?b,
?c,
?d,
?e,
?f,
?a,
?b,
?c,
?d,
?e,
?f
]
def cast(%{
value:
<<a1, a2, a3, a4, a5, a6, a7, a8, ?-, b1, b2, b3, b4, ?-, c1, c2, c3, c4, ?-, d1, d2, d3,
d4, ?-, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12>> = value,
schema: %{format: :uuid}
})
when is_binary(value) and
a1 in @uuid_valid_characters and
a2 in @uuid_valid_characters and
a3 in @uuid_valid_characters and
a4 in @uuid_valid_characters and
a5 in @uuid_valid_characters and
a6 in @uuid_valid_characters and
a7 in @uuid_valid_characters and
a8 in @uuid_valid_characters and
b1 in @uuid_valid_characters and
b2 in @uuid_valid_characters and
b3 in @uuid_valid_characters and
b4 in @uuid_valid_characters and
c1 in @uuid_valid_characters and
c2 in @uuid_valid_characters and
c3 in @uuid_valid_characters and
c3 in @uuid_valid_characters and
c4 in @uuid_valid_characters and
d1 in @uuid_valid_characters and
d2 in @uuid_valid_characters and
d3 in @uuid_valid_characters and
d4 in @uuid_valid_characters and
e1 in @uuid_valid_characters and
e2 in @uuid_valid_characters and
e3 in @uuid_valid_characters and
e4 in @uuid_valid_characters and
e5 in @uuid_valid_characters and
e6 in @uuid_valid_characters and
e7 in @uuid_valid_characters and
e8 in @uuid_valid_characters and
e9 in @uuid_valid_characters and
e10 in @uuid_valid_characters and
e11 in @uuid_valid_characters and
e12 in @uuid_valid_characters do
{:ok, value}
end

def cast(%{value: value, schema: %{format: :uuid}} = ctx) when is_binary(value) do
Cast.error(ctx, {:invalid_format, :uuid})
end

def cast(%{value: value = %Plug.Upload{}, schema: %{format: :binary}}) do
{:ok, value}
end
Expand Down
23 changes: 23 additions & 0 deletions test/cast/string_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,29 @@ defmodule OpenApiSpex.CastStringTest do
assert error.format == :date
end

test "casts a string with valid uuid format" do
schema = %Schema{type: :string, format: :uuid}
value = "02ef9c5f-29e6-48fc-9ec3-7ed57ed351f6"

assert {:ok, ^value} = cast(value: value, schema: schema)
end

test "returns a cast error with an invalid uuid string" do
schema = %Schema{type: :string, format: :uuid}

assert {:error, [%{reason: :invalid_format, value: "string", format: :uuid}]} =
cast(value: "string", schema: schema)

assert {:error,
[
%{
reason: :invalid_format,
value: "????????-$$$$-@@@@-9ec3-7ed57ed351f6",
format: :uuid
}
]} = cast(value: "????????-$$$$-@@@@-9ec3-7ed57ed351f6", schema: schema)
end

test "file upload" do
schema = %Schema{type: :string, format: :binary}
upload = %Plug.Upload{}
Expand Down

0 comments on commit 543e79b

Please sign in to comment.