mirror of https://github.com/Budibase/budibase.git
2 changed files with 172 additions and 0 deletions
@ -0,0 +1,172 @@ |
|||
const fetch = require("node-fetch") |
|||
|
|||
const MAX_RUNTIME_SEC = 600 |
|||
const HOST = "http://localhost:10000" |
|||
const TENANT_ID = "default" |
|||
const RATE_MS = 500 |
|||
|
|||
let API_KEY = process.argv[2] |
|||
let STATS = { |
|||
iterations: 0, |
|||
error: 0, |
|||
success: 0, |
|||
} |
|||
|
|||
if (!API_KEY) { |
|||
console.error("Must specify API key as first run command!") |
|||
process.exit(-1) |
|||
} |
|||
|
|||
const USERS = [ |
|||
{ |
|||
email: "loadtest1@test.com", |
|||
password: "test", |
|||
}, |
|||
{ |
|||
email: "loadtest2@test.com", |
|||
password: "test", |
|||
}, |
|||
{ |
|||
email: "loadtest3@test.com", |
|||
password: "test", |
|||
}, |
|||
{ |
|||
email: "loadtest4@test.com", |
|||
password: "test", |
|||
}, |
|||
{ |
|||
email: "loadtest5@test.com", |
|||
password: "test", |
|||
}, |
|||
{ |
|||
email: "loadtest6@test.com", |
|||
password: "test", |
|||
}, |
|||
{ |
|||
email: "loadtest7@test.com", |
|||
password: "test", |
|||
}, |
|||
] |
|||
|
|||
const REQUESTS = [ |
|||
{ |
|||
endpoint: `/api/global/self`, |
|||
method: "GET", |
|||
}, |
|||
] |
|||
|
|||
function timeout() { |
|||
return new Promise(resolve => { |
|||
setTimeout(() => { |
|||
resolve() |
|||
}, MAX_RUNTIME_SEC * 1000) |
|||
}) |
|||
} |
|||
|
|||
async function preTest() { |
|||
// check if the user exists or not
|
|||
const response = await fetch(`${HOST}/api/global/users`, { |
|||
method: "GET", |
|||
headers: { |
|||
"x-budibase-api-key": API_KEY, |
|||
}, |
|||
}) |
|||
if (response.status !== 200) { |
|||
throw new Error("Unable to retrieve users") |
|||
} |
|||
const users = await response.json() |
|||
for (let user of USERS) { |
|||
if (users.find(u => u.email === user.email)) { |
|||
continue |
|||
} |
|||
const response = await fetch(`${HOST}/api/global/users`, { |
|||
method: "POST", |
|||
headers: { |
|||
"x-budibase-api-key": API_KEY, |
|||
"Content-Type": "application/json", |
|||
}, |
|||
body: JSON.stringify({ |
|||
...user, |
|||
roles: {}, |
|||
status: "active", |
|||
}), |
|||
}) |
|||
if (response.status !== 200) { |
|||
throw new Error( |
|||
`Unable to create user ${user.email}, reason: ${await response.text()}` |
|||
) |
|||
} |
|||
} |
|||
} |
|||
|
|||
async function requests(user) { |
|||
let response = await fetch(`${HOST}/api/global/auth/${TENANT_ID}/login`, { |
|||
method: "POST", |
|||
body: JSON.stringify({ |
|||
username: user.email, |
|||
password: user.password, |
|||
}), |
|||
headers: { |
|||
"Content-Type": "application/json", |
|||
}, |
|||
}) |
|||
// unable to login
|
|||
if (response.status !== 200) { |
|||
STATS.error++ |
|||
return |
|||
} else { |
|||
STATS.success++ |
|||
} |
|||
const cookie = response.headers.get("set-cookie") |
|||
let promises = [] |
|||
for (let request of REQUESTS) { |
|||
const headers = { |
|||
cookie, |
|||
} |
|||
if (request.body) { |
|||
headers["Content-Type"] = "application/json" |
|||
} |
|||
promises.push( |
|||
fetch(`${HOST}${request.endpoint}`, { |
|||
method: request.method, |
|||
headers: { |
|||
cookie, |
|||
}, |
|||
}) |
|||
) |
|||
} |
|||
const responses = await Promise.all(promises) |
|||
for (let resp of responses) { |
|||
if (resp.status !== 200) { |
|||
console.error(await resp.text()) |
|||
STATS.error++ |
|||
} else { |
|||
STATS.success++ |
|||
} |
|||
} |
|||
} |
|||
|
|||
async function run() { |
|||
await preTest() |
|||
setInterval(async () => { |
|||
let promises = [] |
|||
for (let user of USERS) { |
|||
promises.push(requests(user)) |
|||
} |
|||
await Promise.all(promises) |
|||
console.log( |
|||
`Iteration ${STATS.iterations++} - errors: ${STATS.error}, success: ${ |
|||
STATS.success |
|||
}` |
|||
) |
|||
}, RATE_MS) |
|||
await timeout() |
|||
console.log( |
|||
`Max runtime of ${MAX_RUNTIME_SEC} seconds has been reached - stopping.` |
|||
) |
|||
process.exit(0) |
|||
} |
|||
|
|||
run().catch(err => { |
|||
console.error("Failed to run - ", err) |
|||
}) |
|||
Loading…
Reference in new issue