mirror of https://github.com/rancher/dashboard.git
fix failing/flaky tests
This commit is contained in:
parent
552c6288f7
commit
b7dc2ae37a
|
|
@ -0,0 +1,11 @@
|
|||
export function groupByPayload(userId: string, clusterName: string, groupBy:string, namespace: string):object {
|
||||
return {
|
||||
id: userId,
|
||||
type: 'userpreference',
|
||||
data: {
|
||||
cluster: clusterName,
|
||||
'group-by': groupBy,
|
||||
'ns-by-cluster': namespace,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@ import ClusterDashboardPagePo from '@/cypress/e2e/po/pages/explorer/cluster-dash
|
|||
import { NamespaceFilterPo } from '@/cypress/e2e/po/components/namespace-filter.po';
|
||||
import { WorkloadsPodsListPagePo } from '@/cypress/e2e/po/pages/explorer/workloads-pods.po';
|
||||
import HomePagePo from '@/cypress/e2e/po/pages/home.po';
|
||||
import { groupByPayload } from '@/cypress/e2e/blueprints/user_preferences/group_by';
|
||||
|
||||
const namespacePicker = new NamespaceFilterPo();
|
||||
|
||||
|
|
@ -21,9 +22,16 @@ describe('Namespace picker', { testIsolation: 'off' }, () => {
|
|||
namespacePicker.closeDropdown();
|
||||
});
|
||||
|
||||
it('can filter workloads by project/namespace from the picker dropdown', { tags: ['@adminUser'] }, () => {
|
||||
it('can filter workloads by project/namespace from the picker dropdown', { tags: ['@explorer', '@adminUser'] }, () => {
|
||||
// Verify 'Namespace: cattle-fleet-local-system' appears once when filtering by Namespace
|
||||
// Vrify multiple namespaces within Project: System display when filtering by Project
|
||||
// Verify multiple namespaces within Project: System display when filtering by Project
|
||||
|
||||
// group workloads by namespace
|
||||
cy.getRancherResource('v3', 'users?me=true').then((resp: Cypress.Response<any>) => {
|
||||
const userId = resp.body.data[0].id.trim();
|
||||
|
||||
cy.setRancherResource('v1', 'userpreferences', userId, groupByPayload(userId, 'local', 'metadata.namespace', '{"local":["all://user"]}'));
|
||||
});
|
||||
|
||||
const workloadsPodPage = new WorkloadsPodsListPagePo('local');
|
||||
|
||||
|
|
@ -54,7 +62,7 @@ describe('Namespace picker', { testIsolation: 'off' }, () => {
|
|||
workloadsPodPage.sortableTable().groupElementWithName('cattle-fleet-local-system').scrollIntoView().should('be.visible');
|
||||
});
|
||||
|
||||
it('can select only one of the top 5 resource filters at a time', { tags: ['@adminUser', '@standardUser'] }, () => {
|
||||
it('can select only one of the top 5 resource filters at a time', { tags: ['@explorer', '@adminUser', '@standardUser'] }, () => {
|
||||
// Verify that user can only select one of the first 5 options
|
||||
|
||||
namespacePicker.toggle();
|
||||
|
|
@ -85,7 +93,7 @@ describe('Namespace picker', { testIsolation: 'off' }, () => {
|
|||
namespacePicker.checkIcon().should('have.length', 1);
|
||||
});
|
||||
|
||||
it('can select multiple projects/namespaces', { tags: ['@adminUser'] }, () => {
|
||||
it('can select multiple projects/namespaces', { tags: ['@explorer', '@adminUser'] }, () => {
|
||||
// Verify that user can select multiple options (other than the first 5 options)
|
||||
|
||||
namespacePicker.toggle();
|
||||
|
|
@ -119,7 +127,7 @@ describe('Namespace picker', { testIsolation: 'off' }, () => {
|
|||
namespacePicker.moreOptionsSelected().should('have.class', 'has-tooltip');
|
||||
});
|
||||
|
||||
it('can deselect options', { tags: ['@adminUser', '@standardUser'] }, () => {
|
||||
it('can deselect options', { tags: ['@explorer', '@adminUser', '@standardUser'] }, () => {
|
||||
namespacePicker.toggle();
|
||||
|
||||
// Select 'default' option
|
||||
|
|
@ -146,7 +154,7 @@ describe('Namespace picker', { testIsolation: 'off' }, () => {
|
|||
namespacePicker.checkIcon().should('have.length', 1);
|
||||
});
|
||||
|
||||
it('can filter options by name', { tags: ['@adminUser', '@standardUser'] }, () => {
|
||||
it('can filter options by name', { tags: ['@explorer', '@adminUser', '@standardUser'] }, () => {
|
||||
namespacePicker.toggle();
|
||||
|
||||
// filter 'cattle-fleet'
|
||||
|
|
@ -167,7 +175,7 @@ describe('Namespace picker', { testIsolation: 'off' }, () => {
|
|||
namespacePicker.checkIcon().should('have.length', 1);
|
||||
});
|
||||
|
||||
it('newly created project/namespace appears in namespace picker', { tags: ['@adminUser'] }, () => {
|
||||
it('newly created project/namespace appears in namespace picker', { tags: ['@explorer', '@adminUser'] }, () => {
|
||||
const projName = `project${ +new Date() }`;
|
||||
const nsName = `namespace${ +new Date() }`;
|
||||
|
||||
|
|
@ -205,15 +213,7 @@ describe('Namespace picker', { testIsolation: 'off' }, () => {
|
|||
cy.getRancherResource('v3', 'users?me=true').then((resp: Cypress.Response<any>) => {
|
||||
const userId = resp.body.data[0].id.trim();
|
||||
|
||||
cy.setRancherResource('v1', 'userpreferences', userId, {
|
||||
id: userId,
|
||||
type: 'userpreference',
|
||||
data: {
|
||||
cluster: 'local',
|
||||
'group-by': 'none',
|
||||
'ns-by-cluster': '{"local":["all://user"]}',
|
||||
}
|
||||
});
|
||||
cy.setRancherResource('v1', 'userpreferences', userId, groupByPayload(userId, 'local', 'none', '{"local":["all://user"]}'));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -19,6 +19,10 @@ describe('Nodes list', { tags: ['@explorer', '@adminUser'], testIsolation: 'off'
|
|||
});
|
||||
|
||||
it('should show the nodes list page', () => {
|
||||
cy.getRancherResource('v1', 'nodes').then((resp: Cypress.Response<any>) => {
|
||||
cy.wrap(resp.body.count).as('count');
|
||||
});
|
||||
|
||||
ClusterDashboardPagePo.navTo();
|
||||
|
||||
const nav = new ProductNavPo();
|
||||
|
|
@ -35,16 +39,17 @@ describe('Nodes list', { tags: ['@explorer', '@adminUser'], testIsolation: 'off'
|
|||
nodeList.sortableTable().checkLoadingIndicatorNotVisible();
|
||||
|
||||
// Check table has 2 tows
|
||||
nodeList.sortableTable().rowElements({ timeout: 2500 }).should((rows: any) => {
|
||||
expect(rows).not.to.equal(undefined);
|
||||
expect(rows).to.have.length(2);
|
||||
});
|
||||
cy.get<number>('@count').then((count) => {
|
||||
nodeList.sortableTable().rowElements({ timeout: 2500 }).should((rows: any) => {
|
||||
expect(rows).not.to.equal(undefined);
|
||||
expect(rows).to.have.length(count);
|
||||
});
|
||||
|
||||
// Check the node names
|
||||
nodeList.sortableTable().rowNames().should((names: any) => {
|
||||
expect(names).to.have.length(2);
|
||||
// expect(names).to.contain('local-node');
|
||||
expect(names).to.contain('bigip1');
|
||||
// Check the node names
|
||||
nodeList.sortableTable().rowNames().should((names: any) => {
|
||||
expect(names).to.have.length(count);
|
||||
expect(names).to.contain('bigip1');
|
||||
});
|
||||
});
|
||||
|
||||
// Simple test to assert we haven't broken Node detail page
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ describe('Git Repo', { tags: ['@fleet', '@adminUser'] }, () => {
|
|||
cy.intercept('POST', '/v1/fleet.cattle.io.gitrepos').as('interceptGitRepo');
|
||||
|
||||
gitRepoCreatePage.goTo();
|
||||
gitRepoCreatePage.waitForPage();
|
||||
|
||||
const { name } = gitRepoCreateRequest.metadata;
|
||||
const {
|
||||
|
|
|
|||
|
|
@ -27,23 +27,8 @@ describe('Home Page', () => {
|
|||
|
||||
describe('Home Page', { testIsolation: 'off' }, () => {
|
||||
before(() => {
|
||||
// since I wasn't able to fully mock a list of clusters
|
||||
// the next best thing is to add a description to the current local cluster
|
||||
// testing https://github.com/rancher/dashboard/issues/10441
|
||||
cy.intercept('GET', `/v1/provisioning.cattle.io.clusters?*`, (req) => {
|
||||
req.continue((res) => {
|
||||
const localIndex = res.body.data.findIndex((item) => item.id.includes('/local'));
|
||||
|
||||
if (localIndex >= 0) {
|
||||
res.body.data[localIndex].metadata.annotations['field.cattle.io/description'] = longClusterDescription;
|
||||
}
|
||||
|
||||
res.send(res.body);
|
||||
});
|
||||
}).as('provClusters');
|
||||
|
||||
cy.login();
|
||||
HomePagePo.goToAndWaitForGet();
|
||||
HomePagePo.goTo();
|
||||
});
|
||||
|
||||
it('Can navigate to release notes page for latest Rancher version', { tags: ['@generic', '@adminUser', '@standardUser'] }, () => {
|
||||
|
|
@ -172,7 +157,7 @@ describe('Home Page', () => {
|
|||
genericCreateClusterPage.waitForPage();
|
||||
});
|
||||
|
||||
it('Can filter rows in the cluster list', { tags: ['@adminUser'] }, () => {
|
||||
it('Can filter rows in the cluster list', { tags: ['@generic', '@adminUser'] }, () => {
|
||||
/**
|
||||
* Filter rows in the cluster list
|
||||
*/
|
||||
|
|
@ -188,8 +173,23 @@ describe('Home Page', () => {
|
|||
});
|
||||
});
|
||||
|
||||
it('Should show cluster description information in the cluster list', { tags: ['@adminUser'] }, () => {
|
||||
HomePagePo.navTo();
|
||||
it('Should show cluster description information in the cluster list', { tags: ['@generic', '@adminUser'] }, () => {
|
||||
// since I wasn't able to fully mock a list of clusters
|
||||
// the next best thing is to add a description to the current local cluster
|
||||
// testing https://github.com/rancher/dashboard/issues/10441
|
||||
cy.intercept('GET', `/v1/provisioning.cattle.io.clusters?*`, (req) => {
|
||||
req.continue((res) => {
|
||||
const localIndex = res.body.data.findIndex((item) => item.id.includes('/local'));
|
||||
|
||||
if (localIndex >= 0) {
|
||||
res.body.data[localIndex].metadata.annotations['field.cattle.io/description'] = longClusterDescription;
|
||||
}
|
||||
|
||||
res.send(res.body);
|
||||
});
|
||||
}).as('provClusters');
|
||||
|
||||
homePage.goTo();
|
||||
const desc = homeClusterList.resourceTable().sortableTable().rowWithName('local').column(1)
|
||||
.get('.cluster-description');
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ describe('Pod Security Admissions', { testIsolation: 'off', tags: ['@manager', '
|
|||
|
||||
it('can edit a policy security admission', function() {
|
||||
PodSecurityAdmissionsPagePo.navTo();
|
||||
podSecurityAdmissionsPage.waitForPage();
|
||||
podSecurityAdmissionsPage.list().actionMenu(this.podSecurityAdmissionsName).getMenuItem('Edit Config').click();
|
||||
podSecurityAdmissionsPage.createPodSecurityAdmissionForm(this.podSecurityAdmissionsName).waitForPage('mode=edit');
|
||||
podSecurityAdmissionsPage.createPodSecurityAdmissionForm().nameNsDescription().description().set(`${ this.podSecurityAdmissionsName }-description-edit`);
|
||||
|
|
@ -80,6 +81,7 @@ describe('Pod Security Admissions', { testIsolation: 'off', tags: ['@manager', '
|
|||
|
||||
it('can clone a policy security admission', function() {
|
||||
PodSecurityAdmissionsPagePo.navTo();
|
||||
podSecurityAdmissionsPage.waitForPage();
|
||||
podSecurityAdmissionsPage.list().actionMenu(this.podSecurityAdmissionsName).getMenuItem('Clone').click();
|
||||
podSecurityAdmissionsPage.createPodSecurityAdmissionForm(this.podSecurityAdmissionsName).waitForPage('mode=clone');
|
||||
podSecurityAdmissionsPage.createPodSecurityAdmissionForm().nameNsDescription().name().set(`${ this.podSecurityAdmissionsName }-clone`);
|
||||
|
|
@ -92,6 +94,7 @@ describe('Pod Security Admissions', { testIsolation: 'off', tags: ['@manager', '
|
|||
|
||||
it('can download YAML for a policy security admission', function() {
|
||||
PodSecurityAdmissionsPagePo.navTo();
|
||||
podSecurityAdmissionsPage.waitForPage();
|
||||
podSecurityAdmissionsPage.list().actionMenu(this.podSecurityAdmissionsName).getMenuItem('Download YAML').click({ force: true });
|
||||
|
||||
const downloadedFilename = path.join(downloadsFolder, `${ this.podSecurityAdmissionsName }.yaml`);
|
||||
|
|
@ -108,6 +111,7 @@ describe('Pod Security Admissions', { testIsolation: 'off', tags: ['@manager', '
|
|||
|
||||
it('can delete a policy security admission', function() {
|
||||
PodSecurityAdmissionsPagePo.navTo();
|
||||
podSecurityAdmissionsPage.waitForPage();
|
||||
podSecurityAdmissionsPage.list().actionMenu(`${ this.podSecurityAdmissionsName }-clone`).getMenuItem('Delete').click();
|
||||
|
||||
const promptRemove = new PromptRemove();
|
||||
|
|
@ -124,6 +128,7 @@ describe('Pod Security Admissions', { testIsolation: 'off', tags: ['@manager', '
|
|||
|
||||
it('can delete a policy security admission via bulk actions', function() {
|
||||
PodSecurityAdmissionsPagePo.navTo();
|
||||
podSecurityAdmissionsPage.waitForPage();
|
||||
podSecurityAdmissionsPage.list().details(this.podSecurityAdmissionsName, 0).click();
|
||||
podSecurityAdmissionsPage.list().resourceTable().sortableTable().deleteButton()
|
||||
.click();
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
|
|||
|
||||
it('can refresh a repository', function() {
|
||||
ChartRepositoriesPagePo.navTo();
|
||||
repositoriesPage.waitForPage();
|
||||
cy.intercept('PUT', `/v1/catalog.cattle.io.clusterrepos/${ this.repoName }`).as('refreshRepo');
|
||||
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Refresh').click();
|
||||
cy.wait('@refreshRepo').its('response.statusCode').should('eq', 200);
|
||||
|
|
@ -48,6 +49,7 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
|
|||
|
||||
it('can edit a repository', function() {
|
||||
ChartRepositoriesPagePo.navTo();
|
||||
repositoriesPage.waitForPage();
|
||||
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Edit Config').click();
|
||||
repositoriesPage.createEditRepositories(this.repoName).waitForPage('mode=edit');
|
||||
repositoriesPage.createEditRepositories().nameNsDescription().description().set(`${ this.repoName }-desc-edit`);
|
||||
|
|
@ -61,6 +63,7 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
|
|||
|
||||
it('can clone a repository', function() {
|
||||
ChartRepositoriesPagePo.navTo();
|
||||
repositoriesPage.waitForPage();
|
||||
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Clone').click();
|
||||
repositoriesPage.createEditRepositories(this.repoName).waitForPage('mode=clone');
|
||||
repositoriesPage.createEditRepositories().nameNsDescription().name().set(`${ this.repoName }-clone`);
|
||||
|
|
@ -74,6 +77,7 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
|
|||
|
||||
it('can download YAML', function() {
|
||||
ChartRepositoriesPagePo.navTo();
|
||||
repositoriesPage.waitForPage();
|
||||
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Download YAML').click({ force: true });
|
||||
|
||||
const downloadedFilename = path.join(downloadsFolder, `${ this.repoName }.yaml`);
|
||||
|
|
@ -90,6 +94,7 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
|
|||
|
||||
it('can delete a repository', function() {
|
||||
ChartRepositoriesPagePo.navTo();
|
||||
repositoriesPage.waitForPage();
|
||||
|
||||
// delete original cloned Repository
|
||||
repositoriesPage.list().actionMenu(`${ this.repoName }-clone`).getMenuItem('Delete').click();
|
||||
|
|
@ -108,6 +113,7 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
|
|||
|
||||
it('can delete a repository via bulk actions', function() {
|
||||
ChartRepositoriesPagePo.navTo();
|
||||
repositoriesPage.waitForPage();
|
||||
|
||||
// delete original Repository
|
||||
repositoriesPage.list().resourceTable().sortableTable().rowSelectCtlWithName(this.repoName)
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ declare global {
|
|||
createAwsCloudCredentials(nsName: string, cloudCredName: string, defaultRegion: string, accessKey: string, secretKey: string): Chainable;
|
||||
|
||||
getRancherResource(prefix: 'v3' | 'v1', resourceType: string, resourceId?: string, expectedStatusCode?: number): Chainable;
|
||||
setRancherResource(prefix: 'v3' | 'v1', resourceType: string, resourceId: string, body: string): Chainable;
|
||||
setRancherResource(prefix: 'v3' | 'v1', resourceType: string, resourceId: string, body: any): Chainable;
|
||||
createRancherResource(prefix: 'v3' | 'v1', resourceType: string, body: string): Chainable;
|
||||
deleteRancherResource(prefix: 'v3' | 'v1', resourceType: string, resourceId: string, failOnStatusCode?: boolean): Chainable;
|
||||
deleteNodeTemplate(nodeTemplateId: string)
|
||||
|
|
|
|||
Loading…
Reference in New Issue