Move this over to integration testing
This commit is contained in:
		
							parent
							
								
									c7fba40ba3
								
							
						
					
					
						commit
						088a7cd5a7
					
				
							
								
								
									
										152
									
								
								tests/Integration/Api/Daemon/DaemonAuthenticateTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								tests/Integration/Api/Daemon/DaemonAuthenticateTest.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,152 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace App\Tests\Integration\Api\Daemon; | ||||||
|  | 
 | ||||||
|  | use App\Http\Middleware\Api\Daemon\DaemonAuthenticate; | ||||||
|  | use App\Models\Node; | ||||||
|  | use App\Tests\Unit\Http\Middleware\MiddlewareTestCase; | ||||||
|  | use Illuminate\Contracts\Encryption\Encrypter; | ||||||
|  | use Illuminate\Database\Eloquent\ModelNotFoundException; | ||||||
|  | use Mockery as m; | ||||||
|  | use Mockery\MockInterface; | ||||||
|  | use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | ||||||
|  | use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; | ||||||
|  | use Symfony\Component\HttpKernel\Exception\HttpException; | ||||||
|  | 
 | ||||||
|  | class DaemonAuthenticateTest extends MiddlewareTestCase | ||||||
|  | { | ||||||
|  |     private MockInterface $encrypter; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Setup tests. | ||||||
|  |      */ | ||||||
|  |     public function setUp(): void | ||||||
|  |     { | ||||||
|  |         parent::setUp(); | ||||||
|  | 
 | ||||||
|  |         $this->encrypter = m::mock(Encrypter::class); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Test that if we are accessing the daemon configuration route this middleware is not | ||||||
|  |      * applied in order to allow an unauthenticated request to use a token to grab data. | ||||||
|  |      */ | ||||||
|  |     public function testResponseShouldContinueIfRouteIsExempted() | ||||||
|  |     { | ||||||
|  |         $this->request->expects('route->getName')->withNoArgs()->andReturn('daemon.configuration'); | ||||||
|  | 
 | ||||||
|  |         $this->getMiddleware()->handle($this->request, $this->getClosureAssertions()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Test that not passing in the bearer token will result in a HTTP/401 error with the | ||||||
|  |      * proper response headers. | ||||||
|  |      */ | ||||||
|  |     public function testResponseShouldFailIfNoTokenIsProvided() | ||||||
|  |     { | ||||||
|  |         $this->request->expects('route->getName')->withNoArgs()->andReturn('random.route'); | ||||||
|  |         $this->request->expects('bearerToken')->withNoArgs()->andReturnNull(); | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             $this->getMiddleware()->handle($this->request, $this->getClosureAssertions()); | ||||||
|  |         } catch (HttpException $exception) { | ||||||
|  |             $this->assertEquals(401, $exception->getStatusCode(), 'Assert that a status code of 401 is returned.'); | ||||||
|  |             $this->assertTrue(is_array($exception->getHeaders()), 'Assert that an array of headers is returned.'); | ||||||
|  |             $this->assertArrayHasKey('WWW-Authenticate', $exception->getHeaders(), 'Assert exception headers contains WWW-Authenticate.'); | ||||||
|  |             $this->assertEquals('Bearer', $exception->getHeaders()['WWW-Authenticate']); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Test that passing in an invalid node daemon secret will result in a bad request | ||||||
|  |      * exception being returned. | ||||||
|  |      * | ||||||
|  |      * @dataProvider badTokenDataProvider | ||||||
|  |      */ | ||||||
|  |     public function testResponseShouldFailIfTokenFormatIsIncorrect(string $token) | ||||||
|  |     { | ||||||
|  |         $this->expectException(BadRequestHttpException::class); | ||||||
|  | 
 | ||||||
|  |         $this->request->expects('route->getName')->withNoArgs()->andReturn('random.route'); | ||||||
|  |         $this->request->expects('bearerToken')->withNoArgs()->andReturn($token); | ||||||
|  | 
 | ||||||
|  |         $this->getMiddleware()->handle($this->request, $this->getClosureAssertions()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Test that an access denied error is returned if the node is valid but the token | ||||||
|  |      * provided is not valid. | ||||||
|  |      */ | ||||||
|  |     public function testResponseShouldFailIfTokenIsNotValid() | ||||||
|  |     { | ||||||
|  |         $node = Node::factory()->create(); | ||||||
|  | 
 | ||||||
|  |         $this->expectException(AccessDeniedHttpException::class); | ||||||
|  | 
 | ||||||
|  |         $this->request->expects('route->getName')->withNoArgs()->andReturn('random.route'); | ||||||
|  |         $this->request->expects('bearerToken')->withNoArgs()->andReturn($node->daemon_token_id . '.random_string_123'); | ||||||
|  | 
 | ||||||
|  |         $this->encrypter->expects('decrypt')->with($node->daemon_token)->andReturns(decrypt($node->daemon_token)); | ||||||
|  | 
 | ||||||
|  |         $this->getMiddleware()->handle($this->request, $this->getClosureAssertions()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Test that an access denied exception is returned if the node is not found using | ||||||
|  |      * the token ID provided. | ||||||
|  |      */ | ||||||
|  |     public function testResponseShouldFailIfNodeIsNotFound() | ||||||
|  |     { | ||||||
|  |         $this->expectException(ModelNotFoundException::class); | ||||||
|  | 
 | ||||||
|  |         $this->request->expects('route->getName')->withNoArgs()->andReturn('random.route'); | ||||||
|  |         $this->request->expects('bearerToken')->withNoArgs()->andReturn('abcd1234.random_string_123'); | ||||||
|  | 
 | ||||||
|  |         $this->getMiddleware()->handle($this->request, $this->getClosureAssertions()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Test a successful middleware process. | ||||||
|  |      */ | ||||||
|  |     public function testSuccessfulMiddlewareProcess() | ||||||
|  |     { | ||||||
|  |         $node = Node::factory()->create(); | ||||||
|  |         $node->daemon_token = encrypt('the_same'); | ||||||
|  |         $node->save(); | ||||||
|  | 
 | ||||||
|  |         $this->request->expects('route->getName')->withNoArgs()->andReturn('random.route'); | ||||||
|  |         $this->request->expects('bearerToken')->withNoArgs()->andReturn($node->daemon_token_id . '.the_same'); | ||||||
|  |         $this->encrypter->expects('decrypt')->with($node->daemon_token)->andReturns(decrypt($node->daemon_token)); | ||||||
|  | 
 | ||||||
|  |         $this->getMiddleware()->handle($this->request, $this->getClosureAssertions()); | ||||||
|  |         $this->assertRequestHasAttribute('node'); | ||||||
|  |         $this->assertRequestAttributeEquals($node->fresh(), 'node'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Provides different tokens that should trigger a bad request exception due to | ||||||
|  |      * their formatting. | ||||||
|  |      * | ||||||
|  |      * @return array|\string[][] | ||||||
|  |      */ | ||||||
|  |     public static function badTokenDataProvider(): array | ||||||
|  |     { | ||||||
|  |         return [ | ||||||
|  |             ['foo'], | ||||||
|  |             ['foobar'], | ||||||
|  |             ['foo-bar'], | ||||||
|  |             ['foo.bar.baz'], | ||||||
|  |             ['.foo'], | ||||||
|  |             ['foo.'], | ||||||
|  |             ['foo..bar'], | ||||||
|  |         ]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Return an instance of the middleware using mocked dependencies. | ||||||
|  |      */ | ||||||
|  |     private function getMiddleware(): DaemonAuthenticate | ||||||
|  |     { | ||||||
|  |         return new DaemonAuthenticate($this->encrypter); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Lance Pioch
						Lance Pioch