Skip to content

Commit fe3f9bd

Browse files
authored
UIE-204 Narrow Ajax Usage pt5 (#5126)
1 parent b79e668 commit fe3f9bd

15 files changed

+142
-184
lines changed

src/workspaces/dashboard/AzureStorageDetails.test.ts

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,18 @@ import * as clipboard from 'clipboard-polyfill/text';
44
import { axe } from 'jest-axe';
55
import _ from 'lodash/fp';
66
import { dl, h } from 'react-hyperscript-helpers';
7-
import { Ajax } from 'src/libs/ajax';
7+
import { Metrics, MetricsContract } from 'src/libs/ajax/Metrics';
88
import { azureRegions } from 'src/libs/azure-regions';
99
import Events, { extractWorkspaceDetails } from 'src/libs/events';
10-
import { asMockedFn, renderWithAppContexts as render } from 'src/testing/test-utils';
10+
import { asMockedFn, partial, renderWithAppContexts as render } from 'src/testing/test-utils';
1111
import {
1212
defaultAzureStorageOptions,
1313
defaultAzureWorkspace,
1414
defaultGoogleBucketOptions,
1515
} from 'src/testing/workspace-fixtures';
1616
import { AzureStorageDetails, AzureStorageDetailsProps } from 'src/workspaces/dashboard/AzureStorageDetails';
1717

18-
type AjaxContract = ReturnType<typeof Ajax>;
19-
20-
jest.mock('src/libs/ajax');
18+
jest.mock('src/libs/ajax/Metrics');
2119

2220
type ClipboardPolyfillExports = typeof import('clipboard-polyfill/text');
2321
jest.mock('clipboard-polyfill/text', (): ClipboardPolyfillExports => {
@@ -87,12 +85,7 @@ describe('AzureStorageDetails', () => {
8785
// Arrange
8886
const user = userEvent.setup();
8987
const captureEvent = jest.fn();
90-
asMockedFn(Ajax).mockImplementation(
91-
() =>
92-
({
93-
Metrics: { captureEvent } as Partial<AjaxContract['Metrics']>,
94-
} as Partial<AjaxContract> as AjaxContract)
95-
);
88+
asMockedFn(Metrics).mockReturnValue(partial<MetricsContract>({ captureEvent }));
9689
render(dl([h(AzureStorageDetails, azureStorageDetailsProps)]));
9790

9891
// Act
@@ -108,12 +101,8 @@ describe('AzureStorageDetails', () => {
108101
// Arrange
109102
const user = userEvent.setup();
110103
const captureEvent = jest.fn();
111-
asMockedFn(Ajax).mockImplementation(
112-
() =>
113-
({
114-
Metrics: { captureEvent } as Partial<AjaxContract['Metrics']>,
115-
} as Partial<AjaxContract> as AjaxContract)
116-
);
104+
asMockedFn(Metrics).mockReturnValue(partial<MetricsContract>({ captureEvent }));
105+
117106
render(dl([h(AzureStorageDetails, azureStorageDetailsProps)]));
118107

119108
// Act
@@ -129,12 +118,8 @@ describe('AzureStorageDetails', () => {
129118
// Arrange
130119
const user = userEvent.setup();
131120
const captureEvent = jest.fn();
132-
asMockedFn(Ajax).mockImplementation(
133-
() =>
134-
({
135-
Metrics: { captureEvent } as Partial<AjaxContract['Metrics']>,
136-
} as Partial<AjaxContract> as AjaxContract)
137-
);
121+
asMockedFn(Metrics).mockReturnValue(partial<MetricsContract>({ captureEvent }));
122+
138123
render(dl([h(AzureStorageDetails, azureStorageDetailsProps)]));
139124

140125
// Act

src/workspaces/dashboard/AzureStorageDetails.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { h } from 'react-hyperscript-helpers';
33
import { ClipboardButton } from 'src/components/ClipboardButton';
44
import { TooltipCell } from 'src/components/table';
55
import { ReactComponent as AzureLogo } from 'src/images/azure.svg';
6-
import { Ajax } from 'src/libs/ajax';
6+
import { Metrics } from 'src/libs/ajax/Metrics';
77
import { getRegionFlag, getRegionLabel } from 'src/libs/azure-utils';
88
import Events, { EventWorkspaceDetails } from 'src/libs/events';
99
import { StorageDetails } from 'src/workspaces/common/state/useWorkspace';
@@ -41,7 +41,7 @@ export const AzureStorageDetails = (props: AzureStorageDetailsProps): ReactNode
4141
text: azureContext.managedResourceGroupId,
4242
style: { marginLeft: '0.25rem' },
4343
onClick: (_) => {
44-
Ajax().Metrics.captureEvent(Events.workspaceDashboardCopyResourceGroup, {
44+
void Metrics().captureEvent(Events.workspaceDashboardCopyResourceGroup, {
4545
...eventWorkspaceDetails,
4646
});
4747
},
@@ -54,7 +54,7 @@ export const AzureStorageDetails = (props: AzureStorageDetailsProps): ReactNode
5454
text: storageDetails.azureContainerUrl || '',
5555
style: { marginLeft: '0.25rem' },
5656
onClick: (_) => {
57-
Ajax().Metrics.captureEvent(Events.workspaceDashboardCopyStorageContainerUrl, {
57+
void Metrics().captureEvent(Events.workspaceDashboardCopyStorageContainerUrl, {
5858
...eventWorkspaceDetails,
5959
});
6060
},
@@ -67,7 +67,7 @@ export const AzureStorageDetails = (props: AzureStorageDetailsProps): ReactNode
6767
text: storageDetails.azureContainerSasUrl || '',
6868
style: { marginLeft: '0.25rem' },
6969
onClick: (_) => {
70-
Ajax().Metrics.captureEvent(Events.workspaceDashboardCopySASUrl, {
70+
void Metrics().captureEvent(Events.workspaceDashboardCopySASUrl, {
7171
...eventWorkspaceDetails,
7272
});
7373
},

src/workspaces/dashboard/BucketLocation.test.ts

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { asMockedFn } from '@terra-ui-packages/test-utils';
1+
import { asMockedFn, partial } from '@terra-ui-packages/test-utils';
22
import { act, screen } from '@testing-library/react';
33
import userEvent from '@testing-library/user-event';
44
import { axe } from 'jest-axe';
55
import _ from 'lodash/fp';
66
import { h } from 'react-hyperscript-helpers';
7-
import { Ajax, AjaxContract } from 'src/libs/ajax';
8-
import { WorkspacesAjaxContract } from 'src/libs/ajax/workspaces/Workspaces';
7+
import { Metrics, MetricsContract } from 'src/libs/ajax/Metrics';
8+
import { WorkspaceContract, Workspaces, WorkspacesAjaxContract } from 'src/libs/ajax/workspaces/Workspaces';
99
import Events, { extractWorkspaceDetails } from 'src/libs/events';
1010
import { renderWithAppContexts as render } from 'src/testing/test-utils';
1111
import {
@@ -17,7 +17,8 @@ import {
1717
import { BucketLocation } from 'src/workspaces/dashboard/BucketLocation';
1818
import { GoogleWorkspace } from 'src/workspaces/utils';
1919

20-
jest.mock('src/libs/ajax');
20+
jest.mock('src/libs/ajax/Metrics');
21+
jest.mock('src/libs/ajax/workspaces/Workspaces');
2122

2223
jest.mock('src/libs/notifications');
2324

@@ -107,19 +108,16 @@ describe('BucketLocation', () => {
107108
defaultAzureStorageOptions,
108109
]),
109110
};
110-
asMockedFn(Ajax).mockImplementation(
111-
() =>
112-
({
113-
Workspaces: {
114-
workspace: () =>
115-
({
116-
checkBucketLocation: jest.fn().mockResolvedValue({
117-
location: 'bermuda',
118-
locationType: 'triangle',
119-
}),
120-
} as Partial<ReturnType<WorkspacesAjaxContract['workspace']>>),
121-
} as Partial<WorkspacesAjaxContract>,
122-
} as Partial<AjaxContract> as AjaxContract)
111+
asMockedFn(Workspaces).mockReturnValue(
112+
partial<WorkspacesAjaxContract>({
113+
workspace: () =>
114+
partial<WorkspaceContract>({
115+
checkBucketLocation: jest.fn().mockResolvedValue({
116+
location: 'bermuda',
117+
locationType: 'triangle',
118+
}),
119+
}),
120+
})
123121
);
124122

125123
// Act
@@ -142,18 +140,16 @@ describe('BucketLocation', () => {
142140
]),
143141
};
144142
const captureEvent = jest.fn();
145-
asMockedFn(Ajax).mockImplementation(
146-
() =>
147-
({
148-
Metrics: { captureEvent } as Partial<AjaxContract['Metrics']>,
149-
Workspaces: {
150-
workspace: () =>
151-
({
152-
checkBucketLocation: () => Promise.reject(mockBucketRequesterPaysError),
153-
} as Partial<ReturnType<WorkspacesAjaxContract['workspace']>>),
154-
} as Partial<WorkspacesAjaxContract>,
155-
} as Partial<AjaxContract> as AjaxContract)
143+
asMockedFn(Metrics).mockReturnValue(partial<MetricsContract>({ captureEvent }));
144+
asMockedFn(Workspaces).mockReturnValue(
145+
partial<WorkspacesAjaxContract>({
146+
workspace: () =>
147+
partial<WorkspaceContract>({
148+
checkBucketLocation: () => Promise.reject(mockBucketRequesterPaysError),
149+
}),
150+
})
156151
);
152+
157153
// Act
158154
await act(async () => { render(h(BucketLocation, props)) }) //eslint-disable-line
159155

src/workspaces/dashboard/BucketLocation.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { ButtonSecondary } from 'src/components/common';
55
import { icon } from 'src/components/icons';
66
import { getRegionInfo } from 'src/components/region-common';
77
import { TooltipCell } from 'src/components/table';
8-
import { Ajax } from 'src/libs/ajax';
8+
import { Metrics } from 'src/libs/ajax/Metrics';
9+
import { Workspaces } from 'src/libs/ajax/workspaces/Workspaces';
910
import { reportError } from 'src/libs/error';
1011
import Events, { extractWorkspaceDetails } from 'src/libs/events';
1112
import { useCancellation } from 'src/libs/react-utils';
@@ -37,8 +38,8 @@ export const BucketLocation = requesterPaysWrapper({ onDismiss: _.noop })((props
3738
const {
3839
workspace: { namespace, name, googleProject, bucketName },
3940
} = workspace;
40-
const response = await Ajax(signal)
41-
.Workspaces.workspace(namespace, name)
41+
const response = await Workspaces(signal)
42+
.workspace(namespace, name)
4243
.checkBucketLocation(googleProject, bucketName);
4344
setBucketLocation(response);
4445
} catch (error) {
@@ -94,7 +95,7 @@ export const BucketLocation = requesterPaysWrapper({ onDismiss: _.noop })((props
9495
style: { height: '1rem', marginLeft: '1ch' },
9596
onClick: () => {
9697
setShowRequesterPaysModal(true);
97-
Ajax().Metrics.captureEvent(
98+
void Metrics().captureEvent(
9899
Events.workspaceDashboardBucketRequesterPays,
99100
extractWorkspaceDetails(workspace)
100101
);

src/workspaces/dashboard/CloudInformation.test.ts

Lines changed: 47 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { DeepPartial } from '@terra-ui-packages/core-utils';
2-
import { asMockedFn } from '@terra-ui-packages/test-utils';
1+
import { asMockedFn, partial } from '@terra-ui-packages/test-utils';
32
import { act, screen } from '@testing-library/react';
43
import userEvent from '@testing-library/user-event';
54
import * as clipboard from 'clipboard-polyfill/text';
65
import { h } from 'react-hyperscript-helpers';
7-
import { Ajax } from 'src/libs/ajax';
6+
import { Metrics, MetricsContract } from 'src/libs/ajax/Metrics';
7+
import { WorkspaceContract, Workspaces, WorkspacesAjaxContract } from 'src/libs/ajax/workspaces/Workspaces';
88
import Events, { extractWorkspaceDetails } from 'src/libs/events';
99
import { renderWithAppContexts as render } from 'src/testing/test-utils';
1010
import {
@@ -16,15 +16,8 @@ import {
1616
import { StorageDetails } from 'src/workspaces/common/state/useWorkspace';
1717
import { CloudInformation } from 'src/workspaces/dashboard/CloudInformation';
1818

19-
type AjaxContract = ReturnType<typeof Ajax>;
20-
type AjaxExports = typeof import('src/libs/ajax');
21-
22-
jest.mock('src/libs/ajax', (): AjaxExports => {
23-
return {
24-
...jest.requireActual('src/libs/ajax'),
25-
Ajax: jest.fn(),
26-
};
27-
});
19+
jest.mock('src/libs/ajax/Metrics');
20+
jest.mock('src/libs/ajax/workspaces/Workspaces');
2821

2922
type ClipboardPolyfillExports = typeof import('clipboard-polyfill/text');
3023
jest.mock('clipboard-polyfill/text', (): ClipboardPolyfillExports => {
@@ -70,14 +63,15 @@ describe('CloudInformation', () => {
7063
// Arrange
7164
const mockBucketUsage = jest.fn();
7265
const mockStorageCostEstimate = jest.fn();
73-
asMockedFn(Ajax).mockReturnValue({
74-
Workspaces: {
75-
workspace: jest.fn().mockReturnValue({
76-
storageCostEstimate: mockStorageCostEstimate,
77-
bucketUsage: mockBucketUsage,
78-
}),
79-
},
80-
} as DeepPartial<AjaxContract> as AjaxContract);
66+
asMockedFn(Workspaces).mockReturnValue(
67+
partial<WorkspacesAjaxContract>({
68+
workspace: () =>
69+
partial<WorkspaceContract>({
70+
storageCostEstimate: mockStorageCostEstimate,
71+
bucketUsage: mockBucketUsage,
72+
}),
73+
})
74+
);
8175

8276
// Act
8377
render(
@@ -98,14 +92,15 @@ describe('CloudInformation', () => {
9892
estimate: '1 million dollars',
9993
lastUpdated: '2023-12-01',
10094
});
101-
asMockedFn(Ajax).mockReturnValue({
102-
Workspaces: {
103-
workspace: jest.fn().mockReturnValue({
104-
storageCostEstimate: mockStorageCostEstimate,
105-
bucketUsage: mockBucketUsage,
106-
}),
107-
},
108-
} as DeepPartial<AjaxContract> as AjaxContract);
95+
asMockedFn(Workspaces).mockReturnValue(
96+
partial<WorkspacesAjaxContract>({
97+
workspace: () =>
98+
partial<WorkspaceContract>({
99+
storageCostEstimate: mockStorageCostEstimate,
100+
bucketUsage: mockBucketUsage,
101+
}),
102+
})
103+
);
109104

110105
// Act
111106
await act(() =>
@@ -131,15 +126,16 @@ describe('CloudInformation', () => {
131126
const captureEvent = jest.fn();
132127
const mockBucketUsage = jest.fn();
133128
const mockStorageCostEstimate = jest.fn();
134-
asMockedFn(Ajax).mockReturnValue({
135-
Workspaces: {
136-
workspace: jest.fn().mockReturnValue({
137-
storageCostEstimate: mockStorageCostEstimate,
138-
bucketUsage: mockBucketUsage,
139-
}),
140-
},
141-
Metrics: { captureEvent } as Partial<AjaxContract['Metrics']>,
142-
} as DeepPartial<AjaxContract> as AjaxContract);
129+
asMockedFn(Workspaces).mockReturnValue(
130+
partial<WorkspacesAjaxContract>({
131+
workspace: () =>
132+
partial<WorkspaceContract>({
133+
storageCostEstimate: mockStorageCostEstimate,
134+
bucketUsage: mockBucketUsage,
135+
}),
136+
})
137+
);
138+
asMockedFn(Metrics).mockReturnValue(partial<MetricsContract>({ captureEvent }));
143139

144140
await act(() =>
145141
render(
@@ -191,14 +187,15 @@ describe('CloudInformation', () => {
191187
estimate: '2 dollars',
192188
lastUpdated: '2024-07-15',
193189
});
194-
asMockedFn(Ajax).mockReturnValue({
195-
Workspaces: {
196-
workspace: jest.fn().mockReturnValue({
197-
storageCostEstimate: mockStorageCostEstimate,
198-
bucketUsage: mockBucketUsage,
199-
}),
200-
},
201-
} as DeepPartial<AjaxContract> as AjaxContract);
190+
asMockedFn(Workspaces).mockReturnValue(
191+
partial<WorkspacesAjaxContract>({
192+
workspace: () =>
193+
partial<WorkspaceContract>({
194+
storageCostEstimate: mockStorageCostEstimate,
195+
bucketUsage: mockBucketUsage,
196+
}),
197+
})
198+
);
202199

203200
// Act
204201
render(
@@ -215,11 +212,11 @@ describe('CloudInformation', () => {
215212
it('displays bucket size for users with reader access', async () => {
216213
// Arrange
217214
const mockBucketUsage = jest.fn().mockResolvedValue({ usageInBytes: 50, lastUpdated: '2024-07-26' });
218-
asMockedFn(Ajax).mockReturnValue({
219-
Workspaces: {
220-
workspace: jest.fn().mockReturnValue({ bucketUsage: mockBucketUsage }),
221-
},
222-
} as DeepPartial<AjaxContract> as AjaxContract);
215+
asMockedFn(Workspaces).mockReturnValue(
216+
partial<WorkspacesAjaxContract>({
217+
workspace: () => partial<WorkspaceContract>({ bucketUsage: mockBucketUsage }),
218+
})
219+
);
223220

224221
// Act
225222
await act(() =>

0 commit comments

Comments
 (0)