Skip to content

Commit a96ad94

Browse files
ID-1174 Combine loadTerraUser sam api calls into one
1 parent 89266f7 commit a96ad94

File tree

4 files changed

+45
-82
lines changed

4 files changed

+45
-82
lines changed

src/auth/auth.ts

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -480,20 +480,10 @@ export const loadTerraUser = async (): Promise<void> => {
480480
try {
481481
const signInStatus = 'userLoaded';
482482
const getProfile = Ajax().User.profile.get();
483-
const getAllowances = Ajax().User.getUserAllowances();
484-
const getAttributes = Ajax().User.getUserAttributes();
485-
const getTermsOfService = Ajax().TermsOfService.getUserTermsOfServiceDetails();
486-
const getEnterpriseFeatures = Ajax().User.getEnterpriseFeatures();
487-
const getSamUser = Ajax().User.getSamUserResponse();
488-
const [profile, terraUserAllowances, terraUserAttributes, termsOfService, enterpriseFeatures, samUser] =
489-
await Promise.all([
490-
getProfile,
491-
getAllowances,
492-
getAttributes,
493-
getTermsOfService,
494-
getEnterpriseFeatures,
495-
getSamUser,
496-
]);
483+
const getCombinedState = Ajax().User.getSamUserCombinedState();
484+
const [profile, terraUserCombinedState] = await Promise.all([getProfile, getCombinedState]);
485+
const { terraUserAttributes, enterpriseFeatures, samUser, terraUserAllowances, termsOfService } =
486+
terraUserCombinedState;
497487
clearNotification(sessionTimeoutProps.id);
498488
userStore.update((state: TerraUserState) => ({
499489
...state,

src/auth/login.test.ts

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { loadTerraUser } from 'src/auth/auth';
55
import { Ajax } from 'src/libs/ajax';
66
import { GroupRole } from 'src/libs/ajax/Groups';
77
import { SamUserTermsOfServiceDetails } from 'src/libs/ajax/TermsOfService';
8-
import { SamUserResponse } from 'src/libs/ajax/User';
9-
import { TerraUserState, userStore } from 'src/libs/state';
8+
import { SamUserAttributes, SamUserCombinedStateResponse, SamUserResponse } from 'src/libs/ajax/User';
9+
import { userStore } from 'src/libs/state';
1010

1111
jest.mock('src/libs/ajax');
1212

@@ -67,6 +67,14 @@ const testSamUserAllowances = {
6767
details: testSamUserAllowancesDetails,
6868
};
6969

70+
const mockSamUserCombinedState: SamUserCombinedStateResponse = {
71+
samUser: mockSamUserResponse,
72+
terraUserAllowances: testSamUserAllowances,
73+
terraUserAttributes: { marketingConsent: false } as SamUserAttributes,
74+
termsOfService: mockSamUserTermsOfServiceDetails,
75+
enterpriseFeatures: [],
76+
};
77+
7078
const mockNihDatasetPermission = {
7179
name: 'testNihDatasetPermissionName',
7280
authorized: true,
@@ -92,25 +100,17 @@ describe('a request to load a terra user', () => {
92100
});
93101
describe('when successful', () => {
94102
// Arrange (shared between tests for the success case)
95-
const getUserAllowancesFunction = jest.fn().mockResolvedValue(testSamUserAllowances);
96-
const getUserAttributesFunction = jest.fn().mockResolvedValue({ marketingConsent: false });
97-
const getUserTermsOfServiceDetailsFunction = jest.fn().mockResolvedValue(mockSamUserTermsOfServiceDetails);
98-
const getEnterpriseFeaturesFunction = jest.fn().mockResolvedValue([]);
99-
const getSamUserResponseFunction = jest.fn().mockResolvedValue(mockSamUserResponse);
100-
const getNihStatusFunction = jest.fn().mockResolvedValue(mockOrchestrationNihStatusResponse);
101-
const getFenceStatusFunction = jest.fn().mockResolvedValue({});
103+
const getSamUserCombinedStateMock = jest.fn().mockResolvedValue(mockSamUserCombinedState);
104+
const getNihStatusMock = jest.fn().mockResolvedValue(mockOrchestrationNihStatusResponse);
105+
const getFenceStatusMock = jest.fn().mockResolvedValue({});
102106

103107
asMockedFn(Ajax).mockImplementation(
104108
() =>
105109
({
106110
User: {
107-
getUserAllowances: getUserAllowancesFunction,
108-
getUserAttributes: getUserAttributesFunction,
109-
getUserTermsOfServiceDetails: getUserTermsOfServiceDetailsFunction,
110-
getEnterpriseFeatures: getEnterpriseFeaturesFunction,
111-
getSamUserResponse: getSamUserResponseFunction,
112-
getNihStatus: getNihStatusFunction,
113-
getFenceStatus: getFenceStatusFunction,
111+
getSamUserCombinedState: getSamUserCombinedStateMock,
112+
getNihStatus: getNihStatusMock,
113+
getFenceStatus: getFenceStatusMock,
114114
profile: {
115115
get: jest.fn().mockReturnValue(mockTerraUserProfile),
116116
},
@@ -128,39 +128,27 @@ describe('a request to load a terra user', () => {
128128
await act(() => loadTerraUser());
129129

130130
// Assert
131-
expect(getSamUserResponseFunction).toHaveBeenCalled();
131+
expect(getSamUserCombinedStateMock).toHaveBeenCalled();
132132
});
133133
it('should update the samUser in state', async () => {
134134
// Act
135135
await act(() => loadTerraUser());
136136

137-
let samUser;
138-
await act(async () => {
139-
samUser = await getSamUserResponseFunction.mock.results[0].value;
140-
});
141-
userStore.update((state: TerraUserState) => ({
142-
...state,
143-
samUser,
144-
}));
145137
// Assert
146-
expect(getSamUserResponseFunction).toHaveBeenCalled();
138+
expect(getSamUserCombinedStateMock).toHaveBeenCalled();
147139
expect(userStore.get().samUser).toEqual(mockSamUserResponse);
148140
});
149141
describe('when not successful', () => {
150142
it('should fail with an error', async () => {
151143
// // Arrange
152144
// mock a failure to get samUserResponse
153-
const getSamUserResponseFunction = jest.fn().mockRejectedValue(new Error('unknown'));
145+
const getSamUserCombinedStateMockFailure = jest.fn().mockRejectedValue(new Error('unknown'));
154146

155147
asMockedFn(Ajax).mockImplementation(
156148
() =>
157149
({
158150
User: {
159-
getUserAllowances: getUserAllowancesFunction,
160-
getUserAttributes: getUserAttributesFunction,
161-
getUserTermsOfServiceDetails: getUserTermsOfServiceDetailsFunction,
162-
getEnterpriseFeatures: getEnterpriseFeaturesFunction,
163-
getSamUserResponse: getSamUserResponseFunction,
151+
getSamUserCombinedState: getSamUserCombinedStateMockFailure,
164152
profile: {
165153
get: jest.fn().mockReturnValue(mockTerraUserProfile),
166154
},

src/libs/ajax/User.ts

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import _ from 'lodash/fp';
22
import { authOpts, fetchOrchestration, fetchSam, jsonBody } from 'src/libs/ajax/ajax-common';
3+
import { SamUserTermsOfServiceDetails } from 'src/libs/ajax/TermsOfService';
34
import { TerraUserProfile } from 'src/libs/state';
45

56
export interface SamUserRegistrationStatusResponse {
@@ -162,6 +163,14 @@ export type SamUserAttributesRequest = {
162163
marketingConsent: boolean | undefined;
163164
};
164165

166+
export type SamUserCombinedStateResponse = {
167+
samUser: SamUserResponse;
168+
terraUserAllowances: SamUserAllowances;
169+
terraUserAttributes: SamUserAttributes;
170+
termsOfService: SamUserTermsOfServiceDetails;
171+
enterpriseFeatures: string[];
172+
};
173+
165174
export type OrchestrationUserRegistrationRequest = object;
166175

167176
export const User = (signal?: AbortSignal) => {
@@ -171,11 +180,6 @@ export const User = (signal?: AbortSignal) => {
171180
return res.json();
172181
},
173182

174-
getUserAllowances: async (): Promise<SamUserAllowances> => {
175-
const res = await fetchSam('api/users/v2/self/allowed', _.mergeAll([authOpts(), { signal }]));
176-
return res.json();
177-
},
178-
179183
getUserAttributes: async (): Promise<SamUserAttributes> => {
180184
const res = await fetchSam('api/users/v2/self/attributes', _.mergeAll([authOpts(), { signal }]));
181185
return res.json().then((obj) => {
@@ -192,17 +196,9 @@ export const User = (signal?: AbortSignal) => {
192196
return res.json();
193197
},
194198

195-
getEnterpriseFeatures: async (): Promise<string[]> => {
196-
try {
197-
const res = await fetchSam(
198-
'/api/resources/v2?format=flat&resourceTypes=enterprise-feature&roles=user',
199-
_.mergeAll([authOpts(), { signal }])
200-
);
201-
const json = await res.json();
202-
return json.resources.map((resource) => resource.resourceId);
203-
} catch (error: unknown) {
204-
return [];
205-
}
199+
getSamUserCombinedState: async (): Promise<SamUserCombinedStateResponse> => {
200+
const res = await fetchSam('/api/user/v2/self/combinedState', _.mergeAll([authOpts(), { signal }]));
201+
return res.json();
206202
},
207203

208204
registerWithProfile: async (
@@ -267,21 +263,6 @@ export const User = (signal?: AbortSignal) => {
267263
return res.json();
268264
},
269265

270-
getSamUserResponse: async (): Promise<SamUserResponse> => {
271-
const res = await fetchSam('api/users/v2/self', _.mergeAll([authOpts(), { method: 'GET' }]));
272-
const json = await res.json();
273-
return {
274-
id: json.id,
275-
googleSubjectId: json.googleSubjectId,
276-
email: json.email,
277-
azureB2CId: json.azureB2CId,
278-
allowed: json.allowed,
279-
createdAt: json.createdAt ? new Date(json.createdAt) : undefined,
280-
registeredAt: json.registeredAt ? new Date(json.registeredAt) : undefined,
281-
updatedAt: json.updatedAt ? new Date(json.updatedAt) : undefined,
282-
};
283-
},
284-
285266
getNihStatus: async (): Promise<OrchestrationNihStatusResponse | undefined> => {
286267
try {
287268
const res = await fetchOrchestration('api/nih/status', _.merge(authOpts(), { signal }));

src/registration/terms-of-service/TermsOfServicePage.test.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { act, fireEvent, screen } from '@testing-library/react';
33
import { h } from 'react-hyperscript-helpers';
44
import { Ajax } from 'src/libs/ajax';
55
import { SamUserTermsOfServiceDetails } from 'src/libs/ajax/TermsOfService';
6-
import { SamUserAllowances, SamUserResponse } from 'src/libs/ajax/User';
6+
import { SamUserAttributes, SamUserCombinedStateResponse } from 'src/libs/ajax/User';
77
import { AuthState, authStore } from 'src/libs/state';
88
import { TermsOfServicePage } from 'src/registration/terms-of-service/TermsOfServicePage';
99
import { asMockedFn, renderWithAppContexts as render } from 'src/testing/test-utils';
@@ -71,6 +71,13 @@ const setupMockAjax = async (
7171
registeredAt: new Date('1970-01-01'),
7272
updatedAt: new Date('1970-01-01'),
7373
};
74+
const mockSamUserCombinedState: SamUserCombinedStateResponse = {
75+
samUser: mockSamUserResponse,
76+
terraUserAllowances,
77+
terraUserAttributes: { marketingConsent: false } as SamUserAttributes,
78+
termsOfService,
79+
enterpriseFeatures: [],
80+
};
7481
const getTermsOfServiceText = jest.fn().mockResolvedValue('some text');
7582
const getUserTermsOfServiceDetails = jest
7683
.fn()
@@ -89,10 +96,7 @@ const setupMockAjax = async (
8996
captureEvent: jest.fn(),
9097
},
9198
User: {
92-
getUserAttributes: jest.fn().mockResolvedValue({ marketingConsent: true }),
93-
getUserAllowances: jest.fn().mockResolvedValue(terraUserAllowances),
94-
getEnterpriseFeatures: jest.fn().mockResolvedValue([]),
95-
getSamUserResponse: jest.fn().mockResolvedValue(mockSamUserResponse),
99+
getSamUserCombinedState: mockSamUserCombinedState,
96100
profile: {
97101
get: jest.fn().mockResolvedValue({ keyValuePairs: [] }),
98102
update: jest.fn().mockResolvedValue({ keyValuePairs: [] }),

0 commit comments

Comments
 (0)