diff --git a/backend/bills/internal/adapter/sqlite/repository.go b/backend/bills/internal/adapter/sqlite/repository.go index 3fc593d6..b39b5e20 100644 --- a/backend/bills/internal/adapter/sqlite/repository.go +++ b/backend/bills/internal/adapter/sqlite/repository.go @@ -174,6 +174,10 @@ func (r *Repository) GetBillVersionDiff(ctx context.Context, id, fromVersionID, if err != nil { return nil, err } + + if ok, err := r.tableExists(ctx, "bill_versions"); err != nil || !ok { + return nil, err + } if ok, err := r.tableExists(ctx, "bill_diffs"); err != nil || !ok { return nil, err } @@ -181,6 +185,22 @@ func (r *Repository) GetBillVersionDiff(ctx context.Context, id, fromVersionID, return nil, err } + fromVersion, ok, err := r.billVersionByID(ctx, billID, fromVersionID) + if err != nil { + return nil, err + } + if !ok { + return nil, usecase.ErrVersionNotFound + } + + toVersion, ok, err := r.billVersionByID(ctx, billID, toVersionID) + if err != nil { + return nil, err + } + if !ok { + return nil, usecase.ErrVersionNotFound + } + var diffID string err = r.db.QueryRowContext(ctx, ` SELECT id @@ -194,14 +214,6 @@ func (r *Repository) GetBillVersionDiff(ctx context.Context, id, fromVersionID, return nil, fmt.Errorf("query bill diff sqlite artifact: %w", err) } - fromVersion, ok, err := r.billVersionByID(ctx, billID, fromVersionID) - if err != nil || !ok { - return nil, err - } - toVersion, ok, err := r.billVersionByID(ctx, billID, toVersionID) - if err != nil || !ok { - return nil, err - } clauses, err := r.billClauseDiffs(ctx, billID, diffID) if err != nil { return nil, err diff --git a/backend/bills/internal/adapter/sqlite/repository_test.go b/backend/bills/internal/adapter/sqlite/repository_test.go index 24875eb6..bf4fbd2c 100644 --- a/backend/bills/internal/adapter/sqlite/repository_test.go +++ b/backend/bills/internal/adapter/sqlite/repository_test.go @@ -46,12 +46,26 @@ func TestRepositoryGetBillVersionDiffMapsCurrentArtifactSchema(t *testing.T) { } } -func TestRepositoryGetBillVersionDiffReturnsNilForUnknownVersionPair(t *testing.T) { +func TestRepositoryGetBillVersionDiffReturnsVersionNotFoundForUnknownVersionPair(t *testing.T) { db := openDiffFixtureDB(t) defer db.Close() repo := New(db) diff, err := repo.GetBillVersionDiff(context.Background(), "C-2", "v1", "missing") + if !errors.Is(err, usecase.ErrVersionNotFound) { + t.Fatalf("error = %v, want ErrVersionNotFound", err) + } + if diff != nil { + t.Fatalf("diff = %+v, want nil", diff) + } +} + +func TestRepositoryGetBillVersionDiffReturnsNilWhenVersionsExistButNoDiff(t *testing.T) { + db := openDiffFixtureDB(t) + defer db.Close() + repo := New(db) + + diff, err := repo.GetBillVersionDiff(context.Background(), "C-2", "v2", "v1") if err != nil { t.Fatalf("GetBillVersionDiff error: %v", err) } diff --git a/backend/bills/internal/usecase/open_bills_index.go b/backend/bills/internal/usecase/open_bills_index.go index a605a808..5c90da3a 100644 --- a/backend/bills/internal/usecase/open_bills_index.go +++ b/backend/bills/internal/usecase/open_bills_index.go @@ -14,6 +14,7 @@ var ( ErrBillNotFound = errors.New("bill not found") ErrDiffMissingFrom = errors.New("missing required from version id") ErrDiffMissingTo = errors.New("missing required to version id") + ErrVersionNotFound = errors.New("version not found") ) type ManifestLoader interface { diff --git a/backend/bills/main.go b/backend/bills/main.go index 03170bd6..e9a0f3b8 100644 --- a/backend/bills/main.go +++ b/backend/bills/main.go @@ -288,6 +288,8 @@ func mapBillVersionDiffError(err error) events.APIGatewayProxyResponse { return jsonError(http.StatusBadRequest, "missing required query parameter: to") case errors.Is(err, usecase.ErrBillNotFound): return jsonError(http.StatusNotFound, "bill not found") + case errors.Is(err, usecase.ErrVersionNotFound): + return jsonError(http.StatusNotFound, "version not found") default: slog.Error("load bill version diff request failed", "error", err) return jsonError(http.StatusInternalServerError, "internal error") diff --git a/backend/bills/main_test.go b/backend/bills/main_test.go index 4efa0c65..d3221179 100644 --- a/backend/bills/main_test.go +++ b/backend/bills/main_test.go @@ -215,7 +215,7 @@ func TestHandleRequestBillVersionDiffUnknownBillReturns404(t *testing.T) { } } -func TestHandleRequestBillVersionDiffUnknownVersionsReturnsNoContent(t *testing.T) { +func TestHandleRequestBillVersionDiffUnknownVersionsReturns404(t *testing.T) { dir := t.TempDir() p45 := 45 writeBillSQLiteUnitFixture(t, dir, []Bill{ @@ -230,12 +230,12 @@ func TestHandleRequestBillVersionDiffUnknownVersionsReturnsNoContent(t *testing. if err != nil { t.Fatalf("HandleRequest error: %v", err) } - if resp.StatusCode != 204 { + if resp.StatusCode != 404 { t.Fatalf("status = %d, body = %s", resp.StatusCode, resp.Body) } } -func TestHandleRequestBillVersionDiffOneVersionBillReturnsNoContent(t *testing.T) { +func TestHandleRequestBillVersionDiffOneVersionBillReturns404(t *testing.T) { dir := t.TempDir() p45 := 45 writeBillSQLiteUnitFixture(t, dir, []Bill{ @@ -250,6 +250,26 @@ func TestHandleRequestBillVersionDiffOneVersionBillReturnsNoContent(t *testing.T if err != nil { t.Fatalf("HandleRequest error: %v", err) } + if resp.StatusCode != 404 { + t.Fatalf("status = %d, body = %s", resp.StatusCode, resp.Body) + } +} + +func TestHandleRequestBillVersionDiffVersionsExistButNoDiffReturns204(t *testing.T) { + dir := t.TempDir() + p45 := 45 + writeBillSQLiteUnitFixture(t, dir, []Bill{ + {ID: "C-2287", Number: "C-2287", Title: "Diff Act", Status: "InProgress", Parliament: &p45}, + }) + withLocalIndex(t, dir) + + resp, err := HandleRequest(context.Background(), events.APIGatewayProxyRequest{ + Path: "/api/v1/bills/C-2287/diff", + QueryStringParameters: map[string]string{"from": "C-2287-v2", "to": "C-2287-v1"}, + }) + if err != nil { + t.Fatalf("HandleRequest error: %v", err) + } if resp.StatusCode != 204 { t.Fatalf("status = %d, body = %s", resp.StatusCode, resp.Body) }