Resolve recommended-profile Critical and High findings, update vulnerable dependencies, restore invoice queue E2E authentication setup, and clear the remaining frontend Qodana findings.
86 lines
5.1 KiB
JavaScript
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"');
|
|
});
|
|
});
|