PDO::ERRMODE_EXCEPTION]); if ($db->query('SELECT current_database()')->fetchColumn() !== $name) { throw new LogicException('Destino de teste divergente.'); } } else { $db = new PDO('sqlite::memory:', options: [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); } return $db; } function inboxDatabase(): PDO { $db = inboxConnection(); if (getenv('INBOX_TEST_PG') === '1') { $db->exec('DROP TABLE IF EXISTS sgc_exchange_facts'); $db->exec('DROP TABLE IF EXISTS sgc_exchange_streams'); } foreach (WarehouseInbox::schema() as $sql) { $db->exec($sql); } return $db; } function inboxEvent(int $id = 1, string $action = 'deliver', ?string $delivery = null): array { $event = ['schema' => 'sgc.warehouse.fulfilment-event.v1', 'idempotency_key' => 'sgc:7:warehouse-event:'.$id, 'tenant_id' => 7, 'event_id' => $id, 'event_version' => $id + 2, 'action' => $action, 'occurred_at' => '2026-11-02T10:00:00+00:00', 'actor' => ['id' => 3, 'name' => 'Operador sintético'], 'request' => ['id' => 19, 'reference' => 'RA-19', 'document_type' => 'internal_warehouse_request', 'work_context_key' => 'procurement.internal', 'requester' => ['id' => 5, 'name' => 'Requisitante sintético', 'department_id' => 2], 'warehouse' => ['id' => 1, 'code' => 'ARM', 'name' => 'Armazém sintético'], 'cost_center' => ['id' => 2, 'code' => 'CC', 'name' => 'Centro sintético'], 'destination' => 'Oficina sintética'], 'lines' => $action === 'deliver' ? [['request_line_index' => 0, 'item' => ['id' => 4, 'code' => 'ART', 'name' => 'Artigo sintético', 'unit' => 'un'], 'quantity_milli' => 1500, 'use' => 'internal', 'destination' => 'Oficina sintética', 'equipment' => null, 'stock_operation_id' => $id + 10]] : [], 'delivery_event_key' => $delivery]; return inboxSign($event); } function inboxSign(array $event): array { unset($event['payload_sha256']); return [...$event, 'payload_sha256' => hash('sha256', WarehouseFeed::json($event))]; } function inboxPage(array $events, string $cursor = 'synthetic-opaque-cursor', bool $more = false): array { return ['schema' => 'sgc.warehouse.fulfilment-feed.v1', 'items' => $events, 'next_cursor' => $cursor, 'has_more' => $more]; }