diff options
| author | Jacob Richman <[email protected]> | 2025-06-06 09:56:45 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-06-06 09:56:45 -0700 |
| commit | 89aca349cfd46cb242ba32533aee9bc49db89d94 (patch) | |
| tree | ecf14ec14357b3d6d19ef3b6089ea0180714e8de /packages/cli/src/config/settings.test.ts | |
| parent | b4a6b16227bd94bae99401b2effac8a24c3f92ff (diff) | |
Exit with an error message if parsing settings.json fails. (#747)
Diffstat (limited to 'packages/cli/src/config/settings.test.ts')
| -rw-r--r-- | packages/cli/src/config/settings.test.ts | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/packages/cli/src/config/settings.test.ts b/packages/cli/src/config/settings.test.ts index 6c075b38..cfa5e2b5 100644 --- a/packages/cli/src/config/settings.test.ts +++ b/packages/cli/src/config/settings.test.ts @@ -96,6 +96,7 @@ describe('Settings Loading and Merging', () => { expect(settings.user.settings).toEqual({}); expect(settings.workspace.settings).toEqual({}); expect(settings.merged).toEqual({}); + expect(settings.errors.length).toBe(0); }); it('should load user settings if only user file exists', () => { @@ -300,27 +301,61 @@ describe('Settings Loading and Merging', () => { }); it('should handle JSON parsing errors gracefully', () => { - (mockFsExistsSync as Mock).mockReturnValue(true); + (mockFsExistsSync as Mock).mockReturnValue(true); // Both files "exist" + const invalidJsonContent = 'invalid json'; + const userReadError = new SyntaxError( + "Expected ',' or '}' after property value in JSON at position 10", + ); + const workspaceReadError = new SyntaxError( + 'Unexpected token i in JSON at position 0', + ); + (fs.readFileSync as Mock).mockImplementation( (p: fs.PathOrFileDescriptor) => { - // Make it return invalid json for the paths it will try to read - if (p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH) - return 'invalid json'; - return ''; + if (p === USER_SETTINGS_PATH) { + // Simulate JSON.parse throwing for user settings + vi.spyOn(JSON, 'parse').mockImplementationOnce(() => { + throw userReadError; + }); + return invalidJsonContent; // Content that would cause JSON.parse to throw + } + if (p === MOCK_WORKSPACE_SETTINGS_PATH) { + // Simulate JSON.parse throwing for workspace settings + vi.spyOn(JSON, 'parse').mockImplementationOnce(() => { + throw workspaceReadError; + }); + return invalidJsonContent; + } + return '{}'; // Default for other reads }, ); - const consoleErrorSpy = vi - .spyOn(console, 'error') - .mockImplementation(() => {}); const settings = loadSettings(MOCK_WORKSPACE_DIR); + // Check that settings are empty due to parsing errors expect(settings.user.settings).toEqual({}); expect(settings.workspace.settings).toEqual({}); expect(settings.merged).toEqual({}); - expect(consoleErrorSpy).toHaveBeenCalledTimes(2); - consoleErrorSpy.mockRestore(); + // Check that error objects are populated in settings.errors + expect(settings.errors).toBeDefined(); + // Assuming both user and workspace files cause errors and are added in order + expect(settings.errors.length).toEqual(2); + + const userError = settings.errors.find( + (e) => e.path === USER_SETTINGS_PATH, + ); + expect(userError).toBeDefined(); + expect(userError?.message).toBe(userReadError.message); + + const workspaceError = settings.errors.find( + (e) => e.path === MOCK_WORKSPACE_SETTINGS_PATH, + ); + expect(workspaceError).toBeDefined(); + expect(workspaceError?.message).toBe(workspaceReadError.message); + + // Restore JSON.parse mock if it was spied on specifically for this test + vi.restoreAllMocks(); // Or more targeted restore if needed }); it('should resolve environment variables in user settings', () => { @@ -585,13 +620,14 @@ describe('Settings Loading and Merging', () => { 'MY_AGENTS.md', ); expect(loadedSettings.merged.contextFileName).toBe('MY_AGENTS.md'); - expect(loadedSettings.merged.theme).toBe('matrix'); + expect(loadedSettings.merged.theme).toBe('matrix'); // User setting should still be there expect(fs.writeFileSync).toHaveBeenCalledWith( MOCK_WORKSPACE_SETTINGS_PATH, JSON.stringify({ contextFileName: 'MY_AGENTS.md' }, null, 2), 'utf-8', ); + // Workspace theme overrides user theme loadedSettings.setValue(SettingScope.Workspace, 'theme', 'ocean'); expect(loadedSettings.workspace.settings.theme).toBe('ocean'); |
