add test
This commit is contained in:
		
							
								
								
									
										182
									
								
								tests/Unit/Services/MetadataResolverServiceTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								tests/Unit/Services/MetadataResolverServiceTest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,182 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Tests\Unit\Services;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use App\MetadataResolver\MetadataResolver;
 | 
				
			||||||
 | 
					use App\MetadataResolver\ResolverCircuitBreakException;
 | 
				
			||||||
 | 
					use App\MetadataResolver\UncaughtResolverException;
 | 
				
			||||||
 | 
					use App\Services\MetadataResolveService;
 | 
				
			||||||
 | 
					use Carbon\Carbon;
 | 
				
			||||||
 | 
					use GuzzleHttp\Client;
 | 
				
			||||||
 | 
					use GuzzleHttp\Exception\ClientException;
 | 
				
			||||||
 | 
					use GuzzleHttp\Exception\ServerException;
 | 
				
			||||||
 | 
					use GuzzleHttp\Handler\MockHandler;
 | 
				
			||||||
 | 
					use GuzzleHttp\HandlerStack;
 | 
				
			||||||
 | 
					use GuzzleHttp\Psr7\Response;
 | 
				
			||||||
 | 
					use Illuminate\Foundation\Testing\RefreshDatabase;
 | 
				
			||||||
 | 
					use Mockery\MockInterface;
 | 
				
			||||||
 | 
					use Tests\TestCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MetadataResolverServiceTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    use RefreshDatabase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function setUp(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::setUp();
 | 
				
			||||||
 | 
					        $this->seed();
 | 
				
			||||||
 | 
					        Carbon::setTestNow('2020-07-21 19:19:19');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function tearDown(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::tearDown();
 | 
				
			||||||
 | 
					        Carbon::setTestNow();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testOnRuntimeException()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->mock(MetadataResolver::class, function (MockInterface $mock) {
 | 
				
			||||||
 | 
					            $mock->shouldReceive('resolve')->andReturnUsing(function ($url) {
 | 
				
			||||||
 | 
					                throw new \RuntimeException('Something happened!');
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            $service = app()->make(MetadataResolveService::class);
 | 
				
			||||||
 | 
					            $service->execute('http://example.com');
 | 
				
			||||||
 | 
					        } catch (UncaughtResolverException $e) {
 | 
				
			||||||
 | 
					            $this->assertDatabaseHas('metadata', [
 | 
				
			||||||
 | 
					                'url' => 'http://example.com',
 | 
				
			||||||
 | 
					                'error_at' => new Carbon('2020-07-21 19:19:19'),
 | 
				
			||||||
 | 
					                'error_count' => 1,
 | 
				
			||||||
 | 
					                'error_exception_class' => \RuntimeException::class,
 | 
				
			||||||
 | 
					                'error_http_code' => null,
 | 
				
			||||||
 | 
					                'error_body' => 'Something happened!',
 | 
				
			||||||
 | 
					            ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $this->fail();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testOnHttpClientError()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $handler = HandlerStack::create(new MockHandler([new Response(404)]));
 | 
				
			||||||
 | 
					        $client = new Client(['handler' => $handler]);
 | 
				
			||||||
 | 
					        $this->instance(Client::class, $client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            $service = app()->make(MetadataResolveService::class);
 | 
				
			||||||
 | 
					            $service->execute('http://example.com');
 | 
				
			||||||
 | 
					        } catch (UncaughtResolverException $e) {
 | 
				
			||||||
 | 
					            $this->assertDatabaseHas('metadata', [
 | 
				
			||||||
 | 
					                'url' => 'http://example.com',
 | 
				
			||||||
 | 
					                'error_at' => new Carbon('2020-07-21 19:19:19'),
 | 
				
			||||||
 | 
					                'error_count' => 1,
 | 
				
			||||||
 | 
					                'error_exception_class' => ClientException::class,
 | 
				
			||||||
 | 
					                'error_http_code' => 404,
 | 
				
			||||||
 | 
					            ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $this->fail();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testOnHttpServerError()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $handler = HandlerStack::create(new MockHandler([new Response(503), new Response(503)]));
 | 
				
			||||||
 | 
					        $client = new Client(['handler' => $handler]);
 | 
				
			||||||
 | 
					        $this->instance(Client::class, $client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            $service = app()->make(MetadataResolveService::class);
 | 
				
			||||||
 | 
					            $service->execute('http://example.com');
 | 
				
			||||||
 | 
					        } catch (UncaughtResolverException $e) {
 | 
				
			||||||
 | 
					            $this->assertDatabaseHas('metadata', [
 | 
				
			||||||
 | 
					                'url' => 'http://example.com',
 | 
				
			||||||
 | 
					                'error_at' => new Carbon('2020-07-21 19:19:19'),
 | 
				
			||||||
 | 
					                'error_count' => 1,
 | 
				
			||||||
 | 
					                'error_exception_class' => ServerException::class,
 | 
				
			||||||
 | 
					                'error_http_code' => 503,
 | 
				
			||||||
 | 
					            ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $this->fail();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCircuitBreak()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->mock(MetadataResolver::class, function (MockInterface $mock) {
 | 
				
			||||||
 | 
					            $mock->shouldReceive('resolve')->andReturnUsing(function ($url) {
 | 
				
			||||||
 | 
					                throw new \RuntimeException('Something happened!');
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            for ($i = 0; $i < 6; $i++) {
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    $service = app()->make(MetadataResolveService::class);
 | 
				
			||||||
 | 
					                    $service->execute('http://example.com');
 | 
				
			||||||
 | 
					                } catch (UncaughtResolverException $e) {
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (ResolverCircuitBreakException $e) {
 | 
				
			||||||
 | 
					            $this->assertDatabaseHas('metadata', [
 | 
				
			||||||
 | 
					                'url' => 'http://example.com',
 | 
				
			||||||
 | 
					                'error_at' => new Carbon('2020-07-21 19:19:19'),
 | 
				
			||||||
 | 
					                'error_count' => 5,
 | 
				
			||||||
 | 
					                'error_exception_class' => \RuntimeException::class,
 | 
				
			||||||
 | 
					                'error_http_code' => null,
 | 
				
			||||||
 | 
					                'error_body' => 'Something happened!',
 | 
				
			||||||
 | 
					            ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $this->fail();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testOnResurrect()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $successBody = <<<HTML
 | 
				
			||||||
 | 
					<!doctype html>
 | 
				
			||||||
 | 
					<html lang="ja">
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					<meta charset="UTF-8">
 | 
				
			||||||
 | 
					    <meta name="og:title" content="OGP Title">
 | 
				
			||||||
 | 
					    <meta name="og:description" content="OGP Description">
 | 
				
			||||||
 | 
					    <title>Test Document</title>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 | 
					HTML;
 | 
				
			||||||
 | 
					        $handler = HandlerStack::create(new MockHandler([
 | 
				
			||||||
 | 
					            new Response(404),
 | 
				
			||||||
 | 
					            new Response(200, ['Content-Type' => 'text/html'], $successBody),
 | 
				
			||||||
 | 
					        ]));
 | 
				
			||||||
 | 
					        $client = new Client(['handler' => $handler]);
 | 
				
			||||||
 | 
					        $this->instance(Client::class, $client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for ($i = 0; $i < 2; $i++) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                $service = app()->make(MetadataResolveService::class);
 | 
				
			||||||
 | 
					                $service->execute('http://example.com');
 | 
				
			||||||
 | 
					            } catch (UncaughtResolverException $e) {
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertDatabaseHas('metadata', [
 | 
				
			||||||
 | 
					            'url' => 'http://example.com',
 | 
				
			||||||
 | 
					            'title' => 'OGP Title',
 | 
				
			||||||
 | 
					            'description' => 'OGP Description',
 | 
				
			||||||
 | 
					            'image' => '',
 | 
				
			||||||
 | 
					            'error_at' => null,
 | 
				
			||||||
 | 
					            'error_count' => 0,
 | 
				
			||||||
 | 
					            'error_exception_class' => null,
 | 
				
			||||||
 | 
					            'error_http_code' => null,
 | 
				
			||||||
 | 
					            'error_body' => null,
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user