Skip to content

Commit

Permalink
added ability to intercept mlmd requests
Browse files Browse the repository at this point in the history
  • Loading branch information
rsun19 committed Jul 23, 2024
1 parent 0df935a commit c470183
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 37 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
/* eslint-disable camelcase */
import type { Interception } from 'cypress/types/net-stubbing';
import {
buildMockPipelineV2,
buildMockPipelines,
Expand All @@ -21,7 +20,7 @@ import {
import { mockGetExecutions, mockGetNextPageExecutions } from '~/__mocks__/mlmd/mockGetExecutions';
import { tablePagination } from '~/__tests__/cypress/cypress/pages/components/Pagination';
import { verifyRelativeURL } from '~/__tests__/cypress/cypress/utils/url';
import { initMlmdIntercepts } from './mlmdUtils';
import { decodeGetExecutionsRequest, initMlmdIntercepts } from './mlmdUtils';

const projectName = 'test-project-name';
const initialMockPipeline = buildMockPipelineV2({ display_name: 'Test pipeline' });
Expand All @@ -48,35 +47,14 @@ describe('Executions', () => {
executionPage.visit(projectName);
});

it('Makes filter requests', () => {
it('Makes filter requests, includes more entries, tests page pagination, and visits execution details page', () => {
shouldFilterItems(FilterArgs.Execution, 'digit-classification');
shouldFilterItems(FilterArgs.ID, '289');
shouldFilterItems(FilterArgs.Status);
shouldFilterItems(FilterArgs.Type);
});

it('Includes more entries and navigates pages', () => {
setUpIntercept();
tablePagination.top.selectToggleOption('20 per page');
cy.wait('@request');
setUpIntercept();
tablePagination.top.selectToggleOption('30 per page');
cy.wait('@request');
setUpInterceptForNextPage();
tablePagination.top.findNextButton().click();
cy.wait('@request');
setUpIntercept();
tablePagination.top.findPreviousButton().click();
cy.wait('@request');
});

it('Visits execution details page', () => {
const id = 288;
executionPage.findEntryByLink('digit-classification').click();
executionPage.findText(`${id}`);
executionPage.findText('system.ContainerExecution');
executionPage.findText('Custom properties');
verifyRelativeURL(`/executions/${projectName}/${id}`);
testEntriesToggle();
testPagePagination();
testExecutionDetailsPage();
});
});

Expand All @@ -103,11 +81,6 @@ const setUpInterceptForNextPage = () => {
).as('request');
};

const validateMlmdQuery = (interception: Interception, query: string) => {
const interceptionDecoder = new TextDecoder('utf-8');
expect(interceptionDecoder.decode(new Uint8Array(interception.request.body))).to.include(query);
};

const shouldFilterItems = (filter: FilterArgs, query?: string) => {
switch (filter) {
case FilterArgs.Execution:
Expand All @@ -118,8 +91,7 @@ const shouldFilterItems = (filter: FilterArgs, query?: string) => {
setUpIntercept();
executionFilter.findSearchFilter().type(query);
cy.wait('@request').then((interception) => {
validateMlmdQuery(
interception,
expect(decodeGetExecutionsRequest(interception).options?.filterQuery).to.equal(
"custom_properties.display_name.string_value LIKE '%digit-classification%'",
);
});
Expand All @@ -132,23 +104,29 @@ const shouldFilterItems = (filter: FilterArgs, query?: string) => {
setUpIntercept();
executionFilter.findSearchFilter().type(query);
cy.wait('@request').then((interception) => {
validateMlmdQuery(interception, 'id = cast(289 as int64)');
expect(decodeGetExecutionsRequest(interception).options?.filterQuery).to.equal(
"custom_properties.display_name.string_value LIKE '%digit-classification%' AND id = cast(289 as int64)",
);
});
break;
case FilterArgs.Type:
executionFilter.findSearchFilterItem(FilterArgs.Type).click();
setUpIntercept();
executionFilter.findTypeSearchFilterItem('system.ContainerExecution').click();
cy.wait('@request').then((interception) => {
validateMlmdQuery(interception, "type LIKE '%system.ContainerExecution%'");
expect(decodeGetExecutionsRequest(interception).options?.filterQuery).to.include(
"type LIKE '%system.ContainerExecution%'",
);
});
break;
case FilterArgs.Status:
executionFilter.findSearchFilterItem(FilterArgs.Status).click();
setUpIntercept();
executionFilter.findTypeSearchFilterItem('Cached').click();
cy.wait('@request').then((interception) => {
validateMlmdQuery(interception, 'cast(last_known_state as int64) = 5');
expect(decodeGetExecutionsRequest(interception).options?.filterQuery).to.include(
'cast(last_known_state as int64) = 5',
);
});
break;
}
Expand Down Expand Up @@ -191,3 +169,38 @@ const initIntercepts = (interceptMlmd: boolean, isExecutionsEmpty?: boolean) =>
initMlmdIntercepts(projectName, { isExecutionsEmpty });
}
};

const testEntriesToggle = () => {
setUpIntercept();
tablePagination.top.selectToggleOption('30 per page');
cy.wait('@request').then((interception) => {
expect(decodeGetExecutionsRequest(interception).options?.maxResultSize).to.equal(30);
});
setUpIntercept();
tablePagination.top.selectToggleOption('20 per page');
cy.wait('@request').then((interception) => {
expect(decodeGetExecutionsRequest(interception).options?.maxResultSize).to.equal(20);
});
};

const testPagePagination = () => {
setUpInterceptForNextPage();
tablePagination.top.findNextButton().click();
cy.wait('@request').then((interception) => {
expect(decodeGetExecutionsRequest(interception).options?.nextPageToken).to.equal('page token');
});
setUpIntercept();
tablePagination.top.findPreviousButton().click();
cy.wait('@request').then((interception) => {
expect(decodeGetExecutionsRequest(interception).options?.nextPageToken).to.equal('');
});
};

const testExecutionDetailsPage = () => {
const id = 288;
executionPage.findEntryByLink('digit-classification').click();
executionPage.findText(`${id}`);
executionPage.findText('system.ContainerExecution');
executionPage.findText('Custom properties');
verifyRelativeURL(`/executions/${projectName}/${id}`);
};
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import type { Interception } from 'cypress/types/net-stubbing';
import { mockGetArtifactTypes } from '~/__mocks__/mlmd/mockGetArtifactTypes';
import { mockGetArtifactsByContext } from '~/__mocks__/mlmd/mockGetArtifactsByContext';
import { mockGetContextByTypeAndName } from '~/__mocks__/mlmd/mockGetContextByTypeAndName';
import { mockGetEventsByExecutionIDs } from '~/__mocks__/mlmd/mockGetEventsByExecutionIDs';
import { mockGetExecutions, mockGetNoExecutions } from '~/__mocks__/mlmd/mockGetExecutions';
import { mockGetExecutionsByContext } from '~/__mocks__/mlmd/mockGetExecutionsByContext';
import { mockGetExecutionsByID } from '~/__mocks__/mlmd/mockGetExecutionsByID';
import { GetExecutionsRequest } from '~/__mocks__/third_party/mlmd';

export const initMlmdIntercepts = (
projectName: string,
Expand Down Expand Up @@ -47,3 +49,9 @@ export const initMlmdIntercepts = (
mockGetEventsByExecutionIDs(),
);
};

// We remove the first 5 bits of the Uint8Array due to an offset from createGrpcResponse
export const decodeGetExecutionsRequest = (interception: Interception): GetExecutionsRequest => {
const mlmdArr = new Uint8Array(interception.request.body);
return GetExecutionsRequest.decode(mlmdArr.slice(5));
};

0 comments on commit c470183

Please sign in to comment.