diff --git a/src/design-system/primitives/InlineEdit/InlineEdit.test.tsx b/src/design-system/primitives/InlineEdit/InlineEdit.test.tsx
new file mode 100644
index 0000000..0ba7bf9
--- /dev/null
+++ b/src/design-system/primitives/InlineEdit/InlineEdit.test.tsx
@@ -0,0 +1,76 @@
+import { describe, it, expect, vi } from 'vitest'
+import { render, screen } from '@testing-library/react'
+import userEvent from '@testing-library/user-event'
+import { InlineEdit } from './InlineEdit'
+
+describe('InlineEdit', () => {
+ it('renders value in display mode', () => {
+ render()
+ expect(screen.getByText('Alice')).toBeInTheDocument()
+ })
+
+ it('shows placeholder when value is empty', () => {
+ render()
+ expect(screen.getByText('Enter name')).toBeInTheDocument()
+ })
+
+ it('enters edit mode on click', async () => {
+ const user = userEvent.setup()
+ render()
+ await user.click(screen.getByText('Alice'))
+ expect(screen.getByRole('textbox')).toHaveValue('Alice')
+ })
+
+ it('saves on Enter', async () => {
+ const onSave = vi.fn()
+ const user = userEvent.setup()
+ render()
+ await user.click(screen.getByText('Alice'))
+ await user.clear(screen.getByRole('textbox'))
+ await user.type(screen.getByRole('textbox'), 'Bob')
+ await user.keyboard('{Enter}')
+ expect(onSave).toHaveBeenCalledWith('Bob')
+ })
+
+ it('cancels on Escape', async () => {
+ const onSave = vi.fn()
+ const user = userEvent.setup()
+ render()
+ await user.click(screen.getByText('Alice'))
+ await user.clear(screen.getByRole('textbox'))
+ await user.type(screen.getByRole('textbox'), 'Bob')
+ await user.keyboard('{Escape}')
+ expect(onSave).not.toHaveBeenCalled()
+ expect(screen.getByText('Alice')).toBeInTheDocument()
+ })
+
+ it('cancels on blur', async () => {
+ const onSave = vi.fn()
+ const user = userEvent.setup()
+ render()
+ await user.click(screen.getByText('Alice'))
+ await user.clear(screen.getByRole('textbox'))
+ await user.type(screen.getByRole('textbox'), 'Bob')
+ await user.tab()
+ expect(onSave).not.toHaveBeenCalled()
+ })
+
+ it('does not enter edit mode when disabled', async () => {
+ const user = userEvent.setup()
+ render()
+ await user.click(screen.getByText('Alice'))
+ expect(screen.queryByRole('textbox')).not.toBeInTheDocument()
+ })
+
+ it('shows edit icon button', () => {
+ render()
+ expect(screen.getByRole('button', { name: 'Edit' })).toBeInTheDocument()
+ })
+
+ it('enters edit mode when edit button is clicked', async () => {
+ const user = userEvent.setup()
+ render()
+ await user.click(screen.getByRole('button', { name: 'Edit' }))
+ expect(screen.getByRole('textbox')).toHaveValue('Alice')
+ })
+})