create(); $workout = Workout::factory()->create(['user_id' => $user->id]); $item1 = WorkoutExercise::factory()->create(['workout_id' => $workout->id, 'position' => 1]); $item2 = WorkoutExercise::factory()->create(['workout_id' => $workout->id, 'position' => 2]); $response = $this->actingAs($user)->post(route('sessions.store', $workout)); $session = WorkoutSession::where('workout_id', $workout->id)->firstOrFail(); $response->assertRedirect(route('sessions.show', $session)); $this->assertDatabaseHas('workout_session_items', [ 'session_id' => $session->id, 'workout_exercise_id' => $item1->id, ]); $this->assertDatabaseHas('workout_session_items', [ 'session_id' => $session->id, 'workout_exercise_id' => $item2->id, ]); } public function test_other_user_cannot_start_a_session_for_someone_elses_workout(): void { $owner = User::factory()->create(); $other = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $owner->id]); $response = $this->actingAs($other)->post(route('sessions.store', $workout)); $response->assertForbidden(); } public function test_owner_can_view_their_session(): void { $user = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $user->id]); $session = WorkoutSession::factory()->create(['user_id' => $user->id, 'workout_id' => $workout->id]); $response = $this->actingAs($user)->get(route('sessions.show', $session)); $response->assertOk(); } public function test_other_user_cannot_view_session(): void { $owner = User::factory()->create(); $other = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $owner->id]); $session = WorkoutSession::factory()->create(['user_id' => $owner->id, 'workout_id' => $workout->id]); $response = $this->actingAs($other)->get(route('sessions.show', $session)); $response->assertForbidden(); } public function test_owner_can_toggle_session_item(): void { $user = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $user->id]); $item = WorkoutExercise::factory()->create(['workout_id' => $workout->id]); $session = WorkoutSession::factory()->create(['user_id' => $user->id, 'workout_id' => $workout->id]); $response = $this->actingAs($user)->patch(route('sessions.items.toggle', [$session, $item])); $response->assertRedirect(); $this->assertDatabaseHas('workout_session_items', [ 'session_id' => $session->id, 'workout_exercise_id' => $item->id, 'done' => true, ]); // Toggling again flips it back off $this->actingAs($user)->patch(route('sessions.items.toggle', [$session, $item])); $this->assertDatabaseHas('workout_session_items', [ 'session_id' => $session->id, 'workout_exercise_id' => $item->id, 'done' => false, ]); } public function test_owner_can_complete_a_session(): void { $user = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $user->id]); $session = WorkoutSession::factory()->create(['user_id' => $user->id, 'workout_id' => $workout->id]); $response = $this->actingAs($user)->post(route('sessions.complete', $session)); $response->assertRedirect(route('workouts.show', $workout)); $this->assertNotNull($session->fresh()->completed_at); } }