- Added unit tests for `applyPosAddCustomerSearchResult` to handle autofill field updates, manual overrides, and stale response rejection. - Implemented a new e2e scenario for preserving manual edits during autofill updates and ignoring stale delayed responses. - Refactored `mobilePos.js` fixture setup to include CVR search and customer registration mock logic. - Added and integrated `PosDesktopCustomerConflictModal.vue` for UI handling of customer conflicts.
148 lines
4.6 KiB
JavaScript
148 lines
4.6 KiB
JavaScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
applyPosAddCustomerSearchResult,
|
|
createPosAddCustomerFields,
|
|
createPosAddCustomerManualOverrides,
|
|
createPosAddCustomerRequestState,
|
|
nextPosAddCustomerRequestState,
|
|
resolvePosAddCustomerRequestState,
|
|
setPosAddCustomerManualOverride,
|
|
} from "@/components/displays/department/pos/steps/mobile/elements/posAddCustomerAutofill.js";
|
|
|
|
function createSearchResult(overrides = {}) {
|
|
return {
|
|
vat: 41004355,
|
|
name: "Truckwash ApS",
|
|
phone: "21754690",
|
|
email: "mikkel@truckwash.dk",
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
describe("POS mobile add-customer autofill", () => {
|
|
it("fills all eligible fields on the initial successful lookup", () => {
|
|
const nextFields = applyPosAddCustomerSearchResult({
|
|
fields: createPosAddCustomerFields(),
|
|
manualOverrides: createPosAddCustomerManualOverrides(),
|
|
searchResult: createSearchResult(),
|
|
notFoundLabel: "Not found",
|
|
});
|
|
|
|
expect(nextFields).toEqual({
|
|
cvr: "41004355",
|
|
companyPhone: "21754690",
|
|
invoiceEmail: "mikkel@truckwash.dk",
|
|
contactEmail: "mikkel@truckwash.dk",
|
|
contactPhone: "21754690",
|
|
});
|
|
});
|
|
|
|
it("updates only untouched fields when a later lookup resolves", () => {
|
|
const initialFields = applyPosAddCustomerSearchResult({
|
|
fields: createPosAddCustomerFields(),
|
|
manualOverrides: createPosAddCustomerManualOverrides(),
|
|
searchResult: createSearchResult(),
|
|
notFoundLabel: "Not found",
|
|
});
|
|
|
|
const nextFields = applyPosAddCustomerSearchResult({
|
|
fields: {
|
|
...initialFields,
|
|
companyPhone: "55550000",
|
|
},
|
|
manualOverrides: createPosAddCustomerManualOverrides({
|
|
companyPhone: true,
|
|
}),
|
|
searchResult: createSearchResult({
|
|
vat: 43423010,
|
|
name: "Wash Group ApS",
|
|
phone: "42331128",
|
|
email: "billing@wash-group.test",
|
|
}),
|
|
notFoundLabel: "Not found",
|
|
});
|
|
|
|
expect(nextFields).toEqual({
|
|
cvr: "43423010",
|
|
companyPhone: "55550000",
|
|
invoiceEmail: "billing@wash-group.test",
|
|
contactEmail: "billing@wash-group.test",
|
|
contactPhone: "42331128",
|
|
});
|
|
});
|
|
|
|
it("preserves manually edited fields across later autofill passes", () => {
|
|
const manualOverrides = createPosAddCustomerManualOverrides({
|
|
companyPhone: true,
|
|
contactEmail: true,
|
|
});
|
|
|
|
const nextFields = applyPosAddCustomerSearchResult({
|
|
fields: createPosAddCustomerFields({
|
|
cvr: "41004355",
|
|
companyPhone: "99998888",
|
|
invoiceEmail: "old-invoice@example.com",
|
|
contactEmail: "dispatch@example.com",
|
|
contactPhone: "21754690",
|
|
}),
|
|
manualOverrides,
|
|
searchResult: createSearchResult({
|
|
vat: 43423010,
|
|
phone: "42331128",
|
|
email: "billing@wash-group.test",
|
|
}),
|
|
notFoundLabel: "Not found",
|
|
});
|
|
|
|
expect(nextFields.companyPhone).toBe("99998888");
|
|
expect(nextFields.contactEmail).toBe("dispatch@example.com");
|
|
expect(nextFields.invoiceEmail).toBe("billing@wash-group.test");
|
|
expect(nextFields.contactPhone).toBe("42331128");
|
|
expect(nextFields.cvr).toBe("43423010");
|
|
});
|
|
|
|
it("refills a field after the operator clears a manual override", () => {
|
|
const withManualEdit = setPosAddCustomerManualOverride(
|
|
createPosAddCustomerManualOverrides({
|
|
companyPhone: true,
|
|
}),
|
|
"companyPhone",
|
|
""
|
|
);
|
|
|
|
expect(withManualEdit.companyPhone).toBe(false);
|
|
|
|
const nextFields = applyPosAddCustomerSearchResult({
|
|
fields: createPosAddCustomerFields({
|
|
companyPhone: "",
|
|
}),
|
|
manualOverrides: withManualEdit,
|
|
searchResult: createSearchResult({
|
|
phone: "42331128",
|
|
}),
|
|
notFoundLabel: "Not found",
|
|
});
|
|
|
|
expect(nextFields.companyPhone).toBe("42331128");
|
|
});
|
|
|
|
it("rejects slower stale responses after a newer lookup wins", () => {
|
|
const initialState = createPosAddCustomerRequestState();
|
|
const firstRequest = nextPosAddCustomerRequestState(initialState);
|
|
const secondRequest = nextPosAddCustomerRequestState(firstRequest.state);
|
|
|
|
const staleResolution = resolvePosAddCustomerRequestState(secondRequest.state, firstRequest.requestId);
|
|
const latestResolution = resolvePosAddCustomerRequestState(secondRequest.state, secondRequest.requestId);
|
|
|
|
expect(staleResolution.shouldApply).toBe(false);
|
|
expect(staleResolution.state).toEqual(secondRequest.state);
|
|
|
|
expect(latestResolution.shouldApply).toBe(true);
|
|
expect(latestResolution.state).toEqual({
|
|
latestRequestedId: secondRequest.requestId,
|
|
latestAppliedId: secondRequest.requestId,
|
|
});
|
|
});
|
|
});
|