@@ -2,6 +2,7 @@ import { describe, it, expect, vi, afterEach } from 'vitest';
22import { render , screen } from '@testing-library/react' ;
33import { ThemeSelector } from './ThemeSelector' ;
44import { THEME_KEYS } from '../types' ;
5+ import userEvent from '@testing-library/user-event' ;
56
67describe ( 'ThemeSelector' , ( ) => {
78 const onThemeChange = vi . fn ( ) ;
@@ -40,4 +41,35 @@ describe('ThemeSelector', () => {
4041 render ( < ThemeSelector theme = "dark" onThemeChange = { onThemeChange } /> ) ;
4142 screen . getByText ( / b g · a c c e n t · t e x t / i) ;
4243 } ) ;
44+
45+ it ( 'renders the Shuffle button' , ( ) => {
46+ render ( < ThemeSelector theme = "dark" onThemeChange = { onThemeChange } /> ) ;
47+ expect ( screen . getByTitle ( 'Pick a random theme' ) ) . toBeTruthy ( ) ;
48+ } ) ;
49+
50+ it ( 'clicking Shuffle calls onThemeChange with a valid theme key' , async ( ) => {
51+ const user = userEvent . setup ( ) ;
52+ render ( < ThemeSelector theme = "dark" onThemeChange = { onThemeChange } /> ) ;
53+ const shuffleBtn = screen . getByTitle ( 'Pick a random theme' ) ;
54+ await user . click ( shuffleBtn ) ;
55+ expect ( onThemeChange ) . toHaveBeenCalledTimes ( 1 ) ;
56+ const calledWith = onThemeChange . mock . calls [ 0 ] [ 0 ] ;
57+ expect ( THEME_KEYS ) . toContain ( calledWith ) ;
58+ expect ( calledWith ) . not . toBe ( 'auto' ) ;
59+ expect ( calledWith ) . not . toBe ( 'random' ) ;
60+ } ) ;
61+
62+ it ( 'changing the select calls onThemeChange with the selected value' , async ( ) => {
63+ const user = userEvent . setup ( ) ;
64+ render ( < ThemeSelector theme = "dark" onThemeChange = { onThemeChange } /> ) ;
65+ const select = screen . getByRole ( 'combobox' ) ;
66+ await user . selectOptions ( select , 'neon' ) ;
67+ expect ( onThemeChange ) . toHaveBeenCalledWith ( 'neon' ) ;
68+ } ) ;
69+
70+ it ( 'renders color swatches for a normal theme' , ( ) => {
71+ render ( < ThemeSelector theme = "dark" onThemeChange = { onThemeChange } /> ) ;
72+ const swatches = screen . getAllByTitle ( / ^ ( b g | a c c e n t | t e x t ) : / i) ;
73+ expect ( swatches . length ) . toBe ( 3 ) ;
74+ } ) ;
4375} ) ;
0 commit comments