Skip to content

Commit 1024889

Browse files
authored
Merge pull request #15619 from yonasberhe23/fix_repositories_test
Automation: fix repositories test
2 parents a9aa482 + 8587c2c commit 1024889

File tree

6 files changed

+55
-54
lines changed

6 files changed

+55
-54
lines changed

cypress/e2e/po/components/sortable-table.po.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,20 @@ export default class SortableTablePo extends ComponentPo {
219219
*/
220220
rowActionMenuOpen(name: string) {
221221
this.rowWithName(name).actionBtn()
222-
.click();
222+
.click().then((el) => {
223+
expect(el).to.have.attr('aria-expanded', 'true');
224+
});
225+
226+
return this.rowActionMenu();
227+
}
228+
229+
rowActionMenuClose(name: string) {
230+
this.rowWithName(name).actionBtn().then((el) => {
231+
expect(el).to.have.attr('aria-expanded', 'true');
232+
}).click()
233+
.then((el) => {
234+
expect(el).to.have.attr('aria-expanded', 'false');
235+
});
223236

224237
return this.rowActionMenu();
225238
}

cypress/e2e/po/lists/base-resource-list.po.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ export default class BaseResourceList extends ComponentPo {
1818
return this.resourceTable().sortableTable().rowActionMenuOpen(rowLabel);
1919
}
2020

21+
actionMenuClose(rowLabel: string) {
22+
return this.resourceTable().sortableTable().rowActionMenuClose(rowLabel);
23+
}
24+
2125
rowWithName(rowLabel: string) {
2226
return this.resourceTable().sortableTable().rowWithName(rowLabel);
2327
}

cypress/e2e/po/lists/chart-repositories.po.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@ import BaseResourceList from '@/cypress/e2e/po/lists/base-resource-list.po';
44
* List component for catalog.cattle.io.clusterrepo resources
55
*/
66
export default class ChartRepositoriesListPo extends BaseResourceList {
7-
actionMenu(repoName: string) {
8-
return this.resourceTable().sortableTable().rowActionMenuOpen(repoName);
9-
}
10-
11-
closeActionMenu() {
12-
cy.get('body').type('{esc}');
13-
}
14-
157
openBulkActionDropdown() {
168
return this.resourceTable().sortableTable().bulkActionDropDownOpen();
179
}

cypress/e2e/tests/pages/manager/repositories.spec.ts

Lines changed: 25 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import PromptRemove from '@/cypress/e2e/po/prompts/promptRemove.po';
33
import ChartRepositoriesPagePo from '@/cypress/e2e/po/pages/chart-repositories.po';
44
import * as path from 'path';
55
import * as jsyaml from 'js-yaml';
6-
import { LONG_TIMEOUT_OPT } from '@/cypress/support/utils/timeouts';
6+
import { LONG_TIMEOUT_OPT, MEDIUM_TIMEOUT_OPT } from '@/cypress/support/utils/timeouts';
77
import { CLUSTER_REPOS_BASE_URL } from '@/cypress/support/utils/api-endpoints';
88

99
const chartBranch = `release-v${ CURRENT_RANCHER_VERSION }`;
@@ -62,6 +62,7 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
6262
// check list details
6363
repositoriesPage.list().details(this.repoName, 2).should('be.visible');
6464
repositoriesPage.list().details(this.repoName, 1).contains('In Progress').should('be.visible');
65+
cy.waitForRepositoryDownload('v1', 'catalog.cattle.io.clusterrepos', this.repoName);
6566
repositoriesPage.list().details(this.repoName, 1).contains('Active', LONG_TIMEOUT_OPT).should('be.visible');
6667
});
6768

@@ -268,18 +269,8 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
268269
// check list details
269270
repositoriesPage.list().details(this.repoName, 2).should('be.visible');
270271

271-
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Delete').click();
272-
273-
const promptRemove = new PromptRemove();
274-
275-
cy.intercept('DELETE', `v1/catalog.cattle.io.clusterrepos/${ this.repoName }`).as('deleteRepository');
276-
277-
promptRemove.remove();
278-
cy.wait('@deleteRepository');
279-
repositoriesPage.waitForPage();
280-
281-
// check list details
282-
cy.contains(this.repoName).should('not.exist');
272+
// delete repo
273+
cy.deleteRancherResource('v1', 'catalog.cattle.io.clusterrepos', this.repoName);
283274
});
284275

