import { composeStories } from "@storybook/react"
import { screen } from "@testing-library/react"
import userEvent from "@testing-library/user-event"
import React from "react"
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"
import { render } from "../../../tests/render"
import * as stories from "./DateTimePicker.stories"
const { Default, DisabledButton } = composeStories(stories)
describe("", () => {
beforeEach(() => {
vi.useFakeTimers({ shouldAdvanceTime: true })
vi.setSystemTime(new Date("2025-02-17T12:33:00.000Z"))
})
afterEach(() => {
vi.runOnlyPendingTimers()
vi.useRealTimers()
})
test("Default", async () => {
render()
await userEvent.click(screen.getByRole("button", { name: "Select a date" }))
expect(screen.getByRole("dialog")).toBeVisible()
expect(screen.getByText("February 2025")).toBeVisible()
expect(screen.getByText("17")).toHaveClass("bg-bg-additional-1")
await userEvent.click(screen.getByText("19"))
expect(screen.getByText("19")).toHaveAttribute("aria-selected", "true")
})
test("keyboard navigation", async () => {
render()
await userEvent.click(screen.getByRole("button", { name: "Select a date" }))
await userEvent.keyboard("{arrowright}")
await userEvent.click(screen.getByText("19"))
expect(screen.getByText("19")).toHaveAttribute("aria-selected", "true")
await userEvent.keyboard("{arrowright}")
await userEvent.keyboard("{enter}")
expect(screen.getByText("20")).toHaveAttribute("aria-selected", "true")
})
test("onSelect", async () => {
const onSelect = vi.fn()
render()
await userEvent.click(screen.getByRole("button", { name: "Select a date" }))
await userEvent.click(screen.getByText("19"))
expect(onSelect).toHaveBeenCalledWith(new Date("2025-02-19"))
expect(onSelect).toHaveBeenCalledWith(new Date("2025-02-19T00:00:00.000Z"))
// change time
await userEvent.type(screen.getByDisplayValue("00:00"), "2")
expect(onSelect).toHaveBeenCalledWith(new Date("2025-02-19T00:02:00.000Z"))
})
test("Disabled button", () => {
render()
expect(screen.getByRole("button", { name: "Select a date" })).toBeDisabled()
})
})