summaryrefslogtreecommitdiff
path: root/test/support/api_spec_helpers.ex
diff options
context:
space:
mode:
authorEgor Kislitsyn <egor@kislitsyn.com>2020-04-24 14:46:59 +0400
committerEgor Kislitsyn <egor@kislitsyn.com>2020-04-24 15:16:15 +0400
commitf362836742aabd5b60b92c1296f2bbb6d83a3d59 (patch)
treee24949c5eb8cdecd29ea83165af9d2bab4447771 /test/support/api_spec_helpers.ex
parent1b5f8d19eeccfe202c0377079caa6a1d6f3cacb5 (diff)
downloadpleroma-f362836742aabd5b60b92c1296f2bbb6d83a3d59.tar.gz
pleroma-f362836742aabd5b60b92c1296f2bbb6d83a3d59.zip
Support validation for inline OpenAPI schema and automatic tests for examples
Diffstat (limited to 'test/support/api_spec_helpers.ex')
-rw-r--r--test/support/api_spec_helpers.ex57
1 files changed, 57 insertions, 0 deletions
diff --git a/test/support/api_spec_helpers.ex b/test/support/api_spec_helpers.ex
new file mode 100644
index 000000000..80c69c788
--- /dev/null
+++ b/test/support/api_spec_helpers.ex
@@ -0,0 +1,57 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Tests.ApiSpecHelpers do
+ @moduledoc """
+ OpenAPI spec test helpers
+ """
+
+ import ExUnit.Assertions
+
+ alias OpenApiSpex.Cast.Error
+ alias OpenApiSpex.Reference
+ alias OpenApiSpex.Schema
+
+ def assert_schema(value, schema) do
+ api_spec = Pleroma.Web.ApiSpec.spec()
+
+ case OpenApiSpex.cast_value(value, schema, api_spec) do
+ {:ok, data} ->
+ data
+
+ {:error, errors} ->
+ errors =
+ Enum.map(errors, fn error ->
+ message = Error.message(error)
+ path = Error.path_to_string(error)
+ "#{message} at #{path}"
+ end)
+
+ flunk(
+ "Value does not conform to schema #{schema.title}: #{Enum.join(errors, "\n")}\n#{
+ inspect(value)
+ }"
+ )
+ end
+ end
+
+ def resolve_schema(%Schema{} = schema), do: schema
+
+ def resolve_schema(%Reference{} = ref) do
+ schemas = Pleroma.Web.ApiSpec.spec().components.schemas
+ Reference.resolve_schema(ref, schemas)
+ end
+
+ def api_operations do
+ paths = Pleroma.Web.ApiSpec.spec().paths
+
+ Enum.flat_map(paths, fn {_, path_item} ->
+ path_item
+ |> Map.take([:delete, :get, :head, :options, :patch, :post, :put, :trace])
+ |> Map.values()
+ |> Enum.reject(&is_nil/1)
+ |> Enum.uniq()
+ end)
+ end
+end