diff --git a/README.md b/README.md
index 8cf5f14..eccc668 100644
--- a/README.md
+++ b/README.md
@@ -167,14 +167,6 @@ npm run dist:linux
- `APPLE_APP_SPECIFIC_PASSWORD`
- `APPLE_TEAM_ID`
-### Database Utilities
-
-```bash
-npm run db:generate
-npm run db:migrate
-npm run db:studio
-```
-
## Further Documentation
- [DOCUMENTATION.md](DOCUMENTATION.md) — end-user guide covering workflows, macros, scripting, AI assistant, and editorial best practices
diff --git a/src/renderer/components/StatusBar/StatusBar.css b/src/renderer/components/StatusBar/StatusBar.css
index 124498c..dd39275 100644
--- a/src/renderer/components/StatusBar/StatusBar.css
+++ b/src/renderer/components/StatusBar/StatusBar.css
@@ -8,7 +8,6 @@
font-size: 12px;
padding: 0 8px;
user-select: none;
- overflow: hidden;
flex-wrap: nowrap;
}
@@ -17,7 +16,6 @@
display: flex;
align-items: center;
gap: 4px;
- overflow: hidden;
flex-shrink: 0;
}
diff --git a/tests/renderer/components/ProjectSelector.test.tsx b/tests/renderer/components/ProjectSelector.test.tsx
new file mode 100644
index 0000000..039bde5
--- /dev/null
+++ b/tests/renderer/components/ProjectSelector.test.tsx
@@ -0,0 +1,69 @@
+import React from 'react';
+import { describe, it, expect, beforeEach, vi } from 'vitest';
+import { fireEvent, render, screen } from '@testing-library/react';
+import { ProjectSelector } from '../../../src/renderer/components/ProjectSelector/ProjectSelector';
+import { useAppStore } from '../../../src/renderer/store';
+import { I18nProvider } from '../../../src/renderer/i18n';
+
+describe('ProjectSelector', () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ (window as any).electronAPI = {
+ ...(window as any).electronAPI,
+ projects: {
+ getAll: vi.fn().mockResolvedValue([
+ { id: 'default', name: 'Default', slug: 'default', isActive: true, createdAt: '', updatedAt: '' },
+ { id: 'p2', name: 'Blog Two', slug: 'blog-two', isActive: false, createdAt: '', updatedAt: '' },
+ ]),
+ setActive: vi.fn().mockResolvedValue({ id: 'p2', name: 'Blog Two', slug: 'blog-two', isActive: true }),
+ create: vi.fn(),
+ deleteWithData: vi.fn(),
+ },
+ posts: { getAll: vi.fn().mockResolvedValue({ items: [], hasMore: false, total: 0 }) },
+ media: { getAll: vi.fn().mockResolvedValue([]) },
+ app: {
+ getSystemLanguage: vi.fn().mockResolvedValue('en-US'),
+ },
+ };
+
+ useAppStore.setState({
+ projects: [
+ { id: 'default', name: 'Default', slug: 'default', isActive: true, createdAt: '', updatedAt: '' },
+ { id: 'p2', name: 'Blog Two', slug: 'blog-two', isActive: false, createdAt: '', updatedAt: '' },
+ ],
+ activeProject: { id: 'default', name: 'Default', slug: 'default', isActive: true, createdAt: '', updatedAt: '' },
+ } as any);
+ });
+
+ it('opens project dropdown when trigger is clicked', async () => {
+ render(
+
+
+ ,
+ );
+
+ const trigger = screen.getByTitle('Switch project');
+ fireEvent.click(trigger);
+
+ // The dropdown should appear and list the projects
+ expect(screen.getByText('Projects')).toBeInTheDocument();
+ expect(screen.getAllByText('Default').length).toBeGreaterThanOrEqual(2); // trigger + list item
+ expect(screen.getByText('Blog Two')).toBeInTheDocument();
+ });
+
+ it('closes dropdown when clicking outside', async () => {
+ render(
+
+
+ ,
+ );
+
+ const trigger = screen.getByTitle('Switch project');
+ fireEvent.click(trigger);
+ expect(screen.getByText('Projects')).toBeInTheDocument();
+
+ // Click outside
+ fireEvent.mouseDown(document.body);
+ expect(screen.queryByText('Projects')).not.toBeInTheDocument();
+ });
+});