diff --git a/packages/cli/src/controllers/app-env-api.ts b/packages/cli/src/controllers/app-env-api.ts index 954fe32..e229ad9 100644 --- a/packages/cli/src/controllers/app-env-api.ts +++ b/packages/cli/src/controllers/app-env-api.ts @@ -33,6 +33,7 @@ export async function findVariableByNaturalKey( resolved: ResolvedEnvApiScope, signal: AbortSignal, ): Promise { + // Filter by branchId server-side — the list pages at 100, so client-side-only filtering drops branch rows past page 1. const { data, error, response } = await client.GET( "/v1/environment-variables", { @@ -41,6 +42,9 @@ export async function findVariableByNaturalKey( projectId, class: resolved.apiTarget.class, key, + ...(resolved.apiTarget.branchId !== null + ? { branchId: resolved.apiTarget.branchId } + : {}), }, }, signal, diff --git a/packages/cli/tests/app-env.test.ts b/packages/cli/tests/app-env.test.ts index da3e577..f2b7a3e 100644 --- a/packages/cli/tests/app-env.test.ts +++ b/packages/cli/tests/app-env.test.ts @@ -944,6 +944,67 @@ describe("env update", () => { ); }); + it("scopes the branch-override lookup by branchId so it survives pagination", async () => { + const client = createMockClient(); + client.envGET + .mockResolvedValueOnce({ + data: { + data: [makeBranchRow()], + pagination: { hasMore: false, nextCursor: null }, + }, + response: { status: 200 }, + }) + .mockResolvedValueOnce({ + data: { + data: [ + makeVariableRow({ + id: "envvar_branch", + key: "DATABASE_URL", + class: "preview", + branchId: "br_feature", + }), + ], + pagination: { hasMore: false, nextCursor: null }, + }, + response: { status: 200 }, + }); + client.PATCH.mockResolvedValueOnce({ + data: { + data: makeVariableRow({ + id: "envvar_branch", + key: "DATABASE_URL", + class: "preview", + branchId: "br_feature", + }), + }, + response: { status: 200 }, + }); + + const { controllers, createTempCwd, createTestCommandContext } = + await loadControllers(client, "proj_123"); + const cwd = await createTempCwd(); + await writeLocalPin(cwd); + const { context } = await createTestCommandContext({ cwd }); + + await controllers.runEnvUpdate(context, "DATABASE_URL=postgresql://new", { + branchName: "feature/foo", + }); + + expect(client.GET).toHaveBeenCalledWith( + "/v1/environment-variables", + expect.objectContaining({ + params: { + query: expect.objectContaining({ + projectId: "proj_123", + class: "preview", + key: "DATABASE_URL", + branchId: "br_feature", + }), + }, + }), + ); + }); + it("updates variables from a dotenv file via PATCH", async () => { const client = createMockClient(); client.envGET