257 lines
8.7 KiB
TypeScript
257 lines
8.7 KiB
TypeScript
import * as assert from "assert";
|
|
|
|
import fs from "node:fs";
|
|
|
|
import * as userFunctions from "../helpers/functions.user.js";
|
|
import * as sqlFilterFunctions from "../helpers/functions.sqlFilters.js";
|
|
|
|
describe("functions.user", () => {
|
|
describe("unauthenticated, no user in session", () => {
|
|
const noUserRequest = {
|
|
session: {}
|
|
};
|
|
|
|
it("can not update", () => {
|
|
assert.strictEqual(userFunctions.userCanUpdate(noUserRequest), false);
|
|
});
|
|
|
|
it("is not admin", () => {
|
|
assert.strictEqual(userFunctions.userIsAdmin(noUserRequest), false);
|
|
});
|
|
});
|
|
|
|
describe("read only user, no update, no admin", () => {
|
|
const readOnlyRequest: userFunctions.UserRequest = {
|
|
session: {
|
|
user: {
|
|
userName: "*test",
|
|
userProperties: {
|
|
canUpdate: false,
|
|
isAdmin: false,
|
|
apiKey: ""
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
it("can not update", () => {
|
|
assert.strictEqual(userFunctions.userCanUpdate(readOnlyRequest), false);
|
|
});
|
|
|
|
it("is not admin", () => {
|
|
assert.strictEqual(userFunctions.userIsAdmin(readOnlyRequest), false);
|
|
});
|
|
});
|
|
|
|
describe("update only user, no admin", () => {
|
|
const updateOnlyRequest: userFunctions.UserRequest = {
|
|
session: {
|
|
user: {
|
|
userName: "*test",
|
|
userProperties: {
|
|
canUpdate: true,
|
|
isAdmin: false,
|
|
apiKey: ""
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
it("can update", () => {
|
|
assert.strictEqual(userFunctions.userCanUpdate(updateOnlyRequest), true);
|
|
});
|
|
|
|
it("is not admin", () => {
|
|
assert.strictEqual(userFunctions.userIsAdmin(updateOnlyRequest), false);
|
|
});
|
|
});
|
|
|
|
describe("admin only user, no update", () => {
|
|
const adminOnlyRequest: userFunctions.UserRequest = {
|
|
session: {
|
|
user: {
|
|
userName: "*test",
|
|
userProperties: {
|
|
canUpdate: false,
|
|
isAdmin: true,
|
|
apiKey: ""
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
it("can not update", () => {
|
|
assert.strictEqual(userFunctions.userCanUpdate(adminOnlyRequest), false);
|
|
});
|
|
|
|
it("is admin", () => {
|
|
assert.strictEqual(userFunctions.userIsAdmin(adminOnlyRequest), true);
|
|
});
|
|
});
|
|
|
|
describe("update admin user", () => {
|
|
const updateAdminRequest: userFunctions.UserRequest = {
|
|
session: {
|
|
user: {
|
|
userName: "*test",
|
|
userProperties: {
|
|
canUpdate: true,
|
|
isAdmin: true,
|
|
apiKey: ""
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
it("can update", () => {
|
|
assert.strictEqual(userFunctions.userCanUpdate(updateAdminRequest), true);
|
|
});
|
|
|
|
it("is admin", () => {
|
|
assert.strictEqual(userFunctions.userIsAdmin(updateAdminRequest), true);
|
|
});
|
|
});
|
|
|
|
describe("API key check", () => {
|
|
it("authenticates with a valid API key", async () => {
|
|
const apiKeysJSON: { [userName: string]: string } = JSON.parse(
|
|
fs.readFileSync("data/apiKeys.json", "utf8")
|
|
);
|
|
|
|
const apiKey = Object.values(apiKeysJSON)[0];
|
|
|
|
const apiRequest: userFunctions.APIRequest = {
|
|
params: {
|
|
apiKey
|
|
}
|
|
};
|
|
|
|
assert.strictEqual(await userFunctions.apiKeyIsValid(apiRequest), true);
|
|
});
|
|
|
|
it("fails to authenticate with an invalid API key", async () => {
|
|
const apiRequest: userFunctions.APIRequest = {
|
|
params: {
|
|
apiKey: "badKey"
|
|
}
|
|
};
|
|
|
|
assert.strictEqual(await userFunctions.apiKeyIsValid(apiRequest), false);
|
|
});
|
|
|
|
it("fails to authenticate with no API key", async () => {
|
|
const apiRequest: userFunctions.APIRequest = {
|
|
params: {}
|
|
};
|
|
|
|
assert.strictEqual(await userFunctions.apiKeyIsValid(apiRequest), false);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("functions.sqlFilters", () => {
|
|
describe("LotName filter", () => {
|
|
it("returns startsWith filter", () => {
|
|
const filter = sqlFilterFunctions.getLotNameWhereClause(
|
|
"TEST1 TEST2",
|
|
"startsWith",
|
|
"l"
|
|
);
|
|
|
|
assert.strictEqual(filter.sqlWhereClause, " and l.lotName like ? || '%'");
|
|
assert.strictEqual(filter.sqlParameters.length, 1);
|
|
assert.ok(filter.sqlParameters.includes("TEST1 TEST2"));
|
|
});
|
|
|
|
it("returns endsWith filter", () => {
|
|
const filter = sqlFilterFunctions.getLotNameWhereClause("TEST1 TEST2", "endsWith", "l");
|
|
|
|
assert.strictEqual(filter.sqlWhereClause, " and l.lotName like '%' || ?");
|
|
assert.strictEqual(filter.sqlParameters.length, 1);
|
|
assert.strictEqual(filter.sqlParameters[0], "TEST1 TEST2");
|
|
});
|
|
|
|
it("returns contains filter", () => {
|
|
const filter = sqlFilterFunctions.getLotNameWhereClause("TEST1 TEST2", "", "l");
|
|
assert.strictEqual(
|
|
filter.sqlWhereClause,
|
|
" and instr(lower(l.lotName), ?) and instr(lower(l.lotName), ?)"
|
|
);
|
|
|
|
assert.ok(filter.sqlParameters.includes("test1"));
|
|
assert.ok(filter.sqlParameters.includes("test2"));
|
|
});
|
|
|
|
it("handles empty filter", () => {
|
|
const filter = sqlFilterFunctions.getLotNameWhereClause("", "");
|
|
|
|
assert.strictEqual(filter.sqlWhereClause, "");
|
|
assert.strictEqual(filter.sqlParameters.length, 0);
|
|
});
|
|
|
|
it("handles undefined filter", () => {
|
|
const filter = sqlFilterFunctions.getLotNameWhereClause(undefined, undefined, "l");
|
|
|
|
assert.strictEqual(filter.sqlWhereClause, "");
|
|
assert.strictEqual(filter.sqlParameters.length, 0);
|
|
});
|
|
});
|
|
|
|
describe("OccupancyTime filter", () => {
|
|
it("creates three different filters", () => {
|
|
const currentFilter = sqlFilterFunctions.getOccupancyTimeWhereClause("current");
|
|
assert.notStrictEqual(currentFilter.sqlWhereClause, "");
|
|
|
|
const pastFilter = sqlFilterFunctions.getOccupancyTimeWhereClause("past");
|
|
assert.notStrictEqual(pastFilter.sqlWhereClause, "");
|
|
|
|
const futureFilter = sqlFilterFunctions.getOccupancyTimeWhereClause("future");
|
|
assert.notStrictEqual(futureFilter, "");
|
|
|
|
assert.notStrictEqual(currentFilter.sqlWhereClause, pastFilter.sqlWhereClause);
|
|
assert.notStrictEqual(currentFilter.sqlWhereClause, futureFilter.sqlWhereClause);
|
|
assert.notStrictEqual(pastFilter.sqlWhereClause, futureFilter.sqlWhereClause);
|
|
});
|
|
|
|
it("handles empty filter", () => {
|
|
const filter = sqlFilterFunctions.getOccupancyTimeWhereClause("");
|
|
assert.strictEqual(filter.sqlWhereClause, "");
|
|
assert.strictEqual(filter.sqlParameters.length, 0);
|
|
});
|
|
|
|
it("handles undefined filter", () => {
|
|
const filter = sqlFilterFunctions.getOccupancyTimeWhereClause(undefined, "o");
|
|
assert.strictEqual(filter.sqlWhereClause, "");
|
|
assert.strictEqual(filter.sqlParameters.length, 0);
|
|
});
|
|
});
|
|
|
|
describe("OccupantName filter", () => {
|
|
it("returns filter", () => {
|
|
const filter = sqlFilterFunctions.getOccupantNameWhereClause("TEST1 TEST2", "o");
|
|
|
|
assert.strictEqual(
|
|
filter.sqlWhereClause,
|
|
" and instr(lower(o.occupantName), ?) and instr(lower(o.occupantName), ?)"
|
|
);
|
|
|
|
assert.ok(filter.sqlParameters.includes("test1"));
|
|
assert.ok(filter.sqlParameters.includes("test2"));
|
|
});
|
|
|
|
it("handles empty filter", () => {
|
|
const filter = sqlFilterFunctions.getOccupantNameWhereClause("");
|
|
|
|
assert.strictEqual(filter.sqlWhereClause, "");
|
|
assert.strictEqual(filter.sqlParameters.length, 0);
|
|
});
|
|
|
|
it("handles undefined filter", () => {
|
|
const filter = sqlFilterFunctions.getOccupantNameWhereClause(undefined, "o");
|
|
|
|
assert.strictEqual(filter.sqlWhereClause, "");
|
|
assert.strictEqual(filter.sqlParameters.length, 0);
|
|
});
|
|
});
|
|
});
|