diff --git a/app/Models/Site.php b/app/Models/Site.php index c38481b..7e0467c 100644 --- a/app/Models/Site.php +++ b/app/Models/Site.php @@ -45,7 +45,10 @@ public function getUrlAttribute(string $value): string public function getConnectionAttribute(): Connection { - return new Connection($this->url, $this->key); + return App::makeWith( + Connection::class, + ["baseUrl" => $this->url, "key" => $this->key] + ); } public function getFrontendStatus(): int diff --git a/tests/Feature/Api/SiteControllerTest.php b/tests/Feature/Api/SiteControllerTest.php index 6470805..e44115a 100644 --- a/tests/Feature/Api/SiteControllerTest.php +++ b/tests/Feature/Api/SiteControllerTest.php @@ -6,6 +6,7 @@ use App\Models\Site; use App\RemoteSite\Connection; use App\RemoteSite\Responses\HealthCheck; +use Carbon\Carbon; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Queue; use Tests\TestCase; @@ -74,6 +75,82 @@ public function testRegisteringASiteFailsWhenHealthCheckFails(): void $response->assertStatus(500); } + public function testCheckingASiteReturnsSuccessIfCheckIsSuccessful(): void + { + $site = $this->createMockSiteInDb(); + + $mock = $this->getMockBuilder(Connection::class) + ->disableOriginalConstructor() + ->getMock(); + + $mock->method('__call')->willReturn(HealthCheck::from($site->toArray())); + + $this->app->bind(Connection::class, fn () => $mock); + + $response = $this->postJson( + '/api/v1/check', + ["url" => "https://www.joomla.org", "key" => "foobar123foobar123foobar123foobar123"] + ); + + $response->assertStatus(200); + } + + public function testCheckingASiteReturnErrorIfCheckIsUnsuccessful(): void + { + $this->createMockSiteInDb(); + + $mock = $this->getMockBuilder(Connection::class) + ->disableOriginalConstructor() + ->getMock(); + + $mock->method('__call')->willThrowException(new \Exception()); + + $this->app->bind(Connection::class, fn () => $mock); + + $response = $this->postJson( + '/api/v1/check', + ["url" => "https://www.joomla.org", "key" => "foobar123foobar123foobar123foobar123"] + ); + + $response->assertStatus(500); + } + + public function testCheckingASiteReturns404ForInvalidSite(): void + { + $response = $this->postJson( + '/api/v1/check', + ["url" => "https://www.joomlaf.org", "key" => "foobar123foobar123foobar123foobar123"] + ); + + $response->assertStatus(404); + } + + public function testDeleteASiteReturns404ForInvalidSite(): void + { + $response = $this->postJson( + '/api/v1/delete', + ["url" => "https://www.joomlaf.org", "key" => "foobar123foobar123foobar123foobar123"] + ); + + $response->assertStatus(404); + } + + public function testDeleteASiteRemovesRow(): void + { + $this->createMockSiteInDb(); + + $this->assertEquals(1, Site::get()->count()); + + $response = $this->postJson( + '/api/v1/delete', + ["url" => "https://www.joomla.org", "key" => "foobar123foobar123foobar123foobar123"] + ); + + $response->assertStatus(200); + + $this->assertEquals(0, Site::get()->count()); + } + protected function getConnectionMock(HealthCheck $response) { $mock = $this->getMockBuilder(Connection::class) @@ -84,4 +161,24 @@ protected function getConnectionMock(HealthCheck $response) return $mock; } + + protected function createMockSiteInDb(): Site + { + $site = new Site([ + "php_version" => "1.0.0", + "db_type" => "mysqli", + "db_version" => "1.0.0", + "cms_version" => "1.0.0", + "server_os" => "Joomla OS 1.0.0", + "last_seen" => Carbon::now() + ]); + + $site->key = 'foobar123foobar123foobar123foobar123'; + $site->url = 'https://www.joomla.org'; + $site->last_seen = Carbon::now(); + + $site->save(); + + return $site; + } }