Skip to main content

priv/templates/compliance_test.exs.eex

defmodule JSONPath.ComplianceTest do
  use ExUnit.Case

<%= for testcase <- tests do %>
  <%= if Map.get(testcase, "skip", false) do %>
    @tag :skip
  <% end %>
  test "<%= testcase["name"] %>" do
    testcase = <%= inspect(testcase, limit: :infinity) %>
    selector = testcase["selector"]
    root = testcase["document"]
    <%= if not is_nil(Map.get(testcase, "result")) do %>
      %{"result" => result, "result_paths" => result_path} = testcase
    <% end %>
    <%= if not is_nil(Map.get(testcase, "results")) do %>
      %{"results" => results, "results_paths" => results_path} = testcase
    <% end %>

    <%= if Map.get(testcase, "invalid_selector", false) == true do %>
      assert {:error, %JSONPath.Error{}} = JSONPath.values(root, selector)
    <% else %>
      <%= if not is_nil(Map.get(testcase, "result")) do %>
        # Only one possible result
        {:ok, value} = JSONPath.values(root, selector)
        assert value == result,
                "for query #{selector} and root #{inspect(root)}, expected: #{inspect(result)}, got: #{inspect(value)}"
        {:ok, paths} = JSONPath.paths(root, selector)
        assert paths == result_path,
                "for query #{selector} and root #{inspect(root)}, expected paths: #{inspect(result_path)}, got: #{inspect(paths)}"
      <% else %>
        <%= if not is_nil(Map.get(testcase, "results")) do %>
          # Multiple results
          {:ok, value} = JSONPath.values(root, selector)
          assert value in results, "no match for query #{selector} and root #{inspect(root)}"
          {:ok, paths} = JSONPath.paths(root, selector)
          assert paths in results_path, "no path match for query #{selector} and root #{inspect(root)}"
        <% else %>
          raise "Unexpected testcase format: #{inspect(testcase)}"
        <% end %>
      <% end %>
    <% end %>
  end
<% end %>
end