Files

150 lines
5.7 KiB
PHP
Raw Permalink Normal View History

<?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,
]);
}
2026-08-10 12:15:14 +03:00
public function test_toggling_done_records_actual_weight_and_reps(): 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]);
$this->actingAs($user)->patch(route('sessions.items.toggle', [$session, $item]), [
'actual_weight' => 62.5,
'actual_reps' => 8,
]);
$this->assertDatabaseHas('workout_session_items', [
'session_id' => $session->id,
'workout_exercise_id' => $item->id,
'done' => true,
'actual_weight' => 62.5,
'actual_reps' => 8,
]);
}
public function test_untoggling_does_not_send_actual_weight(): 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]);
$this->actingAs($user)->patch(route('sessions.items.toggle', [$session, $item]), [
'actual_weight' => 62.5,
'actual_reps' => 8,
]);
$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,
'actual_weight' => 62.5,
]);
}
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);
}
}