getMocks(); $request->server = new ServerBag(); $request->server->set('REQUEST_TIME_FLOAT', 0.0123456789); $engine->expects($this->once()) ->method('get') ->willReturnCallback(function ($path, $data) { $this->assertEquals('/metrics', $path); $this->assertArrayHasKey('info', $data); $this->assertArrayHasKey('users', $data); $this->assertArrayHasKey('licenses', $data); $this->assertArrayHasKey('users_working', $data); $this->assertArrayHasKey('work_seconds', $data); $this->assertArrayHasKey('worklog_seconds', $data); $this->assertArrayHasKey('vouchers', $data); $this->assertArrayHasKey('tshirts_issued', $data); $this->assertArrayHasKey('tshirt_sizes', $data); $this->assertArrayHasKey('locales', $data); $this->assertArrayHasKey('themes', $data); $this->assertArrayHasKey('shifts', $data); $this->assertArrayHasKey('announcements', $data); $this->assertArrayHasKey('questions', $data); $this->assertArrayHasKey('messages', $data); $this->assertArrayHasKey('password_resets', $data); $this->assertArrayHasKey('registration_enabled', $data); $this->assertArrayHasKey('database', $data); $this->assertArrayHasKey('sessions', $data); $this->assertArrayHasKey('oauth', $data); $this->assertArrayHasKey('log_entries', $data); $this->assertArrayHasKey('scrape_duration_seconds', $data); $this->assertArraySubset(['tshirt_sizes' => [ 'type' => 'gauge', ['labels' => ['size' => 'L'], 2], ['labels' => ['size' => 'XL'], 0] ]], $data); return 'metrics return'; }); $response->expects($this->once()) ->method('withHeader') ->with('Content-Type', 'text/plain; version=0.0.4') ->willReturn($response); $response->expects($this->once()) ->method('withContent') ->with('metrics return') ->willReturn($response); $stats->expects($this->exactly(6)) ->method('licenses') ->withConsecutive(['has_car'], ['forklift'], ['car'], ['3.5t'], ['7.5t'], ['12t']) ->willReturnOnConsecutiveCalls(6, 3, 15, 9, 7, 1); $stats->expects($this->exactly(2)) ->method('arrivedUsers') ->withConsecutive([false], [true]) ->willReturnOnConsecutiveCalls(7, 43); $stats->expects($this->exactly(2)) ->method('currentlyWorkingUsers') ->withConsecutive([false], [true]) ->willReturnOnConsecutiveCalls(10, 1); $stats->expects($this->exactly(3)) ->method('workSeconds') ->withConsecutive([true, false], [false, false], [null, true]) ->willReturnOnConsecutiveCalls(60 * 37, 60 * 251, 60 * 3); $stats->expects($this->exactly(2)) ->method('announcements') ->withConsecutive([false], [true]) ->willReturnOnConsecutiveCalls(18, 7); $stats->expects($this->exactly(2)) ->method('questions') ->withConsecutive([true], [false]) ->willReturnOnConsecutiveCalls(5, 0); $stats->expects($this->exactly(8)) ->method('logEntries') ->withConsecutive( [LogLevel::EMERGENCY], [LogLevel::ALERT], [LogLevel::CRITICAL], [LogLevel::ERROR], [LogLevel::WARNING], [LogLevel::NOTICE], [LogLevel::INFO], [LogLevel::DEBUG] ) ->willReturnOnConsecutiveCalls(0, 1, 0, 5, 999, 4, 55, 3); $this->setExpects($stats, 'newUsers', null, 9); $this->setExpects($stats, 'worklogSeconds', null, 39 * 60 * 60); $this->setExpects($stats, 'vouchers', null, 17); $this->setExpects($stats, 'tshirts', null, 3); $this->setExpects($stats, 'tshirtSizes', null, new Collection([ ['shirt_size' => 'L', 'count' => 2], ])); $this->setExpects($stats, 'languages', null, new Collection([ ['language' => 'en_US', 'count' => 5], ])); $this->setExpects($stats, 'themes', null, new Collection([ ['theme' => '1', 'count' => 3], ])); $this->setExpects($stats, 'oauth', null, new Collection([ ['provider' => 'test', 'count' => 2], ])); $this->setExpects($stats, 'shifts', null, 142); $this->setExpects($stats, 'messages', null, 3); $this->setExpects($stats, 'passwordResets', null, 1); $this->setExpects($stats, 'sessions', null, 1234); $config->set('registration_enabled', 1); $config->set('tshirt_sizes', [ 'L' => 'Large', 'XL' => 'X Large', ]); $config->set('locales', [ 'de_DE' => 'German', 'en_US' => 'US English', ]); $config->set('themes', [ 0 => ['name' => 'Nothing'], 1 => ['name' => 'Testing'], ]); $config->set('metrics', [ 'work' => [60 * 60], 'voucher' => [1], ]); $config->set('oauth', [ 'test' => ['name' => 'Test'], ]); $this->setExpects($version, 'getVersion', [], '0.42.42'); $controller = new Controller($response, $engine, $config, $request, $stats, $version); $controller->metrics(); } /** * @covers \Engelsystem\Controllers\Metrics\Controller::checkAuth * @covers \Engelsystem\Controllers\Metrics\Controller::stats */ public function testStats(): void { /** @var Response|MockObject $response */ /** @var Request|MockObject $request */ /** @var MetricsEngine|MockObject $engine */ /** @var Stats|MockObject $stats */ /** @var Config $config */ /** @var Version|MockObject $version */ list($response, $request, $engine, $stats, $config, $version) = $this->getMocks(); $response->expects($this->once()) ->method('withHeader') ->with('Content-Type', 'application/json') ->willReturn($response); $response->expects($this->once()) ->method('withContent') ->with(json_encode([ 'user_count' => 13, 'arrived_user_count' => 10, 'done_work_hours' => 99, 'users_in_action' => 5, ])) ->willReturn($response); $request->expects($this->once()) ->method('get') ->with('api_key') ->willReturn('ApiKey987'); $config->set('api_key', 'ApiKey987'); $stats->expects($this->once()) ->method('workSeconds') ->with(true) ->willReturn((int)(60 * 60 * 99.47)); $this->setExpects($stats, 'newUsers', null, 3); $this->setExpects($stats, 'arrivedUsers', null, 10, $this->exactly(2)); $this->setExpects($stats, 'currentlyWorkingUsers', null, 5); $controller = new Controller($response, $engine, $config, $request, $stats, $version); $controller->stats(); } /** * @covers \Engelsystem\Controllers\Metrics\Controller::checkAuth */ public function testCheckAuth(): void { /** @var Response|MockObject $response */ /** @var Request|MockObject $request */ /** @var MetricsEngine|MockObject $engine */ /** @var Stats|MockObject $stats */ /** @var Config $config */ /** @var Version|MockObject $version */ list($response, $request, $engine, $stats, $config, $version) = $this->getMocks(); $request->expects($this->once()) ->method('get') ->with('api_key') ->willReturn('LoremIpsum!'); $config->set('api_key', 'fooBar!'); $controller = new Controller($response, $engine, $config, $request, $stats, $version); $this->expectException(HttpForbidden::class); $this->expectExceptionMessage(json_encode(['error' => 'The api_key is invalid'])); $controller->stats(); } protected function getMocks(): array { /** @var Response|MockObject $response */ $response = $this->createMock(Response::class); /** @var Request|MockObject $request */ $request = $this->createMock(Request::class); /** @var MetricsEngine|MockObject $engine */ $engine = $this->createMock(MetricsEngine::class); /** @var Stats|MockObject $stats */ $stats = $this->createMock(Stats::class); $config = new Config(); $version = $this->createMock(Version::class); return [$response, $request, $engine, $stats, $config, $version]; } }