create(); $response = $this->getJson(route('tasks.index')); $response->assertOk() ->assertJsonCount(3, 'data'); } public function test_store_creates_task(): void { $payload = [ 'title' => 'Новая задача', 'is_done' => false, 'due_at' => now()->addDay()->toIso8601ZuluString(), 'tags' => ['home', 'shopping'], ]; $response = $this->postJson(route('tasks.store'), $payload); $response->assertCreated() ->assertJsonFragment([ 'title' => 'Новая задача', 'is_done' => false, ]) ->assertJsonCount(2, 'data.tags'); $this->assertDatabaseHas('tasks', [ 'title' => 'Новая задача', ]); $this->assertDatabaseHas('tags', ['name' => 'home']); $this->assertDatabaseHas('tags', ['name' => 'shopping']); } public function test_show_returns_task(): void { $task = Task::factory()->create(); $response = $this->getJson(route('tasks.show', $task)); $response->assertOk() ->assertJsonPath('data.id', $task->id); } public function test_update_modifies_task(): void { $task = Task::factory()->create(); $payload = ['title' => 'Обновлённая задача', 'is_done' => true]; $response = $this->putJson(route('tasks.update', $task), $payload); $response->assertOk() ->assertJsonFragment([ 'title' => 'Обновлённая задача', 'is_done' => true, ]); $this->assertDatabaseHas('tasks', [ 'id' => $task->id, 'title' => 'Обновлённая задача', 'is_done' => true, ]); } public function test_destroy_deletes_task(): void { $task = Task::factory()->create(); $response = $this->deleteJson(route('tasks.destroy', $task)); $response->assertNoContent(); $this->assertDatabaseMissing('tasks', [ 'id' => $task->id, ]); } public function test_can_filter_tasks_by_tag_and_is_done(): void { $tagWork = Tag::create(['name' => 'work']); $tagHome = Tag::create(['name' => 'home']); $task1 = Task::factory()->create(['is_done' => false]); $task2 = Task::factory()->create(['is_done' => true]); $task3 = Task::factory()->create(['is_done' => false]); $task1->tags()->attach($tagWork->id); $task2->tags()->attach($tagWork->id); $task3->tags()->attach($tagHome->id); $response = $this->getJson(route('tasks.index', ['tag' => 'work'])); $response->assertOk() ->assertJsonCount(2, 'data'); $response = $this->getJson(route('tasks.index', ['is_done' => 0])); $response->assertOk() ->assertJsonCount(2, 'data'); $response = $this->getJson(route('tasks.index', ['is_done' => 1, 'tag' => 'work'])); $response->assertOk() ->assertJsonCount(1, 'data') ->assertJsonPath('data.0.id', $task2->id); } }