Skip to content

Commit

Permalink
test: rewrite model/userData tests to use sqlite
Browse files Browse the repository at this point in the history
  • Loading branch information
a-lubert authored and xgaia committed Mar 5, 2025
1 parent 25fe128 commit c15a4b4
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 55 deletions.
38 changes: 26 additions & 12 deletions model/userData.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,19 +44,35 @@ class UserDataModel {
}
};

/**
* Convert the attributes with wrong type for testing purpose
*
* @param {UserData} data - the user data to convert
* @returns {UserData} - the converted object with the correct types
*/
_convertToJSON = (data) => ({
...data,
data_content: (typeof data.data_content === "string" ? JSON.parse(data.data_content) : data.data_content) || {},
is_shared: (typeof data.is_shared === "number" ? data.is_shared === 1 : data.is_shared) || false,
shared_profiles: (typeof data.shared_profiles === "string" ? JSON.parse(data.shared_profiles) : data.shared_profiles) || [],
shared_users: (typeof data.shared_users === "string" ? JSON.parse(data.shared_users) : data.shared_users) || [],
});

all = async (currentUser) => {
const connection = getKnexConnection(this._mainConfig.database);
if ((currentUser === undefined) & (this._mainConfig.auth === "disabled")) {
currentUser = { login: "admin", groups: ["admin"] };
}
let currentUserData = await connection.select("*").from("user_data_list").where("owned_by", currentUser.login).orWhere("is_shared", true);

currentUserData = currentUserData.filter((data) => {
const isOwner = data.owned_by === currentUser.login;
const isSharedWithUser = data.is_shared && data.shared_users.includes(currentUser.login);
const isSharedWithGroup = data.is_shared && new Set(currentUser.groups.filter((grp) => new Set(data.shared_profiles).has(grp))).size;
return isOwner || isSharedWithUser || isSharedWithGroup;
});
currentUserData = currentUserData
.map((data) => this._convertToJSON(data))
.filter((data) => {
const isOwner = data.owned_by === currentUser.login;
const isSharedWithUser = data.is_shared && data.shared_users.includes(currentUser.login);
const isSharedWithGroup = data.is_shared && new Set(currentUser.groups.filter((grp) => new Set(data.shared_profiles).has(grp))).size;
return isOwner || isSharedWithUser || isSharedWithGroup;
});

cleanupConnection(connection);
return currentUserData;
Expand All @@ -80,14 +96,15 @@ class UserDataModel {
const data = this._check(userData);

const connection = getKnexConnection(this._mainConfig.database);
const results = await connection.select("id").from("users").where("login", data.owned_by).first();
let results = await connection.select("id").from("users").where("login", data.owned_by).first();
if (results === undefined) {
cleanupConnection(connection);
throw Error("The specified owned_by username do not exists", { cause: 404 });
}
data.owned_by = results.id;
await connection.insert(data).into("user_data");
results = await connection.insert(data).into("user_data");
cleanupConnection(connection);
return results[0];
};

remove = async (identifier) => {
Expand All @@ -112,16 +129,13 @@ class UserDataModel {
}
const data = this._check(userData);

let connection = getKnexConnection(this._mainConfig.database);
const connection = getKnexConnection(this._mainConfig.database);
let results = await connection.select("id").from("user_data").where("id", data.id).first();
if (results === undefined) {
cleanupConnection(connection);
throw Error("The specified identifier do not exists", { cause: 404 });
}

// We need to reinitialize connection for tests
connection = getKnexConnection(this._mainConfig.database);

results = await connection.select("*").from("users").where("login", data.owned_by).first();
if (results === undefined) {
cleanupConnection(connection);
Expand Down
68 changes: 25 additions & 43 deletions tests/model.userData.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,17 @@ const fs = require("fs");
const path = require("path");
const tmp = require("tmp");

const { createTracker, MockClient } = require("knex-mock-client");

const { cleanupConnection, getKnexConnection } = require("../model/utils");
const { userDataModel } = require("../model/userData");


jest.mock("../model/utils", () => {
const knex = require("knex");
return {
cleanupConnection: jest.fn().mockReturnThis(),
getKnexConnection: knex({ client: MockClient, dialect: "pg" }),
};
});
jest.mock("../model/utils");


describe("UserDataModel", () => {
let tracker;
let dbUsers;
let dbUserDataList;

beforeAll(() => {
tracker = createTracker(getKnexConnection);
dbUserDataList = JSON.parse(fs.readFileSync(
path.join(__dirname, "data", "config", "users", "userData.list.json")
));
Expand All @@ -36,12 +25,7 @@ describe("UserDataModel", () => {
));
});

afterEach(() => {
tracker.reset();
});

test("get unshared userData", async () => {
tracker.on.select("user_data_list").response(dbUserDataList);
const adminUser = {login: "admin", groups: []};
const userData = await userDataModel.all(adminUser);
expect(Array.from(userData).length).toBe(2);
Expand Down Expand Up @@ -95,7 +79,6 @@ describe("UserDataModel", () => {
});

test("get userData with shared user", async () => {
tracker.on.select("user_data_list").response(dbUserDataList);
const user = {login: "owl_user", groups: []};
const userData = await userDataModel.all(user);
for (const ud of userData) {
Expand All @@ -106,7 +89,6 @@ describe("UserDataModel", () => {
});

test("get userData with shared user and shared profile", async () => {
tracker.on.select("user_data_list").response(dbUserDataList);
const user = {login: "skos_user", groups: ["skos_only"]};
const userData = await userDataModel.all(user);
for (const ud of userData) {
Expand All @@ -119,7 +101,6 @@ describe("UserDataModel", () => {
});

test("get userData with shared user and shared profiles", async () => {
tracker.on.select("user_data_list").response(dbUserDataList);
const user = {login: "skos_user", groups: ["skos_only", "owl_only"]};
const userData = await userDataModel.all(user);
for (const ud of userData) {
Expand All @@ -138,46 +119,26 @@ describe("UserDataModel", () => {
});

test("find userData", async () => {
tracker.on.select("user_data_list").response(dbUserDataList);
const userData = await userDataModel.find(1);
expect(userData).toBeTruthy();
});

test("insert userData", async () => {
tracker.on.select("user_data_list").response(dbUserDataList);
tracker.on.select("users").response(dbUsers);
tracker.on.select("profiles").response(dbProfiles);
tracker.on.insert("user_data").response([]);

const addUserData = {
data_path: "data_path",
data_type: "data_type",
owned_by: "test",
owned_by: "skos_user",
}
await userDataModel.insert(addUserData);

const updatedUserData = Array.from(dbUserDataList);
updatedUserData.push(addUserData);

tracker.reset();
tracker.on.select("user_data").response(updatedUserData);
const userDatas = await userDataModel.all({login: "test", groups: []});
expect(userDatas[0].owned_by).toStrictEqual("test");
const results = await userDataModel.insert(addUserData);
expect(results).toStrictEqual(6);
});

test("remove userData", async () => {
tracker.on.select("user_data").response(dbUserDataList);
tracker.on.delete("user_data").response();
const result = await userDataModel.remove(1);
expect(result).toBeTruthy();
});

test("update userData", async () => {
tracker.on.select("user_data").response(dbUserDataList);
tracker.on.select("users").response(dbUsers);
tracker.on.select("profiles").response(dbProfiles);
tracker.on.update("user_data").response([]);

const updateUserData = {
id: 3,
data_path: "update",
Expand All @@ -188,4 +149,25 @@ describe("UserDataModel", () => {
const result = await userDataModel.update(updateUserData);
expect(result).toBeTruthy();
});

test("test _convertToJSON", async () => {
const data = {
data_content: '{"sparqlServerUrl": "string", "databaseSources": {}}',
is_shared: 1,
shared_profiles: '[]',
shared_users: '["owl_user", "skos_user"]',
};
expect(userDataModel._convertToJSON(data)).toStrictEqual({
data_content: {
sparqlServerUrl: "string",
databaseSources: {},
},
is_shared: true,
shared_profiles: [],
shared_users: [
"owl_user",
"skos_user"
],
});
});
});

1 comment on commit c15a4b4

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jest Coverage Comment

Summary

Lines Statements Branches Functions
Coverage: 76%
76.55% (480/627) 73.66% (207/281) 82.11% (101/123)
Coverage Report (76%)
File% Stmts% Branch% Funcs% LinesUncovered Line #s
All files76.5573.6682.1176.4 
   config.js10096.551001004
   profiles.js94.6295.2394.7395.29136, 164–166
   sources.js62.9954.767562.6936, 64, 93, 143, 147, 150, 173, 219–229, 238–252, 260–270, 279–293
   tools.js41.0821.9555.5541.2685–86, 123–130, 142–174, 187–206, 231–238, 255, 265–269, 285, 297–352
   userData.js82.2760.9710081.8135, 43, 64, 87–88, 101–102, 116–117, 128, 135–136, 141–142
   users.js95.997.059596.61244–245, 264–265
   utils.js10088.8810010016, 42

Please sign in to comment.