From cf554fbb6ef9842007481a02506b7a02b5c5ba5f Mon Sep 17 00:00:00 2001 From: LordMathis Date: Sun, 6 Jul 2025 00:41:30 +0200 Subject: [PATCH] Refactor workspace settings handling in tests and components to use currentWorkspace directly --- .../components/editor/ContentView.test.tsx | 2 - .../editor/MarkdownPreview.test.tsx | 4 +- app/src/components/files/FileActions.test.tsx | 14 +++---- app/src/components/files/FileActions.tsx | 14 ++++--- app/src/components/layout/Layout.test.tsx | 3 -- app/src/components/layout/Sidebar.test.tsx | 9 ++-- app/src/components/layout/Sidebar.tsx | 4 +- app/src/hooks/useWorkspace.test.ts | 41 ------------------- app/src/hooks/useWorkspace.ts | 7 +--- 9 files changed, 25 insertions(+), 73 deletions(-) diff --git a/app/src/components/editor/ContentView.test.tsx b/app/src/components/editor/ContentView.test.tsx index cb41b81..706192c 100644 --- a/app/src/components/editor/ContentView.test.tsx +++ b/app/src/components/editor/ContentView.test.tsx @@ -70,7 +70,6 @@ describe('ContentView', () => { vi.mocked(useWorkspace).mockReturnValue({ currentWorkspace: mockCurrentWorkspace, workspaces: [], - settings: mockCurrentWorkspace, updateSettings: vi.fn(), loading: false, colorScheme: 'light', @@ -88,7 +87,6 @@ describe('ContentView', () => { vi.mocked(useWorkspace).mockReturnValue({ currentWorkspace: null, workspaces: [], - settings: mockCurrentWorkspace, updateSettings: vi.fn(), loading: false, colorScheme: 'light', diff --git a/app/src/components/editor/MarkdownPreview.test.tsx b/app/src/components/editor/MarkdownPreview.test.tsx index 29d131c..da3ee85 100644 --- a/app/src/components/editor/MarkdownPreview.test.tsx +++ b/app/src/components/editor/MarkdownPreview.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { MantineProvider } from '@mantine/core'; import MarkdownPreview from './MarkdownPreview'; import { notifications } from '@mantine/notifications'; -import { Theme, DEFAULT_WORKSPACE_SETTINGS } from '../../types/models'; +import { Theme } from '../../types/models'; // Mock notifications vi.mock('@mantine/notifications', () => ({ @@ -70,7 +70,6 @@ describe('MarkdownPreview', () => { lastOpenedFilePath: '', }, workspaces: [], - settings: DEFAULT_WORKSPACE_SETTINGS, updateSettings: vi.fn(), loading: false, colorScheme: 'light', @@ -213,7 +212,6 @@ describe('MarkdownPreview', () => { vi.mocked(useWorkspace).mockReturnValue({ currentWorkspace: null, workspaces: [], - settings: DEFAULT_WORKSPACE_SETTINGS, updateSettings: vi.fn(), loading: false, colorScheme: 'light', diff --git a/app/src/components/files/FileActions.test.tsx b/app/src/components/files/FileActions.test.tsx index 95a6f76..501a0d8 100644 --- a/app/src/components/files/FileActions.test.tsx +++ b/app/src/components/files/FileActions.test.tsx @@ -23,7 +23,10 @@ describe('FileActions', () => { const mockSetDeleteFileModalVisible = vi.fn(); const mockSetCommitMessageModalVisible = vi.fn(); - const mockSettings = { + const mockCurrentWorkspace = { + id: 1, + name: 'Test Workspace', + createdAt: '2024-01-01T00:00:00Z', gitEnabled: true, gitAutoCommit: false, theme: Theme.Light, @@ -61,9 +64,8 @@ describe('FileActions', () => { const { useWorkspace } = await import('../../hooks/useWorkspace'); vi.mocked(useWorkspace).mockReturnValue({ - currentWorkspace: null, + currentWorkspace: mockCurrentWorkspace, workspaces: [], - settings: mockSettings, updateSettings: vi.fn(), loading: false, colorScheme: 'light', @@ -140,9 +142,8 @@ describe('FileActions', () => { it('disables git buttons when git is not enabled', async () => { const { useWorkspace } = await import('../../hooks/useWorkspace'); vi.mocked(useWorkspace).mockReturnValue({ - currentWorkspace: null, + currentWorkspace: { ...mockCurrentWorkspace, gitEnabled: false }, workspaces: [], - settings: { ...mockSettings, gitEnabled: false }, updateSettings: vi.fn(), loading: false, colorScheme: 'light', @@ -186,9 +187,8 @@ describe('FileActions', () => { it('disables commit button when auto-commit is enabled', async () => { const { useWorkspace } = await import('../../hooks/useWorkspace'); vi.mocked(useWorkspace).mockReturnValue({ - currentWorkspace: null, + currentWorkspace: { ...mockCurrentWorkspace, gitAutoCommit: true }, workspaces: [], - settings: { ...mockSettings, gitAutoCommit: true }, updateSettings: vi.fn(), loading: false, colorScheme: 'light', diff --git a/app/src/components/files/FileActions.tsx b/app/src/components/files/FileActions.tsx index 2695c79..a3f0075 100644 --- a/app/src/components/files/FileActions.tsx +++ b/app/src/components/files/FileActions.tsx @@ -18,7 +18,7 @@ const FileActions: React.FC = ({ handlePullChanges, selectedFile, }) => { - const { settings } = useWorkspace(); + const { currentWorkspace } = useWorkspace(); const { setNewFileModalVisible, setDeleteFileModalVisible, @@ -61,7 +61,7 @@ const FileActions: React.FC = ({ = ({ console.error('Error pulling changes:', error); }); }} - disabled={!settings.gitEnabled} + disabled={!currentWorkspace?.gitEnabled} aria-label="Pull changes from remote" data-testid="pull-changes-button" > @@ -84,9 +84,9 @@ const FileActions: React.FC = ({ = ({ variant="default" size="md" onClick={handleCommitAndPush} - disabled={!settings.gitEnabled || settings.gitAutoCommit} + disabled={ + !currentWorkspace?.gitEnabled || currentWorkspace.gitAutoCommit + } aria-label="Commit and push changes" data-testid="commit-push-button" > diff --git a/app/src/components/layout/Layout.test.tsx b/app/src/components/layout/Layout.test.tsx index 7cc0097..5d660ae 100644 --- a/app/src/components/layout/Layout.test.tsx +++ b/app/src/components/layout/Layout.test.tsx @@ -72,7 +72,6 @@ describe('Layout', () => { vi.mocked(useWorkspace).mockReturnValue({ currentWorkspace: mockCurrentWorkspace, workspaces: [], - settings: mockCurrentWorkspace, updateSettings: vi.fn(), loading: false, colorScheme: 'light', @@ -112,7 +111,6 @@ describe('Layout', () => { vi.mocked(useWorkspace).mockReturnValue({ currentWorkspace: mockCurrentWorkspace, workspaces: [], - settings: mockCurrentWorkspace, updateSettings: vi.fn(), loading: true, colorScheme: 'light', @@ -137,7 +135,6 @@ describe('Layout', () => { vi.mocked(useWorkspace).mockReturnValue({ currentWorkspace: null, workspaces: [], - settings: mockCurrentWorkspace, updateSettings: vi.fn(), loading: false, colorScheme: 'light', diff --git a/app/src/components/layout/Sidebar.test.tsx b/app/src/components/layout/Sidebar.test.tsx index 608b499..f37d71a 100644 --- a/app/src/components/layout/Sidebar.test.tsx +++ b/app/src/components/layout/Sidebar.test.tsx @@ -58,7 +58,10 @@ describe('Sidebar', () => { }, ]; - const mockSettings = { + const mockCurrentWorkspace = { + id: 1, + name: 'test-workspace', + createdAt: '2024-01-01T00:00:00Z', gitEnabled: true, gitAutoCommit: false, theme: Theme.Light, @@ -88,7 +91,6 @@ describe('Sidebar', () => { vi.mocked(useWorkspace).mockReturnValue({ currentWorkspace: null, workspaces: [], - settings: mockSettings, updateSettings: vi.fn(), loading: false, colorScheme: 'light', @@ -122,9 +124,8 @@ describe('Sidebar', () => { it('passes showHiddenFiles setting to file tree', async () => { const { useWorkspace } = await import('../../hooks/useWorkspace'); vi.mocked(useWorkspace).mockReturnValue({ - currentWorkspace: null, + currentWorkspace: { ...mockCurrentWorkspace, showHiddenFiles: true }, workspaces: [], - settings: { ...mockSettings, showHiddenFiles: true }, updateSettings: vi.fn(), loading: false, colorScheme: 'light', diff --git a/app/src/components/layout/Sidebar.tsx b/app/src/components/layout/Sidebar.tsx index 06f40ca..135dbf0 100644 --- a/app/src/components/layout/Sidebar.tsx +++ b/app/src/components/layout/Sidebar.tsx @@ -19,7 +19,7 @@ const Sidebar: React.FC = ({ files, loadFileList, }) => { - const { settings } = useWorkspace(); + const { currentWorkspace } = useWorkspace(); const { handlePull } = useGitOperations(); useEffect(() => { @@ -41,7 +41,7 @@ const Sidebar: React.FC = ({ ); diff --git a/app/src/hooks/useWorkspace.test.ts b/app/src/hooks/useWorkspace.test.ts index 070a973..2ff39ac 100644 --- a/app/src/hooks/useWorkspace.test.ts +++ b/app/src/hooks/useWorkspace.test.ts @@ -85,7 +85,6 @@ describe('useWorkspace', () => { // Reset mock data to defaults mockWorkspaceData.currentWorkspace = null; mockWorkspaceData.workspaces = []; - mockWorkspaceData.settings = DEFAULT_WORKSPACE_SETTINGS; mockWorkspaceData.loading = false; mockTheme.colorScheme = 'light'; }); @@ -100,7 +99,6 @@ describe('useWorkspace', () => { expect(result.current.currentWorkspace).toBeNull(); expect(result.current.workspaces).toEqual([]); - expect(result.current.settings).toEqual(DEFAULT_WORKSPACE_SETTINGS); expect(result.current.loading).toBe(false); expect(result.current.colorScheme).toBe('light'); }); @@ -119,13 +117,11 @@ describe('useWorkspace', () => { it('returns current workspace data', () => { mockWorkspaceData.currentWorkspace = mockWorkspace; mockWorkspaceData.workspaces = mockWorkspaces; - mockWorkspaceData.settings = mockWorkspace; const { result } = renderHook(() => useWorkspace()); expect(result.current.currentWorkspace).toEqual(mockWorkspace); expect(result.current.workspaces).toEqual(mockWorkspaces); - expect(result.current.settings).toEqual(mockWorkspace); }); it('returns loading state from workspace data', () => { @@ -135,24 +131,6 @@ describe('useWorkspace', () => { expect(result.current.loading).toBe(true); }); - - it('uses default settings when no current workspace', () => { - mockWorkspaceData.currentWorkspace = null; - mockWorkspaceData.settings = DEFAULT_WORKSPACE_SETTINGS; - - const { result } = renderHook(() => useWorkspace()); - - expect(result.current.settings).toEqual(DEFAULT_WORKSPACE_SETTINGS); - }); - - it('uses current workspace as settings when available', () => { - mockWorkspaceData.currentWorkspace = mockWorkspace; - mockWorkspaceData.settings = mockWorkspace; - - const { result } = renderHook(() => useWorkspace()); - - expect(result.current.settings).toEqual(mockWorkspace); - }); }); describe('theme integration', () => { @@ -203,7 +181,6 @@ describe('useWorkspace', () => { it('returns consistent data across multiple renders', () => { mockWorkspaceData.currentWorkspace = mockWorkspace; mockWorkspaceData.workspaces = mockWorkspaces; - mockWorkspaceData.settings = mockWorkspace; mockTheme.colorScheme = 'dark'; const { result, rerender } = renderHook(() => useWorkspace()); @@ -216,7 +193,6 @@ describe('useWorkspace', () => { firstResult.currentWorkspace ); expect(result.current.workspaces).toEqual(firstResult.workspaces); - expect(result.current.settings).toEqual(firstResult.settings); expect(result.current.colorScheme).toEqual(firstResult.colorScheme); }); @@ -230,13 +206,11 @@ describe('useWorkspace', () => { // Add workspace data mockWorkspaceData.currentWorkspace = mockWorkspace; mockWorkspaceData.workspaces = mockWorkspaces; - mockWorkspaceData.settings = mockWorkspace; rerender(); expect(result.current.currentWorkspace).toEqual(mockWorkspace); expect(result.current.workspaces).toEqual(mockWorkspaces); - expect(result.current.settings).toEqual(mockWorkspace); }); it('reflects theme changes', () => { @@ -334,7 +308,6 @@ describe('useWorkspace', () => { const expectedKeys = [ 'currentWorkspace', 'workspaces', - 'settings', 'updateSettings', 'loading', 'colorScheme', @@ -356,7 +329,6 @@ describe('useWorkspace', () => { typeof result.current.currentWorkspace === 'object' ).toBe(true); expect(Array.isArray(result.current.workspaces)).toBe(true); - expect(typeof result.current.settings === 'object').toBe(true); expect(typeof result.current.updateSettings === 'function').toBe(true); expect(typeof result.current.loading === 'boolean').toBe(true); expect(typeof result.current.colorScheme === 'string').toBe(true); @@ -373,13 +345,11 @@ describe('useWorkspace', () => { // Simulate undefined data that might occur during loading mockWorkspaceData.currentWorkspace = null; mockWorkspaceData.workspaces = []; - mockWorkspaceData.settings = DEFAULT_WORKSPACE_SETTINGS; const { result } = renderHook(() => useWorkspace()); expect(result.current.currentWorkspace).toBeNull(); expect(result.current.workspaces).toEqual([]); - expect(result.current.settings).toEqual(DEFAULT_WORKSPACE_SETTINGS); expect(typeof result.current.updateSettings).toBe('function'); }); @@ -395,7 +365,6 @@ describe('useWorkspace', () => { const singleWorkspace = [mockWorkspace]; mockWorkspaceData.workspaces = singleWorkspace; mockWorkspaceData.currentWorkspace = mockWorkspace; - mockWorkspaceData.settings = mockWorkspace; const { result } = renderHook(() => useWorkspace()); @@ -411,12 +380,10 @@ describe('useWorkspace', () => { }; mockWorkspaceData.currentWorkspace = minimalWorkspace; - mockWorkspaceData.settings = minimalWorkspace; const { result } = renderHook(() => useWorkspace()); expect(result.current.currentWorkspace).toEqual(minimalWorkspace); - expect(result.current.settings).toEqual(minimalWorkspace); }); }); @@ -424,7 +391,6 @@ describe('useWorkspace', () => { it('provides complete workspace management interface', () => { mockWorkspaceData.currentWorkspace = mockWorkspace; mockWorkspaceData.workspaces = mockWorkspaces; - mockWorkspaceData.settings = mockWorkspace; mockTheme.colorScheme = 'light'; const { result } = renderHook(() => useWorkspace()); @@ -432,7 +398,6 @@ describe('useWorkspace', () => { // Should have all data expect(result.current.currentWorkspace).toEqual(mockWorkspace); expect(result.current.workspaces).toEqual(mockWorkspaces); - expect(result.current.settings).toEqual(mockWorkspace); expect(result.current.colorScheme).toBe('light'); // Should have all operations @@ -457,13 +422,9 @@ describe('useWorkspace', () => { it('supports settings management workflow', () => { mockWorkspaceData.currentWorkspace = mockWorkspace; - mockWorkspaceData.settings = mockWorkspace; const { result } = renderHook(() => useWorkspace()); - // Should have current settings - expect(result.current.settings).toEqual(mockWorkspace); - // Should provide update function expect(typeof result.current.updateSettings).toBe('function'); expect(result.current.updateSettings).toBe( @@ -491,7 +452,6 @@ describe('useWorkspace', () => { it('correctly integrates with WorkspaceDataContext mock', () => { mockWorkspaceData.currentWorkspace = mockWorkspace; mockWorkspaceData.workspaces = mockWorkspaces; - mockWorkspaceData.settings = mockWorkspace; mockWorkspaceData.loading = true; const { result } = renderHook(() => useWorkspace()); @@ -500,7 +460,6 @@ describe('useWorkspace', () => { mockWorkspaceData.currentWorkspace ); expect(result.current.workspaces).toBe(mockWorkspaceData.workspaces); - expect(result.current.settings).toBe(mockWorkspaceData.settings); expect(result.current.loading).toBe(mockWorkspaceData.loading); }); diff --git a/app/src/hooks/useWorkspace.ts b/app/src/hooks/useWorkspace.ts index fcaba6c..4b60849 100644 --- a/app/src/hooks/useWorkspace.ts +++ b/app/src/hooks/useWorkspace.ts @@ -1,13 +1,12 @@ import { useWorkspaceData } from '../contexts/WorkspaceDataContext'; import { useTheme } from '../contexts/ThemeContext'; import { useWorkspaceOperations } from './useWorkspaceOperations'; -import type { Workspace, DEFAULT_WORKSPACE_SETTINGS } from '@/types/models'; +import type { Workspace } from '@/types/models'; import type { MantineColorScheme } from '@mantine/core'; interface UseWorkspaceResult { currentWorkspace: Workspace | null; workspaces: Workspace[]; - settings: Workspace | typeof DEFAULT_WORKSPACE_SETTINGS; updateSettings: (newSettings: Partial) => Promise; loading: boolean; colorScheme: MantineColorScheme; @@ -17,8 +16,7 @@ interface UseWorkspaceResult { } export const useWorkspace = (): UseWorkspaceResult => { - const { currentWorkspace, workspaces, settings, loading } = - useWorkspaceData(); + const { currentWorkspace, workspaces, loading } = useWorkspaceData(); const { colorScheme, updateColorScheme } = useTheme(); const { switchWorkspace, deleteCurrentWorkspace, updateSettings } = useWorkspaceOperations(); @@ -26,7 +24,6 @@ export const useWorkspace = (): UseWorkspaceResult => { return { currentWorkspace, workspaces, - settings, updateSettings, loading, colorScheme,