withAttribute('protocol', 'http'); RedisClient::expects('getAllRouters') ->with(ProtocolEnum::HTTP) ->andReturn(['route1', 'route2']); $controller = new RoutesController(); $response = $controller->get($request); $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals('["route1","route2"]', (string)$response->getBody()); $this->assertEquals('application/json', $response->getHeaderLine('Content-Type')); } /** * @throws \JsonException */ public function testGetInd(): void { $request = new ServerRequest('GET', '/routes/foo'); $request = $request ->withAttribute('protocol', 'http') ->withAttribute('id', 'foo'); RedisClient::expects('getRouter') ->with('foo', ProtocolEnum::HTTP) ->andReturn([ 'traefik/http/routers/foo' => 'bar', ]); $controller = new RoutesController(); $response = $controller->get($request); $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals('{"traefik\/http\/routers\/foo":"bar"}', (string)$response->getBody()); $this->assertEquals('application/json', $response->getHeaderLine('Content-Type')); } /** * @throws \JsonException */ public function testDelete(): void { $request = new ServerRequest('DELETE', '/routes/foo'); $request = $request ->withAttribute('protocol', 'http') ->withAttribute('id', 'foo'); RedisClient::expects('deleteAllKeys') ->with('foo', EntityEnum::ROUTER, ProtocolEnum::HTTP) ->andReturn(true); $controller = new RoutesController(); $response = $controller->delete($request); $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals('{"message":"Router deleted successfully"}', (string)$response->getBody()); } /** * @throws \JsonException */ public function testPost(): void { $request = new ServerRequest('POST', '/routes/foo'); $request = $request ->withAttribute('protocol', 'http') ->withAttribute('id', 'foo') ->withParsedBody([ 'service' => 'my-service', 'rule' => 'Host(`example.com`)', ]); RedisClient::expects('createOrReplace') ->with( 'foo', [ 'service' => 'my-service', 'rule' => 'Host(`example.com`)', ], EntityEnum::ROUTER, ProtocolEnum::HTTP ) ->andReturn(true); $controller = new RoutesController(); $response = $controller->post($request); $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals('{"message":"Router created successfully"}', (string)$response->getBody()); } /** * @throws \JsonException */ public function testPostWithoutService(): void { $request = new ServerRequest('POST', '/routes/foo'); $request = $request ->withAttribute('protocol', 'http') ->withAttribute('id', 'foo') ->withParsedBody([ 'rule' => 'Host(`example.com`)', ]); $controller = new RoutesController(); $response = $controller->post($request); $this->assertEquals(400, $response->getStatusCode()); $this->assertEquals('{"error":"Service is required"}', (string)$response->getBody()); } /** * @throws \JsonException */ public function testPostWithoutRule(): void { $request = new ServerRequest('POST', '/routes/foo'); $request = $request ->withAttribute('protocol', 'http') ->withAttribute('id', 'foo') ->withParsedBody([ 'service' => 'my-service', ]); $controller = new RoutesController(); $response = $controller->post($request); $this->assertEquals(400, $response->getStatusCode()); $this->assertEquals('{"error":"Rule is required"}', (string)$response->getBody()); } }