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
This commit is contained in:
gsxdsm
2026-06-12 19:17:25 -07:00
parent d0bbca4fa9
commit 1d190f37ed
2 changed files with 12 additions and 1 deletions

View File

@@ -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. |
---

View File

@@ -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");
});