From 702d593b6a5aa3b21cd3142149fbf136b3e02a4c Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 13:06:45 +0200 Subject: [PATCH 01/13] add areMetricsEqual method --- app/WikiDailyMetrics.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/WikiDailyMetrics.php b/app/WikiDailyMetrics.php index e29eeaf1..9fe6271e 100644 --- a/app/WikiDailyMetrics.php +++ b/app/WikiDailyMetrics.php @@ -25,5 +25,19 @@ class WikiDailyMetrics extends Model 'is_deleted', ]; + // list of properties which are actual wiki metrics + static public $metricNames = [ + 'pages', + 'is_deleted', + ]; + + public function areMetricsEqual(WikiDailyMetrics $wikiDailyMetrics) { + foreach(self::$metricNames as $field) { + if ($this->$field !== $wikiDailyMetrics->$field) { + return false; + } + } + return true; + } } From c83671206b50f6d4fd8b68f7cebbe39724a10074 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 13:06:59 +0200 Subject: [PATCH 02/13] use areMetricsEqual method --- app/Metrics/App/WikiMetrics.php | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index e66c3c88..b236acf7 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -7,32 +7,37 @@ class WikiMetrics { - public function saveMetrics(Wiki $wiki): void { $today = now()->format('Y-m-d'); $oldRecord = WikiDailyMetrics::where('wiki_id', $wiki->id)->latest('date')->first(); $todayPageCount = $wiki->wikiSiteStats()->first()->pages ?? 0; $isDeleted = (bool)$wiki->deleted_at; + + $dailyMetrics = new WikiDailyMetrics([ + 'id' => $wiki->id . '_' . date('Y-m-d'), + 'pages' => $todayPageCount, + 'is_deleted' => $isDeleted, + 'date' => $today, + 'wiki_id' => $wiki->id + ]); + if ($oldRecord) { if ($oldRecord->is_deleted) { \Log::info("Wiki is deleted, no new record for WikiMetrics ID {$wiki->id}."); return; } + if (!$isDeleted) { - if ($oldRecord->pages === $todayPageCount) { - \Log::info("Page count unchanged for WikiMetrics ID {$wiki->id}, no new record added."); + if ($oldRecord->areMetricsEqual($dailyMetrics)) { + \Log::info("Record unchanged for WikiMetrics ID {$wiki->id}, no new record added."); return; } } } - WikiDailyMetrics::create([ - 'id' => $wiki->id . '_' . date('Y-m-d'), - 'pages' => $todayPageCount, - 'is_deleted' => $isDeleted, - 'date' => $today, - 'wiki_id' => $wiki->id, - ]); + + $dailyMetrics->save(); + \Log::info("New metric recorded for WikiMetrics ID {$wiki->id}"); } From b503d4df21d4b2e01c6b745bfdf4b49873ffa4ac Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 13:07:17 +0200 Subject: [PATCH 03/13] add WikiDailyMetricsTest --- tests/WikiDailyMetricsTest.php | 53 ++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 tests/WikiDailyMetricsTest.php diff --git a/tests/WikiDailyMetricsTest.php b/tests/WikiDailyMetricsTest.php new file mode 100644 index 00000000..b6358192 --- /dev/null +++ b/tests/WikiDailyMetricsTest.php @@ -0,0 +1,53 @@ + [ + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + true + ]; + + yield 'more pages' => [ + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + new WikiDailyMetrics(["pages" => 20, "is_deleted" => false ]), + false + ]; + + yield 'less pages' => [ + new WikiDailyMetrics(["pages" => 10, "is_deleted" => false ]), + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + false + ]; + + yield 'is deleted' => [ + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + new WikiDailyMetrics(["pages" => 1, "is_deleted" => true ]), + false + ]; + } + + /** + * @dataProvider areMetricsEqualProvider + */ + public function testAreMetricsEqual( + WikiDailyMetrics $wikiDailyMetrics1, + WikiDailyMetrics $wikiDailyMetrics2, + $assertion + ): void + { + $this->assertEquals( + $wikiDailyMetrics1->areMetricsEqual($wikiDailyMetrics2), + $assertion + ); + } +} From 2fd41165aa034b57f5b5a92168d5073dbecc9146 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 13:27:29 +0200 Subject: [PATCH 04/13] fix --- app/Metrics/App/WikiMetrics.php | 2 -- app/WikiDailyMetrics.php | 9 +++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index b236acf7..ffe93c37 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -40,6 +40,4 @@ public function saveMetrics(Wiki $wiki): void \Log::info("New metric recorded for WikiMetrics ID {$wiki->id}"); } - } - diff --git a/app/WikiDailyMetrics.php b/app/WikiDailyMetrics.php index 9fe6271e..db00709f 100644 --- a/app/WikiDailyMetrics.php +++ b/app/WikiDailyMetrics.php @@ -26,18 +26,19 @@ class WikiDailyMetrics extends Model ]; // list of properties which are actual wiki metrics - static public $metricNames = [ + public static $metricNames = [ 'pages', 'is_deleted', ]; - public function areMetricsEqual(WikiDailyMetrics $wikiDailyMetrics) { - + public function areMetricsEqual(WikiDailyMetrics $wikiDailyMetrics): bool + { foreach(self::$metricNames as $field) { - if ($this->$field !== $wikiDailyMetrics->$field) { + if ($this->$field != $wikiDailyMetrics->$field) { return false; } } + return true; } } From 34c74eb63388a0f4448f1801748d192493193657 Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 15 Apr 2025 14:12:58 +0200 Subject: [PATCH 05/13] add db migration --- ...add_columns_to_wiki_daily_metric_table.php | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 database/migrations/2025_03_24_143626_add_columns_to_wiki_daily_metric_table.php diff --git a/database/migrations/2025_03_24_143626_add_columns_to_wiki_daily_metric_table.php b/database/migrations/2025_03_24_143626_add_columns_to_wiki_daily_metric_table.php new file mode 100644 index 00000000..332733e5 --- /dev/null +++ b/database/migrations/2025_03_24_143626_add_columns_to_wiki_daily_metric_table.php @@ -0,0 +1,30 @@ +integer('daily_actions')->nullable(); + $table->integer('weekly_actions')->nullable(); + $table->integer('monthly_actions')->nullable(); + $table->integer('quarterly_actions')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('wiki_daily_metric', function (Blueprint $table) { + }); + } +}; From d73b259a71cb3f5fa9c667c502839d204c69ad48 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 14:40:56 +0200 Subject: [PATCH 06/13] rebase de/dailyMetricsCompare --- app/Metrics/App/WikiMetrics.php | 59 +++++++++++++++++++-- tests/Jobs/UpdateWikiDailyMetricJobTest.php | 12 ++++- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index ffe93c37..82b50dd8 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -4,30 +4,62 @@ use App\Wiki; use App\WikiDailyMetrics; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Arr; class WikiMetrics { + const INTERVAL_DAILY = 'INTERVAL 1 DAY'; + const INTERVAL_WEEKLY = ' INTERVAL 1 WEEK'; + const INTERVAL_MONTHLY = 'INTERVAL 1 MONTH'; + const INTERVAL_QUARTERLY = 'INTERVAL 3 MONTH'; + + const QUERY_NUMBER_OF_ACTIONS = <<= DATE_FORMAT(DATE_SUB(NOW(), ?), '%Y%m%d%H%i%S')) AS sum_actions +FROM + ? AS rc +INNER JOIN ? AS a ON rc.rc_actor = a.actor_id +// Conditions below added for consistency with Wikidata: https://phabricator.wikimedia.org/diffusion/ADES/browse/master/src/wikidata/site_stats/sql/active_user_changes.sql +AND a.actor_user != 0 +AND rc.rc_bot = 0 +AND ( rc.rc_log_type != 'newusers' OR rc.rc_log_type IS NULL) +EOF; + + protected $wiki; + 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(); $todayPageCount = $wiki->wikiSiteStats()->first()->pages ?? 0; $isDeleted = (bool)$wiki->deleted_at; + $dailyActions = $this->getNumberOfActions(self::INTERVAL_DAILY); + $weeklyActions = $this->getNumberOfActions(self::INTERVAL_WEEKLY); + $monthlyActions = $this->getNumberOfActions(self::INTERVAL_MONTHLY); + $quarterlyActions = $this->getNumberOfActions(self::INTERVAL_QUARTERLY); + $dailyMetrics = new WikiDailyMetrics([ 'id' => $wiki->id . '_' . date('Y-m-d'), 'pages' => $todayPageCount, 'is_deleted' => $isDeleted, 'date' => $today, - 'wiki_id' => $wiki->id + 'wiki_id' => $wiki->id, + 'daily_actions'=> $dailyActions, + 'weekly_actions'=> $weeklyActions, + 'monthly_actions'=> $monthlyActions, + 'quarterly_actions'=> $quarterlyActions, ]); - + + // 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 WikiMetrics ID {$wiki->id}."); return; } - if (!$isDeleted) { if ($oldRecord->areMetricsEqual($dailyMetrics)) { \Log::info("Record unchanged for WikiMetrics ID {$wiki->id}, no new record added."); @@ -38,6 +70,25 @@ public function saveMetrics(Wiki $wiki): void $dailyMetrics->save(); - \Log::info("New metric recorded for WikiMetrics ID {$wiki->id}"); + \Log::info("New metric recorded for Wiki ID {$wiki->id}"); + } + + protected function getNumberOfActions($interval): mixed + { + $actions = null; + + $wikiDb = Wiki::with('wikiDb')->where('id', $this->wiki->id)->first()->wikiDb; + $tableRecentChanges = $wikiDb->name . '.' . $wikiDb->prefix . '_recentchanges'; + $tableActor = $wikiDb->name . '.' . $wikiDb->prefix . '_actor'; + + $result = DB::select(self::QUERY_NUMBER_OF_ACTIONS, [ + $interval, + $tableRecentChanges, + $tableActor, + ]); + + $actions = Arr::get($result, 'sum_actions', null); + + return $actions; } } diff --git a/tests/Jobs/UpdateWikiDailyMetricJobTest.php b/tests/Jobs/UpdateWikiDailyMetricJobTest.php index d7a334c5..611d4b49 100644 --- a/tests/Jobs/UpdateWikiDailyMetricJobTest.php +++ b/tests/Jobs/UpdateWikiDailyMetricJobTest.php @@ -39,12 +39,20 @@ public function testRunJobForAllWikisIncludingDeletedWikis() $this->assertDatabaseHas('wiki_daily_metrics', [ 'wiki_id' => $activeWiki->id, - 'date' => Carbon::today()->toDateString() + 'date' => Carbon::today()->toDateString(), + 'daily_actions' => null, + 'weekly_actions' => null, + 'monthly_actions' => null, + 'quarterly_actions' => null, ]); $this->assertDatabaseHas('wiki_daily_metrics', [ 'wiki_id' => $deletedWiki->id, - 'date' => Carbon::today()->toDateString() + 'date' => Carbon::today()->toDateString(), + 'daily_actions' => null, + 'weekly_actions' => null, + 'monthly_actions' => null, + 'quarterly_actions' => null, ]); } From d25181bfce85df765f3ba30b65f52dc56d0dd929 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 15:50:47 +0200 Subject: [PATCH 07/13] working query --- app/Metrics/App/WikiMetrics.php | 45 +++++++++++++++++++------------ tests/Metrics/WikiMetricsTest.php | 1 - 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index 82b50dd8..d7a7774a 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -14,18 +14,6 @@ class WikiMetrics const INTERVAL_MONTHLY = 'INTERVAL 1 MONTH'; const INTERVAL_QUARTERLY = 'INTERVAL 3 MONTH'; - const QUERY_NUMBER_OF_ACTIONS = <<= DATE_FORMAT(DATE_SUB(NOW(), ?), '%Y%m%d%H%i%S')) AS sum_actions -FROM - ? AS rc -INNER JOIN ? AS a ON rc.rc_actor = a.actor_id -// Conditions below added for consistency with Wikidata: https://phabricator.wikimedia.org/diffusion/ADES/browse/master/src/wikidata/site_stats/sql/active_user_changes.sql -AND a.actor_user != 0 -AND rc.rc_bot = 0 -AND ( rc.rc_log_type != 'newusers' OR rc.rc_log_type IS NULL) -EOF; - protected $wiki; public function saveMetrics(Wiki $wiki): void @@ -77,18 +65,41 @@ protected function getNumberOfActions($interval): mixed { $actions = null; + // safeguard + if (false === in_array($interval, + [ + self::INTERVAL_DAILY, + self::INTERVAL_WEEKLY, + self::INTERVAL_MONTHLY, + self::INTERVAL_QUARTERLY + ] + )) { return null; } + $wikiDb = Wiki::with('wikiDb')->where('id', $this->wiki->id)->first()->wikiDb; $tableRecentChanges = $wikiDb->name . '.' . $wikiDb->prefix . '_recentchanges'; $tableActor = $wikiDb->name . '.' . $wikiDb->prefix . '_actor'; - $result = DB::select(self::QUERY_NUMBER_OF_ACTIONS, [ - $interval, - $tableRecentChanges, - $tableActor, - ]); + $query = "SELECT + SUM(rc_timestamp >= DATE_FORMAT(DATE_SUB(NOW(), $interval), '%Y%m%d%H%i%S')) AS sum_actions + FROM + $tableRecentChanges AS rc + INNER JOIN $tableActor AS a ON rc.rc_actor = a.actor_id + WHERE + /* + Conditions below added for consistency with Wikidata: https://phabricator.wikimedia.org/diffusion/ADES/browse/master/src/wikidata/site_stats/sql/active_user_changes.sql + */ + a.actor_user != 0 + AND rc.rc_bot = 0 + AND ( rc.rc_log_type != 'newusers' OR rc.rc_log_type IS NULL)"; + + $result = DB::select($query, [ $interval ]); + + dd($result); $actions = Arr::get($result, 'sum_actions', null); + dd($actions); + return $actions; } } diff --git a/tests/Metrics/WikiMetricsTest.php b/tests/Metrics/WikiMetricsTest.php index a38f8177..847557d7 100644 --- a/tests/Metrics/WikiMetricsTest.php +++ b/tests/Metrics/WikiMetricsTest.php @@ -27,7 +27,6 @@ public function testSuccessfullyAddRecords() ]); } - public function testDoesNotAddDuplicateRecordsWithOnlyDateChange() { $wiki = Wiki::factory()->create([ From a3990489ca51cbefa637c56be5c1c395e78a9f58 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 16:05:55 +0200 Subject: [PATCH 08/13] query --- app/Metrics/App/WikiMetrics.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index d7a7774a..cbac640d 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -92,14 +92,10 @@ protected function getNumberOfActions($interval): mixed AND rc.rc_bot = 0 AND ( rc.rc_log_type != 'newusers' OR rc.rc_log_type IS NULL)"; - $result = DB::select($query, [ $interval ]); - - dd($result); - + $result = DB::select($query); + $actions = Arr::get($result, 'sum_actions', null); - dd($actions); - return $actions; } } From 0f17837fd80cfd49d87d18b961cc20d7696ade8a Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 17:05:27 +0200 Subject: [PATCH 09/13] query mediawiki db --- app/Metrics/App/WikiMetrics.php | 8 ++++++-- app/WikiDailyMetrics.php | 8 ++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index cbac640d..0b1ab5cc 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -92,8 +92,12 @@ protected function getNumberOfActions($interval): mixed AND rc.rc_bot = 0 AND ( rc.rc_log_type != 'newusers' OR rc.rc_log_type IS NULL)"; - $result = DB::select($query); - + $manager = app()->db; + $manager->purge('mw'); + $conn = $manager->connection('mw'); + $pdo = $conn->getPdo(); + $result = $pdo->query($query)->fetch(); + $actions = Arr::get($result, 'sum_actions', null); return $actions; diff --git a/app/WikiDailyMetrics.php b/app/WikiDailyMetrics.php index db00709f..d6f844d4 100644 --- a/app/WikiDailyMetrics.php +++ b/app/WikiDailyMetrics.php @@ -23,12 +23,20 @@ class WikiDailyMetrics extends Model 'date', 'pages', 'is_deleted', + 'daily_actions', + 'weekly_actions', + 'monthly_actions', + 'quarterly_actions', ]; // list of properties which are actual wiki metrics public static $metricNames = [ 'pages', 'is_deleted', + 'daily_actions', + 'weekly_actions', + 'monthly_actions', + 'quarterly_actions' ]; public function areMetricsEqual(WikiDailyMetrics $wikiDailyMetrics): bool From 1a1b9725ae07a97988a1d19dee9e91920b266063 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 17:11:19 +0200 Subject: [PATCH 10/13] typoe hinting --- app/Metrics/App/WikiMetrics.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index 0b1ab5cc..ee8327c4 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -61,7 +61,7 @@ public function saveMetrics(Wiki $wiki): void \Log::info("New metric recorded for Wiki ID {$wiki->id}"); } - protected function getNumberOfActions($interval): mixed + protected function getNumberOfActions($interval): null|int { $actions = null; From 66e93a27940bc22e25313380dde8e2786c692309 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 17:13:17 +0200 Subject: [PATCH 11/13] more tyoe hinting --- app/Metrics/App/WikiMetrics.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index ee8327c4..35f6f3c1 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -61,7 +61,7 @@ public function saveMetrics(Wiki $wiki): void \Log::info("New metric recorded for Wiki ID {$wiki->id}"); } - protected function getNumberOfActions($interval): null|int + protected function getNumberOfActions(string $interval): null|int { $actions = null; From bec0c698736e776f591160d5683e9b26ed70e057 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 17:35:47 +0200 Subject: [PATCH 12/13] improve test --- app/Metrics/App/WikiMetrics.php | 2 +- tests/Metrics/WikiMetricsTest.php | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index 35f6f3c1..c0f107c1 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -75,7 +75,7 @@ protected function getNumberOfActions(string $interval): null|int ] )) { return null; } - $wikiDb = Wiki::with('wikiDb')->where('id', $this->wiki->id)->first()->wikiDb; + $wikiDb = Wiki::withTrashed()->with('wikiDb')->where('id', $this->wiki->id)->first()->wikiDb; $tableRecentChanges = $wikiDb->name . '.' . $wikiDb->prefix . '_recentchanges'; $tableActor = $wikiDb->name . '.' . $wikiDb->prefix . '_actor'; diff --git a/tests/Metrics/WikiMetricsTest.php b/tests/Metrics/WikiMetricsTest.php index 847557d7..04521615 100644 --- a/tests/Metrics/WikiMetricsTest.php +++ b/tests/Metrics/WikiMetricsTest.php @@ -4,7 +4,9 @@ use App\Metrics\App\WikiMetrics; use App\Wiki; +use App\WikiDb; use App\WikiDailyMetrics; +use App\Jobs\ProvisionWikiDbJob; use Carbon\Carbon; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; @@ -13,6 +15,12 @@ class WikiMetricsTest extends TestCase { use RefreshDatabase; + public function setUp(): void { + parent::setUp(); + $manager = $this->app->make('db'); + $job = new ProvisionWikiDbJob(); + $job->handle($manager); + } public function testSuccessfullyAddRecords() { @@ -20,6 +28,9 @@ public function testSuccessfullyAddRecords() 'domain' => 'thisfake.wikibase.cloud' ]); + $wikiDb = WikiDb::first(); + $wikiDb->update( ['wiki_id' => $wiki->id] ); + (new WikiMetrics())->saveMetrics($wiki); // Assert the metric is updated in the database $this->assertDatabaseHas('wiki_daily_metrics', [ @@ -27,11 +38,16 @@ public function testSuccessfullyAddRecords() ]); } + public function testDoesNotAddDuplicateRecordsWithOnlyDateChange() { $wiki = Wiki::factory()->create([ 'domain' => 'thisfake.wikibase.cloud' ]); + + $wikiDb = WikiDb::first(); + $wikiDb->update( ['wiki_id' => $wiki->id] ); + //Insert an old metric value for a wiki WikiDailyMetrics::create([ 'id' => $wiki->id. '_'. Carbon::yesterday()->toDateString(), @@ -54,6 +70,10 @@ public function testAddRecordsWikiIsDeleted() $wiki = Wiki::factory()->create([ 'domain' => 'thisfake.wikibase.cloud' ]); + + $wikiDb = WikiDb::first(); + $wikiDb->update( ['wiki_id' => $wiki->id] ); + //Insert an old metric value for a wiki WikiDailyMetrics::create([ 'id' => $wiki->id. '_'. Carbon::yesterday()->toDateString(), From 00e1dac3453cdb49c0d0aabc59d894d554e8c4df Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 25 Apr 2025 17:47:07 +0200 Subject: [PATCH 13/13] fix tests --- app/Metrics/App/WikiMetrics.php | 3 +-- tests/Jobs/UpdateWikiDailyMetricJobTest.php | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index c0f107c1..8e1a85e3 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -4,7 +4,6 @@ use App\Wiki; use App\WikiDailyMetrics; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Arr; class WikiMetrics @@ -75,7 +74,7 @@ protected function getNumberOfActions(string $interval): null|int ] )) { return null; } - $wikiDb = Wiki::withTrashed()->with('wikiDb')->where('id', $this->wiki->id)->first()->wikiDb; + $wikiDb = $this->wiki->wikiDb; $tableRecentChanges = $wikiDb->name . '.' . $wikiDb->prefix . '_recentchanges'; $tableActor = $wikiDb->name . '.' . $wikiDb->prefix . '_actor'; diff --git a/tests/Jobs/UpdateWikiDailyMetricJobTest.php b/tests/Jobs/UpdateWikiDailyMetricJobTest.php index 611d4b49..90123c2c 100644 --- a/tests/Jobs/UpdateWikiDailyMetricJobTest.php +++ b/tests/Jobs/UpdateWikiDailyMetricJobTest.php @@ -4,10 +4,12 @@ use App\Jobs\UpdateWikiDailyMetricJob; use App\Wiki; +use App\WikiDb; use Carbon\Carbon; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Queue; use Tests\TestCase; +use App\Jobs\ProvisionWikiDbJob; class UpdateWikiDailyMetricJobTest extends TestCase { @@ -33,8 +35,23 @@ public function testRunJobForAllWikisIncludingDeletedWikis() $deletedWiki = Wiki::factory()->create([ 'domain' => 'deletedwiki.wikibase.cloud', ]); + + $manager = $this->app->make('db'); + $job = new ProvisionWikiDbJob(); + $job2 = new ProvisionWikiDbJob(); + $job->handle($manager); + $job2->handle($manager); + + $wikiDbActive = WikiDb::whereDoesntHave('wiki')->first(); + $wikiDbActive->update( ['wiki_id' => $activeWiki->id] ); + + $wikiDbDeleted = WikiDb::whereDoesntHave('wiki')->first(); + $wikiDbDeleted->update( ['wiki_id' => $deletedWiki->id] ); + $deletedWiki->delete(); + + (new UpdateWikiDailyMetricJob())->handle(); $this->assertDatabaseHas('wiki_daily_metrics', [