Files
minstrel/internal/api/resolve_test.go
T

102 lines
2.7 KiB
Go

package api
import (
"context"
"errors"
"net/http"
"net/http/httptest"
"testing"
"github.com/go-chi/chi/v5"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgtype"
)
type fakeRow struct {
ID pgtype.UUID
Name string
}
func reqWithParam(_ *testing.T, key, value string) *http.Request {
r := httptest.NewRequest("GET", "/", nil)
rctx := chi.NewRouteContext()
rctx.URLParams.Add(key, value)
return r.WithContext(context.WithValue(r.Context(), chi.RouteCtxKey, rctx))
}
func TestResolveByID_InvalidUUID(t *testing.T) {
called := 0
fetch := func(_ context.Context, _ pgtype.UUID) (fakeRow, error) {
called++
return fakeRow{}, nil
}
r := reqWithParam(t, "id", "not-a-uuid")
row, apiErr := resolveByID(r, "id", fetch, "track")
if apiErr == nil {
t.Fatalf("expected apiErr, got nil (row=%+v)", row)
}
if apiErr.Status != 400 {
t.Errorf("Status: got %d, want 400", apiErr.Status)
}
if apiErr.Code != "bad_request" {
t.Errorf("Code: got %q, want %q", apiErr.Code, "bad_request")
}
if called != 0 {
t.Errorf("fetch was called %d times; expected 0", called)
}
}
func TestResolveByID_NotFound(t *testing.T) {
fetch := func(_ context.Context, _ pgtype.UUID) (fakeRow, error) {
return fakeRow{}, pgx.ErrNoRows
}
r := reqWithParam(t, "id", "11111111-1111-1111-1111-111111111111")
_, apiErr := resolveByID(r, "id", fetch, "track")
if apiErr == nil {
t.Fatal("expected apiErr, got nil")
}
if apiErr.Status != 404 {
t.Errorf("Status: got %d, want 404", apiErr.Status)
}
if apiErr.Code != "track_not_found" {
t.Errorf("Code: got %q, want %q", apiErr.Code, "track_not_found")
}
}
func TestResolveByID_Internal(t *testing.T) {
cause := errors.New("boom")
fetch := func(_ context.Context, _ pgtype.UUID) (fakeRow, error) {
return fakeRow{}, cause
}
r := reqWithParam(t, "id", "11111111-1111-1111-1111-111111111111")
_, apiErr := resolveByID(r, "id", fetch, "track")
if apiErr == nil {
t.Fatal("expected apiErr, got nil")
}
if apiErr.Status != 500 {
t.Errorf("Status: got %d, want 500", apiErr.Status)
}
if !errors.Is(apiErr, cause) {
t.Errorf("expected cause %v wrapped in apiErr; got %v", cause, apiErr)
}
}
func TestResolveByID_Success(t *testing.T) {
want := fakeRow{Name: "alpha"}
fetch := func(_ context.Context, id pgtype.UUID) (fakeRow, error) {
want.ID = id
return want, nil
}
r := reqWithParam(t, "id", "11111111-1111-1111-1111-111111111111")
got, apiErr := resolveByID(r, "id", fetch, "track")
if apiErr != nil {
t.Fatalf("unexpected apiErr: %v", apiErr)
}
if got.Name != want.Name {
t.Errorf("Name: got %q, want %q", got.Name, want.Name)
}
if got.ID != want.ID {
t.Errorf("ID: got %+v, want %+v", got.ID, want.ID)
}
}