Initial commit
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test.describe('Tracker Flow', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
// 1. Navigate to the app
|
||||
await page.goto('http://localhost:5173/');
|
||||
|
||||
// 2. Cleanup: If there is an active session, end it.
|
||||
const stopBtn = page.getByRole('button', { name: /Stop Sleep/i });
|
||||
if (await stopBtn.isVisible({ timeout: 1000 }).catch(() => false)) {
|
||||
await stopBtn.click();
|
||||
// Wait for the session to end and button to return to "Start Sleep" or be visible again.
|
||||
await expect(page.getByRole('button', { name: /Start Sleep/i })).toBeVisible({ timeout: 5000 });
|
||||
}
|
||||
});
|
||||
|
||||
test('1. page loads — Start Sleep button is visible', async ({ page }) => {
|
||||
// By default, there should be no active session (after cleanup), so "Baby is awake" should be visible.
|
||||
await expect(page.getByRole('button', { name: /Start Sleep/i })).toBeVisible();
|
||||
await expect(page.getByText(/Baby is awake/i)).toBeVisible();
|
||||
});
|
||||
|
||||
test('2. click Start Sleep — button changes to Stop Sleep, status banner updates', async ({ page }) => {
|
||||
const startBtn = page.getByRole('button', { name: /Start Sleep/i });
|
||||
await startBtn.click();
|
||||
|
||||
// The button will temporarily show "Processing..." (disabled).
|
||||
// We wait for it to transition to the active session state: "Stop Sleep".
|
||||
await expect(page.getByRole('button', { name: /Stop Sleep/i })).toBeVisible();
|
||||
await expect(page.getByText(/Baby is sleeping/i)).toBeVisible();
|
||||
});
|
||||
|
||||
test('3. adjust start time to 5 minutes ago — verify API receives adjusted time', async ({ page }) => {
|
||||
const datetimeInput = page.locator('input[type="datetime-local"]');
|
||||
|
||||
const now = new Date();
|
||||
const fiveMinAgo = new Date(now.getTime() - 5 * 60 * 1000);
|
||||
const adjustedTime = fiveMinAgo.toISOString().slice(0, 16);
|
||||
await datetimeInput.fill(adjustedTime);
|
||||
|
||||
await page.getByRole('button', { name: /Start Sleep/i }).click();
|
||||
|
||||
// Wait for transition to "Stop Sleep"
|
||||
await expect(page.getByRole('button', { name: /Stop Sleep/i })).toBeVisible();
|
||||
await expect(page.getByText(/Baby is sleeping/i)).toBeVisible();
|
||||
});
|
||||
|
||||
test('4. click Stop Sleep — button returns to Start Sleep', async ({ page }) => {
|
||||
// 1. Start a session
|
||||
await page.getByRole('button', { name: /Start Sleep/i }).click();
|
||||
await expect(page.getByRole('button', { name: /Stop Sleep/i })).toBeVisible();
|
||||
|
||||
// 2. Stop the session
|
||||
await page.getByRole('button', { name: /Stop Sleep/i }).click();
|
||||
// After clicking, it should return to "Start Sleep"
|
||||
await expect(page.getByRole('button', { name: /Start Sleep/i })).toBeVisible();
|
||||
});
|
||||
|
||||
test('5. reload page — UI correctly reflects state from API', async ({ page }) => {
|
||||
// 1. Start a session
|
||||
await page.getByRole('button', { name: /Start Sleep/i }).click();
|
||||
await expect(page.getByRole('button', { name: /Stop Sleep/i })).toBeVisible();
|
||||
|
||||
// 2. Reload the page
|
||||
await page.reload();
|
||||
|
||||
// 3. Check if state is persistent from API
|
||||
await expect(page.getByRole('button', { name: /Stop Sleep/i })).toBeVisible();
|
||||
await expect(page.getByText(/Baby is sleeping/i)).toBeVisible();
|
||||
});
|
||||
|
||||
test('6. Reset to now link resets the time field', async ({ page }) => {
|
||||
const datetimeInput = page.locator('input[type="datetime-local"]');
|
||||
|
||||
// Fill with a dummy value to see if it resets
|
||||
const futureTime = new Date(Date.now() + 10 * 60 * 1000).toISOString().slice(0, 16);
|
||||
await datetimeInput.fill(futureTime);
|
||||
|
||||
// Click Reset
|
||||
await page.getByRole('button', { name: /Reset to now/i }).click();
|
||||
|
||||
// Value should be updated (might slightly differ due to seconds but we check visibility/existence)
|
||||
const newValue = await datetimeInput.inputValue();
|
||||
expect(newValue).not.toBe(futureTime);
|
||||
});
|
||||
|
||||
test('7. elapsed time shows for active session', async ({ page }) => {
|
||||
await page.getByRole('button', { name: /Start Sleep/i }).click();
|
||||
await expect(page.getByRole('button', { name: /Stop Sleep/i })).toBeVisible();
|
||||
|
||||
// Verify that elapsed time (e.g., "1m" or "just now") is visible
|
||||
await expect(page.getByText(/(\d+h|\d+m|just\s*now)/i)).toBeVisible();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user