// IMP-09: Tenant-Scoping-Nachweis für den Postfach-Abruf // (Akzeptanzkriterium 2). Bekannten Fehler vermeiden (known-issues- // archivmail.md #4): Import-nahe Module waren praktisch ungetestet — // dieser Test schließt eine reale Lücke, die vor IMP-09 bestand: kein // bestehender Test bewies bislang, dass zwei Mandanten mit DEMSELBEN // Postfachnamen sich nicht gegenseitig beeinflussen. package imapimport import ( "context" "testing" ) func TestScheduler_TenantScopingIsolatesSyncState(t *testing.T) { store := setupStore(t) scheduler := NewScheduler(store) ctx := context.Background() tenantA := "mandant-imp09-tenant-a" tenantB := "mandant-imp09-tenant-b" const mailbox = "INBOX" // BEWUSST derselbe Postfachname bei beiden Mandanten clientA := &fakeIMAPClient{uidvalidity: 1, messages: []RemoteMessage{{UID: 1}, {UID: 2}}} clientB := &fakeIMAPClient{uidvalidity: 1, messages: []RemoteMessage{{UID: 1}, {UID: 2}, {UID: 3}}} handlerA := &recordingHandler{} resultA, err := scheduler.RunOnce(ctx, tenantA, mailbox, clientA, handlerA) if err != nil { t.Fatalf("mandant a: %v", err) } if resultA.NewMessages != 2 { t.Fatalf("mandant a: erwartete 2 neue nachrichten, habe %d", resultA.NewMessages) } handlerB := &recordingHandler{} resultB, err := scheduler.RunOnce(ctx, tenantB, mailbox, clientB, handlerB) if err != nil { t.Fatalf("mandant b: %v", err) } // Entscheidender Nachweis: Mandant B startet trotz identischem // Postfachnamen bei UID 0 — sähe er fälschlich den Zustand von // Mandant A (UID 2 bereits synchronisiert), würden hier nur 1 statt // 3 neue Nachrichten gezählt. if resultB.NewMessages != 3 { t.Fatalf("mandant b: erwartete 3 neue nachrichten (kein zustand von mandant a übernommen), habe %d", resultB.NewMessages) } stateA, err := store.Get(ctx, tenantA, mailbox) if err != nil { t.Fatalf("zustand mandant a: %v", err) } stateB, err := store.Get(ctx, tenantB, mailbox) if err != nil { t.Fatalf("zustand mandant b: %v", err) } if stateA.LastSyncedUID != 2 { t.Fatalf("mandant a: erwartete last_synced_uid=2, habe %d", stateA.LastSyncedUID) } if stateB.LastSyncedUID != 3 { t.Fatalf("mandant b: erwartete last_synced_uid=3, habe %d", stateB.LastSyncedUID) } }