Skip to content

Commit 80f5784

Browse files
Fix api failure when a single user discord details were not present (#1755)
* fix: handles failure due to missing discordId * fix : failing test due roles undefined * chore: remove roles import * fix: failing test due to users archived * fix: increase timeout to test * fix: failing test * chore: uncomment a test case line --------- Co-authored-by: Shubham Sharma <[email protected]>
1 parent e44354d commit 80f5784

File tree

4 files changed

+42
-19
lines changed

4 files changed

+42
-19
lines changed

models/discordactions.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ const updateUsersNicknameStatus = async (lastNicknameUpdate) => {
470470

471471
const today = new Date().getTime();
472472

473-
const nicknameUpdatePromises = [];
473+
let successfulUpdates = 0;
474474
const nicknameUpdateBatches = [];
475475
const totalUsersStatus = usersStatusDocs.length;
476476

@@ -505,14 +505,19 @@ const updateUsersNicknameStatus = async (lastNicknameUpdate) => {
505505
}
506506
});
507507

508-
const settledPromises = await Promise.all(promises);
509-
nicknameUpdatePromises.push(...settledPromises);
508+
const settledPromises = await Promise.allSettled(promises);
509+
510+
settledPromises.forEach((result) => {
511+
if (result.status === "fulfilled" && !!result.value) {
512+
successfulUpdates++;
513+
} else {
514+
logger.error(`Error while updating nickname: ${result.reason}`);
515+
}
516+
});
510517

511518
await new Promise((resolve) => setTimeout(resolve, 5000));
512519
}
513520

514-
const successfulUpdates = nicknameUpdatePromises.length;
515-
516521
const res = {
517522
totalUsersStatus,
518523
successfulNicknameUpdates: successfulUpdates,

test/integration/discordactions.test.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const { updateUserStatus } = require("../../models/userStatus");
4040
const { generateUserStatusData } = require("../fixtures/userStatus/userStatus");
4141
const { getDiscordMembers } = require("../fixtures/discordResponse/discord-response");
4242
const { getOnboarding31DPlusMembers } = require("../fixtures/discordResponse/discord-response");
43-
43+
const discordRolesModel = require("../../models/discordactions");
4444
chai.use(chaiHttp);
4545
const { userStatusDataForOooState } = require("../fixtures/userStatus/userStatus");
4646
const { generateCronJobToken } = require("../utils/generateBotToken");
@@ -392,7 +392,12 @@ describe("Discord actions", function () {
392392
describe("POST /discord-actions/nickname/status", function () {
393393
let jwtToken;
394394
beforeEach(async function () {
395-
const { id } = await userModel.add({ ...userData[0] });
395+
const userData2 = { ...userData[1] };
396+
delete userData2.discordId;
397+
const [{ id }, { id: userId2 }] = await Promise.all([
398+
userModel.add({ ...userData[0] }),
399+
userModel.add(userData2),
400+
]);
396401
const statusData = {
397402
...userStatusDataForOooState,
398403
futureStatus: {
@@ -402,7 +407,17 @@ describe("Discord actions", function () {
402407
},
403408
userId: id,
404409
};
405-
await userStatusModel.add(statusData);
410+
const statusData2 = {
411+
...userStatusDataForOooState,
412+
futureStatus: {
413+
state: "ACTIVE",
414+
updatedAt: 1668211200000,
415+
from: 1668709800000,
416+
},
417+
userId: userId2,
418+
};
419+
await Promise.all([userStatusModel.add(statusData), userStatusModel.add(statusData2)]);
420+
406421
jwtToken = generateCronJobToken({ name: CRON_JOB_HANDLER });
407422
});
408423

@@ -435,19 +450,19 @@ describe("Discord actions", function () {
435450
expect(res.body).to.deep.equal({
436451
message: "Updated discord users nickname based on status",
437452
data: {
438-
totalUsersStatus: 1,
453+
totalUsersStatus: 2,
439454
successfulNicknameUpdates: 1,
440-
unsuccessfulNicknameUpdates: 0,
455+
unsuccessfulNicknameUpdates: 1,
441456
},
442457
});
443458
return done();
444459
});
445460
}).timeout(10000);
446461

447462
it("should return object with 0 successful updates when user nickname changes", function (done) {
448-
const response = "Error occurred while updating user's nickname";
449-
fetchStub.returns(Promise.reject(response));
463+
sinon.stub(discordRolesModel, "updateUsersNicknameStatus").throws(new Error());
450464

465+
sinon.stub();
451466
chai
452467
.request(app)
453468
.post("/discord-actions/nickname/status")
@@ -464,7 +479,7 @@ describe("Discord actions", function () {
464479
expect(res.body.message).to.equal("An internal server error occurred");
465480
return done();
466481
});
467-
});
482+
}).timeout(10000);
468483
});
469484
describe("POST /discord-actions/discord-roles", function () {
470485
before(async function () {

test/unit/models/discordactions.test.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const discordRoleModel = firestore.collection("discord-roles");
77
const memberRoleModel = firestore.collection("member-group-roles");
88
const userModel = firestore.collection("users");
99
const admin = require("firebase-admin");
10-
1110
const {
1211
createNewRole,
1312
getAllGroupRoles,
@@ -448,7 +447,6 @@ describe("discordactions", function () {
448447
beforeEach(async function () {
449448
fetchStub = sinon.stub(global, "fetch");
450449
dataAccessLayerStub = sinon.stub(dataAccessLayer, "retrieveUsers");
451-
452450
addedUers.forEach(({ username, discordId, id }) => {
453451
dataAccessLayerStub.withArgs(sinon.match({ id })).resolves({
454452
user: {

utils/users.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const userModel = firestore.collection("users");
44
const { months, discordNicknameLength } = require("../constants/users");
55
const dataAccessLayer = require("../services/dataAccessLayer");
66
const discordService = require("../services/discordService");
7-
7+
const ROLES = require("../constants/roles");
88
const addUserToDBForTest = async (userData) => {
99
await userModel.add(userData);
1010
};
@@ -271,10 +271,15 @@ const generateOOONickname = (username = "", from, until) => {
271271
*/
272272
const updateNickname = async (userId, status = {}) => {
273273
try {
274-
const { user: { discordId, username } = {} } = await dataAccessLayer.retrieveUsers({ id: userId });
275-
if (!discordId || !username) {
276-
throw new Error("Username or discordId unavailable");
274+
const {
275+
user: { discordId, username, roles = {} },
276+
discordJoinedAt = {},
277+
} = await dataAccessLayer.retrieveUsers({ id: userId });
278+
279+
if (!discordId || !username || !discordJoinedAt || roles[ROLES.ARCHIVED]) {
280+
throw new Error("User details unavailable");
277281
}
282+
278283
try {
279284
const nickname = generateOOONickname(username, status.from, status.until);
280285

0 commit comments

Comments
 (0)