feat(quick-260910-jab): listForUser binden, die vier Aufzeichnungen im Quelltext richtigstellen
- TenderRssFeedSourceService.listForUser() nimmt jetzt (userId, tenantId) entgegen und laeuft ueber einen gebundenen Klienten (forTenant) — die neue Leseregel schliesst plattformweite Zeilen ein, die Reparatur haette den ungebundenen Pfad sonst still auf nur die plattformweiten Zeilen reduziert (Befund F). createPlatform/remove bleiben bewusst ungebunden, Kommentare an der neuen Regel richtiggestellt. - TendersController.listRssFeeds reicht die Mandantenkennung aus dem Aufrufzusammenhang durch. - Vier Aufzeichnungen im Quelltext (module-access.service.ts, groups.service.ts, module-grants.service.ts, rls-coverage.spec.ts) sagen jetzt, dass die Datenbankregel seit 20260910120000_rls_widen_membership_ grant_and_platform_read beide Seiten prueft; die Anwendungspruefungen bleiben unveraendert bestehen (zweites Netz, wirkt vor dem Scharfschalten als einziger Schutz). - Zwei-Klienten-Nachweis in module-grants.service.spec.ts ergaenzt (Kommentar, warum die beiden Cross-Tenant-Tests nach der Regelaenderung nicht entfallen duerfen) und in tender-rss-feed.service.spec.ts umgekehrt (listForUser bindet jetzt). - Rule 1: implizites any beim Destrukturieren in listRssFeeds (feeds ist seit der Bindung `any`) mit expliziter Annotation behoben. - Falsifizierungsnachweis durchgefuehrt: Bindungsaufruf zurueckgenommen, genau ein Test wurde rot (AssertionError, 0 statt der erwarteten Aufrufe), Ruecknahme rueckgaengig gemacht. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AMASaSxv5QMY7RncqZriRR
This commit is contained in:
@@ -104,7 +104,7 @@ function makeFakeRequest(userId = 'u1', tenantId = 'tenant1', role: Role = Role.
|
||||
*/
|
||||
function makeFakeRssFeedService() {
|
||||
return {
|
||||
listForUser: vi.fn(async (_userId: string) => [] as any[]),
|
||||
listForUser: vi.fn(async (_userId: string, _tenantId: string) => [] as any[]),
|
||||
createForUser: vi.fn(
|
||||
async (ctx: { userId: string; tenantId: string }, dto: any) => ({
|
||||
id: 'feed-1',
|
||||
@@ -901,7 +901,7 @@ describe('TendersController — listTenders favOnly wiring (UI-04, T-11-10/11)',
|
||||
});
|
||||
|
||||
describe('TendersController — RSS-feeds personal + platform-wide (Plan 14-02 D-14/D-08, ownership split Phase 17 Plan 02 D-02)', () => {
|
||||
it('GET /rss-feeds delegates to tenderRssFeedSource.listForUser(userId) and maps isPlatformWide, stripping userId', async () => {
|
||||
it('GET /rss-feeds delegates to tenderRssFeedSource.listForUser(userId, tenantId) and maps isPlatformWide, stripping userId', async () => {
|
||||
const prisma = makeFakePrisma();
|
||||
const scheduler = { setInterval: vi.fn(), stopJob: vi.fn() } as any;
|
||||
const rssFeedService = makeFakeRssFeedService();
|
||||
@@ -921,7 +921,7 @@ describe('TendersController — RSS-feeds personal + platform-wide (Plan 14-02 D
|
||||
|
||||
const result = await controller.listRssFeeds(makeFakeRequest('u1', 'tenant1'));
|
||||
|
||||
expect(rssFeedService.listForUser).toHaveBeenCalledWith('u1');
|
||||
expect(rssFeedService.listForUser).toHaveBeenCalledWith('u1', 'tenant1');
|
||||
expect(result).toEqual([
|
||||
{ id: 'f1', url: 'https://service.bund.de/rss.xml', label: 'service-bund', isPlatformWide: true },
|
||||
{ id: 'f2', url: 'https://mine.invalid/rss.xml', label: 'mine', isPlatformWide: false },
|
||||
|
||||
Reference in New Issue
Block a user