create(); $user = User::factory()->for($tenant)->create(); $p = Project::factory()->for($tenant)->create(['region_mask' => 1]); $this->actingAs($user) ->postJson('/api/projects/bulk', [ 'action' => 'update_regions', 'ids' => [$p->id], 'add' => 6, // биты 2+4 = Северо-Западный + Южный 'remove' => 1, // бит 1 = Центральный ]) ->assertOk() ->assertJsonStructure(['updated', 'skipped', 'warnings']); })->todo('Service handler implemented in Task 2'); it('rejects unknown action', function () { $user = User::factory()->create(); $this->actingAs($user) ->postJson('/api/projects/bulk', [ 'action' => 'nuke_everything', 'ids' => [1], ]) ->assertStatus(422) ->assertJsonValidationErrors(['action']); }); it('rejects update_limit with both delta and replace', function () { $user = User::factory()->create(); $this->actingAs($user) ->postJson('/api/projects/bulk', [ 'action' => 'update_limit', 'ids' => [1], 'delta' => 50, 'replace' => 500, ]) ->assertStatus(422); }); it('rejects empty ids without scope', function () { $user = User::factory()->create(); $this->actingAs($user) ->postJson('/api/projects/bulk', [ 'action' => 'pause', ]) ->assertStatus(422); }); it('accepts empty scope.filter as valid scope (all projects)', function () { $tenant = Tenant::factory()->create(); $user = User::factory()->for($tenant)->create(); $this->actingAs($user) ->postJson('/api/projects/bulk', [ 'action' => 'pause', 'scope' => ['filter' => []], ]) ->assertOk(); });