Reapply "Accident counter"

This reverts commit 9d5615cb9d.
This commit is contained in:
Steve Kinney
2024-10-08 17:05:00 -06:00
parent 9d5615cb9d
commit 5b93f0ac4b
3 changed files with 76 additions and 21 deletions

View File

@@ -1,34 +1,82 @@
import { render, screen } from '@testing-library/react';
import { render, screen, act } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { Counter } from './counter';
import '@testing-library/jest-dom/vitest';
describe.todo('Counter ', () => {
beforeEach(() => {
describe('Counter ', () => {
it('renders with an initial count of 0', () => {
render(<Counter />);
const counter = screen.getByTestId('counter-count');
expect(counter).toHaveTextContent('0');
});
it('renders with an initial count of 0');
it('disables the "Decrement" and "Reset" buttons when the count is 0', () => {
render(<Counter />);
const decrementButton = screen.getByRole('button', { name: /decrement/i });
const resetButton = screen.getByRole('button', { name: /reset/i });
it('disables the "Decrement" and "Reset" buttons when the count is 0');
expect(decrementButton).toBeDisabled();
expect(resetButton).toBeDisabled();
});
it.todo('displays "days" when the count is 0', () => {});
it('displays "days" when the count is 0', () => {
render(<Counter />);
const unit = screen.getByTestId('counter-unit');
expect(unit).toHaveTextContent('days');
});
it.todo(
'increments the count when the "Increment" button is clicked',
async () => {},
);
it('increments the count when the "Increment" button is clicked', async () => {
render(<Counter />);
const incrementButton = screen.getByRole('button', { name: /increment/i });
const counter = screen.getByTestId('counter-count');
it.todo('displays "day" when the count is 1', async () => {});
await act(async () => {
await userEvent.click(incrementButton);
});
it.todo(
'decrements the count when the "Decrement" button is clicked',
async () => {},
);
expect(counter).toHaveTextContent('1');
});
it.todo('does not allow decrementing below 0', async () => {});
it('displays "day" when the count is 1', async () => {
render(<Counter />);
const incrementButton = screen.getByRole('button', { name: /increment/i });
const unit = screen.getByTestId('counter-unit');
await act(async () => {
await userEvent.click(incrementButton);
});
expect(unit).toHaveTextContent('day');
});
it('decrements the count when the "Decrement" button is clicked', async () => {
render(<Counter initialCount={1} />);
const decrementButton = screen.getByRole('button', { name: /decrement/i });
const count = screen.getByTestId('counter-count');
expect(decrementButton).not.toBeDisabled();
await act(async () => {
await userEvent.click(decrementButton);
});
expect(count).toHaveTextContent('0');
expect(decrementButton).toBeDisabled();
});
it('does not allow decrementing below 0', async () => {
render(<Counter />);
const decrementButton = screen.getByRole('button', { name: /decrement/i });
const count = screen.getByTestId('counter-count');
await act(async () => {
await userEvent.click(decrementButton);
});
expect(count).toHaveTextContent('0');
});
it.todo(
'resets the count when the "Reset" button is clicked',
@@ -40,5 +88,14 @@ describe.todo('Counter ', () => {
() => {},
);
it.todo('updates the document title based on the count', async () => {});
it('updates the document title based on the count', async () => {
const { getByRole } = render(<Counter />);
const incrementButton = getByRole('button', { name: /increment/i });
await act(async () => {
await userEvent.click(incrementButton);
});
expect(document.title).toEqual(expect.stringContaining('1 day'));
});
});

View File

@@ -2,8 +2,8 @@ import React from 'react';
import { useReducer, useEffect } from 'react';
import { reducer } from './reducer';
export const Counter = () => {
const [state, dispatch] = useReducer(reducer, { count: 0 });
export const Counter = ({ initialCount = 0 }) => {
const [state, dispatch] = useReducer(reducer, { count: initialCount });
const unit = state.count === 1 ? 'day' : 'days';
useEffect(() => {

View File

@@ -1,2 +0,0 @@
import { test, expect } from '@playwright/test';
import { createServer } from 'vite';