@budibase/worker 2.1.39 → 2.1.40-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mocks__/aws-sdk.ts +15 -0
- package/__mocks__/oauth.ts +57 -0
- package/coverage/clover.xml +2153 -0
- package/coverage/coverage-final.json +78 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +431 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/src/api/controllers/global/auth.ts.html +925 -0
- package/coverage/lcov-report/src/api/controllers/global/configs.ts.html +1405 -0
- package/coverage/lcov-report/src/api/controllers/global/email.ts.html +196 -0
- package/coverage/lcov-report/src/api/controllers/global/index.html +236 -0
- package/coverage/lcov-report/src/api/controllers/global/license.ts.html +187 -0
- package/coverage/lcov-report/src/api/controllers/global/roles.ts.html +283 -0
- package/coverage/lcov-report/src/api/controllers/global/self.ts.html +577 -0
- package/coverage/lcov-report/src/api/controllers/global/templates.ts.html +316 -0
- package/coverage/lcov-report/src/api/controllers/global/users.ts.html +796 -0
- package/coverage/lcov-report/src/api/controllers/global/workspaces.ts.html +244 -0
- package/coverage/lcov-report/src/api/controllers/system/accounts.ts.html +148 -0
- package/coverage/lcov-report/src/api/controllers/system/environment.ts.html +124 -0
- package/coverage/lcov-report/src/api/controllers/system/index.html +191 -0
- package/coverage/lcov-report/src/api/controllers/system/migrations.ts.html +124 -0
- package/coverage/lcov-report/src/api/controllers/system/restore.ts.html +124 -0
- package/coverage/lcov-report/src/api/controllers/system/status.ts.html +133 -0
- package/coverage/lcov-report/src/api/controllers/system/tenants.ts.html +154 -0
- package/coverage/lcov-report/src/api/index.html +116 -0
- package/coverage/lcov-report/src/api/index.ts.html +583 -0
- package/coverage/lcov-report/src/api/routes/global/auth.ts.html +349 -0
- package/coverage/lcov-report/src/api/routes/global/configs.ts.html +457 -0
- package/coverage/lcov-report/src/api/routes/global/email.ts.html +193 -0
- package/coverage/lcov-report/src/api/routes/global/index.html +236 -0
- package/coverage/lcov-report/src/api/routes/global/license.ts.html +124 -0
- package/coverage/lcov-report/src/api/routes/global/roles.ts.html +133 -0
- package/coverage/lcov-report/src/api/routes/global/self.ts.html +139 -0
- package/coverage/lcov-report/src/api/routes/global/templates.ts.html +196 -0
- package/coverage/lcov-report/src/api/routes/global/users.ts.html +409 -0
- package/coverage/lcov-report/src/api/routes/global/workspaces.ts.html +196 -0
- package/coverage/lcov-report/src/api/routes/index.html +116 -0
- package/coverage/lcov-report/src/api/routes/index.ts.html +196 -0
- package/coverage/lcov-report/src/api/routes/system/accounts.ts.html +142 -0
- package/coverage/lcov-report/src/api/routes/system/environment.ts.html +109 -0
- package/coverage/lcov-report/src/api/routes/system/index.html +191 -0
- package/coverage/lcov-report/src/api/routes/system/migrations.ts.html +142 -0
- package/coverage/lcov-report/src/api/routes/system/restore.ts.html +109 -0
- package/coverage/lcov-report/src/api/routes/system/status.ts.html +109 -0
- package/coverage/lcov-report/src/api/routes/system/tenants.ts.html +124 -0
- package/coverage/lcov-report/src/api/routes/validation/index.html +131 -0
- package/coverage/lcov-report/src/api/routes/validation/index.ts.html +88 -0
- package/coverage/lcov-report/src/api/routes/validation/users.ts.html +235 -0
- package/coverage/lcov-report/src/constants/index.html +116 -0
- package/coverage/lcov-report/src/constants/index.ts.html +613 -0
- package/coverage/lcov-report/src/constants/templates/index.html +116 -0
- package/coverage/lcov-report/src/constants/templates/index.ts.html +316 -0
- package/coverage/lcov-report/src/db/index.html +116 -0
- package/coverage/lcov-report/src/db/index.ts.html +115 -0
- package/coverage/lcov-report/src/environment.ts.html +373 -0
- package/coverage/lcov-report/src/index.html +131 -0
- package/coverage/lcov-report/src/index.ts.html +394 -0
- package/coverage/lcov-report/src/middleware/cloudRestricted.ts.html +139 -0
- package/coverage/lcov-report/src/middleware/index.html +116 -0
- package/coverage/lcov-report/src/migrations/functions/globalInfoSyncUsers.ts.html +145 -0
- package/coverage/lcov-report/src/migrations/functions/index.html +116 -0
- package/coverage/lcov-report/src/migrations/index.html +116 -0
- package/coverage/lcov-report/src/migrations/index.ts.html +271 -0
- package/coverage/lcov-report/src/sdk/accounts/accounts.ts.html +262 -0
- package/coverage/lcov-report/src/sdk/accounts/index.html +131 -0
- package/coverage/lcov-report/src/sdk/accounts/index.ts.html +88 -0
- package/coverage/lcov-report/src/sdk/index.html +116 -0
- package/coverage/lcov-report/src/sdk/index.ts.html +106 -0
- package/coverage/lcov-report/src/sdk/users/events.ts.html +577 -0
- package/coverage/lcov-report/src/sdk/users/index.html +146 -0
- package/coverage/lcov-report/src/sdk/users/index.ts.html +88 -0
- package/coverage/lcov-report/src/sdk/users/users.ts.html +1903 -0
- package/coverage/lcov-report/src/tests/TestConfiguration.ts.html +1051 -0
- package/coverage/lcov-report/src/tests/api/accounts.ts.html +160 -0
- package/coverage/lcov-report/src/tests/api/auth.ts.html +220 -0
- package/coverage/lcov-report/src/tests/api/base.ts.html +133 -0
- package/coverage/lcov-report/src/tests/api/configs.ts.html +226 -0
- package/coverage/lcov-report/src/tests/api/email.ts.html +148 -0
- package/coverage/lcov-report/src/tests/api/environment.ts.html +130 -0
- package/coverage/lcov-report/src/tests/api/index.html +296 -0
- package/coverage/lcov-report/src/tests/api/index.ts.html +205 -0
- package/coverage/lcov-report/src/tests/api/migrations.ts.html +151 -0
- package/coverage/lcov-report/src/tests/api/restore.ts.html +127 -0
- package/coverage/lcov-report/src/tests/api/self.ts.html +163 -0
- package/coverage/lcov-report/src/tests/api/status.ts.html +121 -0
- package/coverage/lcov-report/src/tests/api/tenants.ts.html +130 -0
- package/coverage/lcov-report/src/tests/api/users.ts.html +511 -0
- package/coverage/lcov-report/src/tests/controllers.ts.html +100 -0
- package/coverage/lcov-report/src/tests/index.html +146 -0
- package/coverage/lcov-report/src/tests/index.ts.html +139 -0
- package/coverage/lcov-report/src/tests/mocks/email.js.html +115 -0
- package/coverage/lcov-report/src/tests/mocks/index.html +131 -0
- package/coverage/lcov-report/src/tests/mocks/index.ts.html +106 -0
- package/coverage/lcov-report/src/tests/structures/configs.ts.html +313 -0
- package/coverage/lcov-report/src/tests/structures/groups.ts.html +118 -0
- package/coverage/lcov-report/src/tests/structures/index.html +161 -0
- package/coverage/lcov-report/src/tests/structures/index.ts.html +151 -0
- package/coverage/lcov-report/src/tests/structures/users.ts.html +196 -0
- package/coverage/lcov-report/src/utilities/appService.ts.html +181 -0
- package/coverage/lcov-report/src/utilities/email.ts.html +850 -0
- package/coverage/lcov-report/src/utilities/fileSystem.ts.html +100 -0
- package/coverage/lcov-report/src/utilities/index.html +206 -0
- package/coverage/lcov-report/src/utilities/index.ts.html +112 -0
- package/coverage/lcov-report/src/utilities/redis.ts.html +424 -0
- package/coverage/lcov-report/src/utilities/templates.ts.html +232 -0
- package/coverage/lcov-report/src/utilities/users.ts.html +133 -0
- package/coverage/lcov.info +3958 -0
- package/jest.config.ts +29 -0
- package/package.json +13 -23
- package/scripts/localdomain.js +33 -7
- package/src/api/controllers/global/auth.ts +51 -43
- package/src/api/controllers/global/{configs.js → configs.ts} +119 -114
- package/src/api/controllers/global/{email.js → email.ts} +6 -5
- package/src/api/controllers/global/roles.ts +66 -0
- package/src/api/controllers/global/self.ts +2 -2
- package/src/api/controllers/global/users.ts +4 -2
- package/src/api/controllers/global/{workspaces.js → workspaces.ts} +15 -18
- package/src/api/controllers/system/{environment.js → environment.ts} +3 -2
- package/src/api/controllers/system/restore.ts +1 -1
- package/src/api/controllers/system/{status.js → status.ts} +4 -3
- package/src/api/controllers/system/tenants.ts +8 -51
- package/src/api/index.ts +31 -8
- package/src/api/routes/global/{auth.js → auth.ts} +31 -48
- package/src/api/routes/global/{configs.js → configs.ts} +22 -23
- package/src/api/routes/global/{email.js → email.ts} +9 -10
- package/src/api/routes/global/license.ts +1 -1
- package/src/api/routes/global/roles.ts +16 -0
- package/src/api/routes/global/self.ts +2 -2
- package/src/api/routes/global/templates.ts +4 -4
- package/src/api/routes/global/tests/auth.spec.ts +134 -64
- package/src/api/routes/global/tests/configs.spec.ts +34 -35
- package/src/api/routes/global/tests/email.spec.ts +4 -3
- package/src/api/routes/global/tests/license.spec.ts +31 -0
- package/src/api/routes/global/tests/realEmail.spec.ts +2 -3
- package/src/api/routes/global/tests/roles.spec.ts +27 -0
- package/src/api/routes/global/tests/self.spec.ts +3 -4
- package/src/api/routes/global/tests/templates.spec.ts +35 -0
- package/src/api/routes/global/tests/users.spec.ts +51 -43
- package/src/api/routes/global/tests/workspaces.spec.ts +29 -0
- package/src/api/routes/global/{users.js → users.ts} +26 -24
- package/src/api/routes/global/{workspaces.js → workspaces.ts} +9 -10
- package/src/api/routes/index.ts +2 -1
- package/src/api/routes/system/accounts.ts +1 -1
- package/src/api/routes/system/environment.ts +8 -0
- package/src/api/routes/system/migrations.ts +1 -1
- package/src/api/routes/system/restore.ts +1 -1
- package/src/api/routes/system/status.ts +8 -0
- package/src/api/routes/system/tenants.ts +13 -0
- package/src/api/routes/system/tests/accounts.spec.ts +5 -6
- package/src/api/routes/system/tests/environment.spec.ts +29 -0
- package/src/api/routes/system/tests/migrations.spec.ts +63 -0
- package/src/api/routes/system/tests/restore.spec.ts +36 -0
- package/src/api/routes/system/tests/status.spec.ts +48 -0
- package/src/api/routes/system/tests/tenants.spec.ts +61 -0
- package/src/api/routes/validation/users.ts +3 -3
- package/src/constants/{index.js → index.ts} +57 -64
- package/src/constants/templates/{index.js → index.ts} +23 -19
- package/src/db/index.ts +10 -0
- package/src/environment.ts +8 -6
- package/src/index.ts +15 -16
- package/src/middleware/{cloudRestricted.js → cloudRestricted.ts} +5 -4
- package/src/middleware/tests/tenancy.spec.ts +73 -0
- package/src/tests/TestConfiguration.ts +99 -50
- package/src/tests/api/accounts.ts +5 -8
- package/src/tests/api/auth.ts +3 -6
- package/src/tests/api/base.ts +16 -0
- package/src/tests/api/configs.ts +15 -8
- package/src/tests/api/email.ts +3 -6
- package/src/tests/api/environment.ts +15 -0
- package/src/tests/api/index.ts +15 -0
- package/src/tests/api/migrations.ts +22 -0
- package/src/tests/api/restore.ts +14 -0
- package/src/tests/api/self.ts +11 -6
- package/src/tests/api/status.ts +12 -0
- package/src/tests/api/tenants.ts +15 -0
- package/src/tests/api/users.ts +38 -6
- package/src/tests/controllers.ts +5 -0
- package/src/tests/index.ts +5 -1
- package/{scripts/jestSetup.js → src/tests/jestSetup.ts} +12 -3
- package/src/tests/structures/{configs.js → configs.ts} +11 -11
- package/src/tests/structures/index.ts +5 -3
- package/src/tests/structures/users.ts +1 -0
- package/src/utilities/appService.ts +32 -0
- package/src/utilities/{email.js → email.ts} +78 -45
- package/src/utilities/fileSystem.ts +5 -0
- package/src/utilities/{index.js → index.ts} +1 -1
- package/src/utilities/{redis.js → redis.ts} +29 -24
- package/src/utilities/templates.ts +49 -0
- package/src/utilities/users.ts +16 -0
- package/tsconfig.build.json +2 -3
- package/tsconfig.json +3 -1
- package/src/api/controllers/global/roles.js +0 -68
- package/src/api/routes/global/roles.js +0 -12
- package/src/api/routes/system/environment.js +0 -8
- package/src/api/routes/system/status.js +0 -8
- package/src/api/routes/system/tenants.js +0 -12
- package/src/db/index.js +0 -11
- package/src/tests/controllers.js +0 -7
- package/src/tests/structures/accounts.ts +0 -24
- package/src/utilities/appService.js +0 -33
- package/src/utilities/fileSystem.js +0 -5
- package/src/utilities/templates.js +0 -49
- package/src/utilities/users.js +0 -17
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import env from "../environment"
|
|
2
|
+
import { constants } from "@budibase/backend-core"
|
|
3
|
+
import { BBContext } from "@budibase/types"
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* This is a restricted endpoint in the cloud.
|
|
6
7
|
* Ensure that the correct API key has been supplied.
|
|
7
8
|
*/
|
|
8
|
-
|
|
9
|
+
export = async (ctx: BBContext, next: any) => {
|
|
9
10
|
if (!env.SELF_HOSTED && !env.DISABLE_ACCOUNT_PORTAL) {
|
|
10
|
-
const apiKey = ctx.request.headers[
|
|
11
|
+
const apiKey = ctx.request.headers[constants.Header.API_KEY]
|
|
11
12
|
if (apiKey !== env.INTERNAL_API_KEY) {
|
|
12
13
|
ctx.throw(403, "Unauthorized")
|
|
13
14
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { TestConfiguration, structures } from "../../tests"
|
|
2
|
+
import { constants } from "@budibase/backend-core"
|
|
3
|
+
|
|
4
|
+
describe("tenancy middleware", () => {
|
|
5
|
+
const config = new TestConfiguration()
|
|
6
|
+
|
|
7
|
+
beforeAll(async () => {
|
|
8
|
+
await config.beforeAll()
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
afterAll(async () => {
|
|
12
|
+
await config.afterAll()
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
jest.clearAllMocks()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
it("should get tenant id from user", async () => {
|
|
20
|
+
const user = await config.createTenant()
|
|
21
|
+
await config.createSession(user)
|
|
22
|
+
const res = await config.api.self.getSelf(user)
|
|
23
|
+
expect(res.headers[constants.Header.TENANT_ID]).toBe(user.tenantId)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it("should get tenant id from header", async () => {
|
|
27
|
+
const tenantId = structures.uuid()
|
|
28
|
+
const headers = {
|
|
29
|
+
[constants.Header.TENANT_ID]: tenantId,
|
|
30
|
+
}
|
|
31
|
+
const res = await config.request
|
|
32
|
+
.get(`/api/global/configs/checklist`)
|
|
33
|
+
.set(headers)
|
|
34
|
+
expect(res.headers[constants.Header.TENANT_ID]).toBe(tenantId)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it("should get tenant id from query param", async () => {
|
|
38
|
+
const tenantId = structures.uuid()
|
|
39
|
+
const res = await config.request.get(
|
|
40
|
+
`/api/global/configs/checklist?tenantId=${tenantId}`
|
|
41
|
+
)
|
|
42
|
+
expect(res.headers[constants.Header.TENANT_ID]).toBe(tenantId)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it("should get tenant id from subdomain", async () => {
|
|
46
|
+
const tenantId = structures.uuid()
|
|
47
|
+
const headers = {
|
|
48
|
+
host: `${tenantId}.localhost:10000`,
|
|
49
|
+
}
|
|
50
|
+
const res = await config.request
|
|
51
|
+
.get(`/api/global/configs/checklist`)
|
|
52
|
+
.set(headers)
|
|
53
|
+
expect(res.headers[constants.Header.TENANT_ID]).toBe(tenantId)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it("should get tenant id from path variable", async () => {
|
|
57
|
+
const user = await config.createTenant()
|
|
58
|
+
const res = await config.request
|
|
59
|
+
.post(`/api/global/auth/${user.tenantId}/login`)
|
|
60
|
+
.send({
|
|
61
|
+
username: user.email,
|
|
62
|
+
password: user.password,
|
|
63
|
+
})
|
|
64
|
+
expect(res.headers[constants.Header.TENANT_ID]).toBe(user.tenantId)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it("should throw when no tenant id is found", async () => {
|
|
68
|
+
const res = await config.request.get(`/api/global/configs/checklist`)
|
|
69
|
+
expect(res.status).toBe(403)
|
|
70
|
+
expect(res.text).toBe("Tenant id not set")
|
|
71
|
+
expect(res.headers[constants.Header.TENANT_ID]).toBe(undefined)
|
|
72
|
+
})
|
|
73
|
+
})
|
|
@@ -1,41 +1,42 @@
|
|
|
1
1
|
import "./mocks"
|
|
2
|
-
import dbConfig from "../db"
|
|
2
|
+
import * as dbConfig from "../db"
|
|
3
3
|
dbConfig.init()
|
|
4
4
|
import env from "../environment"
|
|
5
|
-
import controllers from "./controllers"
|
|
5
|
+
import * as controllers from "./controllers"
|
|
6
6
|
const supertest = require("supertest")
|
|
7
|
-
import {
|
|
7
|
+
import { Config } from "../constants"
|
|
8
8
|
import {
|
|
9
9
|
users,
|
|
10
10
|
tenancy,
|
|
11
|
-
Cookies,
|
|
12
|
-
Headers,
|
|
13
11
|
sessions,
|
|
14
12
|
auth,
|
|
13
|
+
constants,
|
|
14
|
+
env as coreEnv,
|
|
15
15
|
} from "@budibase/backend-core"
|
|
16
|
-
import { TENANT_ID, TENANT_1, CSRF_TOKEN } from "./structures"
|
|
17
|
-
import structures from "./structures"
|
|
16
|
+
import structures, { TENANT_ID, TENANT_1, CSRF_TOKEN } from "./structures"
|
|
18
17
|
import { CreateUserResponse, User, AuthToken } from "@budibase/types"
|
|
18
|
+
import API from "./api"
|
|
19
19
|
|
|
20
20
|
enum Mode {
|
|
21
|
-
|
|
21
|
+
CLOUD = "cloud",
|
|
22
22
|
SELF = "self",
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
class TestConfiguration {
|
|
26
26
|
server: any
|
|
27
27
|
request: any
|
|
28
|
+
api: API
|
|
28
29
|
defaultUser?: User
|
|
29
30
|
tenant1User?: User
|
|
30
31
|
|
|
31
32
|
constructor(
|
|
32
33
|
opts: { openServer: boolean; mode: Mode } = {
|
|
33
34
|
openServer: true,
|
|
34
|
-
mode: Mode.
|
|
35
|
+
mode: Mode.CLOUD,
|
|
35
36
|
}
|
|
36
37
|
) {
|
|
37
|
-
if (opts.mode === Mode.
|
|
38
|
-
this.
|
|
38
|
+
if (opts.mode === Mode.CLOUD) {
|
|
39
|
+
this.modeCloud()
|
|
39
40
|
} else if (opts.mode === Mode.SELF) {
|
|
40
41
|
this.modeSelf()
|
|
41
42
|
}
|
|
@@ -46,6 +47,8 @@ class TestConfiguration {
|
|
|
46
47
|
// we need the request for logging in, involves cookies, hard to fake
|
|
47
48
|
this.request = supertest(this.server)
|
|
48
49
|
}
|
|
50
|
+
|
|
51
|
+
this.api = new API(this)
|
|
49
52
|
}
|
|
50
53
|
|
|
51
54
|
getRequest() {
|
|
@@ -54,20 +57,24 @@ class TestConfiguration {
|
|
|
54
57
|
|
|
55
58
|
// MODES
|
|
56
59
|
|
|
57
|
-
|
|
58
|
-
env.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
setMultiTenancy = (value: boolean) => {
|
|
61
|
+
env._set("MULTI_TENANCY", value)
|
|
62
|
+
coreEnv._set("MULTI_TENANCY", value)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
setSelfHosted = (value: boolean) => {
|
|
66
|
+
env._set("SELF_HOSTED", value)
|
|
67
|
+
coreEnv._set("SELF_HOSTED", value)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
modeCloud = () => {
|
|
71
|
+
this.setSelfHosted(false)
|
|
72
|
+
this.setMultiTenancy(true)
|
|
63
73
|
}
|
|
64
74
|
|
|
65
75
|
modeSelf = () => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
env.MULTI_TENANCY = false
|
|
69
|
-
// @ts-ignore
|
|
70
|
-
env.DISABLE_ACCOUNT_PORTAL = true
|
|
76
|
+
this.setSelfHosted(true)
|
|
77
|
+
this.setMultiTenancy(false)
|
|
71
78
|
}
|
|
72
79
|
|
|
73
80
|
// UTILS
|
|
@@ -114,6 +121,25 @@ class TestConfiguration {
|
|
|
114
121
|
|
|
115
122
|
// TENANCY
|
|
116
123
|
|
|
124
|
+
createTenant = async (): Promise<User> => {
|
|
125
|
+
// create user / new tenant
|
|
126
|
+
const res = await this.api.users.createAdminUser()
|
|
127
|
+
|
|
128
|
+
// return the created user
|
|
129
|
+
const userRes = await this.api.users.getUser(res.userId, {
|
|
130
|
+
headers: {
|
|
131
|
+
...this.internalAPIHeaders(),
|
|
132
|
+
[constants.Header.TENANT_ID]: res.tenantId,
|
|
133
|
+
},
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
// create a session for the new user
|
|
137
|
+
const user = userRes.body
|
|
138
|
+
await this.createSession(user)
|
|
139
|
+
|
|
140
|
+
return user
|
|
141
|
+
}
|
|
142
|
+
|
|
117
143
|
getTenantId() {
|
|
118
144
|
try {
|
|
119
145
|
return tenancy.getTenantId()
|
|
@@ -122,35 +148,32 @@ class TestConfiguration {
|
|
|
122
148
|
}
|
|
123
149
|
}
|
|
124
150
|
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
async createDefaultUser() {
|
|
128
|
-
const user = structures.users.adminUser({
|
|
129
|
-
email: "test@test.com",
|
|
130
|
-
password: "test",
|
|
131
|
-
})
|
|
132
|
-
this.defaultUser = await this.createUser(user)
|
|
133
|
-
}
|
|
151
|
+
// AUTH
|
|
134
152
|
|
|
135
|
-
async
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
153
|
+
async _createSession({
|
|
154
|
+
userId,
|
|
155
|
+
tenantId,
|
|
156
|
+
}: {
|
|
157
|
+
userId: string
|
|
158
|
+
tenantId: string
|
|
159
|
+
}) {
|
|
160
|
+
await sessions.createASession(userId!, {
|
|
161
|
+
sessionId: "sessionid",
|
|
162
|
+
tenantId: tenantId,
|
|
163
|
+
csrfToken: CSRF_TOKEN,
|
|
139
164
|
})
|
|
140
|
-
this.tenant1User = await this.createUser(user)
|
|
141
165
|
}
|
|
142
166
|
|
|
143
167
|
async createSession(user: User) {
|
|
144
|
-
|
|
145
|
-
sessionId: "sessionid",
|
|
146
|
-
tenantId: user.tenantId,
|
|
147
|
-
csrfToken: CSRF_TOKEN,
|
|
148
|
-
})
|
|
168
|
+
return this._createSession({ userId: user._id!, tenantId: user.tenantId })
|
|
149
169
|
}
|
|
150
170
|
|
|
151
171
|
cookieHeader(cookies: any) {
|
|
172
|
+
if (!Array.isArray(cookies)) {
|
|
173
|
+
cookies = [cookies]
|
|
174
|
+
}
|
|
152
175
|
return {
|
|
153
|
-
Cookie:
|
|
176
|
+
Cookie: cookies,
|
|
154
177
|
}
|
|
155
178
|
}
|
|
156
179
|
|
|
@@ -163,8 +186,8 @@ class TestConfiguration {
|
|
|
163
186
|
const authCookie = auth.jwt.sign(authToken, env.JWT_SECRET)
|
|
164
187
|
return {
|
|
165
188
|
Accept: "application/json",
|
|
166
|
-
...this.cookieHeader([`${
|
|
167
|
-
[
|
|
189
|
+
...this.cookieHeader([`${constants.Cookie.Auth}=${authCookie}`]),
|
|
190
|
+
[constants.Header.CSRF_TOKEN]: CSRF_TOKEN,
|
|
168
191
|
}
|
|
169
192
|
}
|
|
170
193
|
|
|
@@ -179,6 +202,32 @@ class TestConfiguration {
|
|
|
179
202
|
}
|
|
180
203
|
}
|
|
181
204
|
|
|
205
|
+
internalAPIHeaders() {
|
|
206
|
+
return { [constants.Header.API_KEY]: env.INTERNAL_API_KEY }
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
adminOnlyResponse = () => {
|
|
210
|
+
return { message: "Admin user only endpoint.", status: 403 }
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// USERS
|
|
214
|
+
|
|
215
|
+
async createDefaultUser() {
|
|
216
|
+
const user = structures.users.adminUser({
|
|
217
|
+
email: "test@test.com",
|
|
218
|
+
password: "test",
|
|
219
|
+
})
|
|
220
|
+
this.defaultUser = await this.createUser(user)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
async createTenant1User() {
|
|
224
|
+
const user = structures.users.adminUser({
|
|
225
|
+
email: "tenant1@test.com",
|
|
226
|
+
password: "test",
|
|
227
|
+
})
|
|
228
|
+
this.tenant1User = await this.createUser(user)
|
|
229
|
+
}
|
|
230
|
+
|
|
182
231
|
async getUser(email: string): Promise<User> {
|
|
183
232
|
return tenancy.doInTenant(this.getTenantId(), () => {
|
|
184
233
|
return users.getGlobalUserByEmail(email)
|
|
@@ -223,7 +272,7 @@ class TestConfiguration {
|
|
|
223
272
|
// CONFIGS - SETTINGS
|
|
224
273
|
|
|
225
274
|
async saveSettingsConfig() {
|
|
226
|
-
await this.deleteConfig(
|
|
275
|
+
await this.deleteConfig(Config.SETTINGS)
|
|
227
276
|
await this._req(
|
|
228
277
|
structures.configs.settings(),
|
|
229
278
|
null,
|
|
@@ -234,7 +283,7 @@ class TestConfiguration {
|
|
|
234
283
|
// CONFIGS - GOOGLE
|
|
235
284
|
|
|
236
285
|
async saveGoogleConfig() {
|
|
237
|
-
await this.deleteConfig(
|
|
286
|
+
await this.deleteConfig(Config.GOOGLE)
|
|
238
287
|
await this._req(structures.configs.google(), null, controllers.config.save)
|
|
239
288
|
}
|
|
240
289
|
|
|
@@ -242,11 +291,11 @@ class TestConfiguration {
|
|
|
242
291
|
|
|
243
292
|
getOIDConfigCookie(configId: string) {
|
|
244
293
|
const token = auth.jwt.sign(configId, env.JWT_SECRET)
|
|
245
|
-
return this.cookieHeader([[`${
|
|
294
|
+
return this.cookieHeader([[`${constants.Cookie.OIDC_CONFIG}=${token}`]])
|
|
246
295
|
}
|
|
247
296
|
|
|
248
297
|
async saveOIDCConfig() {
|
|
249
|
-
await this.deleteConfig(
|
|
298
|
+
await this.deleteConfig(Config.OIDC)
|
|
250
299
|
const config = structures.configs.oidc()
|
|
251
300
|
|
|
252
301
|
await this._req(config, null, controllers.config.save)
|
|
@@ -256,12 +305,12 @@ class TestConfiguration {
|
|
|
256
305
|
// CONFIGS - SMTP
|
|
257
306
|
|
|
258
307
|
async saveSmtpConfig() {
|
|
259
|
-
await this.deleteConfig(
|
|
308
|
+
await this.deleteConfig(Config.SMTP)
|
|
260
309
|
await this._req(structures.configs.smtp(), null, controllers.config.save)
|
|
261
310
|
}
|
|
262
311
|
|
|
263
312
|
async saveEtherealSmtpConfig() {
|
|
264
|
-
await this.deleteConfig(
|
|
313
|
+
await this.deleteConfig(Config.SMTP)
|
|
265
314
|
await this._req(
|
|
266
315
|
structures.configs.smtpEthereal(),
|
|
267
316
|
null,
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import { Account, AccountMetadata } from "@budibase/types"
|
|
2
2
|
import TestConfiguration from "../TestConfiguration"
|
|
3
|
+
import { TestAPI } from "./base"
|
|
3
4
|
|
|
4
|
-
export class AccountAPI {
|
|
5
|
-
config: TestConfiguration
|
|
6
|
-
request: any
|
|
7
|
-
|
|
5
|
+
export class AccountAPI extends TestAPI {
|
|
8
6
|
constructor(config: TestConfiguration) {
|
|
9
|
-
|
|
10
|
-
this.request = config.request
|
|
7
|
+
super(config)
|
|
11
8
|
}
|
|
12
9
|
|
|
13
10
|
saveMetadata = async (account: Account) => {
|
|
14
11
|
const res = await this.request
|
|
15
12
|
.put(`/api/system/accounts/${account.accountId}/metadata`)
|
|
16
13
|
.send(account)
|
|
17
|
-
.set(this.config.
|
|
14
|
+
.set(this.config.internalAPIHeaders())
|
|
18
15
|
.expect("Content-Type", /json/)
|
|
19
16
|
.expect(200)
|
|
20
17
|
return res.body as AccountMetadata
|
|
@@ -23,6 +20,6 @@ export class AccountAPI {
|
|
|
23
20
|
destroyMetadata = (accountId: string) => {
|
|
24
21
|
return this.request
|
|
25
22
|
.del(`/api/system/accounts/${accountId}/metadata`)
|
|
26
|
-
.set(this.config.
|
|
23
|
+
.set(this.config.internalAPIHeaders())
|
|
27
24
|
}
|
|
28
25
|
}
|
package/src/tests/api/auth.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
import { TestAPI } from "./base"
|
|
2
3
|
|
|
3
|
-
export class AuthAPI {
|
|
4
|
-
config: TestConfiguration
|
|
5
|
-
request: any
|
|
6
|
-
|
|
4
|
+
export class AuthAPI extends TestAPI {
|
|
7
5
|
constructor(config: TestConfiguration) {
|
|
8
|
-
|
|
9
|
-
this.request = config.request
|
|
6
|
+
super(config)
|
|
10
7
|
}
|
|
11
8
|
|
|
12
9
|
updatePassword = (code: string) => {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
|
|
3
|
+
export interface TestAPIOpts {
|
|
4
|
+
headers?: any
|
|
5
|
+
status?: number
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export abstract class TestAPI {
|
|
9
|
+
config: TestConfiguration
|
|
10
|
+
request: any
|
|
11
|
+
|
|
12
|
+
protected constructor(config: TestConfiguration) {
|
|
13
|
+
this.config = config
|
|
14
|
+
this.request = config.request
|
|
15
|
+
}
|
|
16
|
+
}
|
package/src/tests/api/configs.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
import { TestAPI } from "./base"
|
|
2
3
|
|
|
3
|
-
export class ConfigAPI {
|
|
4
|
-
config: TestConfiguration
|
|
5
|
-
request: any
|
|
6
|
-
|
|
4
|
+
export class ConfigAPI extends TestAPI {
|
|
7
5
|
constructor(config: TestConfiguration) {
|
|
8
|
-
|
|
9
|
-
this.request = config.request
|
|
6
|
+
super(config)
|
|
10
7
|
}
|
|
11
8
|
|
|
12
9
|
getConfigChecklist = () => {
|
|
@@ -26,10 +23,20 @@ export class ConfigAPI {
|
|
|
26
23
|
.expect(200)
|
|
27
24
|
}
|
|
28
25
|
|
|
29
|
-
OIDCCallback = (configId: string) => {
|
|
26
|
+
OIDCCallback = (configId: string, preAuthRes: any) => {
|
|
27
|
+
const cookie = this.config.cookieHeader(preAuthRes.get("set-cookie"))
|
|
28
|
+
const setKoaSession = cookie.Cookie.find((c: string) =>
|
|
29
|
+
c.includes("koa:sess")
|
|
30
|
+
)
|
|
31
|
+
const koaSession = setKoaSession.split("=")[1] + "=="
|
|
32
|
+
const sessionContent = JSON.parse(
|
|
33
|
+
Buffer.from(koaSession, "base64").toString("utf-8")
|
|
34
|
+
)
|
|
35
|
+
const handle = sessionContent["openidconnect:localhost"].state.handle
|
|
30
36
|
return this.request
|
|
31
37
|
.get(`/api/global/auth/${this.config.getTenantId()}/oidc/callback`)
|
|
32
|
-
.
|
|
38
|
+
.query({ code: "test", state: handle })
|
|
39
|
+
.set(cookie)
|
|
33
40
|
}
|
|
34
41
|
|
|
35
42
|
getOIDCConfig = (configId: string) => {
|
package/src/tests/api/email.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
import { TestAPI } from "./base"
|
|
2
3
|
|
|
3
|
-
export class EmailAPI {
|
|
4
|
-
config: TestConfiguration
|
|
5
|
-
request: any
|
|
6
|
-
|
|
4
|
+
export class EmailAPI extends TestAPI {
|
|
7
5
|
constructor(config: TestConfiguration) {
|
|
8
|
-
|
|
9
|
-
this.request = config.request
|
|
6
|
+
super(config)
|
|
10
7
|
}
|
|
11
8
|
|
|
12
9
|
sendEmail = (purpose: string) => {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
import { TestAPI } from "./base"
|
|
3
|
+
|
|
4
|
+
export class EnvironmentAPI extends TestAPI {
|
|
5
|
+
constructor(config: TestConfiguration) {
|
|
6
|
+
super(config)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
getEnvironment = () => {
|
|
10
|
+
return this.request
|
|
11
|
+
.get(`/api/system/environment`)
|
|
12
|
+
.expect("Content-Type", /json/)
|
|
13
|
+
.expect(200)
|
|
14
|
+
}
|
|
15
|
+
}
|
package/src/tests/api/index.ts
CHANGED
|
@@ -5,6 +5,11 @@ import { ConfigAPI } from "./configs"
|
|
|
5
5
|
import { EmailAPI } from "./email"
|
|
6
6
|
import { SelfAPI } from "./self"
|
|
7
7
|
import { UserAPI } from "./users"
|
|
8
|
+
import { EnvironmentAPI } from "./environment"
|
|
9
|
+
import { MigrationAPI } from "./migrations"
|
|
10
|
+
import { StatusAPI } from "./status"
|
|
11
|
+
import { RestoreAPI } from "./restore"
|
|
12
|
+
import { TenantAPI } from "./tenants"
|
|
8
13
|
|
|
9
14
|
export default class API {
|
|
10
15
|
accounts: AccountAPI
|
|
@@ -13,6 +18,11 @@ export default class API {
|
|
|
13
18
|
emails: EmailAPI
|
|
14
19
|
self: SelfAPI
|
|
15
20
|
users: UserAPI
|
|
21
|
+
environment: EnvironmentAPI
|
|
22
|
+
migrations: MigrationAPI
|
|
23
|
+
status: StatusAPI
|
|
24
|
+
restore: RestoreAPI
|
|
25
|
+
tenants: TenantAPI
|
|
16
26
|
|
|
17
27
|
constructor(config: TestConfiguration) {
|
|
18
28
|
this.accounts = new AccountAPI(config)
|
|
@@ -21,5 +31,10 @@ export default class API {
|
|
|
21
31
|
this.emails = new EmailAPI(config)
|
|
22
32
|
this.self = new SelfAPI(config)
|
|
23
33
|
this.users = new UserAPI(config)
|
|
34
|
+
this.environment = new EnvironmentAPI(config)
|
|
35
|
+
this.migrations = new MigrationAPI(config)
|
|
36
|
+
this.status = new StatusAPI(config)
|
|
37
|
+
this.restore = new RestoreAPI(config)
|
|
38
|
+
this.tenants = new TenantAPI(config)
|
|
24
39
|
}
|
|
25
40
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
import { TestAPI, TestAPIOpts } from "./base"
|
|
3
|
+
|
|
4
|
+
export class MigrationAPI extends TestAPI {
|
|
5
|
+
constructor(config: TestConfiguration) {
|
|
6
|
+
super(config)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
runMigrations = (opts?: TestAPIOpts) => {
|
|
10
|
+
return this.request
|
|
11
|
+
.post(`/api/system/migrations/run`)
|
|
12
|
+
.set(opts?.headers ? opts.headers : this.config.internalAPIHeaders())
|
|
13
|
+
.expect(opts?.status ? opts.status : 200)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getMigrationDefinitions = (opts?: TestAPIOpts) => {
|
|
17
|
+
return this.request
|
|
18
|
+
.get(`/api/system/migrations/definitions`)
|
|
19
|
+
.set(opts?.headers ? opts.headers : this.config.internalAPIHeaders())
|
|
20
|
+
.expect(opts?.status ? opts.status : 200)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
import { TestAPI, TestAPIOpts } from "./base"
|
|
3
|
+
|
|
4
|
+
export class RestoreAPI extends TestAPI {
|
|
5
|
+
constructor(config: TestConfiguration) {
|
|
6
|
+
super(config)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
restored = (opts?: TestAPIOpts) => {
|
|
10
|
+
return this.request
|
|
11
|
+
.post(`/api/system/restored`)
|
|
12
|
+
.expect(opts?.status ? opts.status : 200)
|
|
13
|
+
}
|
|
14
|
+
}
|
package/src/tests/api/self.ts
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import TestConfiguration from "../TestConfiguration"
|
|
2
2
|
import { User } from "@budibase/types"
|
|
3
|
+
import { TestAPI } from "./base"
|
|
3
4
|
|
|
4
|
-
export class SelfAPI {
|
|
5
|
-
config: TestConfiguration
|
|
6
|
-
request: any
|
|
7
|
-
|
|
5
|
+
export class SelfAPI extends TestAPI {
|
|
8
6
|
constructor(config: TestConfiguration) {
|
|
9
|
-
|
|
10
|
-
this.request = config.request
|
|
7
|
+
super(config)
|
|
11
8
|
}
|
|
12
9
|
|
|
13
10
|
updateSelf = (user: User) => {
|
|
@@ -18,4 +15,12 @@ export class SelfAPI {
|
|
|
18
15
|
.expect("Content-Type", /json/)
|
|
19
16
|
.expect(200)
|
|
20
17
|
}
|
|
18
|
+
|
|
19
|
+
getSelf = (user: User) => {
|
|
20
|
+
return this.request
|
|
21
|
+
.get(`/api/global/self`)
|
|
22
|
+
.set(this.config.authHeaders(user))
|
|
23
|
+
.expect("Content-Type", /json/)
|
|
24
|
+
.expect(200)
|
|
25
|
+
}
|
|
21
26
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
import { TestAPI } from "./base"
|
|
3
|
+
|
|
4
|
+
export class StatusAPI extends TestAPI {
|
|
5
|
+
constructor(config: TestConfiguration) {
|
|
6
|
+
super(config)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
getStatus = () => {
|
|
10
|
+
return this.request.get(`/api/system/status`).expect(200)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import TestConfiguration from "../TestConfiguration"
|
|
2
|
+
import { TestAPI, TestAPIOpts } from "./base"
|
|
3
|
+
|
|
4
|
+
export class TenantAPI extends TestAPI {
|
|
5
|
+
constructor(config: TestConfiguration) {
|
|
6
|
+
super(config)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
delete = (tenantId: string, opts?: TestAPIOpts) => {
|
|
10
|
+
return this.request
|
|
11
|
+
.delete(`/api/system/tenants/${tenantId}`)
|
|
12
|
+
.set(opts?.headers)
|
|
13
|
+
.expect(opts?.status ? opts.status : 204)
|
|
14
|
+
}
|
|
15
|
+
}
|