From 9f1f3e0a48f8edbed5173f8cc526b2048f1542f1 Mon Sep 17 00:00:00 2001 From: Ollie Date: Wed, 28 Oct 2026 00:38:46 +0000 Subject: [PATCH 1/2] Create 'automatic_expiry' suspension on Wiki creation Bug: T442663 --- app/Http/Controllers/WikiController.php | 10 ++++++ tests/Routes/PublicWikiControllerTest.php | 38 +++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/app/Http/Controllers/WikiController.php b/app/Http/Controllers/WikiController.php index b5731bbc4..a128e3936 100644 --- a/app/Http/Controllers/WikiController.php +++ b/app/Http/Controllers/WikiController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Enums\WikiSuspensionReason; use App\Helper\DomainHelper; use App\Helper\DomainValidator; use App\Helper\ProfileValidator; @@ -18,6 +19,8 @@ use App\WikiManager; use App\WikiProfile; use App\WikiSetting; +use App\WikiSuspension; +use Carbon\CarbonImmutable; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -107,6 +110,13 @@ public function create(Request $request): Response { 'domain' => $submittedDomain, ]); + $suspension = new WikiSuspension(); + $suspension->wiki_id = $wiki->id; + // TODO get this 91 days from config instead of hard-coding? + $suspension->active_from = CarbonImmutable::now()->addDays(91); + $suspension->reason = WikiSuspensionReason::AUTOMATIC_EXPIRY; + $suspension->save(); + // Assign storage $dbAssignment = DB::table('wiki_dbs')->where($wikiDbCondition)->limit(1)->update(['wiki_id' => $wiki->id]); if (!$dbAssignment) { diff --git a/tests/Routes/PublicWikiControllerTest.php b/tests/Routes/PublicWikiControllerTest.php index f5748ff84..e27377794 100644 --- a/tests/Routes/PublicWikiControllerTest.php +++ b/tests/Routes/PublicWikiControllerTest.php @@ -2,22 +2,60 @@ namespace Tests\Http\Controllers; +use App\Enums\WikiSuspensionReason; use App\Http\Controllers\PublicWikiController; use App\Http\Resources\PublicWikiResource; +use App\QueryserviceNamespace; +use App\User; use App\Wiki; +use App\WikiDb; use App\WikiProfile; +use App\WikiSuspension; +use Carbon\CarbonImmutable; use Generator; use Illuminate\Database\Events\QueryExecuted; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\AnonymousResourceCollection; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Queue; use Illuminate\Validation\ValidationException; use Tests\TestCase; class PublicWikiControllerTest extends TestCase { use DatabaseTransactions; + public function testCreateSchedulesAutomaticExpirySuspension(): void { + Queue::fake(); + + $user = User::factory()->create(['verified' => true]); + + $now = CarbonImmutable::parse('2026-06-01 12:00'); + $this->travelTo($now); + + WikiDb::factory()->create([ + 'wiki_id' => null, + 'version' => config('wbstack.wiki_db_use_version'), + ]); + QueryserviceNamespace::create([ + 'namespace' => 'automatic-expiry-test', + 'backend' => 'wdqs.svc', + ]); + + $response = $this->actingAs($user, 'api')->postJson('wiki/create', [ + 'domain' => 'automatic-expiry-test.wikibase.cloud', + 'sitename' => 'Automatic Expiry Test', + 'username' => 'Admin', + ]); + + $response->assertOk()->assertJsonPath('success', true); + $suspension = WikiSuspension::where('wiki_id', $response->json('data.id'))->sole(); + $this->assertSame(WikiSuspensionReason::AUTOMATIC_EXPIRY, $suspension->reason); + $this->assertTrue($suspension->active_from->equalTo('2026-08-31 12:00')); + $this->assertNull($suspension->actor_user_id); + $this->assertNull($suspension->review_submission_action_id); + } + public function testShowLoadsWikiLatestProfileForResource(): void { $wiki = Wiki::factory()->create([ 'domain' => 'controller-test.wikibase.cloud', From 87e82321feaecbb0012ff278202693e2366facd5 Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Sun, 1 Nov 2026 15:12:03 +0000 Subject: [PATCH 2/2] config variable for days and move test to correct place --- app/Http/Controllers/WikiController.php | 5 +-- config/wbstack.php | 4 +++ tests/Routes/PublicWikiControllerTest.php | 38 ----------------------- tests/Routes/Wiki/CreateTest.php | 35 +++++++++++++++++++++ 4 files changed, 42 insertions(+), 40 deletions(-) diff --git a/app/Http/Controllers/WikiController.php b/app/Http/Controllers/WikiController.php index a128e3936..3e881792d 100644 --- a/app/Http/Controllers/WikiController.php +++ b/app/Http/Controllers/WikiController.php @@ -112,8 +112,9 @@ public function create(Request $request): Response { $suspension = new WikiSuspension(); $suspension->wiki_id = $wiki->id; - // TODO get this 91 days from config instead of hard-coding? - $suspension->active_from = CarbonImmutable::now()->addDays(91); + $suspension->active_from = CarbonImmutable::now()->addDays( + Config::get('wbstack.automatic_expiry_suspension_days') + ); $suspension->reason = WikiSuspensionReason::AUTOMATIC_EXPIRY; $suspension->save(); diff --git a/config/wbstack.php b/config/wbstack.php index 76f4a2bb9..11f0f2235 100644 --- a/config/wbstack.php +++ b/config/wbstack.php @@ -35,4 +35,8 @@ 'transferbot_image_repo' => env('WBSTACK_TRANSFERBOT_IMAGE_REPO', 'ghcr.io/wbstack/transferbot'), 'transferbot_image_version' => env('WBSTACK_TRANSFERBOT_IMAGE_VERSION', '1.1.0'), + + 'automatic_expiry_suspension_days' => intval( + env('WBSTACK_AUTOMATIC_EXPIRY_SUSPENSION_DAYS', '91') + ), ]; diff --git a/tests/Routes/PublicWikiControllerTest.php b/tests/Routes/PublicWikiControllerTest.php index e27377794..f5748ff84 100644 --- a/tests/Routes/PublicWikiControllerTest.php +++ b/tests/Routes/PublicWikiControllerTest.php @@ -2,60 +2,22 @@ namespace Tests\Http\Controllers; -use App\Enums\WikiSuspensionReason; use App\Http\Controllers\PublicWikiController; use App\Http\Resources\PublicWikiResource; -use App\QueryserviceNamespace; -use App\User; use App\Wiki; -use App\WikiDb; use App\WikiProfile; -use App\WikiSuspension; -use Carbon\CarbonImmutable; use Generator; use Illuminate\Database\Events\QueryExecuted; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\AnonymousResourceCollection; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Queue; use Illuminate\Validation\ValidationException; use Tests\TestCase; class PublicWikiControllerTest extends TestCase { use DatabaseTransactions; - public function testCreateSchedulesAutomaticExpirySuspension(): void { - Queue::fake(); - - $user = User::factory()->create(['verified' => true]); - - $now = CarbonImmutable::parse('2026-06-01 12:00'); - $this->travelTo($now); - - WikiDb::factory()->create([ - 'wiki_id' => null, - 'version' => config('wbstack.wiki_db_use_version'), - ]); - QueryserviceNamespace::create([ - 'namespace' => 'automatic-expiry-test', - 'backend' => 'wdqs.svc', - ]); - - $response = $this->actingAs($user, 'api')->postJson('wiki/create', [ - 'domain' => 'automatic-expiry-test.wikibase.cloud', - 'sitename' => 'Automatic Expiry Test', - 'username' => 'Admin', - ]); - - $response->assertOk()->assertJsonPath('success', true); - $suspension = WikiSuspension::where('wiki_id', $response->json('data.id'))->sole(); - $this->assertSame(WikiSuspensionReason::AUTOMATIC_EXPIRY, $suspension->reason); - $this->assertTrue($suspension->active_from->equalTo('2026-08-31 12:00')); - $this->assertNull($suspension->actor_user_id); - $this->assertNull($suspension->review_submission_action_id); - } - public function testShowLoadsWikiLatestProfileForResource(): void { $wiki = Wiki::factory()->create([ 'domain' => 'controller-test.wikibase.cloud', diff --git a/tests/Routes/Wiki/CreateTest.php b/tests/Routes/Wiki/CreateTest.php index 4711b1547..119b27582 100644 --- a/tests/Routes/Wiki/CreateTest.php +++ b/tests/Routes/Wiki/CreateTest.php @@ -2,6 +2,7 @@ namespace Tests\Routes\Wiki\Managers; +use App\Enums\WikiSuspensionReason; use App\Jobs\ElasticSearchAliasInit; use App\Jobs\MediawikiInit; use App\Jobs\ProvisionWikiDbJob; @@ -9,10 +10,13 @@ use App\QueryserviceNamespace; use App\User; use App\Wiki; +use App\WikiDb; use App\WikiManager; use App\WikiProfile; use App\WikiSetting; +use App\WikiSuspension; use Carbon\Carbon; +use Carbon\CarbonImmutable; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Queue; @@ -36,6 +40,37 @@ class CreateTest extends TestCase { use DatabaseTransactions; use OptionsRequestAllowed; + public function testCreateSchedulesAutomaticExpirySuspension(): void { + Queue::fake(); + + $user = User::factory()->create(['verified' => true]); + + $now = CarbonImmutable::parse('2026-06-01 12:00'); + $this->travelTo($now); + + WikiDb::factory()->create([ + 'wiki_id' => null, + 'version' => config('wbstack.wiki_db_use_version'), + ]); + QueryserviceNamespace::create([ + 'namespace' => 'automatic-expiry-test', + 'backend' => 'wdqs.svc', + ]); + + $response = $this->actingAs($user, 'api')->postJson($this->route, [ + 'domain' => 'automatic-expiry-test.wikibase.cloud', + 'sitename' => 'Automatic Expiry Test', + 'username' => 'Admin', + ]); + + $response->assertOk()->assertJsonPath('success', true); + $suspension = WikiSuspension::where('wiki_id', $response->json('data.id'))->sole(); + $this->assertSame(WikiSuspensionReason::AUTOMATIC_EXPIRY, $suspension->reason); + $this->assertTrue($suspension->active_from->equalTo('2026-08-31 12:00')); + $this->assertNull($suspension->actor_user_id); + $this->assertNull($suspension->review_submission_action_id); + } + /** * @dataProvider createDispatchesSomeJobsProvider */