124 lines
4.2 KiB
PHP
124 lines
4.2 KiB
PHP
<?php
|
|
|
|
use App\Integrations\SnipeIt\Exceptions\SnipeItApiException;
|
|
use App\Integrations\SnipeIt\SnipeItClient;
|
|
use Illuminate\Http\Client\Request;
|
|
use Illuminate\Support\Facades\Http;
|
|
|
|
beforeEach(function () {
|
|
config()->set('services.snipe_it', [
|
|
'url' => 'https://inventory.example.test',
|
|
'read_token' => 'read-token-for-tests',
|
|
'operational_token' => 'operational-token-for-tests',
|
|
'timeout' => 2,
|
|
'page_size' => 2,
|
|
'retries' => 1,
|
|
'retry_delay_ms' => 0,
|
|
]);
|
|
});
|
|
|
|
it('percorre todas as páginas de equipamentos com os cabeçalhos obrigatórios', function () {
|
|
Http::fakeSequence()
|
|
->push(['total' => 3, 'rows' => [snipeClientRow(1), snipeClientRow(2)]])
|
|
->push(['total' => 3, 'rows' => [snipeClientRow(3)]]);
|
|
|
|
$pages = iterator_to_array(app(SnipeItClient::class)->hardwarePages());
|
|
|
|
expect($pages)->toHaveCount(2)
|
|
->and($pages[0]->offset)->toBe(0)
|
|
->and($pages[1]->offset)->toBe(2)
|
|
->and($pages[1]->rows[0]['id'])->toBe(3);
|
|
|
|
Http::assertSentCount(2);
|
|
Http::assertSent(function (Request $request): bool {
|
|
parse_str((string) parse_url($request->url(), PHP_URL_QUERY), $query);
|
|
|
|
return $request->hasHeader('Authorization', 'Bearer read-token-for-tests')
|
|
&& $request->hasHeader('Accept', 'application/json')
|
|
&& ($query['limit'] ?? null) === '2'
|
|
&& in_array($query['offset'] ?? null, ['0', '2'], true);
|
|
});
|
|
});
|
|
|
|
it('repete falhas transitórias e recupera', function () {
|
|
config()->set('services.snipe_it.retries', 2);
|
|
|
|
Http::fakeSequence()
|
|
->push(['message' => 'temporarily unavailable'], 503)
|
|
->push(['total' => 1, 'rows' => [snipeClientRow(1)]]);
|
|
|
|
$page = app(SnipeItClient::class)->listHardwarePage();
|
|
|
|
expect($page->total)->toBe(1);
|
|
Http::assertSentCount(2);
|
|
});
|
|
|
|
it('recusa erros transportados num HTTP 200', function () {
|
|
Http::fake([
|
|
'*' => Http::response(['status' => 'error', 'messages' => 'Unauthorized'], 200),
|
|
]);
|
|
|
|
expect(fn () => app(SnipeItClient::class)->listHardwarePage())
|
|
->toThrow(SnipeItApiException::class, 'recusou a consulta');
|
|
});
|
|
|
|
it('regista uma entrega com o token operacional e o destinatário Snipe-IT', function () {
|
|
Http::fake([
|
|
'*' => Http::response(['status' => 'success', 'payload' => ['id' => 41]], 200),
|
|
]);
|
|
|
|
$payload = app(SnipeItClient::class)->checkoutHardware(41, 2, 73, '2026-08-10', 'Reserva RR-001');
|
|
|
|
expect($payload['status'])->toBe('success');
|
|
|
|
Http::assertSent(function (Request $request): bool {
|
|
return $request->method() === 'POST'
|
|
&& $request->url() === 'https://inventory.example.test/api/v1/hardware/41/checkout'
|
|
&& $request->hasHeader('Authorization', 'Bearer operational-token-for-tests')
|
|
&& $request->data() === [
|
|
'status_id' => 2,
|
|
'checkout_to_type' => 'user',
|
|
'assigned_user' => 73,
|
|
'expected_checkin' => '2026-08-10',
|
|
'note' => 'Reserva RR-001',
|
|
];
|
|
});
|
|
});
|
|
|
|
it('regista uma devolução com estado e localização no Snipe-IT', function () {
|
|
Http::fake([
|
|
'*' => Http::response(['status' => 'success', 'payload' => ['id' => 41]], 200),
|
|
]);
|
|
|
|
app(SnipeItClient::class)->checkinHardware(41, 2, 9, 'Devolvido sem danos');
|
|
|
|
Http::assertSent(function (Request $request): bool {
|
|
return $request->method() === 'POST'
|
|
&& $request->url() === 'https://inventory.example.test/api/v1/hardware/41/checkin'
|
|
&& $request->data() === [
|
|
'status_id' => 2,
|
|
'location_id' => 9,
|
|
'note' => 'Devolvido sem danos',
|
|
];
|
|
});
|
|
});
|
|
|
|
it('recusa erros operacionais transportados num HTTP 200', function () {
|
|
Http::fake([
|
|
'*' => Http::response(['status' => 'error', 'messages' => 'Asset is not deployable'], 200),
|
|
]);
|
|
|
|
expect(fn () => app(SnipeItClient::class)->checkoutHardware(41, 2, 73, '2026-08-10'))
|
|
->toThrow(SnipeItApiException::class, 'recusou a entrega');
|
|
});
|
|
|
|
/** @return array<string, mixed> */
|
|
function snipeClientRow(int $id): array
|
|
{
|
|
return [
|
|
'id' => $id,
|
|
'asset_tag' => "EQ-{$id}",
|
|
'name' => "Equipamento {$id}",
|
|
];
|
|
}
|