diff --git a/app/Http/Controllers/Api/V1/SiteController.php b/app/Http/Controllers/Api/V1/SiteController.php index b653542..e9bbc60 100644 --- a/app/Http/Controllers/Api/V1/SiteController.php +++ b/app/Http/Controllers/Api/V1/SiteController.php @@ -48,9 +48,11 @@ public function register(SiteRequest $request): JsonResponse return $this->error($e->getMessage(), 500); } - // If successful create or update site - $site = Site::where('url', $url)->where('key', $key)->first() ?? new Site(); + // Remove older duplicates of the site if registered + Site::query()->where('url', $url)->delete(); + // Create new row + $site = new Site(); $site->key = $key; $site->url = $url; $site->last_seen = Carbon::now(); diff --git a/tests/Feature/Api/SiteControllerTest.php b/tests/Feature/Api/SiteControllerTest.php index 342f77d..f81f910 100644 --- a/tests/Feature/Api/SiteControllerTest.php +++ b/tests/Feature/Api/SiteControllerTest.php @@ -58,6 +58,40 @@ public function testRegisteringASiteWithUrlAndKeyCreatesRow(): void Queue::assertPushed(CheckSiteHealth::class); } + public function testRegisteringASiteTwiceCreatesOnlyOneRow(): void + { + Queue::fake(); + + $mock = $this->getMockBuilder(Connection::class) + ->disableOriginalConstructor() + ->getMock(); + + $mock->method('__call')->willReturn(HealthCheck::from([ + "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", + "update_requirement_state" => true + ])); + + $this->app->bind(Connection::class, fn () => $mock); + + $this->postJson( + '/api/v1/register', + ["url" => "https://www.joomla.org", "key" => "foobar123foobar123foobar123foobar123"] + ); + + $this->postJson( + '/api/v1/register', + ["url" => "https://www.joomla.org", "key" => "abcdefabcdefabcdefabcdefabcdefabcdef"] + ); + + $rows = Site::where('url', 'https://www.joomla.org')->get(); + $this->assertEquals(1, $rows->count()); + $this->assertEquals('abcdefabcdefabcdefabcdefabcdefabcdef', $rows->first()->key); + } + public function testRegisteringASiteFailsWhenHealthCheckFails(): void { $mock = $this->getMockBuilder(Connection::class)