134 lines
4.3 KiB
JavaScript
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();
|
|
});
|
|
});
|