create(); $public = Workout::factory()->create(['user_id' => $user->id, 'is_public' => true, 'title' => 'Public One']); Workout::factory()->create(['user_id' => $user->id, 'is_public' => false, 'title' => 'Private One']); $response = $this->actingAs($user)->get(route('workouts.community')); $response->assertOk(); $response->assertSee('Public One'); $response->assertDontSee('Private One'); } public function test_community_index_can_search_by_title(): void { $user = User::factory()->create(); Workout::factory()->create(['user_id' => $user->id, 'is_public' => true, 'title' => 'Leg Day Blast']); Workout::factory()->create(['user_id' => $user->id, 'is_public' => true, 'title' => 'Upper Body Push']); $response = $this->actingAs($user)->get(route('workouts.community', ['q' => 'Leg'])); $response->assertOk(); $response->assertSee('Leg Day Blast'); $response->assertDontSee('Upper Body Push'); } public function test_owner_can_toggle_a_workout_public(): void { $user = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $user->id, 'is_public' => false]); $this->actingAs($user)->post(route('workouts.toggle-public', $workout)); $this->assertTrue($workout->fresh()->is_public); $this->actingAs($user)->post(route('workouts.toggle-public', $workout)); $this->assertFalse($workout->fresh()->is_public); } public function test_other_user_cannot_toggle_someone_elses_workout_public(): void { $owner = User::factory()->create(); $other = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $owner->id, 'is_public' => false]); $response = $this->actingAs($other)->post(route('workouts.toggle-public', $workout)); $response->assertForbidden(); $this->assertFalse($workout->fresh()->is_public); } public function test_any_user_can_view_a_public_workout(): void { $owner = User::factory()->create(); $viewer = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $owner->id, 'is_public' => true, 'title' => 'Full Body Blast']); $response = $this->actingAs($viewer)->get(route('workouts.show', $workout)); $response->assertOk(); $response->assertSee('Full Body Blast'); } public function test_viewer_of_a_public_workout_cannot_manage_its_exercises(): void { $owner = User::factory()->create(); $viewer = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $owner->id, 'is_public' => true]); $exercise = Exercise::factory()->create(); $response = $this->actingAs($viewer)->get(route('workouts.show', $workout)); $response->assertOk(); $response->assertDontSee('Add Exercise'); $addResponse = $this->actingAs($viewer)->post(route('workouts.exercises.add', $workout), [ 'exercise_id' => $exercise->id, ]); $addResponse->assertForbidden(); } public function test_non_owner_cannot_view_a_private_workout(): void { $owner = User::factory()->create(); $viewer = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $owner->id, 'is_public' => false]); $response = $this->actingAs($viewer)->get(route('workouts.show', $workout)); $response->assertForbidden(); } public function test_user_can_copy_a_public_workout_with_its_exercises(): void { $owner = User::factory()->create(); $copier = User::factory()->create(); $workout = Workout::factory()->create([ 'user_id' => $owner->id, 'is_public' => true, 'title' => 'Original Workout', 'estimated_minutes' => 45, ]); WorkoutExercise::factory()->create(['workout_id' => $workout->id, 'sets' => 4, 'reps' => 6]); $response = $this->actingAs($copier)->post(route('workouts.copy', $workout)); $response->assertRedirect(); $this->assertDatabaseHas('workouts', [ 'user_id' => $copier->id, 'title' => 'Original Workout (copy)', 'estimated_minutes' => 45, ]); $copiedWorkout = Workout::where('user_id', $copier->id)->firstOrFail(); $this->assertEquals(1, $copiedWorkout->items()->count()); $this->assertEquals(4, $copiedWorkout->items()->first()->sets); // The original is untouched $this->assertEquals(1, $workout->fresh()->items()->count()); } public function test_user_cannot_copy_a_private_workout_they_do_not_own(): void { $owner = User::factory()->create(); $other = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $owner->id, 'is_public' => false]); $response = $this->actingAs($other)->post(route('workouts.copy', $workout)); $response->assertForbidden(); } public function test_owner_can_copy_their_own_private_workout(): void { $owner = User::factory()->create(); $workout = Workout::factory()->create(['user_id' => $owner->id, 'is_public' => false]); $response = $this->actingAs($owner)->post(route('workouts.copy', $workout)); $response->assertRedirect(); $this->assertEquals(2, Workout::where('user_id', $owner->id)->count()); } }