Files
pleno-vue/tests/unit/collected-order-invoice-queue-history.spec.js
T
Jeppe B 1729443cc3 Resolve frontend Qodana critical and high findings (#176)
Resolve recommended-profile Critical and High findings, update vulnerable dependencies, restore invoice queue E2E authentication setup, and clear the remaining frontend Qodana findings.
2026-07-17 06:22:51 +02:00

86 lines
5.1 KiB
JavaScript

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("runSummary.value = 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("runSummary.value = await runQueueBatchWithFallback();");
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"');
});
});