diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index faad0b64..ea3201bb 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -25,7 +25,6 @@ public function saveMetrics(Wiki $wiki): void { $this->wiki = $wiki; $today = now()->format('Y-m-d'); - $oldRecord = WikiDailyMetrics::where('wiki_id', $wiki->id)->latest('date')->first(); $tripleCount = $this->getNumOfTriples(); $todayPageCount = $wiki->wikiSiteStats()->first()->pages ?? 0; $isDeleted = (bool) $wiki->deleted_at; @@ -58,20 +57,12 @@ public function saveMetrics(Wiki $wiki): void { 'total_user_count' => $numberOfUsers, ]); - // compare current record to old record and only save if there is a change - if ($oldRecord) { - if ($oldRecord->is_deleted) { - Log::info("Wiki is deleted, no new record for Wiki ID {$wiki->id}."); + // compare current record to previous record and only save if there is a change + $previousRecord = WikiDailyMetrics::where('wiki_id', $wiki->id)->latest('date')->first(); + if ($previousRecord?->areMetricsEqual($dailyMetrics)) { + Log::info("Record unchanged for Wiki ID {$wiki->id}, no new record added."); - return; - } - if (!$isDeleted) { - if ($oldRecord->areMetricsEqual($dailyMetrics)) { - Log::info("Record unchanged for Wiki ID {$wiki->id}, no new record added."); - - return; - } - } + return; } $dailyMetrics->save(); diff --git a/tests/Metrics/WikiMetricsTest.php b/tests/Metrics/WikiMetricsTest.php index 06442375..3e472585 100644 --- a/tests/Metrics/WikiMetricsTest.php +++ b/tests/Metrics/WikiMetricsTest.php @@ -42,7 +42,7 @@ public function testSuccessfullyAddRecords() { ]); } - public function testDoesNotAddDuplicateRecordsWithOnlyDateChange() { + public function testNoDuplicateRecordsWithOnlyDateChange() { $wiki = Wiki::factory()->create([ 'domain' => 'thisfake.wikibase.cloud', ]); @@ -58,16 +58,18 @@ public function testDoesNotAddDuplicateRecordsWithOnlyDateChange() { 'pages' => 0, 'is_deleted' => 0, ]); + + // Run saveMetrics() (new WikiMetrics)->saveMetrics($wiki); - // Assert No new record was created for today + // Assert no new record was created for today $this->assertDatabaseMissing('wiki_daily_metrics', [ 'wiki_id' => $wiki->id, 'date' => Carbon::today()->toDateString(), ]); } - public function testAddRecordsWikiIsDeleted() { + public function testRecordCreatedWhenWikiFirstDeleted() { $wiki = Wiki::factory()->create([ 'domain' => 'thisfake.wikibase.cloud', ]); @@ -75,21 +77,62 @@ public function testAddRecordsWikiIsDeleted() { $wikiDb = WikiDb::first(); $wikiDb->update(['wiki_id' => $wiki->id]); + $wikiSiteStats = $wiki->wikiSiteStats()->create(); + $wikiSiteStats->update([ + 'pages' => 10, + 'users' => 5, + ]); + // Insert an old metric value for a wiki WikiDailyMetrics::create([ 'id' => $wiki->id . '_' . Carbon::yesterday()->toDateString(), 'wiki_id' => $wiki->id, 'date' => Carbon::yesterday()->toDateString(), 'pages' => 0, + 'is_deleted' => 0, + 'total_user_count' => null, + ]); + + // Delete the wiki + $wiki->delete(); + $wiki->save(); + + // Run saveMetrics() + (new WikiMetrics)->saveMetrics($wiki); + + // Assert new record was created for newly deleted wiki + $this->assertDatabaseHas('wiki_daily_metrics', [ + 'wiki_id' => $wiki->id, 'is_deleted' => 1, + 'total_user_count' => 5, + 'date' => now()->toDateString(), ]); - // delete the wiki + } + + public function testNoDuplicateRecordsForDeletedWiki() { + $wiki = Wiki::factory()->create([ + 'domain' => 'thisfake.wikibase.cloud', + ]); + $wikiDb = WikiDb::first(); + $wikiDb->update(['wiki_id' => $wiki->id]); + + // Delete the wiki $wiki->delete(); $wiki->save(); + // Create an old metric record for the wiki + WikiDailyMetrics::create([ + 'id' => $wiki->id . '_' . Carbon::yesterday()->toDateString(), + 'wiki_id' => $wiki->id, + 'date' => Carbon::yesterday()->toDateString(), + 'pages' => 0, + 'is_deleted' => 1, + ]); + + // Run saveMetrics() (new WikiMetrics)->saveMetrics($wiki); - // Assert No new record was created for today + // Assert no new record was created for previously deleted wiki $this->assertDatabaseMissing('wiki_daily_metrics', [ 'wiki_id' => $wiki->id, 'is_deleted' => 1, @@ -97,6 +140,28 @@ public function testAddRecordsWikiIsDeleted() { ]); } + public function testDailyMetricCreatedWhenNoRecordsInWikiSiteStats() { + $wiki = Wiki::factory()->create([ + 'domain' => 'test.wbaas.dev', + ]); + $wikiDb = WikiDb::first(); + $wikiDb->update(['wiki_id' => $wiki->id]); + + // Ensure no wikiSiteStats record exists + $this->assertNull($wiki->wikiSiteStats()->first()); + + // Run saveMetrics() + (new WikiMetrics)->saveMetrics($wiki); + + // Assert new record was created with default values + $this->assertDatabaseHas('wiki_daily_metrics', [ + 'wiki_id' => $wiki->id, + 'pages' => 0, + 'total_user_count' => 0, + 'date' => now()->toDateString(), + ]); + } + public function testTripleCountSavedSuccessfully() { $wiki = Wiki::factory()->create([ 'domain' => 'somewikiforunittest.wikibase.cloud',