user = User::factory()->create(); }); test('an user can add todo', function () { Sanctum::actingAs($this->user); $this->post('api/todos', [ 'name' => 'Test', ]) ->assertStatus(201) ->assertJson([ 'user_id' => $this->user->id, 'name' => 'Test', 'checked' => false, ]); expect($this->user->toDos) ->toHaveCount(1) ->first()->name->toBe('Test') ->first()->checked->toBeNull() ->first()->user->id->toBe($this->user->id); }); test('an user can retrieve his to dos', function () { Sanctum::actingAs($this->user); ToDo::factory()->count(10)->create([ 'user_id' => $this->user->id, 'checked' => null, ]); $response = $this->get('api/todos'); $toDos = $this->user->toDos->map(fn ($toDo) => [ 'id' => $toDo->id, 'user_id' => $toDo->user_id, 'name' => $toDo->name, 'checked' => false, ])->toArray(); $response->assertOk() ->assertJson($toDos); }); test('an user can retrieve his finished to dos', function () { Sanctum::actingAs($this->user); ToDo::factory()->count(10)->create([ 'user_id' => $this->user->id, ]); $response = $this->get('api/todos/finished'); $toDos = $this->user->toDos()->whereNotNull('checked')->get()->map(fn ($toDo) => [ 'id' => $toDo->id, 'user_id' => $toDo->user_id, 'name' => $toDo->name, 'checked' => now(), ])->toArray(); $response->assertOk() ->assertJson($toDos); }); test('an user can retrieve a to do', function () { Sanctum::actingAs($this->user); $toDos = ToDo::factory()->count(10)->create([ 'user_id' => $this->user->id, 'checked' => null, ]); $toDo = $toDos[rand(0, 9)]; $this->get('api/todos/'.$toDo->id) ->assertOk() ->assertJson([ 'id' => $toDo->id, 'user_id' => $toDo->user_id, 'name' => $toDo->name, 'checked' => false, ]); }); test('an user can update a to do', function () { Sanctum::actingAs($this->user); $toDos = ToDo::factory()->count(10)->create([ 'user_id' => $this->user->id, 'checked' => null, ]); $toDo = $toDos[rand(0, 9)]; $this->put('api/todos/'.$toDo->id, ['name' => 'update test']) ->assertOk() ->assertJson([ 'id' => $toDo->id, 'user_id' => $toDo->user_id, 'name' => 'update test', 'checked' => null, ]); expect(ToDo::find($toDo->id)) ->name->toBe('update test'); $this->put('api/todos/'.$toDo->id, ['checked' => true]) ->assertOk() ->assertJson([ 'id' => $toDo->id, 'user_id' => $toDo->user_id, 'name' => 'update test', 'checked' => now()->format('Y-m-d H:i:s'), ]); }); test('an user can delete a to do', function () { Sanctum::actingAs($this->user); $toDos = ToDo::factory()->count(10)->create([ 'user_id' => $this->user->id, 'checked' => null, ]); $toDo = $toDos[rand(0, 9)]; $this->delete('api/todos/'.$toDo->id) ->assertNoContent(); expect(ToDo::all())->toHaveCount(9); });