@earnaha/auth0-action-helper
Version:
AHA auth0 action helper
626 lines (594 loc) • 22.3 kB
JavaScript
/* 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 PostLoginHelper = require('../post.login.js');
describe('PostLoginHelper Class', () => {
const nowTime = new Date('2023-09-27T16:19:22.123Z');
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: {},
roles: ['student'],
identities: [
{
access_token:
'ya29.a0AWY7CknGEOnVD-7zqcCjysZXCTJyYituZ5eaXTc4zmCW-iG2Na-4vyCwl9rHJ1T0uB0oqPRC2fmQKY0-wlU1AxYGnnwXBnaZIJKmGB2ygPbLSxjP0uVOe7gKum0OEzLN9KZSx6_AL0BMhjSQWIC0co7hQQyH2LUaCgYKAdISARMSFQG1tDrpRFvzPkX6hhpGK7DLZYsOFg0166',
connection: 'google-oauth2',
expires_in: 3599,
isSocial: true,
profileData: {
email: 'krystel_konopelski@yahoo.com',
email_verified: true,
family_name: 'konopelski',
given_name: 'krystel',
locale: 'zh-TW',
name: 'krystel konopelski',
picture:
'https://lh3.googleusercontent.com/a/AGNmyxYotR-HeDwWbj-awKJYNKnsZiVoztJ_2_9VoSAL=s96-c',
},
provider: 'google-oauth2',
user_id: 'q0ugvfad7scksuczsw3fpxxl',
},
],
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',
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-08-23T03:45:33.758Z',
createdAt: '2023-08-23T03:45:33.758Z',
lastPasswordResetAt: null,
},
};
const users = {
[members.inviter.auth0Id]: {
user_id: members.inviter.auth0Id,
created_at: members.inviter.createdAt,
email: members.inviter.email,
email_verified: members.inviter.emailVerified,
family_name: 'Russel',
given_name: 'Magdalena',
identities: members.inviter.identities,
locale: 'en',
name: members.inviter.name,
nickname: members.inviter.nickname,
picture: members.inviter.picture,
updated_at: members.inviter.updatedAt,
app_metadata: members.inviter.appMetadata,
user_metadata: members.inviter.userMetadata,
last_ip: members.inviter.lastIp,
last_login: members.inviter.lastLoginAt,
logins_count: members.inviter.loginsCount,
blocked_for: [],
guardian_authenticators: [],
},
[members.receiver.auth0Id]: {
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: members.receiver.name,
nickname: members.receiver.nickname,
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: [],
},
secondary: {
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: members.receiver.name,
nickname: members.receiver.nickname,
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: [],
},
primary: {
created_at: '2023-09-21T15:38:02.347Z',
email: members.receiver.email,
email_verified: false,
identities: [
{
connection: 'Username-Password-Authentication',
provider: 'auth0',
user_id: '650c635aa56706e4f2cc77c1',
isSocial: false,
},
],
name: 'jest.ut+2023092105',
nickname: 'jest.ut.2023092105.3mfjq2ute',
picture:
'https://s.gravatar.com/avatar/4c371dc5b3b209890c3aef4f3e57f7ed?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fje.png',
updated_at: '2023-09-21T15:38:14.302Z',
user_id: 'auth0|650c635aa56706e4f2cc77c1',
user_metadata: {
memberId: 'cc1a1381-cf67-40df-931a-92502ddd44ca',
},
last_ip: '150.116.99.86',
last_login: '2023-09-21T15:38:02.344Z',
logins_count: 1,
blocked_for: [],
guardian_authenticators: [],
passkeys: [],
},
merged: {
created_at: '2023-09-21T15:38:02.347Z',
email: members.receiver.email,
email_verified: false,
identities: [
{
connection: 'Username-Password-Authentication',
provider: 'auth0',
user_id: '650c635aa56706e4f2cc77c1',
isSocial: false,
},
{
connection: 'Username-Password-Authentication',
isSocial: false,
provider: 'auth0',
user_id: '6423f2abe532c863e93f677a',
profileData: {
email: members.receiver.email,
email_verified: false,
},
},
],
name: 'jest.ut+2023092105',
nickname: 'jest.ut.2023092105.3mfjq2ute',
picture:
'https://s.gravatar.com/avatar/4c371dc5b3b209890c3aef4f3e57f7ed?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fje.png',
updated_at: '2023-09-21T15:38:14.302Z',
user_id: 'auth0|650c635aa56706e4f2cc77c1',
user_metadata: { memberId: 'cc1a1381-cf67-40df-931a-92502ddd44ca' },
last_ip: '150.116.99.86',
last_login: '2023-09-21T15:38:02.344Z',
logins_count: 1,
blocked_for: [],
guardian_authenticators: [],
passkeys: [],
},
};
const payload = {
auth0Id: 'auth0|650c635aa56706e4f2cc77c1',
email: members.receiver.email,
nickname: 'jest.ut.2023092105.3mfjq2ute',
name: 'jest.ut+2023092105',
picture:
'https://s.gravatar.com/avatar/4c371dc5b3b209890c3aef4f3e57f7ed?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fje.png',
loginsCount: 2,
lastIp: '2403:c300:5558:1a86:ebd1:7e49:e45e:2963',
emailVerified: false,
scope: '',
appMetadata: undefined,
userMetadata: {},
roles: undefined,
identities: [
{
connection: 'Username-Password-Authentication',
provider: 'auth0',
user_id: '650c635aa56706e4f2cc77c1',
isSocial: false,
},
{
connection: 'Username-Password-Authentication',
isSocial: false,
provider: 'auth0',
user_id: '6423f2abe532c863e93f677a',
profileData: {
email: members.receiver.email,
email_verified: false,
},
},
],
language: 'en',
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',
},
service: 'aha-local',
};
const loginRes = {
data: {
isSignup: true,
member: {
accessToken:
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6W10sImNvdW50cnkiOiJUVyIsInRpbWV6b25lIjoiQXNpYS9UYWlwZWkiLCJpYXQiOjE2ODM2Mzg1MDUsImV4cCI6MTY4Mzg5NzcwNSwiYXVkIjoiYWhhLWdhbW1hIiwic3ViIjoiZTRmODZjOTEtNGVlNy00NGRiLTk1MzMtYmYzOTc5MWVmMTUzIiwianRpIjoiNzFmNThkNzAtZWU2Yy0xMWVkLTg2YmYtYmQ4YTljMmJjNThkIn0.QhLnUb_Y03cE0AJGzWYR7UXzMO8msP-tJaM1UifzAqlA6Q8B0Ozobbt90jCCxdUa40EvwBIGiKU4NuVfqHw2HLSNkiT5NBpIHkObenO-B4xlWkSKEYJdM0lH8zUasIj9hnSjLix0ignyAoKrps4cnh_HBRXDBvoU6CX6isCCwLo',
accessTokenExpiredIn: 259200000,
appMetadata: {},
auth0Id: users.merged.user_id,
createdAt: users.merged.created_at,
email: users.merged.email,
emailVerified: users.merged.email_verified,
geoip: members.receiver.geoip,
id: 'e4f86c91-4ee7-44db-9533-bf39791ef153',
memberId: 'e4f86c91-4ee7-44db-9533-bf39791ef153',
identities: users.merged.identities,
language: null,
lastIp: '2403:c300:5956:d8f4:bf9f:6c7:a676:ffe6',
lastLoginAt: nowTime.toISOString(),
lastPasswordResetAt: null,
loginsCount: 1,
name: users.merged.name,
nickname: users.merged.nickname,
picture: users.merged.picture,
refreshToken:
'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2ODM2Mzg1MDUsImV4cCI6MTY4NDI0MzMwNSwiYXVkIjoiYWhhLWdhbW1hIiwic3ViIjoiZTRmODZjOTEtNGVlNy00NGRiLTk1MzMtYmYzOTc5MWVmMTUzIiwianRpIjoiNzFmNjAyYTAtZWU2Yy0xMWVkLTg2YmYtYmQ4YTljMmJjNThkIn0.Qr3sQcUca9SgjhUXwK0sGBBuP8PJ22sXhhXaAyjWJNimV2jOiJEZ38xRmXx_mXPEuXXlE7BcdlRRpn8dQfn4Dr3ztdKeMPaMzudKgQrr2CLIAUM3Df69J5-DOwTR0URkIOUdALl-L25BiMby57zD98WLFhdjvqwHttz-1Uo2sO4',
refreshTokenExpiredIn: 604800000,
roles: [],
updatedAt: users.merged.updated_at,
userMetadata: {
country: 'TW',
refer: `@student.a`,
referMemberId: '23f253bf-2524-498f-9aa0-a9e594793942',
timezone: 'Asia/Taipei',
},
},
referrer: {
...members.inviter,
updatedAt: nowTime.toISOString(),
userMetadata: {
country: 'TW',
invitedMemberIds: ['e4f86c91-4ee7-44db-9533-bf39791ef153'],
timezone: 'Asia/Taipei',
totalExtendedTimes: 0,
},
},
},
};
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: users[members.receiver.auth0Id],
stats: { logins_count: 0 },
};
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,
},
idToken: {
setCustomClaim: (_, value) => value,
},
accessToken: {
setCustomClaim: (_, value) => value,
},
user: {
setUserMetadata: (_, value) => value,
},
};
const serverAccessKey =
'b0p1Y3NSTmpDbmN6ckFWc0lVWnhYTllTaCswMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDArYWhhLWxvY2FsKzE3MDAyMDE5NjgwNTg=';
const auth0UserToken = {
data: {
access_token: `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImMyNUVPdVRVNEtvQVZPczJjdXh2MiJ9.eyJpc3MiOiJodHRwczovL2Rldi1vcXd1LmpwLmF1dGgwLmNvbS8iLCJzdWIiOiJzelBBbVNYQmpSN3dIWURGMUhZdm50TUE0R0RyT0pDUkBjbGllbnRzIiwiYXVkIjoiaHR0cHM6Ly9kZXYtb3F3dS5qcC5hdXRoMC5jb20vYXBpL3YyLyIsImlhdCI6MTY3NjA4NzEzMywiZXhwIjoxNjc2MTczNTMzLCJhenAiOiJzelBBbVNYQmpSN3dIWURGMUhZdm50TUE0R0RyT0pDUiIsInNjb3BlIjoicmVhZDpjbGllbnRfZ3JhbnRzIGNyZWF0ZTpjbGllbnRfZ3JhbnRzIGRlbGV0ZTpjbGllbnRfZ3JhbnRzIHVwZGF0ZTpjbGllbnRfZ3JhbnRzIHJlYWQ6dXNlcnMgdXBkYXRlOnVzZXJzIGRlbGV0ZTp1c2VycyBjcmVhdGU6dXNlcnMgcmVhZDp1c2Vyc19hcHBfbWV0YWRhdGEgdXBkYXRlOnVzZXJzX2FwcF9tZXRhZGF0YSBkZWxldGU6dXNlcnNfYXBwX21ldGFkYXRhIGNyZWF0ZTp1c2Vyc19hcHBfbWV0YWRhdGEgcmVhZDp1c2VyX2N1c3RvbV9ibG9ja3MgY3JlYXRlOnVzZXJfY3VzdG9tX2Jsb2NrcyBkZWxldGU6dXNlcl9jdXN0b21fYmxvY2tzIGNyZWF0ZTp1c2VyX3RpY2tldHMgcmVhZDpjbGllbnRzIHVwZGF0ZTpjbGllbnRzIGRlbGV0ZTpjbGllbnRzIGNyZWF0ZTpjbGllbnRzIHJlYWQ6Y2xpZW50X2tleXMgdXBkYXRlOmNsaWVudF9rZXlzIGRlbGV0ZTpjbGllbnRfa2V5cyBjcmVhdGU6Y2xpZW50X2tleXMgcmVhZDpjb25uZWN0aW9ucyB1cGRhdGU6Y29ubmVjdGlvbnMgZGVsZXRlOmNvbm5lY3Rpb25zIGNyZWF0ZTpjb25uZWN0aW9ucyByZWFkOnJlc291cmNlX3NlcnZlcnMgdXBkYXRlOnJlc291cmNlX3NlcnZlcnMgZGVsZXRlOnJlc291cmNlX3NlcnZlcnMgY3JlYXRlOnJlc291cmNlX3NlcnZlcnMgcmVhZDpkZXZpY2VfY3JlZGVudGlhbHMgdXBkYXRlOmRldmljZV9jcmVkZW50aWFscyBkZWxldGU6ZGV2aWNlX2NyZWRlbnRpYWxzIGNyZWF0ZTpkZXZpY2VfY3JlZGVudGlhbHMgcmVhZDpydWxlcyB1cGRhdGU6cnVsZXMgZGVsZXRlOnJ1bGVzIGNyZWF0ZTpydWxlcyByZWFkOnJ1bGVzX2NvbmZpZ3MgdXBkYXRlOnJ1bGVzX2NvbmZpZ3MgZGVsZXRlOnJ1bGVzX2NvbmZpZ3MgcmVhZDpob29rcyB1cGRhdGU6aG9va3MgZGVsZXRlOmhvb2tzIGNyZWF0ZTpob29rcyByZWFkOmFjdGlvbnMgdXBkYXRlOmFjdGlvbnMgZGVsZXRlOmFjdGlvbnMgY3JlYXRlOmFjdGlvbnMgcmVhZDplbWFpbF9wcm92aWRlciB1cGRhdGU6ZW1haWxfcHJvdmlkZXIgZGVsZXRlOmVtYWlsX3Byb3ZpZGVyIGNyZWF0ZTplbWFpbF9wcm92aWRlciBibGFja2xpc3Q6dG9rZW5zIHJlYWQ6c3RhdHMgcmVhZDppbnNpZ2h0cyByZWFkOnRlbmFudF9zZXR0aW5ncyB1cGRhdGU6dGVuYW50X3NldHRpbmdzIHJlYWQ6bG9ncyByZWFkOmxvZ3NfdXNlcnMgcmVhZDpzaGllbGRzIGNyZWF0ZTpzaGllbGRzIHVwZGF0ZTpzaGllbGRzIGRlbGV0ZTpzaGllbGRzIHJlYWQ6YW5vbWFseV9ibG9ja3MgZGVsZXRlOmFub21hbHlfYmxvY2tzIHVwZGF0ZTp0cmlnZ2VycyByZWFkOnRyaWdnZXJzIHJlYWQ6Z3JhbnRzIGRlbGV0ZTpncmFudHMgcmVhZDpndWFyZGlhbl9mYWN0b3JzIHVwZGF0ZTpndWFyZGlhbl9mYWN0b3JzIHJlYWQ6Z3VhcmRpYW5fZW5yb2xsbWVudHMgZGVsZXRlOmd1YXJkaWFuX2Vucm9sbG1lbnRzIGNyZWF0ZTpndWFyZGlhbl9lbnJvbGxtZW50X3RpY2tldHMgcmVhZDp1c2VyX2lkcF90b2tlbnMgY3JlYXRlOnBhc3N3b3Jkc19jaGVja2luZ19qb2IgZGVsZXRlOnBhc3N3b3Jkc19jaGVja2luZ19qb2IgcmVhZDpjdXN0b21fZG9tYWlucyBkZWxldGU6Y3VzdG9tX2RvbWFpbnMgY3JlYXRlOmN1c3RvbV9kb21haW5zIHVwZGF0ZTpjdXN0b21fZG9tYWlucyByZWFkOmVtYWlsX3RlbXBsYXRlcyBjcmVhdGU6ZW1haWxfdGVtcGxhdGVzIHVwZGF0ZTplbWFpbF90ZW1wbGF0ZXMgcmVhZDptZmFfcG9saWNpZXMgdXBkYXRlOm1mYV9wb2xpY2llcyByZWFkOnJvbGVzIGNyZWF0ZTpyb2xlcyBkZWxldGU6cm9sZXMgdXBkYXRlOnJvbGVzIHJlYWQ6cHJvbXB0cyB1cGRhdGU6cHJvbXB0cyByZWFkOmJyYW5kaW5nIHVwZGF0ZTpicmFuZGluZyBkZWxldGU6YnJhbmRpbmcgcmVhZDpsb2dfc3RyZWFtcyBjcmVhdGU6bG9nX3N0cmVhbXMgZGVsZXRlOmxvZ19zdHJlYW1zIHVwZGF0ZTpsb2dfc3RyZWFtcyBjcmVhdGU6c2lnbmluZ19rZXlzIHJlYWQ6c2lnbmluZ19rZXlzIHVwZGF0ZTpzaWduaW5nX2tleXMgcmVhZDpsaW1pdHMgdXBkYXRlOmxpbWl0cyBjcmVhdGU6cm9sZV9tZW1iZXJzIHJlYWQ6cm9sZV9tZW1iZXJzIGRlbGV0ZTpyb2xlX21lbWJlcnMgcmVhZDplbnRpdGxlbWVudHMgcmVhZDphdHRhY2tfcHJvdGVjdGlvbiB1cGRhdGU6YXR0YWNrX3Byb3RlY3Rpb24gcmVhZDpvcmdhbml6YXRpb25zIHVwZGF0ZTpvcmdhbml6YXRpb25zIGNyZWF0ZTpvcmdhbml6YXRpb25zIGRlbGV0ZTpvcmdhbml6YXRpb25zIGNyZWF0ZTpvcmdhbml6YXRpb25fbWVtYmVycyByZWFkOm9yZ2FuaXphdGlvbl9tZW1iZXJzIGRlbGV0ZTpvcmdhbml6YXRpb25fbWVtYmVycyBjcmVhdGU6b3JnYW5pemF0aW9uX2Nvbm5lY3Rpb25zIHJlYWQ6b3JnYW5pemF0aW9uX2Nvbm5lY3Rpb25zIHVwZGF0ZTpvcmdhbml6YXRpb25fY29ubmVjdGlvbnMgZGVsZXRlOm9yZ2FuaXphdGlvbl9jb25uZWN0aW9ucyBjcmVhdGU6b3JnYW5pemF0aW9uX21lbWJlcl9yb2xlcyByZWFkOm9yZ2FuaXphdGlvbl9tZW1iZXJfcm9sZXMgZGVsZXRlOm9yZ2FuaXphdGlvbl9tZW1iZXJfcm9sZXMgY3JlYXRlOm9yZ2FuaXphdGlvbl9pbnZpdGF0aW9ucyByZWFkOm9yZ2FuaXphdGlvbl9pbnZpdGF0aW9ucyBkZWxldGU6b3JnYW5pemF0aW9uX2ludml0YXRpb25zIiwiZ3R5IjoiY2xpZW50LWNyZWRlbnRpYWxzIn0.rHOgYOAG_HYlrUKey6j9nkKvyKwt8q_rVliqEZSBwoBjZ3CvEMDA1vXLPQLfGUHUw3S3R6SSPUSHIkSKsu2TOmHXVBPiTEd-cCap5_5oGWABrymRTfT4fPO6HyEvgBXAPAnh8tetLYp5jXvsreYt-qafaM7CWpwYryFxKO0-bEyUSEkWIfFdDwheT90QMgrvzve5FMHCMv7nna-DsqlFAYoGLAcqgQaB0wd_Ker7pypNmrzIX08KOggA0We3loPL5p5uiRZiwjT5-HKuFPxDgGqUSU-LNAbgkpUulZ3q95d1oVKEYY-nGAEsagdEAiExrgG9SQ_4dT35vVpUdED3pQ`,
},
};
const linkAccountReplyFunc = args => {
const secondary = users[JSON.parse(args.data).user_id];
return [
200,
[
{ ...users.primary.identities[0] },
{
...secondary.identities[0],
profileData: {
email: secondary.email,
email_verified: secondary.email_verified,
},
},
],
];
};
let axiosMockAdapter;
let helper;
beforeAll(async () => {
axiosMockAdapter = new AxiosMockAdapter(axios);
});
beforeEach(async () => {
helper = new PostLoginHelper(envConfig);
helper.getServerAccessKey = jest
.fn()
.mockResolvedValue(serverAccessKey);
axiosMockAdapter
.onPost(`${envConfig.AUTH0_DOMAIN}/oauth/token`)
.reply(200, auth0UserToken.data);
axiosMockAdapter
.onGet(
`${envConfig.AUTH0_DOMAIN}/api/v2/users/${members.inviter.auth0Id}`,
)
.reply(200, users[members.inviter.auth0Id]);
axiosMockAdapter
.onGet(
`${envConfig.AUTH0_DOMAIN}/api/v2/users/${members.receiver.auth0Id}`,
)
.reply(200, users[members.receiver.auth0Id]);
axiosMockAdapter
.onPatch(
`${envConfig.AUTH0_DOMAIN}/api/v2/users/${members.inviter.auth0Id}`,
)
.reply(args => [
200,
{
...users[members.inviter.auth0Id],
...JSON.parse(args.data),
},
]);
axiosMockAdapter
.onPatch(
`${envConfig.AUTH0_DOMAIN}/api/v2/users/${members.receiver.auth0Id}`,
)
.reply(args => [
200,
{
...users[members.receiver.auth0Id],
...JSON.parse(args.data),
},
]);
axiosMockAdapter
.onPost(`${envConfig.DOMAIN}/auth/v3/login`)
.reply(200, loginRes);
});
afterEach(() => {
axiosMockAdapter.reset();
jest.restoreAllMocks();
});
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 getUsersByEmail correctly', async () => {
axiosMockAdapter
.onGet(
`${
envConfig.AUTH0_DOMAIN
}/api/v2/users-by-email?email=${encodeURIComponent(
members.receiver.email.toLowerCase(),
)}`,
)
.replyOnce(200, [users[members.receiver.auth0Id], users.primary]);
const res = await helper.getUsersByEmail(
members.receiver.email,
auth0UserToken,
);
expect(res.data).toEqual([
users[members.receiver.auth0Id],
users.primary,
]);
});
it('should call method linkAccount correctly', async () => {
axiosMockAdapter
.onPost(
`${envConfig.AUTH0_DOMAIN}/api/v2/users/${users.primary.user_id}/identities`,
)
.replyOnce(linkAccountReplyFunc);
const res = await helper.linkAccount(
users.primary.user_id,
users.secondary.user_id,
users.secondary.identities[0].provider,
auth0UserToken,
);
expect(res.data).toEqual(users.merged.identities);
});
it('should call method getUserById correctly', async () => {
const res = await helper.getUserById(
members.inviter.auth0Id,
auth0UserToken,
);
expect(res.data).toEqual(users[members.inviter.auth0Id]);
});
it('should call method updateUser correctly', async () => {
const updateValues = {
nickname: members.receiver.nickname,
name: members.receiver.name,
};
const res = await helper.updateUser(
users[members.receiver.auth0Id],
updateValues,
auth0UserToken,
);
expect(res.data).toEqual({
...users[members.receiver.auth0Id],
...updateValues,
});
});
it('should call method updateUserMetadata correctly', async () => {
const updateValues = {
country: 'TW',
invitedMemberIds: [members.receiver.id],
timezone: 'Asia/Taipei',
totalExtendedTimes: 0,
};
const res = await helper.updateUserMetadata(
users[members.inviter.auth0Id],
updateValues,
auth0UserToken,
);
expect(res.data).toEqual({
...users[members.inviter.auth0Id],
user_metadata: updateValues,
});
});
it('should call method setEmailVerified correctly', async () => {
const res = await helper.setEmailVerified(
users[members.receiver.auth0Id],
auth0UserToken,
);
expect(res.data).toEqual({
...users[members.receiver.auth0Id],
email_verified: true,
});
});
it('should call method api-auth login correctly', async () => {
const res = await helper.login(auth0ActionApi, payload);
expect(res.data).toEqual(loginRes);
});
it('should call method emailToNames correctly', async () => {
const genRounds = 30000; // 100000 takes 6 mins+, 30000 only needs around 45 seconds
const genNameAry = [];
for (let idx = 0; idx < genRounds; idx += 1) {
jest.useFakeTimers().setSystemTime(nowTime);
const res = helper.emailToNames(users.primary.email);
if (!genNameAry.includes(res.nickname)) {
genNameAry.push(res.nickname);
}
}
expect(genNameAry.length).toEqual(genRounds);
jest.useRealTimers();
});
it.skip('should success execute the main function of post-login helper', async () => {
axiosMockAdapter
.onGet(
`${
envConfig.AUTH0_DOMAIN
}/api/v2/users-by-email?email=${encodeURIComponent(
members.receiver.email.toLowerCase(),
)}`,
)
.replyOnce(200, [users[members.receiver.auth0Id], users.primary]);
axiosMockAdapter
.onPost(
`${envConfig.AUTH0_DOMAIN}/api/v2/users/${users.primary.user_id}/identities`,
)
.replyOnce(linkAccountReplyFunc);
jest.useFakeTimers().setSystemTime(nowTime);
const res = await helper.exec(auth0ActionEvent, auth0ActionApi);
expect(res).toEqual(loginRes.data);
jest.useRealTimers();
});
});