UNPKG

@earnaha/auth0-action-helper

Version:
400 lines (374 loc) 15.6 kB
/* eslint-disable max-len */ const { describe, beforeEach, beforeAll, afterEach, expect, it, jest, } = require('@jest/globals'); const axios = require('axios'); const AxiosMockAdapter = require('axios-mock-adapter'); const PostChangePasswordHelper = require('../post.change.password.js'); describe('PostChangePasswordHelper Class', () => { const envConfig = { ENV: 'local', SERVICE: 'aha-local', DOMAIN: 'https://1f53-2401-e180-8814-4076-522b-1a24-60e4-9edd.ngrok-free.app', ACCESS_KEY: 'oJucsRNjCnczrAVsIUZxXNYSh', ACCESS_SALT: '4479748907', AUTH0_DOMAIN: 'https://aha-local.jp.auth0.com', AUTH0_CLIENT_ID: 'rR5hZwRTU5PeTQ9iCVtsNrLYS45PaeMY', AUTH0_CLIENT_SECRET: 'kJR-aAjiUWwcaF-f9JfVaiaePNLnxNL60R2plM2cljPDlmzIGBsv_JYhLRsaJlh0', SENTRY_DSN: '', SENTRY_TRACES_SAMPLE_RATE: '0.1', SENTRY_LOGGER_LEVEL: 'debug', LINK_ACCOUNT_TIME: '2022-04-22', OPEN_SEARCH_NODE: 'https://logger:wkb.xdg2ugx3dew!RZV@search-earnaha-log-p5zmiz3blqoub4f43lr4a34wwe.ap-northeast-1.es.amazonaws.com', }; const members = { inviter: { id: '23f253bf-2524-498f-9aa0-a9e594793942', auth0Id: 'auth0|q0ugvfad7scksuczsw3fpxxl', email: 'krystel_konopelski@yahoo.com', nickname: 'student.a', name: 'Magdalena.Russel', picture: null, loginsCount: 3, lastIp: null, emailVerified: true, appMetadata: null, userMetadata: null, roles: ['student'], identities: null, language: null, geoip: null, lastLoginAt: '2023-02-04T10:34:02.968Z', lastPasswordResetAt: null, createdAt: '2023-01-24T09:40:08.315Z', updatedAt: '2023-02-04T10:34:02.968Z', }, receiver: { id: '79ceeb5f-bb6a-469b-93d0-8a077290fc61', auth0Id: 'auth0|6423f2abe532c863e93f677a', email: 'jest.ut+2023032903@avancevl.com', nickname: 'jest.ut+2023032903', name: 'jest.ut+2023032903@avancevl.com', picture: 'https://s.gravatar.com/avatar/7e5f83cbf99e60c27c73074279c1b8b4?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fje.png', loginsCount: 1, lastIp: '2403:c300:5558:1a86:ebd1:7e49:e45e:2963', emailVerified: false, language: null, appMetadata: {}, userMetadata: { refer: `@student.a`, referMemberId: '23f253bf-2524-498f-9aa0-a9e594793942', }, roles: ['student'], identities: [ { connection: 'Username-Password-Authentication', isSocial: false, provider: 'auth0', userId: '6423f2abe532c863e93f677a', user_id: '6423f2abe532c863e93f677a', }, ], geoip: { cityName: 'Taoyuan District', continentCode: 'AS', countryCode3: 'TWN', countryCode: 'TW', countryName: 'Taiwan', latitude: 24.9889, longitude: 121.3176, subdivisionCode: 'TAO', subdivisionName: 'Taoyuan', timeZone: 'Asia/Taipei', }, lastLoginAt: null, Memberships: null, updatedAt: '2023-02-11T03:45:33.758Z', createdAt: '2023-02-11T03:45:33.758Z', lastPasswordResetAt: null, }, }; const user = { user_id: members.receiver.auth0Id, created_at: members.receiver.createdAt, email: members.receiver.email, email_verified: members.receiver.emailVerified, family_name: 'jest', given_name: 'ut', identities: members.receiver.identities, locale: 'en', name: 'jest.ut', nickname: 'jest.ut', picture: members.receiver.picture, updated_at: members.receiver.updatedAt, app_metadata: members.receiver.appMetadata, user_metadata: members.receiver.userMetadata, last_ip: members.receiver.lastIp, last_login: members.receiver.lastLoginAt, logins_count: members.receiver.loginsCount, blocked_for: [], guardian_authenticators: [], }; const acceptanceRes = { updateExistingRelation: { isInvitationExist: false, existingInvitationId: null, isAutoCreateInvitation: true, createdInvitationId: '09a766f3-e6d9-4a4d-a820-d1744017f7bf', finalStatusOfInvitation: 102, }, redeemReferReward: { isReferRewardRedeemed: true, ahaPointTotalAmount: 1.5, }, updateInvitersMembership: { referredMemberCount: 3, totalExtendedTimes: 1, hasBeenExtendedByThisMethod: false, isReachExtendCriteria: true, isMemberDataUpdated: true, isFreeTrialExtended: true, isExtendNoticeSent: true, }, notice: { id: 'b6aa7d73-5cf7-4717-921a-2307f65cda61', tag: 'invite.accept.addressee.requester.global', title: 'I accepted your invite to join Aha. Let’s practice together!', service: 'aha-local', body: null, data: JSON.stringify({ payload: { senderUserId: '592b8005-9958-49a1-af97-33862fbc5b67', senderNameDyna: null, senderAvatarDyna: null, body: {}, }, }), android: null, apns: null, webPush: null, message: null, scheduledAt: '2023-02-15T23:59:59.999Z', createdAt: '2023-02-15T08:42:20.136Z', updatedAt: '2023-02-15T08:42:20.136Z', userNotifications: [ { id: '978f8f14-d72b-4e34-909f-6c6f3549b5d6', userId: 'f4dacf3c-3d1a-452e-bc8d-16e2829582e2', notificationId: 'b6aa7d73-5cf7-4717-921a-2307f65cda61', readAt: null, createdAt: '2023-02-15T08:42:20.195Z', updatedAt: '2023-02-15T08:42:20.195Z', actionStatus: null, triggeredAt: null, }, ], invalidMemberIds: [], }, inviter: members.inviter, receiver: members.receiver, }; const auth0ActionEvent = { secrets: envConfig, connection: 'Username-Password-Authentication', request: { geoip: { cityName: 'Taoyuan District', continentCode: 'AS', countryCode3: 'TWN', countryCode: 'TW', countryName: 'Taiwan', latitude: 24.9889, longitude: 121.3176, subdivisionCode: 'TAO', subdivisionName: 'Taoyuan', timeZone: 'Asia/Taipei', }, hostname: '', ip: '2403:c300:5558:1a86:ebd1:7e49:e45e:2963', language: 'en', method: 'post', user_agent: '', }, tenant: 'aha-local', user, }; const auth0ActionApi = { key: 'auth0-action-api-object-key', value: 'auth0-action-api-object-value', options: { expires_at: null, ttl: 0, }, cache: { get: () => null, set: (_, key) => key, }, }; const serverAccessKey = 'b0p1Y3NSTmpDbmN6ckFWc0lVWnhYTllTaCswMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDArYWhhLWxvY2FsKzE3MDAyMDE5NjgwNTg='; const auth0UserToken = { data: { access_token: `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImMyNUVPdVRVNEtvQVZPczJjdXh2MiJ9.eyJpc3MiOiJodHRwczovL2Rldi1vcXd1LmpwLmF1dGgwLmNvbS8iLCJzdWIiOiJzelBBbVNYQmpSN3dIWURGMUhZdm50TUE0R0RyT0pDUkBjbGllbnRzIiwiYXVkIjoiaHR0cHM6Ly9kZXYtb3F3dS5qcC5hdXRoMC5jb20vYXBpL3YyLyIsImlhdCI6MTY3NjA4NzEzMywiZXhwIjoxNjc2MTczNTMzLCJhenAiOiJzelBBbVNYQmpSN3dIWURGMUhZdm50TUE0R0RyT0pDUiIsInNjb3BlIjoicmVhZDpjbGllbnRfZ3JhbnRzIGNyZWF0ZTpjbGllbnRfZ3JhbnRzIGRlbGV0ZTpjbGllbnRfZ3JhbnRzIHVwZGF0ZTpjbGllbnRfZ3JhbnRzIHJlYWQ6dXNlcnMgdXBkYXRlOnVzZXJzIGRlbGV0ZTp1c2VycyBjcmVhdGU6dXNlcnMgcmVhZDp1c2Vyc19hcHBfbWV0YWRhdGEgdXBkYXRlOnVzZXJzX2FwcF9tZXRhZGF0YSBkZWxldGU6dXNlcnNfYXBwX21ldGFkYXRhIGNyZWF0ZTp1c2Vyc19hcHBfbWV0YWRhdGEgcmVhZDp1c2VyX2N1c3RvbV9ibG9ja3MgY3JlYXRlOnVzZXJfY3VzdG9tX2Jsb2NrcyBkZWxldGU6dXNlcl9jdXN0b21fYmxvY2tzIGNyZWF0ZTp1c2VyX3RpY2tldHMgcmVhZDpjbGllbnRzIHVwZGF0ZTpjbGllbnRzIGRlbGV0ZTpjbGllbnRzIGNyZWF0ZTpjbGllbnRzIHJlYWQ6Y2xpZW50X2tleXMgdXBkYXRlOmNsaWVudF9rZXlzIGRlbGV0ZTpjbGllbnRfa2V5cyBjcmVhdGU6Y2xpZW50X2tleXMgcmVhZDpjb25uZWN0aW9ucyB1cGRhdGU6Y29ubmVjdGlvbnMgZGVsZXRlOmNvbm5lY3Rpb25zIGNyZWF0ZTpjb25uZWN0aW9ucyByZWFkOnJlc291cmNlX3NlcnZlcnMgdXBkYXRlOnJlc291cmNlX3NlcnZlcnMgZGVsZXRlOnJlc291cmNlX3NlcnZlcnMgY3JlYXRlOnJlc291cmNlX3NlcnZlcnMgcmVhZDpkZXZpY2VfY3JlZGVudGlhbHMgdXBkYXRlOmRldmljZV9jcmVkZW50aWFscyBkZWxldGU6ZGV2aWNlX2NyZWRlbnRpYWxzIGNyZWF0ZTpkZXZpY2VfY3JlZGVudGlhbHMgcmVhZDpydWxlcyB1cGRhdGU6cnVsZXMgZGVsZXRlOnJ1bGVzIGNyZWF0ZTpydWxlcyByZWFkOnJ1bGVzX2NvbmZpZ3MgdXBkYXRlOnJ1bGVzX2NvbmZpZ3MgZGVsZXRlOnJ1bGVzX2NvbmZpZ3MgcmVhZDpob29rcyB1cGRhdGU6aG9va3MgZGVsZXRlOmhvb2tzIGNyZWF0ZTpob29rcyByZWFkOmFjdGlvbnMgdXBkYXRlOmFjdGlvbnMgZGVsZXRlOmFjdGlvbnMgY3JlYXRlOmFjdGlvbnMgcmVhZDplbWFpbF9wcm92aWRlciB1cGRhdGU6ZW1haWxfcHJvdmlkZXIgZGVsZXRlOmVtYWlsX3Byb3ZpZGVyIGNyZWF0ZTplbWFpbF9wcm92aWRlciBibGFja2xpc3Q6dG9rZW5zIHJlYWQ6c3RhdHMgcmVhZDppbnNpZ2h0cyByZWFkOnRlbmFudF9zZXR0aW5ncyB1cGRhdGU6dGVuYW50X3NldHRpbmdzIHJlYWQ6bG9ncyByZWFkOmxvZ3NfdXNlcnMgcmVhZDpzaGllbGRzIGNyZWF0ZTpzaGllbGRzIHVwZGF0ZTpzaGllbGRzIGRlbGV0ZTpzaGllbGRzIHJlYWQ6YW5vbWFseV9ibG9ja3MgZGVsZXRlOmFub21hbHlfYmxvY2tzIHVwZGF0ZTp0cmlnZ2VycyByZWFkOnRyaWdnZXJzIHJlYWQ6Z3JhbnRzIGRlbGV0ZTpncmFudHMgcmVhZDpndWFyZGlhbl9mYWN0b3JzIHVwZGF0ZTpndWFyZGlhbl9mYWN0b3JzIHJlYWQ6Z3VhcmRpYW5fZW5yb2xsbWVudHMgZGVsZXRlOmd1YXJkaWFuX2Vucm9sbG1lbnRzIGNyZWF0ZTpndWFyZGlhbl9lbnJvbGxtZW50X3RpY2tldHMgcmVhZDp1c2VyX2lkcF90b2tlbnMgY3JlYXRlOnBhc3N3b3Jkc19jaGVja2luZ19qb2IgZGVsZXRlOnBhc3N3b3Jkc19jaGVja2luZ19qb2IgcmVhZDpjdXN0b21fZG9tYWlucyBkZWxldGU6Y3VzdG9tX2RvbWFpbnMgY3JlYXRlOmN1c3RvbV9kb21haW5zIHVwZGF0ZTpjdXN0b21fZG9tYWlucyByZWFkOmVtYWlsX3RlbXBsYXRlcyBjcmVhdGU6ZW1haWxfdGVtcGxhdGVzIHVwZGF0ZTplbWFpbF90ZW1wbGF0ZXMgcmVhZDptZmFfcG9saWNpZXMgdXBkYXRlOm1mYV9wb2xpY2llcyByZWFkOnJvbGVzIGNyZWF0ZTpyb2xlcyBkZWxldGU6cm9sZXMgdXBkYXRlOnJvbGVzIHJlYWQ6cHJvbXB0cyB1cGRhdGU6cHJvbXB0cyByZWFkOmJyYW5kaW5nIHVwZGF0ZTpicmFuZGluZyBkZWxldGU6YnJhbmRpbmcgcmVhZDpsb2dfc3RyZWFtcyBjcmVhdGU6bG9nX3N0cmVhbXMgZGVsZXRlOmxvZ19zdHJlYW1zIHVwZGF0ZTpsb2dfc3RyZWFtcyBjcmVhdGU6c2lnbmluZ19rZXlzIHJlYWQ6c2lnbmluZ19rZXlzIHVwZGF0ZTpzaWduaW5nX2tleXMgcmVhZDpsaW1pdHMgdXBkYXRlOmxpbWl0cyBjcmVhdGU6cm9sZV9tZW1iZXJzIHJlYWQ6cm9sZV9tZW1iZXJzIGRlbGV0ZTpyb2xlX21lbWJlcnMgcmVhZDplbnRpdGxlbWVudHMgcmVhZDphdHRhY2tfcHJvdGVjdGlvbiB1cGRhdGU6YXR0YWNrX3Byb3RlY3Rpb24gcmVhZDpvcmdhbml6YXRpb25zIHVwZGF0ZTpvcmdhbml6YXRpb25zIGNyZWF0ZTpvcmdhbml6YXRpb25zIGRlbGV0ZTpvcmdhbml6YXRpb25zIGNyZWF0ZTpvcmdhbml6YXRpb25fbWVtYmVycyByZWFkOm9yZ2FuaXphdGlvbl9tZW1iZXJzIGRlbGV0ZTpvcmdhbml6YXRpb25fbWVtYmVycyBjcmVhdGU6b3JnYW5pemF0aW9uX2Nvbm5lY3Rpb25zIHJlYWQ6b3JnYW5pemF0aW9uX2Nvbm5lY3Rpb25zIHVwZGF0ZTpvcmdhbml6YXRpb25fY29ubmVjdGlvbnMgZGVsZXRlOm9yZ2FuaXphdGlvbl9jb25uZWN0aW9ucyBjcmVhdGU6b3JnYW5pemF0aW9uX21lbWJlcl9yb2xlcyByZWFkOm9yZ2FuaXphdGlvbl9tZW1iZXJfcm9sZXMgZGVsZXRlOm9yZ2FuaXphdGlvbl9tZW1iZXJfcm9sZXMgY3JlYXRlOm9yZ2FuaXphdGlvbl9pbnZpdGF0aW9ucyByZWFkOm9yZ2FuaXphdGlvbl9pbnZpdGF0aW9ucyBkZWxldGU6b3JnYW5pemF0aW9uX2ludml0YXRpb25zIiwiZ3R5IjoiY2xpZW50LWNyZWRlbnRpYWxzIn0.rHOgYOAG_HYlrUKey6j9nkKvyKwt8q_rVliqEZSBwoBjZ3CvEMDA1vXLPQLfGUHUw3S3R6SSPUSHIkSKsu2TOmHXVBPiTEd-cCap5_5oGWABrymRTfT4fPO6HyEvgBXAPAnh8tetLYp5jXvsreYt-qafaM7CWpwYryFxKO0-bEyUSEkWIfFdDwheT90QMgrvzve5FMHCMv7nna-DsqlFAYoGLAcqgQaB0wd_Ker7pypNmrzIX08KOggA0We3loPL5p5uiRZiwjT5-HKuFPxDgGqUSU-LNAbgkpUulZ3q95d1oVKEYY-nGAEsagdEAiExrgG9SQ_4dT35vVpUdED3pQ`, }, }; const scprLogs = [ { date: '2023-09-26T11:47:16.586Z', type: 'scpr', description: 'Change password request succeeded', connection: 'Username-Password-Authentication', connection_id: 'con_1zqzV8vyVksEvv66', client_id: 'b0otIVK7p9kyQawoD2v637u6bIkA61px', client_name: 'All Applications', ip: '52.199.143.205', user_agent: 'Other 0.0.0 / Other 0.0.0', details: { resetUrl: 'https://aha-beta.jp.auth0.com/lo/reset?ticket=jt9yNJBE1BZ5Kn10uZnQCoydLtum55HX#', body: { tenant: 'aha-beta', client_id: 'b0otIVK7p9kyQawoD2v637u6bIkA61px', connection: 'Username-Password-Authentication', email: 'ahatestjhdb8@test.com', resultUrl: 'https://app-beta.earnaha.com/api/auth/login?refer=04cdf75c-8e9e-4055-b9f2-cd5186ad4e88', includeEmailInRedirect: false, markEmailAsVerified: true, ttl_sec: 604800, }, }, user_id: '', user_name: 'ahatestjhdb8@test.com', strategy: 'auth0', strategy_type: 'database', log_id: '90020230926114716705196000000000000001223372037546308942', _id: '90020230926114716705196000000000000001223372037546308942', isMobile: false, id: '90020230926114716705196000000000000001223372037546308942', }, ]; const scpLogs = [ { date: '2023-09-26T11:47:25.732Z', type: 'scp', description: 'You can now login to the application with the new password.', connection: 'Username-Password-Authentication', connection_id: 'con_1zqzV8vyVksEvv66', client_id: 'b0otIVK7p9kyQawoD2v637u6bIkA61px', client_name: 'All Applications', ip: '139.162.104.62', user_agent: 'Python Requests 2.30.0 / Other 0.0.0', details: { body: { newPassword: '*****', confirmNewPassword: '*****', _csrf: 'H8or7Fnq-munGJ61aodx9sPIIOS3QUGqnAbg', ticket: 'jt9yNJBE1BZ5Kn10uZnQCoydLtum55HX', }, query: { user_id: '6512c4c332781c41b4379966', email: 'ahatestjhdb8@test.com', newPassword: '*****', tenant: 'aha-beta', client_id: 'b0otIVK7p9kyQawoD2v637u6bIkA61px', connection: 'Username-Password-Authentication', resultUrl: 'https://app-beta.earnaha.com/api/auth/login?refer=04cdf75c-8e9e-4055-b9f2-cd5186ad4e88', includeEmailInRedirect: false, markEmailAsVerified: true, }, }, user_id: 'auth0|6512c4c332781c41b4379966', user_name: 'ahatestjhdb8@test.com', strategy: 'auth0', strategy_type: 'database', log_id: '90020230926114725769635000000000000001223372037546309463', _id: '90020230926114725769635000000000000001223372037546309463', isMobile: false, id: '90020230926114725769635000000000000001223372037546309463', }, ]; let axiosMockAdapter; let helper; beforeAll(async () => { axiosMockAdapter = new AxiosMockAdapter(axios); }); beforeEach(async () => { helper = new PostChangePasswordHelper(envConfig); helper.getServerAccessKey = jest .fn() .mockResolvedValue(serverAccessKey); axiosMockAdapter .onPost(`${envConfig.AUTH0_DOMAIN}/oauth/token`) .reply(200, auth0UserToken.data); axiosMockAdapter .onPost(`${envConfig.DOMAIN}/auth/v3/refer/invitation/accept`) .reply(200, { data: acceptanceRes }); const querySCPR = encodeURIComponent( `type:"scpr"` + ` AND connection:"Username-Password-Authentication"` + ` AND strategy:"auth0"` + ` AND user_name:"${user.email}"`, ); axiosMockAdapter .onGet(`${envConfig.AUTH0_DOMAIN}/api/v2/logs?q=${querySCPR}`) .reply(200, scprLogs); const querySCP = encodeURIComponent( `type:"scp"` + ` AND connection:"Username-Password-Authentication"` + ` AND strategy:"auth0"` + ` AND user_id:"${user.user_id}"`, ); axiosMockAdapter .onGet(`${envConfig.AUTH0_DOMAIN}/api/v2/logs?q=${querySCP}`) .reply(200, scpLogs); }); afterEach(() => { axiosMockAdapter.reset(); jest.restoreAllMocks(); }); it('should call method acceptInvitation correctly', async () => { const res = await helper.acceptInvitation(auth0ActionApi, { receiverAuth0Id: user.user_id, inviterMemberId: members.inviter.id, }); expect(res.data.data).toEqual(acceptanceRes); }); it('should call method getServerAccessKey correctly', async () => { const res = await helper.getServerAccessKey(auth0ActionApi); expect(res).toEqual(serverAccessKey); }); it('should call method getUserToken correctly', async () => { const res = await helper.getUserToken(); expect(res.data).toEqual(auth0UserToken.data); }); it('should call method searchChangePasswordRequestSucceededLogs correctly', async () => { const res = await helper.searchChangePasswordRequestSucceededLogs( auth0ActionEvent, auth0UserToken, ); expect(res.data).toEqual(scprLogs); }); it('should call method searchSuccessChangePasswordLogs correctly', async () => { const res = await helper.searchSuccessChangePasswordLogs( auth0ActionEvent, auth0UserToken, ); expect(res.data).toEqual(scpLogs); }); it('should success execute the main function of post-change-password helper', async () => { const res = await helper.exec(auth0ActionEvent, auth0ActionApi); expect(res).toEqual(acceptanceRes); }); });