diff --git a/lib/asapi.ex b/lib/asapi.ex index 2a014e7..7cbeee7 100644 --- a/lib/asapi.ex +++ b/lib/asapi.ex @@ -5,16 +5,20 @@ defmodule Asapi do @loading "…" @unknown "unknown" - def shield(status) when status in [@loading, @unknown] do - shield(status, "inactive") + def shield(status, json \\ false) when status in [@loading, @unknown] do + shield(status, "inactive", json) end - def shield(status) do - shield(status, "informational") + def shield(status, json) do + shield(status, "informational", json) end - defp shield(status, color) do - "https://img.shields.io/badge/API-#{encode(status)}-#{color}" + defp shield(status, color, json) do + unless json do + "https://img.shields.io/badge/API-#{encode(status)}-#{color}" + else + "{\"schemaVersion\":1,\"label\":\"API\",\"message\":\"#{status}\",\"color\":\"#{color}\"}" + end end defp encode(part) do diff --git a/lib/asapi/lv.ex b/lib/asapi/lv.ex index 04867fe..e1c33d7 100644 --- a/lib/asapi/lv.ex +++ b/lib/asapi/lv.ex @@ -57,6 +57,13 @@ defmodule Asapi.Lv do |> redirect_to end + defp asapi_lv(%Conn{assigns: %{asapi_aar: aar, asapi_ext: :json}}) do + aar + |> api_lv + |> shield(json: true) + |> send_json + end + defp asapi_lv(%Conn{assigns: %{asapi_aar: aar, asapi_ext: :txt}}) do aar |> api_lv diff --git a/lib/asapi/util.ex b/lib/asapi/util.ex index 3e06efd..bef38f0 100644 --- a/lib/asapi/util.ex +++ b/lib/asapi/util.ex @@ -20,5 +20,7 @@ defmodule Asapi.Util do def redirect_to(url), do: {:redirect, url} + def send_json(json), do: {:ok, json, ["content-type": "application/json"]} + def send_text(text), do: {:ok, text, ["content-type": "text/plain"]} end diff --git a/test/asapi/lv_test.exs b/test/asapi/lv_test.exs index fcd0f79..aa2b693 100644 --- a/test/asapi/lv_test.exs +++ b/test/asapi/lv_test.exs @@ -167,6 +167,27 @@ defmodule Asapi.LvTest do assert {"location", "#{shield("12+")}.svg"} in conn.resp_headers end + test "call returns json to with unknown api level" do + conn = + conn(:get, "/foo") + |> assign(:asapi_aar, %{@aar | group: nil}) + |> assign(:asapi_ext, :json) + |> Lv.call(nil) + + assert conn.resp_body == shield(@unknown, json: true) + end + + test_with_mock "call returns json to with api level", Data, get!: fn _ -> "13+" end do + conn = + conn(:get, "/foo") + |> assign(:asapi_aar, @aar) + |> assign(:asapi_ext, :json) + |> Lv.call(nil) + + assert called(Data.get!(@aar)) + assert conn.resp_body == shield("13+", json: true) + end + test "call returns txt to with unknown api level" do conn = conn(:get, "/foo")