defmodule Microwaveprop.Radio.CallsignClientTest do
use Microwaveprop.DataCase, async: false
alias Microwaveprop.CallsignLocation.Location
alias Microwaveprop.Qrz.Client
alias Microwaveprop.Radio.CallsignClient
setup do
Client.reset_session()
:ok
end
describe "locate/1" do
test "reshapes a cached CallsignLocation into the public shape" do
{:ok, _} =
%Location{}
|> Location.changeset(%{
callsign: "W1AW",
latitude: 41.714,
longitude: -72.727,
gridsquare: "FN31pr58"
})
|> Repo.insert()
assert {:ok, result} = CallsignClient.locate("W1AW")
assert result == %{
callsign: "W1AW",
gridsquare: "FN31pr58",
lat: 41.714,
lon: -72.727
}
end
test "returns only callsign, gridsquare, lat, lon (drops name and address)" do
{:ok, _} =
%Location{}
|> Location.changeset(%{
callsign: "W1AW",
latitude: 41.714,
longitude: -72.727,
gridsquare: "FN31pr58"
})
|> Repo.insert()
assert {:ok, result} = CallsignClient.locate("W1AW")
assert result |> Map.keys() |> Enum.sort() == [:callsign, :gridsquare, :lat, :lon]
end
test "renames latitude/longitude to lat/lon" do
{:ok, _} =
%Location{}
|> Location.changeset(%{
callsign: "K5QE",
latitude: 30.5,
longitude: -94.1,
gridsquare: "EM30wn"
})
|> Repo.insert()
assert {:ok, %{lat: 30.5, lon: -94.1}} = CallsignClient.locate("K5QE")
end
test "propagates {:error, reason} tuples from the underlying lookup" do
Req.Test.expect(Client, 2, fn conn ->
params = Plug.Conn.fetch_query_params(conn).query_params
if Map.has_key?(params, "username") do
Plug.Conn.send_resp(conn, 200, """
session123
""")
else
Plug.Conn.send_resp(conn, 200, """
Not found: INVALID
session123
""")
end
end)
assert {:error, _reason} = CallsignClient.locate("INVALID")
end
test "upcases lookups, matching a cached row inserted in different casing" do
# The underlying CallsignLocation.lookup/1 upcases the callsign before
# the DB read, so a mixed-case request finds an uppercase cache hit.
{:ok, _} =
%Location{}
|> Location.changeset(%{
callsign: "W1AW",
latitude: 41.714,
longitude: -72.727,
gridsquare: "FN31pr58"
})
|> Repo.insert()
assert {:ok, %{callsign: "W1AW"}} = CallsignClient.locate("w1aw")
end
end
end