['count' => 2, 'last_printed_at' => '2026-03-06 10:00:00', 'last_printed_by' => 1], ]; $model->shouldReceive('getStatus') ->once() ->with([5, 7], '2025-2026') ->andReturn($expected); $service = new BadgePrintLogService($model, $formatter); $result = $service->getStatus(['5', '7', '5', ''], '2025-2026'); $this->assertSame($expected, $result); } public function test_log_normalizes_ids_and_returns_inserted_count(): void { $model = Mockery::mock(BadgePrintLog::class); $formatter = new BadgeTextFormatter; $model->shouldReceive('logPrints') ->once() ->with( [10, 20], 99, '2025-2026', ['10' => 'Teacher'], ['10' => '3-A'], 1 ) ->andReturn(2); $service = new BadgePrintLogService($model, $formatter); $result = $service->log( userIds: ['10', '20', '10'], actorId: 99, schoolYear: '2025-2026', rolesMap: ['10' => 'Teacher'], classesMap: ['10' => '3-A'], copies: 1 ); $this->assertSame(2, $result); } public function test_log_safely_swallows_exceptions_and_logs_error(): void { Log::spy(); $model = Mockery::mock(BadgePrintLog::class); $formatter = new BadgeTextFormatter; $model->shouldReceive('logPrints') ->once() ->andThrow(new \RuntimeException('table missing')); $service = new BadgePrintLogService($model, $formatter); $service->logSafely( userIds: [1, 2], actorId: 5, schoolYear: '2025-2026' ); Log::shouldHaveReceived('error')->once(); $this->assertTrue(true); } }