reader = $this->createMock(PaginatedClassesReader::class); $this->cache = new PaginatedQueryCache( new TagAwareAdapter(new ArrayAdapter()), ); $this->handler = new GetClassesHandler($this->reader, $this->cache); } #[Test] public function returnsItemsForTenant(): void { $dto = $this->createClassDto(); $this->reader->method('findPaginated')->willReturn( new PaginatedResult(items: [$dto], total: 1, page: 1, limit: 30), ); $result = ($this->handler)(new GetClassesQuery(tenantId: 'tenant-1', academicYearId: 'year-1')); self::assertCount(1, $result->items); self::assertSame(1, $result->total); } #[Test] public function mapsDtoFields(): void { $dto = $this->createClassDto(); $this->reader->method('findPaginated')->willReturn( new PaginatedResult(items: [$dto], total: 1, page: 1, limit: 30), ); $result = ($this->handler)(new GetClassesQuery(tenantId: 'tenant-1', academicYearId: 'year-1')); $item = $result->items[0]; self::assertSame('class-1', $item->id); self::assertSame('6eme A', $item->name); self::assertSame('sixieme', $item->level); self::assertSame(30, $item->capacity); self::assertSame('active', $item->status); self::assertSame('Description test', $item->description); } #[Test] public function paginatesResults(): void { $this->reader->method('findPaginated')->willReturn( new PaginatedResult(items: [], total: 50, page: 2, limit: 10), ); $result = ($this->handler)(new GetClassesQuery(tenantId: 'tenant-1', academicYearId: 'year-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->createClassDto(); $this->reader->expects(self::once())->method('findPaginated')->willReturn( new PaginatedResult(items: [$dto], total: 1, page: 1, limit: 30), ); $query = new GetClassesQuery(tenantId: 'tenant-1', academicYearId: 'year-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 GetClassesQuery(tenantId: 'tenant-1', academicYearId: 'year-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 GetClassesQuery(tenantId: 'tenant-1', academicYearId: 'year-1', limit: 500)); self::assertSame(100, $result->limit); } private function createClassDto(): ClassDto { return new ClassDto( id: 'class-1', name: '6eme A', level: 'sixieme', capacity: 30, status: 'active', description: 'Description test', createdAt: new DateTimeImmutable('2026-01-15'), updatedAt: new DateTimeImmutable('2026-01-15'), ); } }