-
Notifications
You must be signed in to change notification settings - Fork 6
Test ButtonDarkMode #1724
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Test ButtonDarkMode #1724
Conversation
""" WalkthroughA new test suite has been added for the Changes
Sequence Diagram(s)sequenceDiagram
participant TestSuite
participant Document
participant MockStore
participant ButtonDarkMode
participant MockDarkMode
TestSuite->>Document: Reset 'dark' class
TestSuite->>MockStore: Initialize colorTheme store
TestSuite->>ButtonDarkMode: Render component with store
ButtonDarkMode->>MockDarkMode: Render mocked DarkMode
TestSuite->>ButtonDarkMode: Simulate button click
ButtonDarkMode->>Document: Check 'dark' class
ButtonDarkMode->>MockStore: Update colorTheme ('light' or 'dark')
TestSuite->>MockStore: Assert updated colorTheme value
""" 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🧰 Additional context used🧠 Learnings (1)packages/ui-components/src/__tests__/ButtonDarkMode.test.ts (1)
⏰ Context from checks skipped due to timeout of 90000ms (16)
🔇 Additional comments (1)
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (1)
packages/ui-components/src/__tests__/ButtonDarkMode.test.ts
(1 hunks)
🔇 Additional comments (4)
packages/ui-components/src/__tests__/ButtonDarkMode.test.ts (4)
1-5
: LGTM: Good import organization.The imports are well organized, correctly importing testing utilities, Svelte stores, and the component under test.
6-12
: LGTM: Effective mocking approach.Good practice used for mocking the
DarkMode
component fromflowbite-svelte
while preserving the rest of the library's functionality.
14-20
: LGTM: Clean test setup.The test setup correctly initializes a fresh store and resets the document state before each test, ensuring test isolation.
22-27
: LGTM: Clear rendering test.This test effectively verifies that both the button and mocked component render correctly.
import { render, screen, fireEvent } from '@testing-library/svelte'; | ||
import { describe, it, expect, vi, beforeEach } from 'vitest'; | ||
import { writable, get, type Writable } from 'svelte/store'; | ||
import ButtonDarkMode from '../lib/components/ButtonDarkMode.svelte'; | ||
|
||
vi.mock('flowbite-svelte', async (importOriginal) => { | ||
const original = await importOriginal<typeof import('flowbite-svelte')>(); | ||
return { | ||
...original, | ||
DarkMode: (await import('../lib/__mocks__/MockComponent.svelte')).default | ||
}; | ||
}); | ||
|
||
describe('ButtonDarkMode.svelte', () => { | ||
let mockColorThemeStore: Writable<string | undefined>; | ||
|
||
beforeEach(() => { | ||
mockColorThemeStore = writable<string | undefined>(undefined); | ||
document.documentElement.classList.remove('dark'); | ||
}); | ||
|
||
it('renders the button and the DarkMode component', () => { | ||
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | ||
|
||
expect(screen.getByRole('button')).toBeInTheDocument(); | ||
expect(screen.getByTestId('mock-component')).toBeInTheDocument(); | ||
}); | ||
|
||
it('sets colorTheme to "light" when toggled from light mode', async () => { | ||
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | ||
const button = screen.getByRole('button'); | ||
|
||
expect(document.documentElement.classList.contains('dark')).toBe(false); | ||
expect(get(mockColorThemeStore)).toBeUndefined(); | ||
|
||
await fireEvent.click(button); | ||
|
||
expect(get(mockColorThemeStore)).toBe('light'); | ||
}); | ||
|
||
it('sets colorTheme to "dark" when toggled from dark mode', async () => { | ||
document.documentElement.classList.add('dark'); | ||
|
||
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | ||
const button = screen.getByRole('button'); | ||
|
||
expect(document.documentElement.classList.contains('dark')).toBe(true); | ||
expect(get(mockColorThemeStore)).toBeUndefined(); | ||
|
||
await fireEvent.click(button); | ||
|
||
expect(get(mockColorThemeStore)).toBe('dark'); | ||
}); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧹 Nitpick (assertive)
Consider adding JSDoc comments for better test documentation.
The tests are well-structured, but adding JSDoc comments explaining the expected behavior of the ButtonDarkMode component would improve documentation and make it easier for other developers to understand the intended functionality.
+ /**
+ * Tests for ButtonDarkMode.svelte component
+ *
+ * The ButtonDarkMode component is responsible for toggling between
+ * light and dark themes by updating a colorTheme store and
+ * manipulating the dark class on the document element.
+ */
describe('ButtonDarkMode.svelte', () => {
let mockColorThemeStore: Writable<string | undefined>;
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
import { render, screen, fireEvent } from '@testing-library/svelte'; | |
import { describe, it, expect, vi, beforeEach } from 'vitest'; | |
import { writable, get, type Writable } from 'svelte/store'; | |
import ButtonDarkMode from '../lib/components/ButtonDarkMode.svelte'; | |
vi.mock('flowbite-svelte', async (importOriginal) => { | |
const original = await importOriginal<typeof import('flowbite-svelte')>(); | |
return { | |
...original, | |
DarkMode: (await import('../lib/__mocks__/MockComponent.svelte')).default | |
}; | |
}); | |
describe('ButtonDarkMode.svelte', () => { | |
let mockColorThemeStore: Writable<string | undefined>; | |
beforeEach(() => { | |
mockColorThemeStore = writable<string | undefined>(undefined); | |
document.documentElement.classList.remove('dark'); | |
}); | |
it('renders the button and the DarkMode component', () => { | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
expect(screen.getByRole('button')).toBeInTheDocument(); | |
expect(screen.getByTestId('mock-component')).toBeInTheDocument(); | |
}); | |
it('sets colorTheme to "light" when toggled from light mode', async () => { | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
const button = screen.getByRole('button'); | |
expect(document.documentElement.classList.contains('dark')).toBe(false); | |
expect(get(mockColorThemeStore)).toBeUndefined(); | |
await fireEvent.click(button); | |
expect(get(mockColorThemeStore)).toBe('light'); | |
}); | |
it('sets colorTheme to "dark" when toggled from dark mode', async () => { | |
document.documentElement.classList.add('dark'); | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
const button = screen.getByRole('button'); | |
expect(document.documentElement.classList.contains('dark')).toBe(true); | |
expect(get(mockColorThemeStore)).toBeUndefined(); | |
await fireEvent.click(button); | |
expect(get(mockColorThemeStore)).toBe('dark'); | |
}); | |
}); | |
import { render, screen, fireEvent } from '@testing-library/svelte'; | |
import { describe, it, expect, vi, beforeEach } from 'vitest'; | |
import { writable, get, type Writable } from 'svelte/store'; | |
import ButtonDarkMode from '../lib/components/ButtonDarkMode.svelte'; | |
vi.mock('flowbite-svelte', async (importOriginal) => { | |
const original = await importOriginal<typeof import('flowbite-svelte')>(); | |
return { | |
...original, | |
DarkMode: (await import('../lib/__mocks__/MockComponent.svelte')).default | |
}; | |
}); | |
+ /** | |
+ * Tests for ButtonDarkMode.svelte component | |
+ * | |
+ * The ButtonDarkMode component is responsible for toggling between | |
+ * light and dark themes by updating a colorTheme store and | |
+ * manipulating the dark class on the document element. | |
+ */ | |
describe('ButtonDarkMode.svelte', () => { | |
let mockColorThemeStore: Writable<string | undefined>; | |
beforeEach(() => { | |
mockColorThemeStore = writable<string | undefined>(undefined); | |
document.documentElement.classList.remove('dark'); | |
}); | |
it('renders the button and the DarkMode component', () => { | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
expect(screen.getByRole('button')).toBeInTheDocument(); | |
expect(screen.getByTestId('mock-component')).toBeInTheDocument(); | |
}); | |
it('sets colorTheme to "light" when toggled from light mode', async () => { | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
const button = screen.getByRole('button'); | |
expect(document.documentElement.classList.contains('dark')).toBe(false); | |
expect(get(mockColorThemeStore)).toBeUndefined(); | |
await fireEvent.click(button); | |
expect(get(mockColorThemeStore)).toBe('light'); | |
}); | |
it('sets colorTheme to "dark" when toggled from dark mode', async () => { | |
document.documentElement.classList.add('dark'); | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
const button = screen.getByRole('button'); | |
expect(document.documentElement.classList.contains('dark')).toBe(true); | |
expect(get(mockColorThemeStore)).toBeUndefined(); | |
await fireEvent.click(button); | |
expect(get(mockColorThemeStore)).toBe('dark'); | |
}); | |
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not necessary
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hardingjam Understood! I'll respect your preference regarding documentation in test files.
✏️ Learnings added
Learnt from: hardingjam
PR: rainlanguage/rain.orderbook#1724
File: packages/ui-components/src/__tests__/ButtonDarkMode.test.ts:1-54
Timestamp: 2025-05-03T10:29:03.985Z
Learning: JSDoc comments are not considered necessary for test files in the rainlanguage/rain.orderbook repository. Test descriptions and assertions are sufficient documentation.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
it('sets colorTheme to "light" when toggled from light mode', async () => { | ||
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | ||
const button = screen.getByRole('button'); | ||
|
||
expect(document.documentElement.classList.contains('dark')).toBe(false); | ||
expect(get(mockColorThemeStore)).toBeUndefined(); | ||
|
||
await fireEvent.click(button); | ||
|
||
expect(get(mockColorThemeStore)).toBe('light'); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Consider clarifying the toggle logic and adding DOM verification.
The test name suggests toggling "from light mode" but the assertion only verifies the store value changes to "light". This seems counterintuitive - typically toggling from light mode would change to dark mode.
Also, consider verifying DOM class changes after the click to ensure the visual state is updated correctly.
🏁 Script executed:
#!/bin/bash
# Check how ButtonDarkMode.svelte is implemented to understand the expected behavior
cat packages/ui-components/src/lib/components/ButtonDarkMode.svelte
Length of output: 478
Clarify test intent and cover both themes
The ButtonDarkMode
toggle simply reads the current document.documentElement
theme and writes that value to the store—it doesn’t flip the class itself—so let’s adjust the test names and add a dark-mode scenario.
• Rename the existing test to reflect “clicked in light mode” rather than “toggled from light mode.”
• Add a parallel test for when document.documentElement
already has the dark
class.
• Since this component only updates the store (and doesn’t mutate the DOM theme), you can drop the post-click DOM assertion here or defer it to an integration test where the store is consumed.
Suggested diff in packages/ui-components/src/__tests__/ButtonDarkMode.test.ts
:
- it('sets colorTheme to "light" when toggled from light mode', async () => {
+ it('sets colorTheme to "light" when clicked in light mode', async () => {
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } });
const button = screen.getByRole('button');
expect(document.documentElement.classList.contains('dark')).toBe(false);
expect(get(mockColorThemeStore)).toBeUndefined();
await fireEvent.click(button);
expect(get(mockColorThemeStore)).toBe('light');
});
+ it('sets colorTheme to "dark" when clicked in dark mode', async () => {
+ document.documentElement.classList.add('dark');
+ render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } });
+ const button = screen.getByRole('button');
+
+ expect(document.documentElement.classList.contains('dark')).toBe(true);
+ expect(get(mockColorThemeStore)).toBeUndefined();
+
+ await fireEvent.click(button);
+
+ expect(get(mockColorThemeStore)).toBe('dark');
+ });
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
it('sets colorTheme to "light" when toggled from light mode', async () => { | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
const button = screen.getByRole('button'); | |
expect(document.documentElement.classList.contains('dark')).toBe(false); | |
expect(get(mockColorThemeStore)).toBeUndefined(); | |
await fireEvent.click(button); | |
expect(get(mockColorThemeStore)).toBe('light'); | |
}); | |
it('sets colorTheme to "light" when clicked in light mode', async () => { | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
const button = screen.getByRole('button'); | |
expect(document.documentElement.classList.contains('dark')).toBe(false); | |
expect(get(mockColorThemeStore)).toBeUndefined(); | |
await fireEvent.click(button); | |
expect(get(mockColorThemeStore)).toBe('light'); | |
}); | |
it('sets colorTheme to "dark" when clicked in dark mode', async () => { | |
document.documentElement.classList.add('dark'); | |
render(ButtonDarkMode, { props: { colorTheme: mockColorThemeStore } }); | |
const button = screen.getByRole('button'); | |
expect(document.documentElement.classList.contains('dark')).toBe(true); | |
expect(get(mockColorThemeStore)).toBeUndefined(); | |
await fireEvent.click(button); | |
expect(get(mockColorThemeStore)).toBe('dark'); | |
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@hardingjam Thank you for implementing the changes! The tests now properly verify behavior in both light and dark modes. This provides complete coverage for the component's functionality.
(_/)
(•ᴗ•)
/ >👍
If you found this review helpful, would you consider giving us a shout-out on X?
Thank you for using CodeRabbit!
Motivation
Solution
Checks
By submitting this for review, I'm confirming I've done the following:
Summary by CodeRabbit