Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
name: Cypress Tests
name: Playwright Tests

on: push

jobs:
cypress-run:
playwright-run:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Cypress run
uses: cypress-io/github-action@v6
- name: Setup Node
uses: actions/setup-node@v4
with:
build: npm run example:build
start: npm run example:dev
node-version: lts/*
- name: Install dependencies
run: npm ci
- name: Install Playwright browsers
run: npx playwright install --with-deps
- name: Run Playwright tests
run: npx playwright test
10 changes: 0 additions & 10 deletions cypress.config.js

This file was deleted.

180 changes: 0 additions & 180 deletions cypress/e2e/spec.cy.js

This file was deleted.

179 changes: 179 additions & 0 deletions e2e/spec.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
import { test, expect } from '@playwright/test'

test.describe('basic', () => {
test('should not change in readOnlyMode', async ({ page }) => {
await page.goto('/')

const content = page.locator('.selected-text')
await expect(content).toHaveText('Selected: None')

// Switch to read only mode
await page.locator('[name=read-only]').click()

// make a selection
await page.locator('[data-row="1"][data-col="1"] > button').click()

// Nothing should be selected
await expect(content).toHaveText('Selected: None')
})

test('Switch between modes', async ({ page }) => {
await page.goto('/')

const content = page.locator('.selected-text')
await expect(content).toHaveText('Selected: None')

// Switch to range
await page.locator('[name=mode][value=range]').click()
await expect(content).toHaveText('Selected Range: None - None')

// Switch to single
await page.locator('[name=mode][value=single]').click()
await expect(content).not.toHaveText('Selected Range: None - None')
await expect(content).toHaveText('Selected: None')
})

test('Basic Keyboard movement', async ({ page }) => {
await page.goto('/')
await page.locator('[data-row="1"][data-col="1"] > button').click()

// Down
await page
.locator('[data-row="1"][data-col="1"] > button')
.press('ArrowDown')
await expect(
page.locator('[data-row="2"][data-col="1"] > button')
).toHaveCSS('background-color', /rgb\(0, 0, 0\)/)

// Up
await page.locator('[data-row="2"][data-col="1"] > button').press('ArrowUp')
await expect(
page.locator('[data-row="1"][data-col="1"] > button')
).toHaveCSS('background-color', /rgb\(0, 0, 0\)/)

// Right
await page
.locator('[data-row="1"][data-col="1"] > button')
.press('ArrowRight')
await expect(
page.locator('[data-row="1"][data-col="2"] > button')
).toHaveCSS('background-color', /rgb\(0, 0, 0\)/)

// Left
await page
.locator('[data-row="1"][data-col="2"] > button')
.press('ArrowLeft')
await expect(
page.locator('[data-row="1"][data-col="1"] > button')
).toHaveCSS('background-color', /rgb\(0, 0, 0\)/)
})

test('changes month and year from dropdowns', async ({ page }) => {
await page.goto('/')

// Months are 0-indexed: 10 => November
await page.locator('.preachjs-calendar--header-month').selectOption('10')
await page.locator('.preachjs-calendar--header-year').selectOption('2030')

await expect(page.locator('.preachjs-calendar--grid')).toHaveAttribute(
'aria-label',
'Nov 2030'
)
})

test('should disable dates before min', async ({ page }) => {
await page.goto('/')

const today = new Date()
const tomorrow = new Date(today)
tomorrow.setDate(today.getDate() + 1)

const formatDateInput = date => {
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
}

await page.locator('input[name="min"]').fill(formatDateInput(tomorrow))

const todayISO = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
).toISOString()
await expect(page.locator(`[data-date="${todayISO}"]`)).toHaveClass(
/preachjs-calendar--grid-cell-disabled/
)
await page
.locator(`[data-date="${todayISO}"] > button`)
.click({ force: true })

await expect(page.locator('.selected-text')).toHaveText('Selected: None')
})

test('should disable dates after max', async ({ page }) => {
await page.goto('/')

const today = new Date()
const yesterday = new Date(today)
yesterday.setDate(today.getDate() - 1)

const formatDateInput = date => {
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
}

await page.locator('input[name="max"]').fill(formatDateInput(yesterday))

const todayISO = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
).toISOString()
await expect(page.locator(`[data-date="${todayISO}"]`)).toHaveClass(
/preachjs-calendar--grid-cell-disabled/
)
await page
.locator(`[data-date="${todayISO}"] > button`)
.click({ force: true })

await expect(page.locator('.selected-text')).toHaveText('Selected: None')
})

test('should allow selection within min and max', async ({ page }) => {
await page.goto('/')

const today = new Date()
const yesterday = new Date(today)
yesterday.setDate(today.getDate() - 1)
const tomorrow = new Date(today)
tomorrow.setDate(today.getDate() + 1)

const formatDateInput = date => {
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
}

await page.locator('input[name="min"]').fill(formatDateInput(yesterday))
await page.locator('input[name="max"]').fill(formatDateInput(tomorrow))

const todayISO = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
).toISOString()
await expect(page.locator(`[data-date="${todayISO}"]`)).not.toHaveClass(
/preachjs-calendar--grid-cell-disabled/
)
await page.locator(`[data-date="${todayISO}"] > button`).click()

await expect(page.locator('.selected-text')).not.toHaveText(
'Selected: None'
)
})
})
Loading
Loading