const testAppDef = require("../appPackages/testApp/appDefinition.json") const testAccessLevels = require("../appPackages/testApp/access_levels.json") const testPages = require("../appPackages/testApp/pages.json") const testComponents = require("../appPackages/testApp/customComponents/components.json") const testMoreComponents = require("../appPackages/testApp/moreCustomComponents/components.json") const statusCodes = require("../utilities/statusCodes") const screen1 = require("../appPackages/testApp/components/myTextBox.json") const screen2 = require("../appPackages/testApp/components/subfolder/otherTextBox.json") const { readJSON, pathExists, unlink } = require("fs-extra") const app = require("./testApp")() testComponents.textbox.name = `./customComponents/textbox` testMoreComponents.textbox.name = `./moreCustomComponents/textbox` beforeAll(async () => { const testComponent = "./appPackages/testApp/components/newTextBox.json" const testComponentAfterMove = "./appPackages/testApp/components/anotherSubFolder/newTextBox.json" if (await pathExists(testComponent)) await unlink(testComponent) if (await pathExists(testComponentAfterMove)) await unlink(testComponentAfterMove) await app.start() }) afterAll(async () => await app.destroy()) it("/apppackage should get appDefinition", async () => { const { body } = await app .get("/_builder/api/testApp/appPackage") .expect(statusCodes.OK) expect(body.appDefinition).toEqual(testAppDef) }) it("/apppackage should get access levels", async () => { const { body } = await app .get("/_builder/api/testApp/appPackage") .expect(statusCodes.OK) expect(body.accessLevels).toEqual(testAccessLevels) }) it("/apppackage should get pages", async () => { const { body } = await app .get("/_builder/api/testApp/appPackage") .expect(statusCodes.OK) expect(body.pages).toEqual(testPages) }) it("/apppackage should get components", async () => { const { body } = await app .get("/_builder/api/testApp/appPackage") .expect(statusCodes.OK) expect(body.components["./customComponents/textbox"]).toBeDefined() expect(body.components["./moreCustomComponents/textbox"]).toBeDefined() expect(body.components["./customComponents/textbox"]).toEqual( testComponents.textbox ) expect(body.components["./moreCustomComponents/textbox"]).toEqual( testMoreComponents.textbox ) }) it("/apppackage should get screens", async () => { const { body } = await app .get("/_builder/api/testApp/appPackage") .expect(statusCodes.OK) const expectedComponents = { myTextBox: { ...screen1, name: "myTextBox" }, "subfolder/otherTextBox": { ...screen2, name: "subfolder/otherTextBox" }, } expect(body.screens).toEqual(expectedComponents) }) it("should be able to create new derived component", async () => { const newscreen = { name: "newTextBox", inherits: "./customComponents/textbox", props: { label: "something", }, } await app .post("/_builder/api/testApp/screen", newscreen) .expect(statusCodes.OK) const componentFile = "./appPackages/testApp/components/newTextBox.json" expect(await pathExists(componentFile)).toBe(true) expect(await readJSON(componentFile)).toEqual(newscreen) }) it("should be able to update derived component", async () => { const updatedscreen = { name: "newTextBox", inherits: "./customComponents/textbox", props: { label: "something else", }, } await app .post("/_builder/api/testApp/screen", updatedscreen) .expect(statusCodes.OK) const componentFile = "./appPackages/testApp/components/newTextBox.json" expect(await readJSON(componentFile)).toEqual(updatedscreen) }) it("should be able to rename derived component", async () => { await app .patch("/_builder/api/testApp/screen", { oldname: "newTextBox", newname: "anotherSubFolder/newTextBox", }) .expect(statusCodes.OK) const oldcomponentFile = "./appPackages/testApp/components/newTextBox.json" const newcomponentFile = "./appPackages/testApp/components/anotherSubFolder/newTextBox.json" expect(await pathExists(oldcomponentFile)).toBe(false) expect(await pathExists(newcomponentFile)).toBe(true) }) it("should be able to delete derived component", async () => { await app .delete("/_builder/api/testApp/screen/anotherSubFolder/newTextBox") .expect(statusCodes.OK) const componentFile = "./appPackages/testApp/components/anotherSubFolder/newTextBox.json" const componentDir = "./appPackages/testApp/components/anotherSubFolder" expect(await pathExists(componentFile)).toBe(false) expect(await pathExists(componentDir)).toBe(false) }) it("/savePackage should prepare all necessary client files", async () => { await app .post("/_builder/api/testApp/appPackage", { appDefinition: testAppDef, accessLevels: testAccessLevels, pages: testPages, }) .expect(statusCodes.OK) const publicFolderMain = relative => "./appPackages/testApp/public/main" + relative const publicFolderUnauth = relative => "./appPackages/testApp/public/unauthenticated" + relative expect(await pathExists(publicFolderMain("/index.html"))).toBe(true) expect(await pathExists(publicFolderUnauth("/index.html"))).toBe(true) expect( await pathExists(publicFolderMain("/lib/customComponents/index.js")) ).toBe(true) expect( await pathExists(publicFolderUnauth("/lib/customComponents/index.js")) ).toBe(true) expect( await pathExists(publicFolderMain("/lib/moreCustomComponents/index.js")) ).toBe(true) expect( await pathExists(publicFolderUnauth("/lib/moreCustomComponents/index.js")) ).toBe(true) expect( await pathExists( publicFolderMain( "/lib/node_modules/@budibase/standard-components/dist/index.js" ) ) ).toBe(true) expect( await pathExists( publicFolderUnauth( "/lib/node_modules/@budibase/standard-components/dist/index.js" ) ) ).toBe(true) expect(await pathExists(publicFolderUnauth("/budibase-client.js"))).toBe(true) expect(await pathExists(publicFolderUnauth("/clientAppDefinition.js"))).toBe( true ) })