create(['url' => $url]); $expectedDomain = (new UrlService)->host($url); $this->assertDatabaseHas('page_crawls', [ 'page_id' => $page->id, 'domain' => $expectedDomain, 'priority' => 0, ]); $crawl = PageCrawl::where('page_id', $page->id)->first(); $this->assertNotNull($crawl); } public function test_first_or_create_with_existing_url_does_not_insert_duplicate_crawl(): void { $url = 'https://example-blog.com/article'; Page::factory()->create(['url' => $url]); // Finds the existing row — created event does not fire again Page::firstOrCreate(['url' => $url], ['status' => 'discovered']); $this->assertDatabaseCount('page_crawls', 1); } public function test_updating_a_page_does_not_insert_another_crawl(): void { $page = Page::factory()->create(['url' => 'https://example-blog.com/article']); $page->update(['title' => 'New Title']); $this->assertDatabaseCount('page_crawls', 1); } public function test_bad_url_throws_exception_page_persists_no_crawl_inserted(): void { $caught = null; try { Page::create(['url' => 'not-a-url', 'status' => 'discovered']); } catch (\InvalidArgumentException $e) { $caught = $e; } $this->assertNotNull($caught, 'Expected InvalidArgumentException to be thrown'); $this->assertDatabaseHas('pages', ['url' => 'not-a-url']); $this->assertDatabaseCount('page_crawls', 0); } }