import { readFileSync } from "node:fs"; import { join } from "node:path"; import { describe, expect, it } from "vitest"; const root = process.cwd(); const source = readFileSync( join(root, "src/views/dashboards/superUserDashboard/collectedOrderInvoices/CollectedOrderInvoicesQueueHistory.vue"), "utf8" ); describe("collected invoice queue history reliability contract", () => { it("uses server-driven pagination metadata for next-page behavior", () => { expect(source).toContain("parseEconomicTransferQueueListResponse"); expect(source).toContain("const hasMore = ref(false);"); expect(source).toContain("const canGoToNext = computed(() => hasMore.value);"); expect(source).toContain("hasMore.value = Boolean(parsed.hasMore);"); expect(source).toContain("More results available."); }); it("keeps polling single-flight and stops on transport errors", () => { expect(source).toContain("let loadPromise = null;"); expect(source).toContain("if (loadPromise) {"); expect(source).toContain("pollTimer = setTimeout(async () => {"); expect(source).not.toContain("setInterval("); expect(source).toContain("await runQueueBatchWithFallback();"); expect(source).toContain("pollErrorMessage.value = `Polling paused due to a transport error:"); expect(source).toContain("stopPolling();"); }); it("kicks queue worker before refresh and polling status reads", () => { expect(source).toContain("const runQueueBatchWithFallback = async () => {"); expect(source).toContain("if (hasActiveJobs.value) {"); expect(source).toContain("await runQueueBatchWithFallback();"); expect(source).toContain("const run = await runQueueBatchWithFallback();"); }); it("shows richer diagnostics and guards retries by failed status and attempts", () => { expect(source).toContain("attempts: toNonNegativeInt(rawJob?.attempts, 0)"); expect(source).toContain("max_attempts: toNonNegativeInt(rawJob?.max_attempts, 0)"); expect(source).toContain("Created: {{ formatDateTime(job.created_at) }}"); expect(source).toContain("Started: {{ formatDateTime(job.started_at) }}"); expect(source).toContain("Updated: {{ formatDateTime(job.updated_at) }}"); expect(source).toContain("Completed: {{ formatDateTime(job.completed_at) }}"); expect(source).toContain("if (job.status !== ECONOMIC_QUEUE_STATUS.FAILED) {"); expect(source).toContain("if (job.max_attempts > 0 && job.attempts >= job.max_attempts) {"); }); it("exposes a manual run-now action with loading and inline summary state", () => { expect(source).toContain("const runningQueue = ref(false);"); expect(source).toContain("const manualRunUnavailable = ref(false);"); expect(source).toContain("const runSummary = ref(null);"); expect(source).toContain("const runSummaryTone = computed(() => {"); expect(source).toContain("const formatRunSummaryMessage = (summary) => {"); expect(source).toContain("const isManualRunEndpointMissing = (error) => {"); expect(source).toContain('message.includes("processpendingbytransfertype")'); expect(source).toContain("const runQueueViaLegacyFallback = async () => {"); expect(source).toContain("status: ECONOMIC_QUEUE_STATUS.QUEUED,"); expect(source).toContain("manualRunUnavailable.value = true;"); expect(source).toContain("const onRunQueueNow = async () => {"); expect(source).toContain("await SessionUser.objects.collectedOrderInvoices.functions.economic.queue.run();"); expect(source).toContain( "await SessionUser.objects.collectedOrderInvoices.functions.economic.queue.status(queuedJob.id);" ); expect(source).toContain("const run = await runQueueBatchWithFallback();"); expect(source).toContain("runSummary.value = run;"); expect(source).toContain("Legacy fallback active while the backend queue runner is unavailable."); expect(source).toContain('data-testid="economic-queue-history-run-now"'); expect(source).toContain('data-testid="economic-queue-history-run-summary"'); expect(source).toContain(':disabled="loading || refreshing || runningQueue"'); }); it("retains server details_summary, builds local fallback summaries, and renders details modal test ids", () => { expect(source).toContain("details_summary: normalizeDetailsSummary(rawJob?.details_summary, rawJob)"); expect(source).toContain("const buildLocalFallbackSummary = (rawJob) => {"); expect(source).toContain("const normalizeDetailsSummary = (rawSummary, rawJob) => {"); expect(source).toContain("Se detaljer"); expect(source).toContain('data-testid="economic-queue-history-details-modal"'); expect(source).toContain('data-testid="economic-queue-history-details-close"'); expect(source).toContain('data-testid="economic-queue-history-details-section-udfald"'); expect(source).toContain('data-testid="economic-queue-history-details-section-faktura"'); expect(source).toContain('data-testid="economic-queue-history-details-section-overfoersel"'); expect(source).toContain('data-testid="economic-queue-history-details-section-koersel"'); expect(source).toContain('data-testid="economic-queue-history-details-section-teknisk"'); expect(source).toContain('data-testid="economic-queue-history-details-technical-raw"'); }); });