package store_test import ( "context" "testing" "time" "github.com/netcell-it/deklarix/internal/store" ) func testRegistereintragInput(accountID, antragID, entscheidungID string) store.RegistereintragInput { gueltigBis := time.Now().Add(365 * 24 * time.Hour).Truncate(time.Millisecond) return store.RegistereintragInput{ AccountID: accountID, AntragID: antragID, EntscheidungID: entscheidungID, Zweck: "Angebotstexte generieren", Abteilung: "Vertrieb", Werkzeug: "ChatGPT Enterprise", Datenklasse: "personenbezogen", Einstufung: "minimal", Auflagen: []string{"AVV erforderlich", "kein Training auf Eingaben"}, Verantwortlicher: "verantwortlicher@example.com", EntschiedenAm: time.Now().Truncate(time.Millisecond), GueltigBis: &gueltigBis, } } func testEntscheidungID(t *testing.T, s *store.Store, antragID, bewertungID, userID string) string { t.Helper() e, err := s.CreateEntscheidung(context.Background(), store.EntscheidungInput{ AntragID: antragID, BewertungID: bewertungID, EntscheiderUserID: userID, Entscheidung: "genehmigt", }) if err != nil { t.Fatalf("CreateEntscheidung: %v", err) } return e.ID } func TestRegistereintragCreateAndList(t *testing.T) { s := openTestStore(t) ctx := context.Background() accID := testAccountID(t, s) userID := testUserID(t, s, accID) antrag, bewertung := testAntragMitBewertung(t, s, accID, userID) entscheidungID := testEntscheidungID(t, s, antrag.ID, bewertung.ID, userID) e, err := s.CreateRegistereintrag(ctx, testRegistereintragInput(accID, antrag.ID, entscheidungID)) if err != nil { t.Fatalf("CreateRegistereintrag: %v", err) } if e.Werkzeug != "ChatGPT Enterprise" || len(e.Auflagen) != 2 { t.Fatalf("CreateRegistereintrag = %+v, unerwartete Werte", e) } list, err := s.ListRegistereintraegeForAccount(ctx, accID) if err != nil { t.Fatalf("ListRegistereintraegeForAccount: %v", err) } if len(list) != 1 || list[0].ID != e.ID { t.Fatalf("ListRegistereintraegeForAccount = %+v, want exactly one entry", list) } } func TestRegistereintragIsolatesTenants(t *testing.T) { s := openTestStore(t) ctx := context.Background() accA := testAccountID(t, s) userA := testUserID(t, s, accA) antragA, bewertungA := testAntragMitBewertung(t, s, accA, userA) entscheidungA := testEntscheidungID(t, s, antragA.ID, bewertungA.ID, userA) if _, err := s.CreateRegistereintrag(ctx, testRegistereintragInput(accA, antragA.ID, entscheidungA)); err != nil { t.Fatalf("CreateRegistereintrag (A): %v", err) } accB := testAccountID(t, s) list, err := s.ListRegistereintraegeForAccount(ctx, accB) if err != nil { t.Fatalf("ListRegistereintraegeForAccount (B): %v", err) } if len(list) != 0 { t.Fatalf("expected no registereintraege for a different tenant, got %+v", list) } } func TestRegistereintragIsAppendOnly(t *testing.T) { s := openTestStore(t) ctx := context.Background() accID := testAccountID(t, s) userID := testUserID(t, s, accID) antrag, bewertung := testAntragMitBewertung(t, s, accID, userID) entscheidungID := testEntscheidungID(t, s, antrag.ID, bewertung.ID, userID) e, err := s.CreateRegistereintrag(ctx, testRegistereintragInput(accID, antrag.ID, entscheidungID)) if err != nil { t.Fatalf("CreateRegistereintrag: %v", err) } _, err = s.Pool.Exec(ctx, `UPDATE registereintrag SET werkzeug = 'geaendert' WHERE id = $1`, e.ID) if err == nil { t.Fatal("expected UPDATE on registereintrag to be rejected by the append-only trigger") } _, err = s.Pool.Exec(ctx, `DELETE FROM registereintrag WHERE id = $1`, e.ID) if err == nil { t.Fatal("expected DELETE on registereintrag to be rejected by the append-only trigger") } }