108 lines
4.0 KiB
PHP
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);
|
||
|
|
}
|
||
|
|
}
|