unit tests
This commit is contained in:
parent
dde1237ed2
commit
cbc377b0f4
|
@ -817,7 +817,6 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"string",
|
"string",
|
||||||
"barcodeqr",
|
|
||||||
"longform",
|
"longform",
|
||||||
"options",
|
"options",
|
||||||
"number",
|
"number",
|
||||||
|
@ -829,7 +828,8 @@
|
||||||
"formula",
|
"formula",
|
||||||
"auto",
|
"auto",
|
||||||
"json",
|
"json",
|
||||||
"internal"
|
"internal",
|
||||||
|
"barcodeqr"
|
||||||
],
|
],
|
||||||
"description": "Defines the type of the column, most explain themselves, a link column is a relationship."
|
"description": "Defines the type of the column, most explain themselves, a link column is a relationship."
|
||||||
},
|
},
|
||||||
|
@ -1021,7 +1021,6 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"string",
|
"string",
|
||||||
"barcodeqr",
|
|
||||||
"longform",
|
"longform",
|
||||||
"options",
|
"options",
|
||||||
"number",
|
"number",
|
||||||
|
@ -1033,7 +1032,8 @@
|
||||||
"formula",
|
"formula",
|
||||||
"auto",
|
"auto",
|
||||||
"json",
|
"json",
|
||||||
"internal"
|
"internal",
|
||||||
|
"barcodeqr"
|
||||||
],
|
],
|
||||||
"description": "Defines the type of the column, most explain themselves, a link column is a relationship."
|
"description": "Defines the type of the column, most explain themselves, a link column is a relationship."
|
||||||
},
|
},
|
||||||
|
@ -1236,7 +1236,6 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"string",
|
"string",
|
||||||
"barcodeqr",
|
|
||||||
"longform",
|
"longform",
|
||||||
"options",
|
"options",
|
||||||
"number",
|
"number",
|
||||||
|
@ -1248,7 +1247,8 @@
|
||||||
"formula",
|
"formula",
|
||||||
"auto",
|
"auto",
|
||||||
"json",
|
"json",
|
||||||
"internal"
|
"internal",
|
||||||
|
"barcodeqr"
|
||||||
],
|
],
|
||||||
"description": "Defines the type of the column, most explain themselves, a link column is a relationship."
|
"description": "Defines the type of the column, most explain themselves, a link column is a relationship."
|
||||||
},
|
},
|
||||||
|
@ -2054,6 +2054,24 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/metrics": {
|
||||||
|
"get": {
|
||||||
|
"operationId": "getById",
|
||||||
|
"summary": "Retrieve Budibase tenant metrics",
|
||||||
|
"description": "Output metrics in OpenMetrics format compatible with Prometheus",
|
||||||
|
"tags": [
|
||||||
|
"metrics"
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Returns tenant metrics.",
|
||||||
|
"content": {
|
||||||
|
"text/plain": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/queries/{queryId}": {
|
"/queries/{queryId}": {
|
||||||
"post": {
|
"post": {
|
||||||
"operationId": "execute",
|
"operationId": "execute",
|
||||||
|
|
|
@ -603,7 +603,6 @@ components:
|
||||||
type: string
|
type: string
|
||||||
enum:
|
enum:
|
||||||
- string
|
- string
|
||||||
- barcodeqr
|
|
||||||
- longform
|
- longform
|
||||||
- options
|
- options
|
||||||
- number
|
- number
|
||||||
|
@ -616,6 +615,7 @@ components:
|
||||||
- auto
|
- auto
|
||||||
- json
|
- json
|
||||||
- internal
|
- internal
|
||||||
|
- barcodeqr
|
||||||
description: Defines the type of the column, most explain themselves, a link
|
description: Defines the type of the column, most explain themselves, a link
|
||||||
column is a relationship.
|
column is a relationship.
|
||||||
constraints:
|
constraints:
|
||||||
|
@ -766,7 +766,6 @@ components:
|
||||||
type: string
|
type: string
|
||||||
enum:
|
enum:
|
||||||
- string
|
- string
|
||||||
- barcodeqr
|
|
||||||
- longform
|
- longform
|
||||||
- options
|
- options
|
||||||
- number
|
- number
|
||||||
|
@ -779,6 +778,7 @@ components:
|
||||||
- auto
|
- auto
|
||||||
- json
|
- json
|
||||||
- internal
|
- internal
|
||||||
|
- barcodeqr
|
||||||
description: Defines the type of the column, most explain themselves, a link
|
description: Defines the type of the column, most explain themselves, a link
|
||||||
column is a relationship.
|
column is a relationship.
|
||||||
constraints:
|
constraints:
|
||||||
|
@ -936,7 +936,6 @@ components:
|
||||||
type: string
|
type: string
|
||||||
enum:
|
enum:
|
||||||
- string
|
- string
|
||||||
- barcodeqr
|
|
||||||
- longform
|
- longform
|
||||||
- options
|
- options
|
||||||
- number
|
- number
|
||||||
|
@ -949,6 +948,7 @@ components:
|
||||||
- auto
|
- auto
|
||||||
- json
|
- json
|
||||||
- internal
|
- internal
|
||||||
|
- barcodeqr
|
||||||
description: Defines the type of the column, most explain themselves, a link
|
description: Defines the type of the column, most explain themselves, a link
|
||||||
column is a relationship.
|
column is a relationship.
|
||||||
constraints:
|
constraints:
|
||||||
|
@ -1531,6 +1531,18 @@ paths:
|
||||||
examples:
|
examples:
|
||||||
applications:
|
applications:
|
||||||
$ref: "#/components/examples/applications"
|
$ref: "#/components/examples/applications"
|
||||||
|
/metrics:
|
||||||
|
get:
|
||||||
|
operationId: getById
|
||||||
|
summary: Retrieve Budibase tenant metrics
|
||||||
|
description: Output metrics in OpenMetrics format compatible with Prometheus
|
||||||
|
tags:
|
||||||
|
- metrics
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Returns tenant metrics.
|
||||||
|
content:
|
||||||
|
? text/plain
|
||||||
"/queries/{queryId}":
|
"/queries/{queryId}":
|
||||||
post:
|
post:
|
||||||
operationId: execute
|
operationId: execute
|
||||||
|
|
|
@ -13,8 +13,8 @@ export async function fetch(ctx: BBContext) {
|
||||||
|
|
||||||
// *** APPS ***
|
// *** APPS ***
|
||||||
const allDatabases = await dbCore.getAllDbs()
|
const allDatabases = await dbCore.getAllDbs()
|
||||||
const devAppIDs = await dbCore.getDevAppIDs({ idsOnly: true })
|
const devAppIDs = await dbCore.getDevAppIDs()
|
||||||
const prodAppIDs = await dbCore.getProdAppIDs({ idsOnly: true })
|
const prodAppIDs = await dbCore.getProdAppIDs()
|
||||||
const allAppIds = await dbCore.getAllApps({ idsOnly: true })
|
const allAppIds = await dbCore.getAllApps({ idsOnly: true })
|
||||||
|
|
||||||
// *** USERS ***
|
// *** USERS ***
|
||||||
|
@ -147,7 +147,7 @@ export async function fetch(ctx: BBContext) {
|
||||||
"budibase_quota_limit_apps",
|
"budibase_quota_limit_apps",
|
||||||
"The limit on the number of apps that can be created",
|
"The limit on the number of apps that can be created",
|
||||||
"gauge",
|
"gauge",
|
||||||
appsQuotaLimit == -1 ? 3000000 : appsQuotaLimit
|
appsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : appsQuotaLimit
|
||||||
)
|
)
|
||||||
|
|
||||||
// **** budibase_quota_usage_rows ****
|
// **** budibase_quota_usage_rows ****
|
||||||
|
@ -163,7 +163,7 @@ export async function fetch(ctx: BBContext) {
|
||||||
"budibase_quota_limit_rows",
|
"budibase_quota_limit_rows",
|
||||||
"The limit on the number of rows that can be created",
|
"The limit on the number of rows that can be created",
|
||||||
"gauge",
|
"gauge",
|
||||||
rowsQuotaLimit == -1 ? 3000000 : rowsQuotaLimit
|
rowsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : rowsQuotaLimit
|
||||||
)
|
)
|
||||||
|
|
||||||
// **** budibase_quota_usage_plugins ****
|
// **** budibase_quota_usage_plugins ****
|
||||||
|
@ -179,7 +179,7 @@ export async function fetch(ctx: BBContext) {
|
||||||
"budibase_quota_limit_plugins",
|
"budibase_quota_limit_plugins",
|
||||||
"The limit on the number of plugins that can be created",
|
"The limit on the number of plugins that can be created",
|
||||||
"gauge",
|
"gauge",
|
||||||
pluginsQuotaLimit == -1 ? 3000000 : pluginsQuotaLimit
|
pluginsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : pluginsQuotaLimit
|
||||||
)
|
)
|
||||||
|
|
||||||
// **** budibase_quota_usage_user_groups ****
|
// **** budibase_quota_usage_user_groups ****
|
||||||
|
@ -195,7 +195,7 @@ export async function fetch(ctx: BBContext) {
|
||||||
"budibase_quota_limit_user_groups",
|
"budibase_quota_limit_user_groups",
|
||||||
"The limit on the number of user groups that can be created",
|
"The limit on the number of user groups that can be created",
|
||||||
"gauge",
|
"gauge",
|
||||||
userGroupsQuotaLimit == -1 ? 3000000 : userGroupsQuotaLimit
|
userGroupsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : userGroupsQuotaLimit
|
||||||
)
|
)
|
||||||
|
|
||||||
// **** budibase_quota_usage_queries ****
|
// **** budibase_quota_usage_queries ****
|
||||||
|
@ -211,7 +211,7 @@ export async function fetch(ctx: BBContext) {
|
||||||
"budibase_quota_limit_queries",
|
"budibase_quota_limit_queries",
|
||||||
"The limit on the number of queries for the current month",
|
"The limit on the number of queries for the current month",
|
||||||
"gauge",
|
"gauge",
|
||||||
queryQuotaLimit == -1 ? 3000000 : queryQuotaLimit
|
queryQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : queryQuotaLimit
|
||||||
)
|
)
|
||||||
|
|
||||||
// **** budibase_quota_usage_automations ****
|
// **** budibase_quota_usage_automations ****
|
||||||
|
@ -227,10 +227,12 @@ export async function fetch(ctx: BBContext) {
|
||||||
"budibase_quota_limit_automations",
|
"budibase_quota_limit_automations",
|
||||||
"The limit on the number of automations that can be created",
|
"The limit on the number of automations that can be created",
|
||||||
"gauge",
|
"gauge",
|
||||||
automationsQuotaLimit == -1 ? 3000000 : automationsQuotaLimit
|
automationsQuotaLimit == -1
|
||||||
|
? Number.MAX_SAFE_INTEGER
|
||||||
|
: automationsQuotaLimit
|
||||||
)
|
)
|
||||||
|
|
||||||
ctx.body = outputString
|
ctx.body = outputString
|
||||||
|
ctx.set('Content-Type', 'text/plain');
|
||||||
}
|
}
|
||||||
|
|
||||||
export function convertToOpenMetrics(
|
export function convertToOpenMetrics(
|
||||||
|
|
|
@ -13,7 +13,7 @@ import env from "../../../environment"
|
||||||
// below imports don't have declaration files
|
// below imports don't have declaration files
|
||||||
const Router = require("@koa/router")
|
const Router = require("@koa/router")
|
||||||
const { RateLimit, Stores } = require("koa2-ratelimit")
|
const { RateLimit, Stores } = require("koa2-ratelimit")
|
||||||
import { redis, permissions } from "@budibase/backend-core"
|
import { middleware, redis, permissions } from "@budibase/backend-core"
|
||||||
const { PermissionType, PermissionLevel } = permissions
|
const { PermissionType, PermissionLevel } = permissions
|
||||||
|
|
||||||
const PREFIX = "/api/public/v1"
|
const PREFIX = "/api/public/v1"
|
||||||
|
@ -92,6 +92,13 @@ function addToRouter(endpoints: any) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function applyAdminRoutes(endpoints: any) {
|
||||||
|
addMiddleware(endpoints.read, middleware.builderOrAdmin)
|
||||||
|
addMiddleware(endpoints.write, middleware.builderOrAdmin)
|
||||||
|
addToRouter(endpoints.read)
|
||||||
|
addToRouter(endpoints.write)
|
||||||
|
}
|
||||||
|
|
||||||
function applyRoutes(
|
function applyRoutes(
|
||||||
endpoints: any,
|
endpoints: any,
|
||||||
permType: string,
|
permType: string,
|
||||||
|
@ -120,8 +127,8 @@ function applyRoutes(
|
||||||
addToRouter(endpoints.write)
|
addToRouter(endpoints.write)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
applyAdminRoutes(metricEndpoints)
|
||||||
applyRoutes(appEndpoints, PermissionType.APP, "appId")
|
applyRoutes(appEndpoints, PermissionType.APP, "appId")
|
||||||
applyRoutes(metricEndpoints, PermissionType.APP, "appId")
|
|
||||||
applyRoutes(tableEndpoints, PermissionType.TABLE, "tableId")
|
applyRoutes(tableEndpoints, PermissionType.TABLE, "tableId")
|
||||||
applyRoutes(userEndpoints, PermissionType.USER, "userId")
|
applyRoutes(userEndpoints, PermissionType.USER, "userId")
|
||||||
applyRoutes(queryEndpoints, PermissionType.QUERY, "queryId")
|
applyRoutes(queryEndpoints, PermissionType.QUERY, "queryId")
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
const { roles, utils } = require("@budibase/backend-core")
|
||||||
|
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||||
|
const setup = require("./utilities")
|
||||||
|
const { BUILTIN_ROLE_IDS } = roles
|
||||||
|
|
||||||
|
jest.setTimeout(30000)
|
||||||
|
|
||||||
|
// jest.mock("../../../utilities/workerRequests", () => ({
|
||||||
|
// getGlobalUsers: jest.fn(() => {
|
||||||
|
// return {}
|
||||||
|
// }),
|
||||||
|
// getGlobalSelf: jest.fn(() => {
|
||||||
|
// return {}
|
||||||
|
// }),
|
||||||
|
// deleteGlobalUser: jest.fn(),
|
||||||
|
// }))
|
||||||
|
|
||||||
|
describe("/metrics", () => {
|
||||||
|
let request = setup.getRequest()
|
||||||
|
let config = setup.getConfig()
|
||||||
|
|
||||||
|
afterAll(setup.afterAll)
|
||||||
|
|
||||||
|
// For some reason this cannot be a beforeAll or the test "should be able to update the user" fail
|
||||||
|
beforeEach(async () => {
|
||||||
|
await config.init()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("get", () => {
|
||||||
|
it("returns a list of metrics", async () => {
|
||||||
|
const res = await request
|
||||||
|
.get(`/api/public/v1/metrics`)
|
||||||
|
.set(config.defaultHeaders())
|
||||||
|
.expect("Content-Type", /text\/plain/)
|
||||||
|
.expect(200)
|
||||||
|
expect(res.text).toContain("budibase_tenant_user_count")
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should apply authorization to endpoint", async () => {
|
||||||
|
// await config.createUser()
|
||||||
|
const res = await request
|
||||||
|
.get(`/api/public/v1/metrics`)
|
||||||
|
.set(config.publicHeaders())
|
||||||
|
.expect(403)
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
Loading…
Reference in New Issue