From 1d190f37ed56dd32a393ccf2036d12766534f1a3 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Fri, 12 Jun 2026 19:17:25 -0700 Subject: [PATCH] FN-6322: validate settings scopes workflow payload Clarify and cover the settings scopes response shape including workflow settings. - Document that GET /api/settings/scopes returns workflowSettings with global and project scopes. - Assert workflowSettings is always a non-null object for default and project-scoped route tests. - Preserve exact workflow setting payload coverage when workflow overrides are present. Files changed: docs/settings-reference.md | 2 +- packages/dashboard/src/__tests__/routes-settings.test.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) Fusion-Task-Id: FN-6322 Fusion-Task-Lineage: 08796f9d-be99-46a1-8326-251a8d79dda4 --- docs/settings-reference.md | 2 +- .../dashboard/src/__tests__/routes-settings.test.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/settings-reference.md b/docs/settings-reference.md index b06c501e29..45624befd3 100644 --- a/docs/settings-reference.md +++ b/docs/settings-reference.md @@ -21,7 +21,7 @@ At runtime, settings are merged. **Project settings override global settings** w | `PUT /api/settings` | Update project settings only. | | `GET /api/settings/global` | Get global settings only. | | `PUT /api/settings/global` | Update global settings only. | -| `GET /api/settings/scopes` | Get separated `{ global, project }` view. | +| `GET /api/settings/scopes` | Get separated `{ global, project, workflowSettings }` view. | --- diff --git a/packages/dashboard/src/__tests__/routes-settings.test.ts b/packages/dashboard/src/__tests__/routes-settings.test.ts index 24f9919be7..1e4b8aaeae 100644 --- a/packages/dashboard/src/__tests__/routes-settings.test.ts +++ b/packages/dashboard/src/__tests__/routes-settings.test.ts @@ -1376,6 +1376,10 @@ describe("GET /settings/scopes", () => { expect(res.body.global.persistAgentThinkingLog).toBe(false); expect(res.body.project.maxConcurrent).toBe(4); expect(res.body.project.autoMerge).toBe(false); + expect(res.body.workflowSettings).toEqual({}); + expect(res.body.workflowSettings).not.toBeNull(); + expect(typeof res.body.workflowSettings).toBe("object"); + expect(Array.isArray(res.body.workflowSettings)).toBe(false); expect(res.body.project.persistAgentToolOutput).toBeUndefined(); expect(res.body.project.persistAgentThinkingLogPermanent).toBeUndefined(); expect(res.body.project.persistAgentThinkingLogEphemeral).toBeUndefined(); @@ -1398,6 +1402,9 @@ describe("GET /settings/scopes", () => { expect(res.body).toHaveProperty("global"); expect(res.body).toHaveProperty("project"); expect(res.body).toHaveProperty("workflowSettings"); + expect(res.body.workflowSettings).not.toBeNull(); + expect(typeof res.body.workflowSettings).toBe("object"); + expect(Array.isArray(res.body.workflowSettings)).toBe(false); // No unexpected top-level keys const keys = Object.keys(res.body); expect(keys).toHaveLength(3); @@ -1587,6 +1594,10 @@ describe("GET /settings/scopes with projectId scoping", () => { expect(projectStoreResolver.getOrCreateProjectStore).toHaveBeenCalledWith(projectId); expect(scopedStore.getSettingsByScopeFast).toHaveBeenCalled(); expect(defaultStore.getSettingsByScopeFast).not.toHaveBeenCalled(); + expect(res.body.workflowSettings).toEqual({}); + expect(res.body.workflowSettings).not.toBeNull(); + expect(typeof res.body.workflowSettings).toBe("object"); + expect(Array.isArray(res.body.workflowSettings)).toBe(false); expect(res.body.project.maxConcurrent).toBe(8); expect(res.body.project.planningProvider).toBe("anthropic"); });