const statusCodes = require("../utilities/statusCodes") const constructHierarchy = require("../utilities/constructHierarchy") const { readFile } = require("fs-extra") const { getRecordApi, getAuthApi } = require("@budibase/core") const masterAppDefinition = constructHierarchy( require("../appPackages/_master/appDefinition.json") ) const { getApisWithFullAccess } = require("../utilities/budibaseApi") const { createTarGzPackage } = require("../utilities/targzAppPackage") const { timeout } = require("./helpers") module.exports = app => { let _master const getmaster = async () => { if (!_master) _master = await getApisWithFullAccess({}, app.masterAppPackage) return _master } let testInstance const getTestInstance = async () => { if (!testInstance) { const testAppInstance1AppPackage = app.testAppInstance1AppPackage testInstance = await getApisWithFullAccess( {}, await testAppInstance1AppPackage(app) ) } return testInstance } let instance2 it("should be able to create second instance of app", async () => { const version1 = app.apps.testApp1.version1 const master = await getmaster() instance2 = master.recordApi.getNew( `${app.apps.testApp1.key}/instances`, "instance" ) instance2.name = "instance 2" instance2.active = true instance2.version = { key: version1.key, name: "v1", defaultAccessLevel: "owner", } await app .post(`/_master/api/record/${instance2.key}`, instance2) .set("cookie", app.credentials.masterOwner.cookie) .expect(statusCodes.OK) const loadInstanceResponse = await app .get(`/_master/api/record/${instance2.key}`) .set("cookie", app.credentials.masterOwner.cookie) .expect(statusCodes.OK) instance2 = loadInstanceResponse.body app.apps.testApp1.instance2 = instance2 }) let user1_instance2 it("should be able to create new user on second instance, via master", async () => { const master = await getmaster() user1_instance2 = master.recordApi.getNew( `${app.apps.testApp1.key}/users`, "user" ) user1_instance2.name = app.credentials.testAppUser2.username user1_instance2.createdByMaster = true master.recordApi.setCustomId(user1_instance2, user1_instance2.name) user1_instance2.instance = instance2 user1_instance2.active = true //await timeout(100); await app .post(`/_master/api/record/${user1_instance2.key}`, user1_instance2) .set("cookie", app.credentials.masterOwner.cookie) .expect(statusCodes.OK) }) it("should be able to set password for new user using temporary code", async () => { const testUserTempCode = await readFile( `./tests/.data/tempaccess${user1_instance2.name}`, "utf8" ) user1_instance2.password = app.credentials.testAppUser2.password await app .post("/testApp/api/setPasswordFromTemporaryCode", { username: app.credentials.testAppUser2.username, tempCode: testUserTempCode, newPassword: app.credentials.testAppUser2.password, }) .expect(statusCodes.OK) const response = await app .post("/testApp/api/authenticate", { username: app.credentials.testAppUser2.username, password: app.credentials.testAppUser2.password, }) .expect(statusCodes.OK) app.credentials.testAppUser2.cookie = response.header["set-cookie"] }) it("should create records in the correct instance", async () => { const bb = await getTestInstance() const newCustomer = name => { const c = bb.recordApi.getNew("/customers", "customer") c.name = name return c } const customer1 = newCustomer("customer1") await app .post(`/testApp/api/record/${customer1.key}`, customer1) .set("cookie", app.credentials.testAppUser1.cookie) .expect(statusCodes.OK) const customer2 = newCustomer("customer2") await app .post(`/testApp/api/record/${customer2.key}`, customer2) .set("cookie", app.credentials.testAppUser2.cookie) .expect(statusCodes.OK) await app .get(`/testApp/api/record/${customer1.key}`) .set("cookie", app.credentials.testAppUser1.cookie) .expect(statusCodes.OK) await app .get(`/testApp/api/record/${customer1.key}`) .set("cookie", app.credentials.testAppUser2.cookie) .expect(statusCodes.INTERAL_ERROR) await app .get(`/testApp/api/record/${customer2.key}`) .set("cookie", app.credentials.testAppUser2.cookie) .expect(statusCodes.OK) await app .get(`/testApp/api/record/${customer2.key}`) .set("cookie", app.credentials.testAppUser1.cookie) .expect(statusCodes.INTERAL_ERROR) }) let versionlessInstance it("should be able to create a versionless instance", async () => { const master = await getmaster() versionlessInstance = master.recordApi.getNew( `${app.apps.testApp1.key}/instances`, "instance" ) versionlessInstance.name = "versionless instance" versionlessInstance.active = true versionlessInstance.version = { key: "", defaultAccessLevel: "owner" } await app .post( `/_master/api/record/${versionlessInstance.key}`, versionlessInstance ) .set("cookie", app.credentials.masterOwner.cookie) .expect(statusCodes.OK) const loadInstanceResponse = await app .get(`/_master/api/record/${versionlessInstance.key}`) .set("cookie", app.credentials.masterOwner.cookie) .expect(statusCodes.OK) versionlessInstance = loadInstanceResponse.body app.apps.testApp1.versionlessInstance = versionlessInstance }) let user1_versionlessInstance it("should be able to create new user on versionless, via master", async () => { const master = await getmaster() user1_versionlessInstance = master.recordApi.getNew( `${app.apps.testApp1.key}/users`, "user" ) user1_versionlessInstance.name = app.credentials.user1_versionlessInstance.username user1_versionlessInstance.createdByMaster = true master.recordApi.setCustomId( user1_versionlessInstance, user1_versionlessInstance.name ) user1_versionlessInstance.instance = versionlessInstance user1_versionlessInstance.active = true //await timeout(100); await app .post( `/_master/api/record/${user1_versionlessInstance.key}`, user1_versionlessInstance ) .set("cookie", app.credentials.masterOwner.cookie) .expect(statusCodes.OK) const testUserTempCode = await readFile( `./tests/.data/tempaccess${user1_versionlessInstance.name}`, "utf8" ) user1_versionlessInstance.password = app.credentials.user1_versionlessInstance.password await app .post("/testApp/api/setPasswordFromTemporaryCode", { username: app.credentials.user1_versionlessInstance.username, tempCode: testUserTempCode, newPassword: app.credentials.user1_versionlessInstance.password, }) .expect(statusCodes.OK) const response = await app .post("/testApp/api/authenticate", { username: app.credentials.user1_versionlessInstance.username, password: app.credentials.user1_versionlessInstance.password, }) .expect(statusCodes.OK) app.credentials.user1_versionlessInstance.cookie = response.header["set-cookie"] }) }