From 0d6d058f808bc38c690768863fa592c42550a18f Mon Sep 17 00:00:00 2001 From: Fakhruddin KW <85249044+fakhruddinkw@users.noreply.github.com> Date: Fri, 20 Sep 2024 13:51:20 +0530 Subject: [PATCH] Adding FF to Maven getting listed in idle,idle-7d+ (#2171) * added condition to prevent mavens being added to idle,idle7d * edited test for group-idle-7d and added test for group-idle * resolving build error * resolving test errors * fixing tests * fixed the tests * added model tests * added line break * resolving Tejas's comments * fixed model function * added feature flag * adding feature flag * edited tests * fixing unit * added FF --------- Co-authored-by: Amit Prakash <34869115+iamitprakash@users.noreply.github.com> --- controllers/discordactions.js | 6 +- models/discordactions.js | 19 +- .../discordResponse/discord-response.js | 46 +++++ .../fixtures/discordactions/discordactions.js | 3 + test/integration/discordactions.test.js | 112 +++++++++- test/integration/external-accounts.test.js | 12 +- test/unit/models/discordactions.test.js | 194 +++++++++++++++++- 7 files changed, 372 insertions(+), 20 deletions(-) diff --git a/controllers/discordactions.js b/controllers/discordactions.js index c29a443ce..ec15c6d4a 100644 --- a/controllers/discordactions.js +++ b/controllers/discordactions.js @@ -213,7 +213,8 @@ const updateDiscordImageForVerification = async (req, res) => { */ const setRoleIdleToIdleUsers = async (req, res) => { try { - const result = await discordRolesModel.updateIdleUsersOnDiscord(); + const { dev } = req.query; + const result = await discordRolesModel.updateIdleUsersOnDiscord(dev); return res.status(201).json({ message: "All Idle Users updated successfully.", ...result, @@ -231,7 +232,8 @@ const setRoleIdleToIdleUsers = async (req, res) => { */ const setRoleIdle7DToIdleUsers = async (req, res) => { try { - const result = await discordRolesModel.updateIdle7dUsersOnDiscord(); + const { dev } = req.query; + const result = await discordRolesModel.updateIdle7dUsersOnDiscord(dev); return res.status(201).json({ message: "All Idle 7d+ Users updated successfully.", ...result, diff --git a/models/discordactions.js b/models/discordactions.js index 3c71e74f7..6576a9b6f 100644 --- a/models/discordactions.js +++ b/models/discordactions.js @@ -28,6 +28,7 @@ const { FIRESTORE_IN_CLAUSE_SIZE } = require("../constants/users"); const discordService = require("../services/discordService"); const { buildTasksQueryForMissedUpdates } = require("../utils/tasks"); const { buildProgressQueryForMissedUpdates } = require("../utils/progresses"); +const allMavens = []; /** * @@ -312,7 +313,7 @@ const fetchGroupToUserMapping = async (roleIds) => { } }; -const updateIdleUsersOnDiscord = async () => { +const updateIdleUsersOnDiscord = async (dev) => { let totalIdleUsers = 0; const totalGroupIdleRolesApplied = { count: 0, response: [] }; const totalGroupIdleRolesNotApplied = { count: 0, errors: [] }; @@ -335,6 +336,11 @@ const updateIdleUsersOnDiscord = async () => { discordUsers?.forEach((discordUser) => { const isDeveloper = discordUser.roles.includes(discordDeveloperRoleId); const haveIdleRole = discordUser.roles.includes(groupIdleRole.role.roleid); + const isMaven = discordUser.roles.includes(discordMavenRoleId); + + if (dev === "true" && isMaven) { + allMavens.push(discordUser.user.id); + } if (isDeveloper && haveIdleRole) { usersHavingIdleRole.push({ userid: discordUser.user.id }); @@ -349,7 +355,7 @@ const updateIdleUsersOnDiscord = async () => { if (userData.exists) { if (isUserArchived) { totalArchivedUsers++; - } else { + } else if (dev === "true" && !allMavens.includes(userData.data().discordId)) { userStatus.userid = userData.data().discordId; allIdleUsers.push(userStatus); } @@ -537,7 +543,7 @@ const updateUsersNicknameStatus = async (lastNicknameUpdate) => { } }; -const updateIdle7dUsersOnDiscord = async () => { +const updateIdle7dUsersOnDiscord = async (dev) => { let totalIdle7dUsers = 0; const totalGroupIdle7dRolesApplied = { count: 0, response: [] }; const totalGroupIdle7dRolesNotApplied = { count: 0, errors: [] }; @@ -562,6 +568,11 @@ const updateIdle7dUsersOnDiscord = async () => { discordUsers?.forEach((discordUser) => { const isDeveloper = discordUser.roles.includes(discordDeveloperRoleId); const haveIdle7dRole = discordUser.roles.includes(groupIdle7dRoleId); + const isMaven = discordUser.roles.includes(discordMavenRoleId); + + if (dev === "true" && isMaven) { + allMavens.push(discordUser.user.id); + } if (isDeveloper && haveIdle7dRole) { usersHavingIdle7dRole.push({ userid: discordUser.user.id }); @@ -583,7 +594,7 @@ const updateIdle7dUsersOnDiscord = async () => { if (userData.exists) { if (isUserArchived) { totalArchivedUsers++; - } else { + } else if (dev === "true" && !allMavens.includes(userData.data().discordId)) { userStatus.userid = userData.data().discordId; allIdle7dUsers.push(userStatus); } diff --git a/test/fixtures/discordResponse/discord-response.js b/test/fixtures/discordResponse/discord-response.js index 7e61f26a4..ba2a6b213 100644 --- a/test/fixtures/discordResponse/discord-response.js +++ b/test/fixtures/discordResponse/discord-response.js @@ -68,6 +68,52 @@ const getDiscordMembers = [ mute: false, deaf: false, }, + { + avatar: "", + communication_disabled_until: "", + flags: 0, + is_pending: false, + joined_at: "some_intensional_date", // ISO8601 timestamp + nick: "goliath", + pending: false, + premium_since: null, + roles: ["giant", "hero"], + user: { + id: "1234567", + username: "goliath", + global_name: "goliath", + display_name: "goliath", + avatar: "56yu6567uuju7636w4e6yr7e9utbw8r4", // avatar hash + discriminator: "44551", // 4-digit discord-tag + public_flags: 0, + avatar_decoration: null, + }, + mute: false, + deaf: false, + }, + { + avatar: "", + communication_disabled_until: "", + flags: 0, + is_pending: false, + joined_at: "some_intensional_date", // ISO8601 timestamp + nick: "goliath-1", + pending: false, + premium_since: null, + roles: ["giant", "hero"], + user: { + id: "2131234453456545656765767876", + username: "goliath-1", + global_name: "goliath-1", + display_name: "goliath-1", + avatar: "56yu6567uuju7636w4e6yr7e9utbw8r4", // avatar hash + discriminator: "44551", // 4-digit discord-tag + public_flags: 1, + avatar_decoration: null, + }, + mute: false, + deaf: false, + }, ]; const usersFromRds = [ diff --git a/test/fixtures/discordactions/discordactions.js b/test/fixtures/discordactions/discordactions.js index 0ef3c5647..cc2da4d1f 100644 --- a/test/fixtures/discordactions/discordactions.js +++ b/test/fixtures/discordactions/discordactions.js @@ -8,6 +8,8 @@ const groupData = [ const groupIdle7d = { rolename: "group-idle-7d+", roleid: 4, createdBy: "1dad23q23j131j" }; +const groupIdle = { rolename: "group-idle", roleid: 3, createdBy: "1dad23q23j131jj" }; + const roleData = { roleid: "test-role-id", userid: "test-user-id", @@ -56,4 +58,5 @@ module.exports = { groupIdle7d, roleDataFromDiscord, groupOnboarding31dPlus, + groupIdle, }; diff --git a/test/integration/discordactions.test.js b/test/integration/discordactions.test.js index 7967c65ad..287bb644f 100644 --- a/test/integration/discordactions.test.js +++ b/test/integration/discordactions.test.js @@ -35,6 +35,7 @@ const { roleDataFromDiscord, memberGroupData, groupOnboarding31dPlus, + groupIdle, } = require("../fixtures/discordactions/discordactions"); const discordServices = require("../../services/discordService"); const { addGroupRoleToMember, addInviteToInviteModel } = require("../../models/discordactions"); @@ -615,9 +616,30 @@ describe("Discord actions", function () { let allIds; beforeEach(async function () { - userData[0].roles = { archived: false }; - userData[1].roles = { archived: false }; - userData[2].roles = { archived: false }; + userData[0] = { + ...userData[0], + discordId: "123456789098765432", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + userData[1] = { + ...userData[1], + discordId: "12345678909867666", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + userData[2] = { + ...userData[2], + discordId: "1234567", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + + getDiscordMembers[3] = { + ...getDiscordMembers[3], + roles: ["1212121212"], + }; + await addUser(userData[0]); await addUser(userData[1]); await addUser(userData[2]); @@ -650,7 +672,7 @@ describe("Discord actions", function () { it("should update Idle 7d+ Users successfully and return a 201 status code", function (done) { chai .request(app) - .put(`/discord-actions/group-idle-7d`) + .put(`/discord-actions/group-idle-7d?dev=true`) .set("Cookie", `${cookieName}=${superUserAuthToken}`) .end((err, res) => { if (err) { @@ -658,9 +680,9 @@ describe("Discord actions", function () { } expect(res).to.have.status(201); expect(res.body.message).to.be.equal("All Idle 7d+ Users updated successfully."); - expect(res.body.totalIdle7dUsers).to.be.equal(3); - expect(res.body.totalGroupIdle7dRolesApplied.count).to.be.equal(3); - expect(res.body.totalUserRoleToBeAdded).to.be.equal(3); + expect(res.body.totalIdle7dUsers).to.be.equal(2); + expect(res.body.totalGroupIdle7dRolesApplied.count).to.be.equal(2); + expect(res.body.totalUserRoleToBeAdded).to.be.equal(2); return done(); }); }); @@ -956,4 +978,80 @@ describe("Discord actions", function () { expect(res.body.inviteLink).to.be.equal("discord.gg/asdfdsfsd"); }); }); + + describe("PUT /discord-actions/group-idle", function () { + let allIds; + + beforeEach(async function () { + userData[0] = { + ...userData[0], + discordId: "123456789098765432", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + userData[1] = { + ...userData[1], + discordId: "12345678909867666", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + userData[2] = { + ...userData[2], + discordId: "1234567", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + + getDiscordMembers[3] = { + ...getDiscordMembers[3], + roles: ["1212121212"], + }; + + await addUser(userData[0]); + await addUser(userData[1]); + await addUser(userData[2]); + + const addUsersPromises = userData.slice(0, 3).map((user) => userModel.add({ ...user })); + const responses = await Promise.all(addUsersPromises); + allIds = responses.map((response) => response.id); + + const userStatusPromises = allIds.map(async (userId) => { + await updateUserStatus(userId, generateUserStatusData("IDLE", 1690829925336, 1690829925336)); + }); + await Promise.all(userStatusPromises); + + const addRolesPromises = [discordRoleModel.add(groupIdle)]; + await Promise.all(addRolesPromises); + + fetchStub.returns( + Promise.resolve({ + status: 200, + json: () => Promise.resolve(getDiscordMembers), + }) + ); + }); + + afterEach(async function () { + sinon.restore(); + await cleanDb(); + }); + + it("should update Idle Users successfully and return a 201 status code!", function (done) { + chai + .request(app) + .put(`/discord-actions/group-idle?dev=true`) + .set("Cookie", `${cookieName}=${superUserAuthToken}`) + .end((err, res) => { + if (err) { + return done(err); + } + expect(res).to.have.status(201); + expect(res.body.message).to.be.equal("All Idle Users updated successfully."); + expect(res.body.totalIdleUsers).to.be.equal(2); + expect(res.body.totalGroupIdleRolesApplied.count).to.be.equal(2); + expect(res.body.totalUserRoleToBeAdded).to.be.equal(2); + return done(); + }); + }); + }); }); diff --git a/test/integration/external-accounts.test.js b/test/integration/external-accounts.test.js index 158b6bac0..4dac34048 100644 --- a/test/integration/external-accounts.test.js +++ b/test/integration/external-accounts.test.js @@ -265,7 +265,7 @@ describe("External Accounts", function () { expect(res).to.have.status(200); expect(res.body).to.deep.equal({ rdsUsers: 3, - discordUsers: 3, + discordUsers: 5, userUpdatedWithInDiscordFalse: 0, usersMarkedUnArchived: 1, message: "Data Sync Complete", @@ -344,7 +344,7 @@ describe("External Accounts", function () { usersArchivedCount: 1, usersUnArchivedCount: 0, totalUsersProcessed: 2, - rdsDiscordServerUsers: 3, + rdsDiscordServerUsers: 5, backlogTasksCount: 2, }); }); @@ -370,7 +370,7 @@ describe("External Accounts", function () { usersArchivedCount: 0, usersUnArchivedCount: 0, totalUsersProcessed: 2, - rdsDiscordServerUsers: 3, + rdsDiscordServerUsers: 5, backlogTasksCount: 0, }); }); @@ -396,12 +396,12 @@ describe("External Accounts", function () { usersArchivedCount: 0, usersUnArchivedCount: 1, totalUsersProcessed: 2, - rdsDiscordServerUsers: 3, + rdsDiscordServerUsers: 5, backlogTasksCount: 0, }); }); - it("Should Do Nothing to Users With Archived as True and Not in RDS Discord Server", async function () { + it("Should Do Nothing to Users With Archived as True and Not in RDS Discord Server ", async function () { await userModel.add(usersFromRds[3]); // archivedAndNotInDiscord fetchStub.returns( @@ -422,7 +422,7 @@ describe("External Accounts", function () { usersArchivedCount: 0, usersUnArchivedCount: 0, totalUsersProcessed: 1, - rdsDiscordServerUsers: 3, + rdsDiscordServerUsers: 5, backlogTasksCount: 0, }); }); diff --git a/test/unit/models/discordactions.test.js b/test/unit/models/discordactions.test.js index f8d903872..dd1af35cc 100644 --- a/test/unit/models/discordactions.test.js +++ b/test/unit/models/discordactions.test.js @@ -31,8 +31,17 @@ const { addInviteToInviteModel, getUserDiscordInvite, groupUpdateLastJoinDate, + updateIdleUsersOnDiscord, + updateIdle7dUsersOnDiscord, } = require("../../../models/discordactions"); -const { groupData, roleData, existingRole, memberGroupData } = require("../../fixtures/discordactions/discordactions"); +const { + groupData, + roleData, + existingRole, + memberGroupData, + groupIdle, + groupIdle7d, +} = require("../../fixtures/discordactions/discordactions"); const cleanDb = require("../../utils/cleanDb"); const { userPhotoVerificationData } = require("../../fixtures/user/photo-verification"); const userData = require("../../fixtures/user/user")(); @@ -44,6 +53,7 @@ const { ONE_DAY_IN_MS } = require("../../../constants/users"); const { createProgressDocument } = require("../../../models/progresses"); const { stubbedModelTaskProgressData } = require("../../fixtures/progress/progresses"); const { convertDaysToMilliseconds } = require("../../../utils/time"); +const { generateUserStatusData } = require("../../fixtures/userStatus/userStatus"); chai.should(); @@ -801,4 +811,186 @@ describe("discordactions", function () { expect(res.updated).to.be.equal(true); }); }); + + describe("updateGroupIdle7d+", function () { + let fetchStub; + let allIds; + + beforeEach(async function () { + fetchStub = fetchStub = sinon.stub(global, "fetch"); + + userData[0] = { + ...userData[0], + discordId: "123456789098765432", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + userData[1] = { + ...userData[1], + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + userData[2] = { + ...userData[2], + discordId: "1234567", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + + userData[3] = { + ...userData[3], + roles: { archived: true, in_discord: false }, + }; + + userData[4] = { + ...userData[4], + discordId: "2131234453456545656765767876", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + + getDiscordMembers[3] = { + ...getDiscordMembers[3], + roles: ["1212121212"], + }; + + await addUser(userData[0]); + await addUser(userData[1]); + await addUser(userData[2]); + await addUser(userData[3]); + await addUser(userData[4]); + + getDiscordMembers[4] = { + ...getDiscordMembers[4], + roles: [...getDiscordMembers[4].roles, groupIdle7d.roleid, "9876543210"], + }; + const addUsersPromises = userData.slice(0, 5).map((user) => userModel.add({ ...user })); + const responses = await Promise.all(addUsersPromises); + allIds = responses.map((response) => response.id); + + const userStatusPromises = allIds.map(async (userId, index) => { + if (index === 4) { + await userStatusModel.updateUserStatus(userId, generateUserStatusData("ACTIVE", new Date(), new Date())); + } else { + await userStatusModel.updateUserStatus(userId, generateUserStatusData("IDLE", 1690829925336, 1690829925336)); + } + }); + await Promise.all(userStatusPromises); + + const addRolesPromises = [discordRoleModel.add(groupIdle7d)]; + await Promise.all(addRolesPromises); + + fetchStub.returns( + Promise.resolve({ + status: 200, + json: () => Promise.resolve(getDiscordMembers), + }) + ); + }); + + afterEach(async function () { + sinon.restore(); + await cleanDb(); + }); + + it("should return totalIdleUsers as 3,totalRolesApplied as 3, totalRoleToBeAdded as 3 as no one is maven", async function () { + const dev = "true"; + const res = await updateIdle7dUsersOnDiscord(dev); + expect(res.totalIdle7dUsers).to.be.equal(2); + expect(res.totalUserRoleToBeAdded).to.be.equal(2); + expect(res.totalUserRoleToBeRemoved).to.be.equal(1); + expect(res.totalArchivedUsers).to.be.equal(1); + }); + }); + + describe("updateGroupIdle", function () { + let fetchStub; + let allIds; + + beforeEach(async function () { + fetchStub = fetchStub = sinon.stub(global, "fetch"); + + userData[0] = { + ...userData[0], + discordId: "123456789098765432", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + userData[1] = { + ...userData[1], + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + userData[2] = { + ...userData[2], + discordId: "1234567", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + + userData[3] = { + ...userData[3], + roles: { archived: true, in_discord: false }, + }; + + userData[4] = { + ...userData[4], + discordId: "2131234453456545656765767876", + discordJoinedAt: "2023-07-31T16:57:53.894000+00:00", + roles: { archived: false, in_discord: true }, + }; + + getDiscordMembers[3] = { + ...getDiscordMembers[3], + roles: ["1212121212"], + }; + + await addUser(userData[0]); + await addUser(userData[1]); + await addUser(userData[2]); + await addUser(userData[3]); + await addUser(userData[4]); + + getDiscordMembers[4] = { + ...getDiscordMembers[4], + roles: [...getDiscordMembers[4].roles, groupIdle.roleid, "9876543210"], + }; + const addUsersPromises = userData.slice(0, 5).map((user) => userModel.add({ ...user })); + const responses = await Promise.all(addUsersPromises); + allIds = responses.map((response) => response.id); + + const userStatusPromises = allIds.map(async (userId, index) => { + if (index === 4) { + await userStatusModel.updateUserStatus(userId, generateUserStatusData("ACTIVE", new Date(), new Date())); + } else { + await userStatusModel.updateUserStatus(userId, generateUserStatusData("IDLE", 1690829925336, 1690829925336)); + } + }); + await Promise.all(userStatusPromises); + + const addRolesPromises = [discordRoleModel.add(groupIdle)]; + await Promise.all(addRolesPromises); + + fetchStub.returns( + Promise.resolve({ + status: 200, + json: () => Promise.resolve(getDiscordMembers), + }) + ); + }); + + afterEach(async function () { + sinon.restore(); + await cleanDb(); + }); + + it("should return totalIdleUsers as 2,totalArchivedUsers as 2, totalRoleToBeAdded as 2", async function () { + const dev = "true"; + const res = await updateIdleUsersOnDiscord(dev); + expect(res.totalIdleUsers).to.be.equal(2); + expect(res.totalUserRoleToBeAdded).to.be.equal(2); + expect(res.totalUserRoleToBeRemoved).to.be.equal(1); + expect(res.totalArchivedUsers).to.be.equal(1); + }); + }); });