Skip to content

Commit

Permalink
UIE-204 Narrow Ajax Usage pt22
Browse files Browse the repository at this point in the history
- just getting started...
  • Loading branch information
msilva-broad committed Jan 28, 2025
1 parent 859c5a2 commit 6606b54
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 53 deletions.
63 changes: 23 additions & 40 deletions src/libs/ajax/analysis-providers/AnalysisProvider.test.ts
Original file line number Diff line number Diff line change
@@ -1,75 +1,58 @@
import { AbsolutePath } from 'src/analysis/utils/file-utils';
import { runtimeToolLabels } from 'src/analysis/utils/tool-utils';
import { Ajax } from 'src/libs/ajax';
import { AnalysisProvider } from 'src/libs/ajax/analysis-providers/AnalysisProvider';
import { asMockedFn } from 'src/testing/test-utils';
import { AzureStorage, AzureStorageContract } from 'src/libs/ajax/AzureStorage';
import { GoogleStorage, GoogleStorageContract } from 'src/libs/ajax/GoogleStorage';
import { asMockedFn, MockedFn, partial } from 'src/testing/test-utils';
import { WorkspaceInfo } from 'src/workspaces/utils';

type AjaxExports = typeof import('src/libs/ajax');
jest.mock('src/libs/ajax', (): AjaxExports => {
return {
...jest.requireActual('src/libs/ajax'),
Ajax: jest.fn(),
};
});
jest.mock('src/libs/ajax/AzureStorage');
jest.mock('src/libs/ajax/GoogleStorage');

type AjaxContract = ReturnType<typeof Ajax>;
type AjaxBucketsContract = AjaxContract['Buckets'];
type AjaxBucketsAnalysisContract = ReturnType<AjaxContract['Buckets']['analysis']>;
type AjaxAzureStorageContract = AjaxContract['AzureStorage'];
type AjaxAzureStorageBlobContract = ReturnType<AjaxAzureStorageContract['blob']>;
type AjaxBucketsAnalysisContract = ReturnType<GoogleStorageContract['analysis']>;
type AjaxAzureStorageBlobContract = ReturnType<AzureStorageContract['blob']>;

describe('AnalysisProvider - listAnalyses', () => {
it('handles GCP workspace', async () => {
// Arrange
const mockBuckets: Partial<AjaxBucketsContract> = {
listAnalyses: jest.fn(),
};
asMockedFn((mockBuckets as AjaxBucketsContract).listAnalyses).mockResolvedValue([]);
const listAnalyses: MockedFn<GoogleStorageContract['listAnalyses']> = jest.fn();
listAnalyses.mockResolvedValue([]);

const mockAjax: Partial<AjaxContract> = {
Buckets: mockBuckets as AjaxBucketsContract,
};
asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract);
asMockedFn(GoogleStorage).mockReturnValue(partial<GoogleStorageContract>({ listAnalyses }));

const workspaceInfo: Partial<WorkspaceInfo> = {
const workspaceInfo = partial<WorkspaceInfo>({
googleProject: 'GoogleProject123',
bucketName: 'Bucket123',
cloudPlatform: 'Gcp',
};
});

// Act
const results = await AnalysisProvider.listAnalyses(workspaceInfo as WorkspaceInfo);
const results = await AnalysisProvider.listAnalyses(workspaceInfo);

// Assert
expect(results).toEqual([]);
expect(mockBuckets.listAnalyses).toBeCalledTimes(1);
expect(mockBuckets.listAnalyses).toBeCalledWith('GoogleProject123', 'Bucket123');
expect(listAnalyses).toBeCalledTimes(1);
expect(listAnalyses).toBeCalledWith('GoogleProject123', 'Bucket123');
});

it('handles Azure workspace', async () => {
// Arrange
const mockAzureStorage: Partial<AjaxAzureStorageContract> = {
listNotebooks: jest.fn(),
};
asMockedFn((mockAzureStorage as AjaxAzureStorageContract).listNotebooks).mockResolvedValue([]);
const listNotebooks: MockedFn<AzureStorageContract['listNotebooks']> = jest.fn();
listNotebooks.mockResolvedValue([]);

const mockAjax: Partial<AjaxContract> = {
AzureStorage: mockAzureStorage as AjaxAzureStorageContract,
};
asMockedFn(Ajax).mockImplementation(() => mockAjax as AjaxContract);
asMockedFn(AzureStorage).mockReturnValue(partial<AzureStorageContract>({ listNotebooks }));

const workspaceInfo: Partial<WorkspaceInfo> = {
const workspaceInfo = partial<WorkspaceInfo>({
workspaceId: 'Workspace123',
};
});

// Act
const results = await AnalysisProvider.listAnalyses(workspaceInfo as WorkspaceInfo);
const results = await AnalysisProvider.listAnalyses(workspaceInfo);

// Assert
expect(results).toEqual([]);
expect(mockAzureStorage.listNotebooks).toBeCalledTimes(1);
expect(mockAzureStorage.listNotebooks).toBeCalledWith('Workspace123');
expect(listNotebooks).toBeCalledTimes(1);
expect(listNotebooks).toBeCalledWith('Workspace123');
});
});

