controller = new KpiController(new KpiRepository(Database::inMemory())); } public function testReportRejectsMissingValue(): void { $response = $this->controller->report(Request::create('POST', '/api/v1/kpis/open_tickets', body: []), ['key' => 'open_tickets']); self::assertSame(422, $response->status); } public function testReportRejectsNonNumericValue(): void { $response = $this->controller->report( Request::create('POST', '/api/v1/kpis/open_tickets', body: ['value' => 'abc']), ['key' => 'open_tickets'] ); self::assertSame(422, $response->status); } public function testReportReturns201WithKpi(): void { $response = $this->controller->report( Request::create('POST', '/api/v1/kpis/open_tickets', body: ['value' => 3]), ['key' => 'open_tickets'] ); self::assertSame(201, $response->status); self::assertSame(3.0, $response->body()['kpi']['current_value']); } public function testIndexListsKpis(): void { $this->controller->report(Request::create('POST', '/x', body: ['value' => 1]), ['key' => 'a']); $response = $this->controller->index(Request::create('GET', '/api/v1/kpis')); self::assertCount(1, $response->body()['kpis']); } }