107 lines
3.3 KiB
Elixir
107 lines
3.3 KiB
Elixir
defmodule MusicLibraryWeb.CollectionControllerTest do
|
|
use MusicLibraryWeb.ConnCase
|
|
|
|
import MusicLibrary.Fixtures.Records
|
|
|
|
defp create_record(_) do
|
|
%{record: record_with_artist("Steven Wilson", %{release_date: "2025-06-21"})}
|
|
end
|
|
|
|
defp api_token do
|
|
Application.get_env(:music_library, MusicLibraryWeb)
|
|
|> Keyword.fetch!(:api_token)
|
|
end
|
|
|
|
describe "authentication" do
|
|
test "all API endpoints require a bearer token", %{conn: conn} do
|
|
for path <- [
|
|
~p"/api/v1/collection/latest",
|
|
~p"/api/v1/collection/random",
|
|
~p"/api/v1/collection",
|
|
~p"/api/v1/collection/on_this_day"
|
|
] do
|
|
assert get(conn, path).status == 401,
|
|
"expected 401 for unauthenticated GET #{path}"
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "GET /api/v1/collection/latest" do
|
|
setup [:create_record]
|
|
|
|
test "returns the latest record", %{conn: conn, record: record} do
|
|
conn =
|
|
conn
|
|
|> put_req_header("authorization", "Bearer #{api_token()}")
|
|
|> get(~p"/api/v1/collection/latest")
|
|
|
|
assert json_response(conn, 200) == expected_record_json(record)
|
|
end
|
|
end
|
|
|
|
describe "GET /api/v1/collection/random" do
|
|
setup [:create_record]
|
|
|
|
# We're not testing random here - the query is solid enough
|
|
test "returns a random record", %{conn: conn, record: record} do
|
|
conn =
|
|
conn
|
|
|> put_req_header("authorization", "Bearer #{api_token()}")
|
|
|> get(~p"/api/v1/collection/random")
|
|
|
|
assert json_response(conn, 200) == expected_record_json(record)
|
|
end
|
|
end
|
|
|
|
describe "GET /api/v1/collection" do
|
|
setup [:create_record]
|
|
|
|
test "returns a paginated list of records", %{conn: conn, record: record} do
|
|
conn =
|
|
conn
|
|
|> put_req_header("authorization", "Bearer #{api_token()}")
|
|
|> get(~p"/api/v1/collection")
|
|
|
|
assert json_response(conn, 200) == %{
|
|
"total" => 1,
|
|
"limit" => 20,
|
|
"offset" => 0,
|
|
"records" => [expected_record_json(record)]
|
|
}
|
|
end
|
|
end
|
|
|
|
describe "GET /api/v1/collection/on_this_day" do
|
|
setup [:create_record]
|
|
|
|
test "returns a list of records", %{conn: conn, record: record} do
|
|
conn =
|
|
conn
|
|
|> put_req_header("authorization", "Bearer #{api_token()}")
|
|
|> get(~p"/api/v1/collection/on_this_day?date=2025-06-21")
|
|
|
|
assert json_response(conn, 200) == %{
|
|
"records" => [expected_record_json(record)]
|
|
}
|
|
end
|
|
end
|
|
|
|
defp expected_record_json(record) do
|
|
%{
|
|
"id" => record.id,
|
|
"type" => record.type |> to_string(),
|
|
"format" => record.format |> to_string(),
|
|
"musicbrainz_id" => record.musicbrainz_id,
|
|
"genres" => record.genres,
|
|
"release_date" => record.release_date,
|
|
"purchased_at" => record.purchased_at |> DateTime.to_iso8601(),
|
|
"artists" => Enum.map(record.artists, & &1.name),
|
|
"title" => record.title,
|
|
"cover_url" =>
|
|
"http://localhost:4002/api/v1/assets/eyJoYXNoIjoiNTk5NDA3RERGNjk5MDdENEE2MEZFMTNDQ0FBODI0RDI1Q0YwOERDMTI0RkQ2QUEzRThFN0VDRDk4Qzg4NUZGRSIsIndpZHRoIjpudWxsfQ",
|
|
"thumb_url" =>
|
|
"http://localhost:4002/api/v1/assets/eyJoYXNoIjoiNTk5NDA3RERGNjk5MDdENEE2MEZFMTNDQ0FBODI0RDI1Q0YwOERDMTI0RkQ2QUEzRThFN0VDRDk4Qzg4NUZGRSIsIndpZHRoIjo0ODB9"
|
|
}
|
|
end
|
|
end
|