Files
fitness/tests/Feature/WorkoutSessionTest.php
T
rootandClaude Sonnet 5 0a36afbfdc Add feature test coverage for the core domain
Only Breeze's default auth/profile tests existed - nothing covered
Workouts, Sessions, Exercises, Yoga, Favorites, Blog, or the Admin
panel, which is the actual product. Adds factories for the domain
models and 45 new feature tests covering the main flows plus
authorization boundaries (owner-only access on workouts/sessions,
admin-only access on /admin, drafts hidden from the public blog).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 11:47:51 +03:00

108 lines
4.0 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\User;
use App\Models\Workout;
use App\Models\WorkoutExercise;
use App\Models\WorkoutSession;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class WorkoutSessionTest extends TestCase
{
use RefreshDatabase;
public function test_owner_can_start_a_session_with_items_precreated(): void
{
$user = User::factory()->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);
}
}