285276
it('can disable/enable a repository', function() {
@@ -300,45 +291,34 @@ describe('Cluster Management Helm Repositories', { testIsolation: 'off', tags: [
300291
repositoriesPage.waitForPage();
301292

302293
// check list details
303-
repositoriesPage.list().details(this.repoName, 2).should('be.visible');
304-
repositoriesPage.list().details(this.repoName, 1).contains('In Progress').should('be.visible');
305-
306-
// refresh should be displayed for an enabled repo
307-
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Refresh').should('be.visible');
308-
// close action menu
309-
repositoriesPage.list().closeActionMenu();
294+
cy.waitForRepositoryDownload('v1', 'catalog.cattle.io.clusterrepos', this.repoName).then(() => {
295+
repositoriesPage.list().details(this.repoName, 1).contains('Active', MEDIUM_TIMEOUT_OPT).should('be.visible');
296+
// refresh should be displayed for an enabled repo
297+
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Refresh').should('be.visible');
298+
// close action menu
299+
repositoriesPage.list().actionMenuClose(this.repoName);
300+
});
310301

311302
// disable repo
312-
// eslint-disable-next-line cypress/no-unnecessary-waiting
313-
cy.wait(1500);
314-
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Disable').click();
315-
repositoriesPage.list().details(this.repoName, 1).contains('Disabled', { timeout: 10000 }).scrollIntoView()
316-
.should('be.visible');
303+
cy.waitForResourceState('v1', 'catalog.cattle.io.clusterrepos', this.repoName).then(() => {
304+
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Disable').click();
305+
repositoriesPage.list().details(this.repoName, 1).contains('Disabled').should('be.visible');
306+
});
317307

318308
// refresh should NOT be displayed for a disabled repo
319-
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Refresh').should('not.exist');
320-
// close action menu
321-
repositoriesPage.list().closeActionMenu();
309+
cy.waitForResourceState('v1', 'catalog.cattle.io.clusterrepos', this.repoName).then(() => {
310+
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Refresh').should('not.exist');
311+
// close action menu
312+
repositoriesPage.list().actionMenuClose(this.repoName);
313+
});
322314

323315
// enable repo
324-
// eslint-disable-next-line cypress/no-unnecessary-waiting
325-
cy.wait(1500);
326-
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Enable').click();
327-
repositoriesPage.list().details(this.repoName, 1).contains('Active', LONG_TIMEOUT_OPT).scrollIntoView()
328-
.should('be.visible');
316+
cy.waitForResourceState('v1', 'catalog.cattle.io.clusterrepos', this.repoName).then(() => {
317+
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Enable').click();
318+
repositoriesPage.list().details(this.repoName, 1).contains('Active', MEDIUM_TIMEOUT_OPT).should('be.visible');
319+
});
329320

330321
// delete repo
331-
repositoriesPage.list().actionMenu(this.repoName).getMenuItem('Delete').click();
332-
333-
const promptRemove = new PromptRemove();
334-
335-
cy.intercept('DELETE', `v1/catalog.cattle.io.clusterrepos/${ this.repoName }`).as('deleteRepository');
336-
337-
promptRemove.remove();
338-
cy.wait('@deleteRepository');
339-
repositoriesPage.waitForPage();
340-
341-
// check list details
342-
cy.contains(this.repoName).should('not.exist');
322+
cy.deleteRancherResource('v1', 'catalog.cattle.io.clusterrepos', this.repoName);
343323
});
344324
});

cypress/globals.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ declare global {
120120
waitForRancherResource(prefix: 'v3' | 'v1', resourceType: string, resourceId: string, testFn: (resp: any) => boolean, retries?: number, config?: {failOnStatusCode?: boolean}): Chainable;
121121
waitForRancherResources(prefix: 'v3' | 'v1', resourceType: string, expectedResourcesTotal: number, greaterThan?: boolean): Chainable;
122122
waitForRepositoryDownload(prefix: 'v3' | 'v1', resourceType: string, resourceId: string, retries?: number): Chainable;
123+
waitForResourceState(prefix: 'v3' | 'v1', resourceType: string, resourceId: string, resourceState?: string, retries?: number): Chainable;
123124
deleteRancherResource(prefix: 'v3' | 'v1' | 'k8s', resourceType: string, resourceId: string, failOnStatusCode?: boolean): Chainable;
124125
getClusterIdByName(clusterName: string): Chainable<string>;
125126
deleteNodeTemplate(nodeTemplateId: string, timeout?: number, failOnStatusCode?: boolean)

cypress/support/commands/rancher-api-commands.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,17 @@ Cypress.Commands.add('waitForRepositoryDownload', (prefix, resourceType, resourc
594594
}, retries);
595595
});
596596

597+
/**
598+
* Wait for repository to be state
599+
*/
600+
Cypress.Commands.add('waitForResourceState', (prefix, resourceType, resourceId, resourceState = 'active', retries = 20) => {
601+
return cy.waitForRancherResource(prefix, resourceType, resourceId, (resp) => {
602+
const state = resp.body.metadata?.state;
603+
604+
return state && state.transitioning === false && state.name === resourceState;
605+
}, retries);
606+
});
607+
597608
/**
598609
* delete a node template
599610
*/

0 commit comments

Comments
 (0)