Files
pleno-vue/tests/unit/use-wash-progress.spec.js
T

134 lines
4.3 KiB
JavaScript

// @vitest-environment jsdom
import { mount } from "@vue/test-utils";
import { ref } from "vue";
import { afterEach, describe, expect, it, vi } from "vitest";
import { useWashProgress } from "@/composables/useWashProgress.js";
const buildSavedProgress = (overrides = {}) => ({
washInProgress: true,
washLaneId: 7,
washStartTime: Date.now() - 30_000,
currentStep: 4,
licensePlateInput: "AB12345",
vehicleTypeSelect: 2,
radioWashType: "Manual",
radioLaneOption: 7,
customerNumberInput: "12345679",
answers: {},
completedTasks: {},
nearestDepartmentId: 6,
forceNearestDepartmentEvaluationId: 0,
savedAt: Date.now(),
isForcingNearestDepartment: false,
...overrides,
});
const createProgress = () => {
const state = {
currentStep: ref(0),
washInProgress: ref(false),
washLaneId: ref(null),
washStartTime: ref(null),
licensePlateInput: ref(null),
vehicleTypeSelect: ref(null),
radioWashType: ref("Manual"),
radioLaneOption: ref("Any"),
customerNumberInput: ref(null),
answers: ref({}),
completedTasks: ref({}),
forceNearestDepartmentEvaluationId: ref(0),
isForcingNearestDepartment: ref(false),
};
let progress = null;
const wrapper = mount({
setup() {
progress = useWashProgress({
...state,
nearestDepartmentId: () => 6,
applyRestoredState: (savedProgress) => {
state.washInProgress.value = savedProgress.washInProgress;
state.washLaneId.value = savedProgress.washLaneId;
state.washStartTime.value = savedProgress.washStartTime;
state.currentStep.value = savedProgress.currentStep;
state.licensePlateInput.value = savedProgress.licensePlateInput;
state.vehicleTypeSelect.value = savedProgress.vehicleTypeSelect;
state.radioWashType.value = savedProgress.radioWashType;
state.radioLaneOption.value = savedProgress.radioLaneOption;
state.customerNumberInput.value = savedProgress.customerNumberInput;
state.answers.value = savedProgress.answers;
state.completedTasks.value = savedProgress.completedTasks;
state.forceNearestDepartmentEvaluationId.value = savedProgress.forceNearestDepartmentEvaluationId;
state.isForcingNearestDepartment.value = savedProgress.isForcingNearestDepartment;
},
});
return {};
},
template: "<div />",
});
return { progress, state, wrapper };
};
describe("useWashProgress", () => {
const wrappers = [];
afterEach(() => {
wrappers.splice(0).forEach((wrapper) => wrapper.unmount());
localStorage.clear();
vi.useRealTimers();
});
it("does not reapply a restored step after the restored wash state changes", () => {
vi.useFakeTimers();
localStorage.setItem("mywash_progress_v6", JSON.stringify(buildSavedProgress()));
const { progress, state, wrapper } = createProgress();
wrappers.push(wrapper);
progress.restoreProgress();
state.washInProgress.value = false;
state.washLaneId.value = null;
state.washStartTime.value = null;
state.licensePlateInput.value = "";
state.currentStep.value = 0;
vi.advanceTimersByTime(1500);
expect(state.currentStep.value).toBe(0);
expect(progress.isRestoring.value).toBe(false);
});
it("reapplies the restored step while the restored wash state is still current", () => {
vi.useFakeTimers();
localStorage.setItem("mywash_progress_v6", JSON.stringify(buildSavedProgress()));
const { progress, state, wrapper } = createProgress();
wrappers.push(wrapper);
progress.restoreProgress();
state.currentStep.value = 0;
vi.advanceTimersByTime(1500);
expect(state.currentStep.value).toBe(4);
expect(progress.isRestoring.value).toBe(false);
});
it("does not persist the completed step as resumable wash progress", () => {
localStorage.setItem("mywash_progress_v6", JSON.stringify(buildSavedProgress()));
const { progress, state, wrapper } = createProgress();
wrappers.push(wrapper);
state.washInProgress.value = false;
state.washLaneId.value = null;
state.washStartTime.value = null;
state.currentStep.value = 5;
progress.isRestoring.value = false;
progress.saveProgress("watch-currentStep");
expect(localStorage.getItem("mywash_progress_v6")).toBeNull();
});
});