create(); $assets = SnipeAsset::factory()->count(2)->create(); $startsAt = now()->addDays(2)->startOfHour(); $endsAt = $startsAt->addHours(3); $response = $this->actingAs($user)->post('/requisicoes', [ 'purpose' => 'Produção de conteúdos para a disciplina de multimédia.', 'usage_location' => 'Estúdio multimédia', 'starts_at' => $startsAt->toIso8601String(), 'ends_at' => $endsAt->toIso8601String(), 'asset_ids' => $assets->modelKeys(), 'terms_accepted' => true, ]); $response->assertRedirect('/dashboard')->assertSessionHas('success'); $this->assertDatabaseHas('reservations', [ 'requester_id' => $user->id, 'status' => ReservationStatus::PendingApproval->value, ]); $this->assertDatabaseCount('reservation_items', 2); $this->assertDatabaseHas('reservation_items', ['status' => ReservationItemStatus::Held->value]); $this->assertDatabaseHas('audit_logs', ['event' => 'reservation.submitted', 'actor_id' => $user->id]); }); it('recusa um período que conflita com uma pré-reserva', function () { $user = User::factory()->create(); $asset = SnipeAsset::factory()->create(); $startsAt = now()->addDays(3)->startOfHour(); $payload = [ 'purpose' => 'Utilização pedagógica do equipamento na sala de aula.', 'usage_location' => 'Sala 12', 'starts_at' => $startsAt->toIso8601String(), 'ends_at' => $startsAt->addHours(2)->toIso8601String(), 'asset_ids' => [$asset->id], 'terms_accepted' => true, ]; $this->actingAs($user)->post('/requisicoes', $payload)->assertRedirect('/dashboard'); $this->actingAs(User::factory()->create()) ->from('/requisicoes/nova') ->post('/requisicoes', $payload) ->assertRedirect('/requisicoes/nova') ->assertSessionHasErrors('asset_ids'); $this->assertDatabaseCount('reservations', 1); }); it('exige autenticação para consultar o catálogo', function () { $this->get('/equipamentos')->assertRedirect('/login'); }); it('não expõe registo público', function () { $this->get('/register')->assertNotFound(); });