diff --git a/packages/backend-core/src/users/db.ts b/packages/backend-core/src/users/db.ts index 6280c6d789..410e3846d7 100644 --- a/packages/backend-core/src/users/db.ts +++ b/packages/backend-core/src/users/db.ts @@ -196,7 +196,10 @@ export class UserDB { throw new Error("_id or email is required") } - if (user.builder?.apps?.length && !await this.features.isAppBuildersEnabled()) { + if ( + user.builder?.apps?.length && + !(await this.features.isAppBuildersEnabled()) + ) { throw new Error("Unable to update app builders, please check license") } diff --git a/packages/backend-core/tests/core/utilities/mocks/licenses.ts b/packages/backend-core/tests/core/utilities/mocks/licenses.ts index 4272e78eb8..c98900440a 100644 --- a/packages/backend-core/tests/core/utilities/mocks/licenses.ts +++ b/packages/backend-core/tests/core/utilities/mocks/licenses.ts @@ -94,6 +94,10 @@ export const useSyncAutomations = () => { return useFeature(Feature.SYNC_AUTOMATIONS) } +export const useAppBuilders = () => { + return useFeature(Feature.APP_BUILDERS) +} + // QUOTAS export const setAutomationLogsQuota = (value: number) => { diff --git a/packages/pro b/packages/pro index 20b120c636..8e00c6f4bb 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 20b120c636184aa3497fa439c4ec5cc1e3696231 +Subproject commit 8e00c6f4bbd3c02de32872819d4a053dc7c0c058 diff --git a/packages/worker/src/api/routes/global/tests/appBuilder.spec.ts b/packages/worker/src/api/routes/global/tests/appBuilder.spec.ts index 22039471b4..2a0c75b365 100644 --- a/packages/worker/src/api/routes/global/tests/appBuilder.spec.ts +++ b/packages/worker/src/api/routes/global/tests/appBuilder.spec.ts @@ -1,4 +1,5 @@ import { TestConfiguration, structures } from "../../../../tests" +import { mocks } from "@budibase/backend-core/tests" import { User } from "@budibase/types" const MOCK_APP_ID = "app_a" @@ -24,18 +25,31 @@ describe("/api/global/users/:userId/app/builder", () => { return response.body as User } + describe("Confirm pro license", () => { + it("should 400 with licensing", async () => { + const user = await newUser() + const resp = await config.api.users.grantBuilderToApp( + user._id!, + MOCK_APP_ID, + 400 + ) + expect(resp.body.message).toContain("Feature not enabled") + }) + }) + describe("PATCH /api/global/users/:userId/app/:appId/builder", () => { it("should be able to grant a user access to a particular app", async () => { + mocks.licenses.useAppBuilders() const user = await newUser() await config.api.users.grantBuilderToApp(user._id!, MOCK_APP_ID) const updated = await getUser(user._id!) - expect(updated.builder?.appBuilder).toBe(true) expect(updated.builder?.apps![0]).toBe(MOCK_APP_ID) }) }) describe("DELETE /api/global/users/:userId/app/:appId/builder", () => { it("should allow revoking access", async () => { + mocks.licenses.useAppBuilders() const user = await newUser() await config.api.users.grantBuilderToApp(user._id!, MOCK_APP_ID) let updated = await getUser(user._id!)