reader = $this->createMock(PaginatedStudentImageRightsReader::class); $this->cache = new PaginatedQueryCache( new TagAwareAdapter(new ArrayAdapter()), ); $this->handler = new GetStudentsImageRightsHandler($this->reader, $this->cache); } #[Test] public function returnsItemsForTenant(): void { $dto = $this->createStudentImageRightsDto(); $this->reader->method('findPaginated')->willReturn( new PaginatedResult(items: [$dto], total: 1, page: 1, limit: 30), ); $result = ($this->handler)(new GetStudentsImageRightsQuery(tenantId: 'tenant-1')); self::assertCount(1, $result->items); self::assertSame(1, $result->total); } #[Test] public function mapsDtoFields(): void { $dto = $this->createStudentImageRightsDto(); $this->reader->method('findPaginated')->willReturn( new PaginatedResult(items: [$dto], total: 1, page: 1, limit: 30), ); $result = ($this->handler)(new GetStudentsImageRightsQuery(tenantId: 'tenant-1')); $item = $result->items[0]; self::assertSame('student-1', $item->id); self::assertSame('Alice', $item->firstName); self::assertSame('Dupont', $item->lastName); self::assertSame('alice@test.com', $item->email); self::assertSame('authorized', $item->imageRightsStatus); self::assertSame('Autorise', $item->imageRightsStatusLabel); self::assertSame('6eme A', $item->className); } #[Test] public function paginatesResults(): void { $this->reader->method('findPaginated')->willReturn( new PaginatedResult(items: [], total: 50, page: 2, limit: 10), ); $result = ($this->handler)(new GetStudentsImageRightsQuery(tenantId: 'tenant-1', page: 2, limit: 10)); self::assertSame(50, $result->total); self::assertSame(2, $result->page); self::assertSame(10, $result->limit); } #[Test] public function cachesResult(): void { $dto = $this->createStudentImageRightsDto(); $this->reader->expects(self::once())->method('findPaginated')->willReturn( new PaginatedResult(items: [$dto], total: 1, page: 1, limit: 30), ); $query = new GetStudentsImageRightsQuery(tenantId: 'tenant-1'); ($this->handler)($query); $result = ($this->handler)($query); self::assertCount(1, $result->items); } #[Test] public function clampsPageToMinimumOne(): void { $this->reader->method('findPaginated')->willReturn( new PaginatedResult(items: [], total: 0, page: 1, limit: 30), ); $result = ($this->handler)(new GetStudentsImageRightsQuery(tenantId: 'tenant-1', page: -5)); self::assertSame(1, $result->page); } #[Test] public function clampsLimitToMaximumHundred(): void { $this->reader->method('findPaginated')->willReturn( new PaginatedResult(items: [], total: 0, page: 1, limit: 100), ); $result = ($this->handler)(new GetStudentsImageRightsQuery(tenantId: 'tenant-1', limit: 500)); self::assertSame(100, $result->limit); } private function createStudentImageRightsDto(): StudentImageRightsDto { return new StudentImageRightsDto( id: 'student-1', firstName: 'Alice', lastName: 'Dupont', email: 'alice@test.com', imageRightsStatus: 'authorized', imageRightsStatusLabel: 'Autorise', imageRightsUpdatedAt: new DateTimeImmutable('2026-02-01'), className: '6eme A', ); } }