@budibase/worker
Version:
Budibase background service
254 lines (226 loc) • 6.8 kB
text/typescript
import { generator } from "@budibase/backend-core/tests"
import {
BulkUserRequest,
BulkUserResponse,
CreateAdminUserRequest,
InviteUsersRequest,
InviteUsersResponse,
SearchFilters,
User,
} from "@budibase/types"
import structures from "../structures"
import { TestAPI, TestAPIOpts } from "./base"
export class UserAPI extends TestAPI {
// INVITE
sendUserInvite = async (sendMailMock: any, email: string, status = 200) => {
await this.config.saveSmtpConfig()
await this.config.saveSettingsConfig()
const res = await this.request
.post(`/api/global/users/invite`)
.send({
email,
})
.set(this.config.defaultHeaders())
.expect(status)
.expect("Content-Type", /json/)
if (status !== 200) {
return { code: undefined, res }
}
const emailCall = sendMailMock.mock.calls[0][0]
// after this URL there should be a code
const parts = emailCall.html.split(
"http://localhost:10000/builder/invite?code="
)
const code = parts[1].split('"')[0].split("&")[0]
return { code, res }
}
acceptInvite = (code: string) => {
return this.request
.post(`/api/global/users/invite/accept`)
.send({
password: "newpassword1",
inviteCode: code,
firstName: "Ted",
})
.expect("Content-Type", /json/)
.expect(200)
}
sendMultiUserInvite = async (request: InviteUsersRequest, status = 200) => {
await this.config.saveSmtpConfig()
await this.config.saveSettingsConfig()
return this.request
.post(`/api/global/users/multi/invite`)
.send(request)
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(status)
}
// BULK
bulkCreateUsers = async (users: User[], groups: any[] = []) => {
const body: BulkUserRequest = { create: { users, groups } }
const res = await this.request
.post(`/api/global/users/bulk`)
.send(body)
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(200)
return res.body as BulkUserResponse
}
bulkDeleteUsers = async (
users: Array<{
userId: string
email: string
}>,
status?: number
) => {
const body: BulkUserRequest = { delete: { users } }
const res = await this.request
.post(`/api/global/users/bulk`)
.send(body)
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(status ? status : 200)
return res.body as BulkUserResponse
}
// USER
createAdminUser = async (
request?: CreateAdminUserRequest,
opts?: TestAPIOpts
) => {
if (!request) {
request = {
email: structures.email(),
password: generator.string({ length: 12 }),
tenantId: structures.tenant.id(),
}
}
const res = await this.request
.post(`/api/global/users/init`)
.send(request)
.set(this.config.internalAPIHeaders())
.expect("Content-Type", /json/)
.expect(opts?.status ? opts.status : 200)
return {
...request,
userId: res.body._id,
}
}
saveUser = (user: User, status?: number, headers?: any) => {
return this.request
.post(`/api/global/users`)
.send(user)
.set(headers ?? this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(status ? status : 200)
}
addSsoSupportInternalAPIAuth = (ssoId: string, email: string) => {
return this.request
.post(`/api/global/users/sso`)
.send({ ssoId, email })
.set(this.config.internalAPIHeaders())
}
addSsoSupportDefaultAuth = (ssoId: string, email: string) => {
return this.request
.post(`/api/global/users/sso`)
.send({ ssoId, email })
.set(this.config.defaultHeaders())
}
deleteUser = (userId: string, status?: number) => {
return this.request
.delete(`/api/global/users/${userId}`)
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(status ? status : 200)
}
searchUsers = (
{ query }: { query?: SearchFilters },
opts?: {
status?: number
noHeaders?: boolean
useHeaders?: Record<string, string>
}
) => {
const req = this.request
.post("/api/global/users/search")
.send({ query })
.expect("Content-Type", /json/)
.expect(opts?.status ? opts.status : 200)
if (opts?.useHeaders) {
req.set(opts.useHeaders)
} else if (!opts?.noHeaders) {
req.set(this.config.defaultHeaders())
}
return req
}
getUser = (userId: string, opts?: TestAPIOpts) => {
return this.request
.get(`/api/global/users/${userId}`)
.set(opts?.headers ? opts.headers : this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(opts?.status ? opts.status : 200)
}
onboardUser = async (
req: InviteUsersRequest
): Promise<InviteUsersResponse> => {
const resp = await this.request
.post(`/api/global/users/onboard`)
.send(req)
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
if (resp.status !== 200) {
throw new Error(
`request failed with status ${resp.status} and body ${JSON.stringify(
resp.body
)}`
)
}
return resp.body as InviteUsersResponse
}
changeTenantOwnerEmail = (
newAccountEmail: string,
originalEmail: string,
tenantIds: string[],
status = 200
) => {
return this.request
.put(`/api/global/users/tenant/owner`)
.send({ newAccountEmail, originalEmail, tenantIds })
.set(this.config.internalAPIHeaders())
.expect(status)
}
addWorkspaceIdToInvite = (code: string, role: string, status = 200) => {
return this.request
.post(`/api/global/users/invite/${code}/${role}`)
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(status)
}
removeWorkspaceIdFromInvite = (code: string, status = 200) => {
return this.request
.delete(`/api/global/users/invite/${code}`)
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(status)
}
addUserToWorkspace = (
userId: string,
_rev: string,
role: string,
status = 200
) => {
return this.request
.post(`/api/global/users/${userId}/permission/${role}`)
.send({ _rev })
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(status)
}
removeUserFromWorkspace = (userId: string, _rev: string, status = 200) => {
return this.request
.delete(`/api/global/users/${userId}/permission`)
.send({ _rev })
.set(this.config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(status)
}
}