From e5864af2be40850a7882b5e72a530bdc8e9df249 Mon Sep 17 00:00:00 2001 From: andresaclan Date: Mon, 28 Jul 2025 15:18:27 -0700 Subject: [PATCH 1/4] implement fuzzy search --- api/main_endpoints/models/User.js | 5 + api/main_endpoints/routes/ShortcutSearch.js | 48 ++-- api/package-lock.json | 257 +++++++------------- api/package.json | 1 + package-lock.json | 148 ++++++----- package.json | 5 +- test/api/ShortcutSearch.js | 21 +- 7 files changed, 202 insertions(+), 283 deletions(-) diff --git a/api/main_endpoints/models/User.js b/api/main_endpoints/models/User.js index 35a3450be..ded903703 100644 --- a/api/main_endpoints/models/User.js +++ b/api/main_endpoints/models/User.js @@ -1,4 +1,5 @@ const mongoose = require('mongoose'); +const mongooseFuzzySearching = require('mongoose-fuzzy-searching'); const Schema = mongoose.Schema; const bcrypt = require('bcryptjs'); const membershipState = require('../../util/constants').MEMBERSHIP_STATE; @@ -78,6 +79,10 @@ const UserSchema = new Schema( { collection: 'User' } ); +UserSchema.plugin(mongooseFuzzySearching, { + fields: ['firstName', 'lastName', 'email'], +}); + UserSchema.pre('save', function(next) { const member = this; let emailRegExp = new RegExp(['^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0', diff --git a/api/main_endpoints/routes/ShortcutSearch.js b/api/main_endpoints/routes/ShortcutSearch.js index 7853ea0ee..bf76ae071 100644 --- a/api/main_endpoints/routes/ShortcutSearch.js +++ b/api/main_endpoints/routes/ShortcutSearch.js @@ -19,7 +19,7 @@ const logger = require('../../util/logger'); router.post('/', async function(req, res) { if (!checkIfTokenSent(req)) { return res.sendStatus(FORBIDDEN); - } else if (!checkIfTokenValid(req, membershipState.OFFICER)) { + } else if (!checkIfTokenValid(req)) { return res.sendStatus(UNAUTHORIZED); } @@ -27,26 +27,6 @@ router.post('/', async function(req, res) { return res.status(OK).send({ items: [] }); } - const query = req.body.query.replace(/[*\s]/g, ''); - - // Create a fuzzy regex pattern to match characters in order, e.g., "pone" -> /p.*o.*n.*e/i - const fuzzyPattern = query.split('').join('.*'); - const pattern = new RegExp(fuzzyPattern, 'i'); - - const maybeOr = { - $or: [ - { - $expr: { - $regexMatch: { - input: { $concat: ['$firstName', '$lastName'] }, - regex: pattern, - } - } - }, - { email: { $regex: new RegExp(query, 'i')} } - ] - }; - /** * Function to calculate scores based on token matches for sorting * @param {string} str - The string to score against @@ -94,17 +74,21 @@ router.post('/', async function(req, res) { }; }; - // Find user and sort results based on best match of full name or email - User.find(maybeOr, { password: 0 }) - .limit(5) - .then(items => { - items.sort(sortByMatch(req.body.query)); - res.status(OK).send({ items }); - }) - .catch((error) => { - logger.error('/shortcutsearchusers encountered an error:', error); - res.sendStatus(BAD_REQUEST); - }); + try { + const users = await User.find({}); + for (const user of users) { + await user.save(); + } + const topUsers = await User.fuzzySearch(req.body.query) + .limit(5) + .select('-password, -apiKey'); + + const sortUsers = topUsers.sort(sortByMatch(req.body.query)); + + return res.status(OK).send({ items: sortUsers }); + } catch (e) { + return res.sendStatus(SERVER_ERROR); + } }); module.exports = router; diff --git a/api/package-lock.json b/api/package-lock.json index 048d7d385..444334bf3 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -17,6 +17,7 @@ "form-data": "^4.0.0", "googleapis": "^52.1.0", "mongoose": "^5.10.0", + "mongoose-fuzzy-searching": "^2.0.2", "multer": "^1.4.5-lts.1", "nodemailer": "^6.4.11", "nodemon": "^2.0.4", @@ -631,34 +632,6 @@ "node": ">=8.0.0" } }, - "node_modules/@types/bson": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", - "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "license": "MIT", - "dependencies": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2684,9 +2657,9 @@ } }, "node_modules/kareem": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", - "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", + "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==", "license": "Apache-2.0" }, "node_modules/keyv": { @@ -2883,15 +2856,15 @@ } }, "node_modules/mongodb": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", - "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", + "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", "license": "Apache-2.0", "dependencies": { "bl": "^2.2.1", "bson": "^1.1.4", "denque": "^1.4.1", - "optional-require": "^1.1.8", + "require_optional": "^1.0.1", "safe-buffer": "^5.1.2" }, "engines": { @@ -2921,37 +2894,22 @@ } } }, - "node_modules/mongodb/node_modules/optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "license": "Apache-2.0", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mongoose": { - "version": "5.13.23", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.23.tgz", - "integrity": "sha512-Q5bo1yYOcH2wbBPP4tGmcY5VKsFkQcjUDh66YjrbneAFB3vNKQwLvteRFLuLiU17rA5SDl3UMcMJLD9VS8ng2Q==", + "version": "5.10.19", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.19.tgz", + "integrity": "sha512-SuJwbhQpfZ6WZFM6H2v0Hv1wQNLDeBDLZwOHR3UnR6IlPLKjuLyEx4OLI0vFQihv+JWJKWqJt+LcRRbRyL9PCg==", "license": "MIT", "dependencies": { - "@types/bson": "1.x || 4.0.x", - "@types/mongodb": "^3.5.27", "bson": "^1.1.4", - "kareem": "2.3.2", - "mongodb": "3.7.4", + "kareem": "2.3.1", + "mongodb": "3.6.3", "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.4", - "mquery": "3.2.5", + "mpath": "0.7.0", + "mquery": "3.2.2", "ms": "2.1.2", - "optional-require": "1.0.x", "regexp-clone": "1.0.0", "safe-buffer": "5.2.1", - "sift": "13.5.2", + "sift": "7.0.1", "sliced": "1.0.1" }, "engines": { @@ -2962,6 +2920,15 @@ "url": "https://opencollective.com/mongoose" } }, + "node_modules/mongoose-fuzzy-searching": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mongoose-fuzzy-searching/-/mongoose-fuzzy-searching-2.0.2.tgz", + "integrity": "sha512-Hbmx59VWJjQJDNdoyQ8bdECaqpis0pKoliWzf5eILzFs2KO7laUJpaQWJySN9OvdQS/gM9fURMSzQVQoLeZ3DA==", + "license": "MIT", + "peerDependencies": { + "mongoose": "5.10.x" + } + }, "node_modules/mongoose-legacy-pluralize": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", @@ -2995,18 +2962,18 @@ ] }, "node_modules/mpath": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", - "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", + "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==", "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/mquery": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", - "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", "license": "MIT", "dependencies": { "bluebird": "3.5.1", @@ -3226,15 +3193,6 @@ "wrappy": "1" } }, - "node_modules/optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3504,13 +3462,23 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "node_modules/require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", "license": "Apache-2.0", + "dependencies": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "node_modules/require_optional/node_modules/resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, "node_modules/require-from-string": { @@ -3739,9 +3707,9 @@ } }, "node_modules/sift": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", - "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==", "license": "MIT" }, "node_modules/simple-update-notifier": { @@ -4026,12 +3994,6 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "license": "MIT" }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "license": "MIT" - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -4626,31 +4588,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, - "@types/bson": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", - "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", - "requires": { - "@types/node": "*" - } - }, - "@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "requires": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", - "requires": { - "undici-types": "~6.20.0" - } - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -6037,9 +5974,9 @@ } }, "kareem": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", - "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", + "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" }, "keyv": { "version": "4.5.4", @@ -6181,46 +6118,33 @@ } }, "mongodb": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", - "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", + "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", "requires": { "bl": "^2.2.1", "bson": "^1.1.4", "denque": "^1.4.1", - "optional-require": "^1.1.8", + "require_optional": "^1.0.1", "safe-buffer": "^5.1.2", "saslprep": "^1.0.0" - }, - "dependencies": { - "optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "requires": { - "require-at": "^1.0.6" - } - } } }, "mongoose": { - "version": "5.13.23", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.23.tgz", - "integrity": "sha512-Q5bo1yYOcH2wbBPP4tGmcY5VKsFkQcjUDh66YjrbneAFB3vNKQwLvteRFLuLiU17rA5SDl3UMcMJLD9VS8ng2Q==", + "version": "5.10.19", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.19.tgz", + "integrity": "sha512-SuJwbhQpfZ6WZFM6H2v0Hv1wQNLDeBDLZwOHR3UnR6IlPLKjuLyEx4OLI0vFQihv+JWJKWqJt+LcRRbRyL9PCg==", "requires": { - "@types/bson": "1.x || 4.0.x", - "@types/mongodb": "^3.5.27", "bson": "^1.1.4", - "kareem": "2.3.2", - "mongodb": "3.7.4", + "kareem": "2.3.1", + "mongodb": "3.6.3", "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.4", - "mquery": "3.2.5", + "mpath": "0.7.0", + "mquery": "3.2.2", "ms": "2.1.2", - "optional-require": "1.0.x", "regexp-clone": "1.0.0", "safe-buffer": "5.2.1", - "sift": "13.5.2", + "sift": "7.0.1", "sliced": "1.0.1" }, "dependencies": { @@ -6236,6 +6160,12 @@ } } }, + "mongoose-fuzzy-searching": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mongoose-fuzzy-searching/-/mongoose-fuzzy-searching-2.0.2.tgz", + "integrity": "sha512-Hbmx59VWJjQJDNdoyQ8bdECaqpis0pKoliWzf5eILzFs2KO7laUJpaQWJySN9OvdQS/gM9fURMSzQVQoLeZ3DA==", + "requires": {} + }, "mongoose-legacy-pluralize": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", @@ -6243,14 +6173,14 @@ "requires": {} }, "mpath": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", - "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", + "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==" }, "mquery": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", - "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", "requires": { "bluebird": "3.5.1", "debug": "3.1.0", @@ -6401,11 +6331,6 @@ "wrappy": "1" } }, - "optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" - }, "optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6593,10 +6518,21 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==" + } + } }, "require-from-string": { "version": "2.0.2", @@ -6751,9 +6687,9 @@ } }, "sift": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", - "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" }, "simple-update-notifier": { "version": "1.1.0", @@ -6960,11 +6896,6 @@ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, - "undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/api/package.json b/api/package.json index f680fd1ad..ea8dacef6 100644 --- a/api/package.json +++ b/api/package.json @@ -36,6 +36,7 @@ "form-data": "^4.0.0", "googleapis": "^52.1.0", "mongoose": "^5.10.0", + "mongoose-fuzzy-searching": "^2.0.2", "multer": "^1.4.5-lts.1", "nodemailer": "^6.4.11", "nodemon": "^2.0.4", diff --git a/package-lock.json b/package-lock.json index 243134f32..c196868a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,8 @@ "enzyme": "^3.11.0", "googleapis": "^126.0.1", "jsonwebtoken": "^9.0.2", - "mongoose": "^5.11.18", + "mongoose": "^5.10.0", + "mongoose-fuzzy-searching": "^2.0.2", "multer": "^1.4.5-lts.1", "nodemailer": "^6.9.5", "passport": "^0.6.0", @@ -49,7 +50,7 @@ "inquirer": "^8.2.4", "jsdom": "^19.0.0", "jsdom-global": "^3.0.2", - "mocha": "^8.1.1", + "mocha": "^8.4.0", "proxyquire": "^2.1.3", "sinon": "^13.0.1", "tailwindcss": "^3.4.0" @@ -3598,14 +3599,6 @@ "@types/node": "*" } }, - "node_modules/@types/bson": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", - "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/chai": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.1.tgz", @@ -3748,15 +3741,6 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, - "node_modules/@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "dependencies": { - "@types/bson": "*", - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "18.0.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", @@ -13219,9 +13203,10 @@ } }, "node_modules/kareem": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", - "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", + "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==", + "license": "Apache-2.0" }, "node_modules/kind-of": { "version": "6.0.3", @@ -13966,15 +13951,15 @@ "dev": true }, "node_modules/mongodb": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", - "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", + "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", "license": "Apache-2.0", "dependencies": { "bl": "^2.2.1", "bson": "^1.1.4", "denque": "^1.4.1", - "optional-require": "^1.1.8", + "require_optional": "^1.0.1", "safe-buffer": "^5.1.2" }, "engines": { @@ -14004,37 +13989,22 @@ } } }, - "node_modules/mongodb/node_modules/optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "license": "Apache-2.0", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mongoose": { - "version": "5.13.23", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.23.tgz", - "integrity": "sha512-Q5bo1yYOcH2wbBPP4tGmcY5VKsFkQcjUDh66YjrbneAFB3vNKQwLvteRFLuLiU17rA5SDl3UMcMJLD9VS8ng2Q==", + "version": "5.10.19", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.19.tgz", + "integrity": "sha512-SuJwbhQpfZ6WZFM6H2v0Hv1wQNLDeBDLZwOHR3UnR6IlPLKjuLyEx4OLI0vFQihv+JWJKWqJt+LcRRbRyL9PCg==", "license": "MIT", "dependencies": { - "@types/bson": "1.x || 4.0.x", - "@types/mongodb": "^3.5.27", "bson": "^1.1.4", - "kareem": "2.3.2", - "mongodb": "3.7.4", + "kareem": "2.3.1", + "mongodb": "3.6.3", "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.4", - "mquery": "3.2.5", + "mpath": "0.7.0", + "mquery": "3.2.2", "ms": "2.1.2", - "optional-require": "1.0.x", "regexp-clone": "1.0.0", "safe-buffer": "5.2.1", - "sift": "13.5.2", + "sift": "7.0.1", "sliced": "1.0.1" }, "engines": { @@ -14045,6 +14015,15 @@ "url": "https://opencollective.com/mongoose" } }, + "node_modules/mongoose-fuzzy-searching": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mongoose-fuzzy-searching/-/mongoose-fuzzy-searching-2.0.2.tgz", + "integrity": "sha512-Hbmx59VWJjQJDNdoyQ8bdECaqpis0pKoliWzf5eILzFs2KO7laUJpaQWJySN9OvdQS/gM9fURMSzQVQoLeZ3DA==", + "license": "MIT", + "peerDependencies": { + "mongoose": "5.10.x" + } + }, "node_modules/mongoose-legacy-pluralize": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", @@ -14078,17 +14057,19 @@ "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" }, "node_modules/mpath": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", - "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", + "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==", + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/mquery": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", - "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", + "license": "MIT", "dependencies": { "bluebird": "3.5.1", "debug": "3.1.0", @@ -14103,12 +14084,14 @@ "node_modules/mquery/node_modules/bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "license": "MIT" }, "node_modules/mquery/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -14116,7 +14099,8 @@ "node_modules/mquery/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/ms": { "version": "2.1.2", @@ -14592,14 +14576,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -17466,7 +17442,8 @@ "node_modules/regexp-clone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==", + "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", @@ -17556,13 +17533,32 @@ "strip-ansi": "^6.0.1" } }, - "node_modules/require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "node_modules/require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", "license": "Apache-2.0", + "dependencies": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "node_modules/require_optional/node_modules/resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" + } + }, + "node_modules/require_optional/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, "node_modules/require-directory": { @@ -18323,9 +18319,10 @@ } }, "node_modules/sift": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", - "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==", + "license": "MIT" }, "node_modules/signal-exit": { "version": "3.0.7", @@ -18437,7 +18434,8 @@ "node_modules/sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", + "license": "MIT" }, "node_modules/sockjs": { "version": "0.3.24", diff --git a/package.json b/package.json index 69b806a0b..4797142bd 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "enzyme": "^3.11.0", "googleapis": "^126.0.1", "jsonwebtoken": "^9.0.2", - "mongoose": "^5.11.18", + "mongoose": "^5.10.0", + "mongoose-fuzzy-searching": "^2.0.2", "multer": "^1.4.5-lts.1", "nodemailer": "^6.9.5", "passport": "^0.6.0", @@ -67,7 +68,7 @@ "inquirer": "^8.2.4", "jsdom": "^19.0.0", "jsdom-global": "^3.0.2", - "mocha": "^8.1.1", + "mocha": "^8.4.0", "proxyquire": "^2.1.3", "sinon": "^13.0.1", "tailwindcss": "^3.4.0" diff --git a/test/api/ShortcutSearch.js b/test/api/ShortcutSearch.js index 2f1056a61..71b15bd20 100644 --- a/test/api/ShortcutSearch.js +++ b/test/api/ShortcutSearch.js @@ -78,7 +78,7 @@ describe('ShortcutSearch', () => { describe('POST /', () => { const queryUser = { query: 'coOl' }; - const fiveMatchUsers = { query: 'Lot' }; + const fourMatchUsers = { query: 'Lot' }; const url = '/api/ShortcutSearch/'; it('Should return status code 403 if no token is passed through', async () => { @@ -199,10 +199,10 @@ describe('ShortcutSearch', () => { expect(result.body.items).that.is.an('array').that.is.empty; }); - it('Should return FIVE records when query = \'Lot\'', async () => { - const result = await test.sendPostRequestWithToken(token, url, fiveMatchUsers); + it('Should return FOUR records when query = \'Lot\'', async () => { + const result = await test.sendPostRequestWithToken(token, url, fourMatchUsers); expect(result).to.have.status(OK); - expect(result.body.items).that.is.an('array').to.have.lengthOf(5); + expect(result.body.items).that.is.an('array').to.have.lengthOf(4); }); it('Should return no records when query = \'Pika\'', async () => { @@ -215,21 +215,20 @@ describe('ShortcutSearch', () => { setTokenStatus(true, { accessLevel: MEMBERSHIP_STATE.ADMIN }); }); - it('Should return THREE records when query = \'coOl\'', async () => { + it('Should return FIVE records when query = \'coOl\'', async () => { const result = await test.sendPostRequestWithToken(token, url, queryUser); expect(result).to.have.status(OK); - expect(result.body.items).that.is.an('array').to.have.lengthOf(3); + expect(result.body.items).that.is.an('array').to.have.lengthOf(5); }); it('Should show results sorted by best match of name and email', async () => { - const result = await test.sendPostRequestWithToken(token, url, fiveMatchUsers); + const result = await test.sendPostRequestWithToken(token, url, fourMatchUsers); expect(result).to.have.status(OK); expect(result.body.items.map(u => u.email)).to.eql([ 'test1@test.com', - 'test0@test.com', - 'test00@test.com', - 'test2@test.com', - 'test3@test.com' + 'test3@test.com', + 'test5@test.com', + 'test6@test.com', ]); }); }); From 549d5a51e33caa70491aa3979756c82642805d6f Mon Sep 17 00:00:00 2001 From: andresaclan Date: Mon, 28 Jul 2025 15:22:24 -0700 Subject: [PATCH 2/4] async User api test --- test/api/User.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/api/User.js b/test/api/User.js index 25c0a8f8a..579a3e5ed 100644 --- a/test/api/User.js +++ b/test/api/User.js @@ -52,7 +52,7 @@ chai.use(chaiHttp); // Our parent block describe('User', () => { - before(done => { + before(async () => { initializeTokenMock(); initializeDiscordAPIMock(); app = tools.initializeServer([ @@ -61,7 +61,7 @@ describe('User', () => { ]); test = new SceApiTester(app); // Before each test we empty the database - tools.emptySchema(User); + await tools.emptySchema(User); const testUser = new User({ email: 'a@b.c', password: 'Passw0rd', @@ -69,8 +69,7 @@ describe('User', () => { lastName: 'last-name', major: 'Computer Science', }); - testUser.save(); - done(); + await testUser.save(); }); after(done => { From de819d69a03f5dcf4650688674f66185b94386e3 Mon Sep 17 00:00:00 2001 From: andresaclan Date: Mon, 28 Jul 2025 15:37:41 -0700 Subject: [PATCH 3/4] fix tests --- test/api/ShortcutSearch.js | 5 +++-- test/api/User.js | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/test/api/ShortcutSearch.js b/test/api/ShortcutSearch.js index 71b15bd20..51a033b2e 100644 --- a/test/api/ShortcutSearch.js +++ b/test/api/ShortcutSearch.js @@ -39,7 +39,7 @@ chai.use(chaiHttp); // Our parent block describe('ShortcutSearch', () => { - before(async () => { + before(done => { initializeTokenMock(); initializeDiscordAPIMock(); app = tools.initializeServer([ @@ -47,7 +47,7 @@ describe('ShortcutSearch', () => { ]); test = new SceApiTester(app); // Before each test we empty the database - await tools.emptySchema(User); + tools.emptySchema(User); const testUser = new User({ email: 'a@b.c', password: 'Passw0rd', @@ -56,6 +56,7 @@ describe('ShortcutSearch', () => { major: 'Software Engineering', }); testUser.save(); + done(); }); after(done => { diff --git a/test/api/User.js b/test/api/User.js index 579a3e5ed..25c0a8f8a 100644 --- a/test/api/User.js +++ b/test/api/User.js @@ -52,7 +52,7 @@ chai.use(chaiHttp); // Our parent block describe('User', () => { - before(async () => { + before(done => { initializeTokenMock(); initializeDiscordAPIMock(); app = tools.initializeServer([ @@ -61,7 +61,7 @@ describe('User', () => { ]); test = new SceApiTester(app); // Before each test we empty the database - await tools.emptySchema(User); + tools.emptySchema(User); const testUser = new User({ email: 'a@b.c', password: 'Passw0rd', @@ -69,7 +69,8 @@ describe('User', () => { lastName: 'last-name', major: 'Computer Science', }); - await testUser.save(); + testUser.save(); + done(); }); after(done => { From 9c9e9b98147a5b242ec50585f748970e69c471ea Mon Sep 17 00:00:00 2001 From: andresaclan Date: Mon, 28 Jul 2025 15:48:24 -0700 Subject: [PATCH 4/4] properly empty database before test --- test/api/User.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/api/User.js b/test/api/User.js index 25c0a8f8a..8ba7c0c51 100644 --- a/test/api/User.js +++ b/test/api/User.js @@ -52,7 +52,7 @@ chai.use(chaiHttp); // Our parent block describe('User', () => { - before(done => { + before(async () => { initializeTokenMock(); initializeDiscordAPIMock(); app = tools.initializeServer([ @@ -61,7 +61,8 @@ describe('User', () => { ]); test = new SceApiTester(app); // Before each test we empty the database - tools.emptySchema(User); + await tools.emptySchema(User); + await User.deleteMany({}); const testUser = new User({ email: 'a@b.c', password: 'Passw0rd', @@ -69,8 +70,7 @@ describe('User', () => { lastName: 'last-name', major: 'Computer Science', }); - testUser.save(); - done(); + await testUser.save(); }); after(done => {