Expand Down
27 changes: 14 additions & 13 deletions src/libs/ajax/analysis-providers/AnalysisProvider.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { AnalysisFile } from 'src/analysis/useAnalysisFiles';
import { AbsolutePath, getExtension, getFileName, stripExtension } from 'src/analysis/utils/file-utils';
import { getToolLabelFromFileExtension, ToolLabel } from 'src/analysis/utils/tool-utils';
import { Ajax } from 'src/libs/ajax';
import { AzureStorage } from 'src/libs/ajax/AzureStorage';
import { GoogleStorage } from 'src/libs/ajax/GoogleStorage';
import { GoogleWorkspaceInfo, isGoogleWorkspaceInfo, WorkspaceInfo } from 'src/workspaces/utils';

export interface AnalysisProviderContract {
Expand All @@ -27,9 +28,9 @@ export interface AnalysisProviderContract {
export const AnalysisProvider: AnalysisProviderContract = {
listAnalyses: async (workspaceInfo: WorkspaceInfo, signal?: AbortSignal): Promise<AnalysisFile[]> => {
const selectedAnalyses: AnalysisFile[] = isGoogleWorkspaceInfo(workspaceInfo)
? await Ajax(signal).Buckets.listAnalyses(workspaceInfo.googleProject, workspaceInfo.bucketName)
? await GoogleStorage(signal).listAnalyses(workspaceInfo.googleProject, workspaceInfo.bucketName)
: // TODO: cleanup once TS is merged in for AzureStorage module
((await Ajax(signal).AzureStorage.listNotebooks(workspaceInfo.workspaceId)) as any);
((await AzureStorage(signal).listNotebooks(workspaceInfo.workspaceId)) as any);
return selectedAnalyses;
},
copyAnalysis: async (
Expand All @@ -41,13 +42,13 @@ export const AnalysisProvider: AnalysisProviderContract = {
signal?: AbortSignal
): Promise<void> => {
if (isGoogleWorkspaceInfo(sourceWorkspace)) {
await Ajax(signal)
.Buckets.analysis(sourceWorkspace.googleProject, sourceWorkspace.bucketName, printName, toolLabel)
await GoogleStorage(signal)
.analysis(sourceWorkspace.googleProject, sourceWorkspace.bucketName, printName, toolLabel)
// assumes GCP to GCP copy
.copy(`${newName}.${getExtension(printName)}`, (targetWorkspace as GoogleWorkspaceInfo).bucketName, false);
} else {
await Ajax(signal)
.AzureStorage.blob(sourceWorkspace.workspaceId, printName)
await AzureStorage(signal)
.blob(sourceWorkspace.workspaceId, printName)
.copy(stripExtension(newName), targetWorkspace.workspaceId);
}
},
Expand All @@ -59,21 +60,21 @@ export const AnalysisProvider: AnalysisProviderContract = {
signal?: AbortSignal
): Promise<void> => {
isGoogleWorkspaceInfo(workspaceInfo)
? await Ajax(signal)
.Buckets.analysis(workspaceInfo.googleProject, workspaceInfo.bucketName, fullAnalysisName, toolLabel)
? await GoogleStorage(signal)
.analysis(workspaceInfo.googleProject, workspaceInfo.bucketName, fullAnalysisName, toolLabel)
.create(contents)
: await Ajax(signal).AzureStorage.blob(workspaceInfo.workspaceId, fullAnalysisName).create(contents);
: await AzureStorage(signal).blob(workspaceInfo.workspaceId, fullAnalysisName).create(contents);
},
deleteAnalysis: async (workspaceInfo: WorkspaceInfo, path: AbsolutePath, signal?: AbortSignal): Promise<void> => {
isGoogleWorkspaceInfo(workspaceInfo)
? await Ajax(signal)
.Buckets.analysis(
? await GoogleStorage(signal)
.analysis(
workspaceInfo.googleProject,
workspaceInfo.bucketName,
getFileName(path),
getToolLabelFromFileExtension(getExtension(path))
)
.delete()
: await Ajax(signal).AzureStorage.blob(workspaceInfo.workspaceId, getFileName(path)).delete();
: await AzureStorage(signal).blob(workspaceInfo.workspaceId, getFileName(path)).delete();
},
};

0 comments on commit 6606b54

Please sign in to comment.