package store_test import ( "context" "errors" "testing" "github.com/netcell-it/deklarix/internal/store" ) func testUserID(t *testing.T, s *store.Store, accountID string) string { t.Helper() u, err := s.CreateUser(context.Background(), accountID, "mitarbeiter-"+accountID+"@example.com", "hash", "mitarbeiter") if err != nil { t.Fatalf("CreateUser: %v", err) } return u.ID } func TestAntragCRUD(t *testing.T) { s := openTestStore(t) ctx := context.Background() accID := testAccountID(t, s) userID := testUserID(t, s, accID) abt, err := s.CreateAbteilung(ctx, accID, "Vertrieb") if err != nil { t.Fatalf("CreateAbteilung: %v", err) } a, err := s.CreateAntrag(ctx, accID, userID, &abt.ID, "Angebotstexte generieren") if err != nil { t.Fatalf("CreateAntrag: %v", err) } if a.Status != "entwurf" { t.Fatalf("Status = %q, want entwurf", a.Status) } if a.AbteilungID == nil || *a.AbteilungID != abt.ID { t.Fatalf("AbteilungID = %v, want %q", a.AbteilungID, abt.ID) } got, err := s.GetAntrag(ctx, a.ID) if err != nil { t.Fatalf("GetAntrag: %v", err) } if got.Titel != "Angebotstexte generieren" { t.Fatalf("Titel = %q, unerwartet", got.Titel) } updated, err := s.UpdateAntragFelder(ctx, a.ID, "Angebotstexte generieren", "KI schreibt Angebotstexte", "Fertiger Text zur Freigabe", "gelegentlich", []byte(`{"b1":"nein"}`)) if err != nil { t.Fatalf("UpdateAntragFelder: %v", err) } if updated.Beschreibung != "KI schreibt Angebotstexte" || updated.Haeufigkeit != "gelegentlich" { t.Fatalf("UpdateAntragFelder = %+v, unerwartete Werte", updated) } if err := s.SetAntragStatus(ctx, a.ID, "eingereicht"); err != nil { t.Fatalf("SetAntragStatus: %v", err) } got, err = s.GetAntrag(ctx, a.ID) if err != nil { t.Fatalf("GetAntrag nach Statuswechsel: %v", err) } if got.Status != "eingereicht" { t.Fatalf("Status nach SetAntragStatus = %q, want eingereicht", got.Status) } } func TestGetAntragNotFound(t *testing.T) { s := openTestStore(t) _, err := s.GetAntrag(context.Background(), "00000000-0000-0000-0000-000000000000") if !errors.Is(err, store.ErrNotFound) { t.Fatalf("err = %v, want store.ErrNotFound", err) } } func TestSetAntragStatusNotFound(t *testing.T) { s := openTestStore(t) err := s.SetAntragStatus(context.Background(), "00000000-0000-0000-0000-000000000000", "eingereicht") if !errors.Is(err, store.ErrNotFound) { t.Fatalf("err = %v, want store.ErrNotFound", err) } } func TestListAntraegeForUserOnlyReturnsOwnAntraege(t *testing.T) { s := openTestStore(t) ctx := context.Background() accID := testAccountID(t, s) userA := testUserID(t, s, accID) userB, err := s.CreateUser(ctx, accID, "zweiter-mitarbeiter-"+accID+"@example.com", "hash", "mitarbeiter") if err != nil { t.Fatalf("CreateUser: %v", err) } if _, err := s.CreateAntrag(ctx, accID, userA, nil, "Antrag von A"); err != nil { t.Fatalf("CreateAntrag (A): %v", err) } if _, err := s.CreateAntrag(ctx, accID, userB.ID, nil, "Antrag von B"); err != nil { t.Fatalf("CreateAntrag (B): %v", err) } listA, err := s.ListAntraegeForUser(ctx, userA) if err != nil { t.Fatalf("ListAntraegeForUser: %v", err) } if len(listA) != 1 || listA[0].Titel != "Antrag von A" { t.Fatalf("ListAntraegeForUser(A) = %+v, want exactly Antrag von A", listA) } } func TestListAntraegeForAccountIsolatesTenants(t *testing.T) { s := openTestStore(t) ctx := context.Background() accA := testAccountID(t, s) accB := testAccountID(t, s) userA := testUserID(t, s, accA) userB := testUserID(t, s, accB) if _, err := s.CreateAntrag(ctx, accA, userA, nil, "Antrag A"); err != nil { t.Fatalf("CreateAntrag (A): %v", err) } if _, err := s.CreateAntrag(ctx, accB, userB, nil, "Antrag B"); err != nil { t.Fatalf("CreateAntrag (B): %v", err) } listA, err := s.ListAntraegeForAccount(ctx, accA) if err != nil { t.Fatalf("ListAntraegeForAccount (A): %v", err) } if len(listA) != 1 || listA[0].Titel != "Antrag A" { t.Fatalf("ListAntraegeForAccount (A) = %+v, want exactly Antrag A", listA) } }