Skip to content

Commit

Permalink
Msilva/UIE-204 narrow ajax usage pt23 (#5237)
Browse files Browse the repository at this point in the history
  • Loading branch information
msilva-broad authored Jan 28, 2025
1 parent ca7c4b4 commit 5521b69
Show file tree
Hide file tree
Showing 12 changed files with 248 additions and 372 deletions.
228 changes: 65 additions & 163 deletions src/libs/ajax/analysis-providers/AnalysisProvider.test.ts
Original file line number Diff line number Diff line change
@@ -1,98 +1,70 @@
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');
});
});

describe('AnalysisProvider - copyAnalysis', () => {
it('handles GCP workspace', async () => {
// Arrange
const mockBuckets: Partial<AjaxBucketsContract> = {
analysis: jest.fn(),
};
const watchCopy = jest.fn();
asMockedFn((mockBuckets as AjaxBucketsContract).analysis).mockImplementation(() => {
const mockAnalysisContract: Partial<AjaxBucketsAnalysisContract> = {
copy: watchCopy,
};
const analysisContract = mockAnalysisContract as AjaxBucketsAnalysisContract;
asMockedFn(analysisContract.copy).mockResolvedValue(undefined);
return analysisContract;
});
const analysis: MockedFn<GoogleStorageContract['analysis']> = jest.fn();
const watchCopy: MockedFn<AjaxBucketsAnalysisContract['copy']> = jest.fn();
watchCopy.mockResolvedValue(undefined);

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

const workspaceInfo: Partial<WorkspaceInfo> = {
googleProject: 'GoogleProject123',
Expand All @@ -114,36 +86,20 @@ describe('AnalysisProvider - copyAnalysis', () => {

// Assert
expect(result).toEqual(undefined);
expect(mockBuckets.analysis).toBeCalledTimes(1);
expect(mockBuckets.analysis).toBeCalledWith(
'GoogleProject123',
'Bucket123',
'PrintName123.jpt',
runtimeToolLabels.Jupyter
);
expect(analysis).toBeCalledTimes(1);
expect(analysis).toBeCalledWith('GoogleProject123', 'Bucket123', 'PrintName123.jpt', runtimeToolLabels.Jupyter);
expect(watchCopy).toBeCalledTimes(1);
expect(watchCopy).toBeCalledWith('NewName123.jpt', 'TargetBucket456', false);
});

it('handles Azure workspace', async () => {
// Arrange
const mockAzureStorage: Partial<AjaxAzureStorageContract> = {
blob: jest.fn(),
};
const watchCopy = jest.fn();
asMockedFn((mockAzureStorage as AjaxAzureStorageContract).blob).mockImplementation(() => {
const mockBlobContract: Partial<AjaxAzureStorageBlobContract> = {
copy: watchCopy,
};
const blobContract = mockBlobContract as AjaxAzureStorageBlobContract;
asMockedFn(blobContract.copy).mockResolvedValue(undefined);
return blobContract;
});
const blob: MockedFn<AzureStorageContract['blob']> = jest.fn();
const watchCopy: MockedFn<AjaxAzureStorageBlobContract['copy']> = jest.fn();
watchCopy.mockResolvedValue(undefined);

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

const workspaceInfo: Partial<WorkspaceInfo> = {
workspaceId: 'Workspace123',
Expand All @@ -164,8 +120,8 @@ describe('AnalysisProvider - copyAnalysis', () => {

// Assert
expect(result).toEqual(undefined);
expect(mockAzureStorage.blob).toBeCalledTimes(1);
expect(mockAzureStorage.blob).toBeCalledWith('Workspace123', 'PrintName123.jpt');
expect(blob).toBeCalledTimes(1);
expect(blob).toBeCalledWith('Workspace123', 'PrintName123.jpt');
expect(watchCopy).toBeCalledTimes(1);
expect(watchCopy).toBeCalledWith('NewName123', 'Workspace456');
});
Expand All @@ -174,23 +130,12 @@ describe('AnalysisProvider - copyAnalysis', () => {
describe('AnalysisProvider - createAnalysis', () => {
it('handles GCP workspace', async () => {
// Arrange
const mockBuckets: Partial<AjaxBucketsContract> = {
analysis: jest.fn(),
};
const watchCreate = jest.fn();
asMockedFn((mockBuckets as AjaxBucketsContract).analysis).mockImplementation(() => {
const mockAnalysisContract: Partial<AjaxBucketsAnalysisContract> = {
create: watchCreate,
};
const analysisContract = mockAnalysisContract as AjaxBucketsAnalysisContract;
asMockedFn(analysisContract.create).mockResolvedValue(undefined);
return analysisContract;
});
const analysis: MockedFn<GoogleStorageContract['analysis']> = jest.fn();
const watchCreate: MockedFn<AjaxBucketsAnalysisContract['create']> = jest.fn();
watchCreate.mockResolvedValue(undefined);

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

const workspaceInfo: Partial<WorkspaceInfo> = {
googleProject: 'GoogleProject123',
Expand All @@ -211,36 +156,20 @@ describe('AnalysisProvider - createAnalysis', () => {
// contents: any, signal?: AbortSignal) => Promise<void>
// Assert
expect(result).toEqual(undefined);
expect(mockBuckets.analysis).toBeCalledTimes(1);
expect(mockBuckets.analysis).toBeCalledWith(
'GoogleProject123',
'Bucket123',
'PrintName123.ipynb',
runtimeToolLabels.Jupyter
);
expect(analysis).toBeCalledTimes(1);
expect(analysis).toBeCalledWith('GoogleProject123', 'Bucket123', 'PrintName123.ipynb', runtimeToolLabels.Jupyter);
expect(watchCreate).toBeCalledTimes(1);
expect(watchCreate).toBeCalledWith('MyIpynbContents');
});

it('handles Azure workspace', async () => {
// Arrange
const mockAzureStorage: Partial<AjaxAzureStorageContract> = {
blob: jest.fn(),
};
const watchCreate = jest.fn();
asMockedFn((mockAzureStorage as AjaxAzureStorageContract).blob).mockImplementation(() => {
const mockBlobContract: Partial<AjaxAzureStorageBlobContract> = {
create: watchCreate,
};
const blobContract = mockBlobContract as AjaxAzureStorageBlobContract;
asMockedFn(blobContract.create).mockResolvedValue(undefined);
return blobContract;
});
const blob: MockedFn<AzureStorageContract['blob']> = jest.fn();
const watchCreate: MockedFn<AjaxAzureStorageBlobContract['create']> = jest.fn();
watchCreate.mockResolvedValue(undefined);

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

const workspaceInfo: Partial<WorkspaceInfo> = {
workspaceId: 'Workspace123',
Expand All @@ -257,8 +186,8 @@ describe('AnalysisProvider - createAnalysis', () => {

// Assert
expect(result).toEqual(undefined);
expect(mockAzureStorage.blob).toBeCalledTimes(1);
expect(mockAzureStorage.blob).toBeCalledWith('Workspace123', 'PrintName123.ipynb');
expect(blob).toBeCalledTimes(1);
expect(blob).toBeCalledWith('Workspace123', 'PrintName123.ipynb');
expect(watchCreate).toBeCalledTimes(1);
expect(watchCreate).toBeCalledWith('MyIpynbContents');
});
Expand All @@ -267,23 +196,12 @@ describe('AnalysisProvider - createAnalysis', () => {
describe('AnalysisProvider - deleteAnalysis', () => {
it('handles GCP workspace', async () => {
// Arrange
const mockBuckets: Partial<AjaxBucketsContract> = {
analysis: jest.fn(),
};
const watchDelete = jest.fn();
asMockedFn((mockBuckets as AjaxBucketsContract).analysis).mockImplementation(() => {
const mockAnalysisContract: Partial<AjaxBucketsAnalysisContract> = {
delete: watchDelete,
};
const analysisContract = mockAnalysisContract as AjaxBucketsAnalysisContract;
asMockedFn(analysisContract.delete).mockResolvedValue(undefined);
return analysisContract;
});
const analysis: MockedFn<GoogleStorageContract['analysis']> = jest.fn();
const watchDelete: MockedFn<AjaxBucketsAnalysisContract['delete']> = jest.fn();
watchDelete.mockResolvedValue(undefined);

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

const workspaceInfo: Partial<WorkspaceInfo> = {
googleProject: 'GoogleProject123',
Expand All @@ -302,35 +220,19 @@ describe('AnalysisProvider - deleteAnalysis', () => {
// contents: any, signal?: AbortSignal) => Promise<void>
// Assert
expect(result).toEqual(undefined);
expect(mockBuckets.analysis).toBeCalledTimes(1);
expect(mockBuckets.analysis).toBeCalledWith(
'GoogleProject123',
'Bucket123',
'PrintName123.ipynb',
runtimeToolLabels.Jupyter
);
expect(analysis).toBeCalledTimes(1);
expect(analysis).toBeCalledWith('GoogleProject123', 'Bucket123', 'PrintName123.ipynb', runtimeToolLabels.Jupyter);
expect(watchDelete).toBeCalledTimes(1);
});

it('handles Azure workspace', async () => {
// Arrange
const mockAzureStorage: Partial<AjaxAzureStorageContract> = {
blob: jest.fn(),
};
const watchDelete = jest.fn();
asMockedFn((mockAzureStorage as AjaxAzureStorageContract).blob).mockImplementation(() => {
const mockBlobContract: Partial<AjaxAzureStorageBlobContract> = {
delete: watchDelete,
};
const blobContract = mockBlobContract as AjaxAzureStorageBlobContract;
asMockedFn(blobContract.delete).mockResolvedValue(undefined);
return blobContract;
});
const blob: MockedFn<AzureStorageContract['blob']> = jest.fn();
const watchDelete: MockedFn<AjaxAzureStorageBlobContract['delete']> = jest.fn();
watchDelete.mockResolvedValue(undefined);

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

const workspaceInfo: Partial<WorkspaceInfo> = {
workspaceId: 'Workspace123',
Expand All @@ -345,8 +247,8 @@ describe('AnalysisProvider - deleteAnalysis', () => {

// Assert
expect(result).toEqual(undefined);
expect(mockAzureStorage.blob).toBeCalledTimes(1);
expect(mockAzureStorage.blob).toBeCalledWith('Workspace123', 'PrintName123.ipynb');
expect(blob).toBeCalledTimes(1);
expect(blob).toBeCalledWith('Workspace123', 'PrintName123.ipynb');
expect(watchDelete).toBeCalledTimes(1);
});
});
Loading

0 comments on commit 5521b69

Please sign in to comment.