// @vitest-environment jsdom import { defineComponent, ref } from "vue"; import { mount } from "@vue/test-utils"; import { beforeEach, describe, expect, it, vi } from "vitest"; const sharedState = vi.hoisted(() => ({ width: null, })); vi.mock("@vueuse/core", async () => { const { ref: vueRef } = await import("vue"); const width = vueRef(1024); sharedState.width = width; return { useWindowSize: () => ({ width }), }; }); vi.mock("buefy", () => ({ BMessage: defineComponent({ name: "BMessage", template: "
", }), })); vi.mock("@/components/session/token/SessionUser.vue", () => ({ SessionUser: { functions: { device: { isMobile: () => false, }, ucFirst: (value) => String(value).charAt(0).toUpperCase() + String(value).slice(1), }, objects: { global: { language: { text: { today: "Today", yesterday: "Yesterday", this_week: "This week", last_week: "Last week", this_month: "This month", last_month: "Last month", same_week_last_year: "Same week last year", same_month_last_year: "Same month last year", date_from: "From", date_to: "To", month: "Month", year: "Year", }, }, }, }, }, })); import DatePeriodSelector from "@/components/displays/buttons/DatePeriodSelector.vue"; describe("DatePeriodSelector mobile layout", () => { beforeEach(() => { sharedState.width.value = 480; }); it("renders stacked mobile controls and hides advanced month and year selectors by default", async () => { const wrapper = mount(DatePeriodSelector, { props: { selection: { startDate: new Date("2026-03-01T00:00:00.000Z"), endDate: new Date("2026-03-03T00:00:00.000Z"), }, onSelectionChange: vi.fn(), visibility: { showMonthSelector: true, showYearSelector: true, showUpdateButton: false, }, }, }); expect(wrapper.get("[data-testid='date-period-mobile-layout']").exists()).toBe(true); expect(wrapper.get("[data-testid='date-period-shortcuts']").exists()).toBe(true); expect(wrapper.get("[data-testid='date-period-start']").exists()).toBe(true); expect(wrapper.get("[data-testid='date-period-end']").exists()).toBe(true); expect(wrapper.findAll("select")).toHaveLength(1); await wrapper.get("[data-testid='date-period-advanced-toggle']").trigger("click"); expect(wrapper.findAll("select")).toHaveLength(3); }); it("preserves the update:selection and onSelectionChange contract on mobile", async () => { const onSelectionChange = vi.fn(); const wrapper = mount(DatePeriodSelector, { props: { selection: { startDate: new Date("2026-03-01T00:00:00.000Z"), endDate: new Date("2026-03-03T00:00:00.000Z"), }, onSelectionChange, visibility: { showMonthSelector: true, showYearSelector: true, showUpdateButton: false, }, }, }); await wrapper.get("[data-testid='date-period-end']").setValue("2026-03-05"); const emittedSelection = wrapper.emitted("update:selection")?.at(-1)?.[0]; expect(emittedSelection.startDate.toISOString().split("T")[0]).toBe("2026-03-01"); expect(emittedSelection.endDate.toISOString().split("T")[0]).toBe("2026-03-05"); expect(onSelectionChange).toHaveBeenCalledTimes(1); expect(onSelectionChange.mock.calls[0][0].toISOString().split("T")[0]).toBe("2026-03-01"); expect(onSelectionChange.mock.calls[0][1].toISOString().split("T")[0]).toBe("2026-03-05"); }); });