CLD-7841 Optimize E2E testing costs (#27883)

* Utilize free runners for E2E tests, report back to PR on run completion
* Increase test stability on smaller instances
* Merge worker reports
* merge start+prepare steps
* upgrade keycloak
* increase test timeouts
* Add video recording to report artifacts

Co-authored-by: Saturnino Abril <5334504+saturninoabril@users.noreply.github.com>

---------

Co-authored-by: Saturnino Abril <5334504+saturninoabril@users.noreply.github.com>
Этот коммит содержится в:
Mario Vitale
2024-08-14 21:39:08 +02:00
коммит произвёл GitHub
родитель 5f19d8513b
Коммит 948f8941f0
37 изменённых файлов: 261 добавлений и 151 удалений

Просмотреть файл

@@ -73,7 +73,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
describe('post update dialog', () => {
it('renders description correctly', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -84,7 +84,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
it('description link navigates to run overview', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -101,7 +101,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
it('prevents posting an update message with only whitespace', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -157,7 +157,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
cy.visit(`/${testTeam.name}/channels/${channelName}`);
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -183,7 +183,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
const reminderTime = '1 day';
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get the dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -249,7 +249,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
describe('prevents user from losing changes', () => {
it('cancel, go back and save', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -279,7 +279,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
it('click overview link, go back and save', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -310,7 +310,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
it('cancel and discard explicitly', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -333,7 +333,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
it('click overview link and discard explicitly', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -364,7 +364,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
describe('shows the last update in update message', () => {
it('shows the default when we have not made an update before', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get the dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -383,7 +383,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
cy.updateStatus(firstMessage);
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get the dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -399,7 +399,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
describe('the default reminder', () => {
it('shows the configured default when we have not made a previous update', () => {
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get the dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -418,7 +418,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
cy.updateStatus(firstMessage, '15 minutes');
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get the dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -437,7 +437,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
cy.updateStatus(firstMessage, '90 minutes');
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get the dialog modal.
cy.getStatusUpdateDialog().within(() => {
@@ -456,7 +456,7 @@ describe('channels > rhs > status update', {testIsolation: true}, () => {
cy.updateStatus(firstMessage, '7 days');
// # Run the `/playbook update` slash command.
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// # Get the dialog modal.
cy.getStatusUpdateDialog().within(() => {

Просмотреть файл

@@ -90,7 +90,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
cy.findByTestId('post_textbox').clear();
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook check 1 1');
cy.uiPostMessageQuickly('/playbook check 1 1 ');
// * Verify the task is checked
cy.get('[data-rbd-droppable-id="1"]').find('.checkbox').eq(1).should('be.checked');
@@ -98,7 +98,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('check add', () => {
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook checkadd 1 new-task');
cy.uiPostMessageQuickly('/playbook checkadd 1 new-task ');
// * Verify the task was added
cy.get('[data-rbd-droppable-id="1"]').contains('new-task');
@@ -106,7 +106,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('check remove', () => {
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook checkremove 1 1');
cy.uiPostMessageQuickly('/playbook checkremove 1 1 ');
// * Verify the task was added
cy.get('[data-rbd-droppable-id="1"]').contains('Step 2').should('not.exist');
@@ -114,7 +114,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('owner', () => {
// # Run a slash command
cy.uiPostMessageQuickly('/playbook owner');
cy.uiPostMessageQuickly('/playbook owner ');
// * Verify the message.
cy.verifyEphemeralMessage(`@${testUser.username} is the current owner for this playbook run.`);
@@ -123,13 +123,13 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
cy.uiPostMessageQuickly(`/playbook owner @${testUser2.username}`);
// * Verify that the owner was set.
cy.uiPostMessageQuickly('/playbook owner');
cy.uiPostMessageQuickly('/playbook owner ');
cy.verifyEphemeralMessage(`@${testUser2.username} is the current owner for this playbook run.`);
});
it('timeline', () => {
// # Run a slash command on a run with view access
cy.uiPostMessageQuickly('/playbook timeline');
cy.uiPostMessageQuickly('/playbook timeline ');
// * Verify the message.
cy.verifyEphemeralMessage(`Timeline for ${playbookRunName}`);
@@ -137,7 +137,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('finish', () => {
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook finish');
cy.uiPostMessageQuickly('/playbook finish ');
// * Verify confirm modal is visible.
cy.get('#interactiveDialogModalLabel').should('exist');
@@ -274,19 +274,19 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('check', () => {
// # Run a slash command with not enough parameters
cy.uiPostMessageQuickly('/playbook check 1 1');
cy.uiPostMessageQuickly('/playbook check 1 1 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Command expects three arguments: the run number, the checklist number and the item number.');
// # Run a slash command wrong run number
cy.uiPostMessageQuickly('/playbook check 2 1 1');
cy.uiPostMessageQuickly('/playbook check 2 1 1 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Invalid run number');
// # Run a slash command on a run with view access
cy.uiPostMessageQuickly('/playbook check 0 1 1');
cy.uiPostMessageQuickly('/playbook check 0 1 1 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Become a participant to interact with this run');
@@ -301,7 +301,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
cy.findByTestId('post_textbox').clear();
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook check 1 1 1');
cy.uiPostMessageQuickly('/playbook check 1 1 1 ');
cy.get('#rhsContainer').within(() => {
// * Verify number of runs
cy.get('[data-testid="run-list-card"]').should('have.length', 2);
@@ -316,19 +316,19 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('check add', () => {
// # Run a slash command with not enough parameters
cy.uiPostMessageQuickly('/playbook checkadd 1');
cy.uiPostMessageQuickly('/playbook checkadd 1 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Command expects two arguments: the run number and the checklist number.');
// # Run a slash command wrong run number
cy.uiPostMessageQuickly('/playbook checkadd 2 1 1');
cy.uiPostMessageQuickly('/playbook checkadd 2 1 1 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Invalid run number');
// # Run a slash command on a run with view access
cy.uiPostMessageQuickly('/playbook checkadd 0 1 new-task');
cy.uiPostMessageQuickly('/playbook checkadd 0 1 new-task ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Become a participant to interact with this run');
@@ -343,7 +343,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
cy.findByTestId('post_textbox').clear();
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook checkadd 1 1 new-task');
cy.uiPostMessageQuickly('/playbook checkadd 1 1 new-task ');
cy.get('#rhsContainer').within(() => {
// * Verify number of runs
@@ -359,19 +359,19 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('check remove', () => {
// # Run a slash command with not enough parameters
cy.uiPostMessageQuickly('/playbook checkremove 1 1');
cy.uiPostMessageQuickly('/playbook checkremove 1 1 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Command expects three arguments: the run number, the checklist number and the item number.');
// # Run a slash command wrong run number
cy.uiPostMessageQuickly('/playbook checkremove 2 0 1');
cy.uiPostMessageQuickly('/playbook checkremove 2 0 1 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Invalid run number');
// # Run a slash command on a run with view access
cy.uiPostMessageQuickly('/playbook checkremove 0 1 0');
cy.uiPostMessageQuickly('/playbook checkremove 0 1 0 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Become a participant to interact with this run');
@@ -386,7 +386,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
cy.findByTestId('post_textbox').clear();
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook checkremove 1 1 1');
cy.uiPostMessageQuickly('/playbook checkremove 1 1 1 ');
cy.get('#rhsContainer').within(() => {
// * Verify number of runs
@@ -402,19 +402,19 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('owner', () => {
// # Run a slash command with not enough parameters
cy.uiPostMessageQuickly('/playbook owner');
cy.uiPostMessageQuickly('/playbook owner ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('/playbook owner expects at most one argument.');
// # Run a slash command wrong run number
cy.uiPostMessageQuickly('/playbook owner 2');
cy.uiPostMessageQuickly('/playbook owner 2 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Invalid run number');
// # Run a slash command on a run with view access
cy.uiPostMessageQuickly('/playbook owner 0');
cy.uiPostMessageQuickly('/playbook owner 0 ');
// * Verify the message.
cy.verifyEphemeralMessage(`@${testUser.username} is the current owner for this playbook run.`);
@@ -429,34 +429,34 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
cy.findByTestId('post_textbox').clear();
// # Run a slash command on a run with view access
cy.uiPostMessageQuickly(`/playbook owner 0 @${testUser2.username}`);
cy.uiPostMessageQuickly(`/playbook owner 0 @${testUser2.username} `);
// * Verify the expected error message.
cy.verifyEphemeralMessage('Become a participant to interact with this run');
// # Run a slash command on a run with write access
cy.uiPostMessageQuickly(`/playbook owner 1 @${testUser2.username}`);
cy.uiPostMessageQuickly(`/playbook owner 1 @${testUser2.username} `);
// * Verify that the owner was set.
cy.uiPostMessageQuickly('/playbook owner 1');
cy.uiPostMessageQuickly('/playbook owner 1 ');
cy.verifyEphemeralMessage(`@${testUser2.username} is the current owner for this playbook run.`);
});
it('finish', () => {
// # Run a slash command with not enough parameters
cy.uiPostMessageQuickly('/playbook finish');
cy.uiPostMessageQuickly('/playbook finish ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Command expects one argument: the run number.');
// # Run a slash command wrong run number
cy.uiPostMessageQuickly('/playbook finish 2');
cy.uiPostMessageQuickly('/playbook finish 2 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Invalid run number');
// # Run a slash command on a run with view access
cy.uiPostMessageQuickly('/playbook finish 0');
cy.uiPostMessageQuickly('/playbook finish 0 ');
// * Verify the message.
cy.verifyEphemeralMessage(`userID ${testUser2.id} is not an admin or channel member`);
@@ -479,7 +479,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
});
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook finish 1');
cy.uiPostMessageQuickly('/playbook finish 1 ');
// * Verify confirm modal is visible.
cy.get('#interactiveDialogModalLabel').should('exist');
@@ -493,19 +493,19 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('timeline', () => {
// # Run a slash command with not enough parameters
cy.uiPostMessageQuickly('/playbook timeline');
cy.uiPostMessageQuickly('/playbook timeline ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Command expects one argument: the run number.');
// # Run a slash command wrong run number
cy.uiPostMessageQuickly('/playbook timeline 2');
cy.uiPostMessageQuickly('/playbook timeline 2 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Invalid run number');
// # Run a slash command on a run with view access
cy.uiPostMessageQuickly('/playbook timeline 0');
cy.uiPostMessageQuickly('/playbook timeline 0 ');
// * Verify the message.
cy.verifyEphemeralMessage(`Timeline for ${playbookRuns[1].name}`);
@@ -513,13 +513,13 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
it('update', () => {
// # Run a slash command with not enough parameters
cy.uiPostMessageQuickly('/playbook update');
cy.uiPostMessageQuickly('/playbook update ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Command expects one argument: the run number.');
// # Run a slash command wrong run number
cy.uiPostMessageQuickly('/playbook update 2');
cy.uiPostMessageQuickly('/playbook update 2 ');
// * Verify the expected error message.
cy.verifyEphemeralMessage('Invalid run number');
@@ -534,7 +534,7 @@ describe('channels > slash command > owner', {testIsolation: true}, () => {
cy.findByTestId('post_textbox').clear();
// # Run a slash command with correct parameters
cy.uiPostMessageQuickly('/playbook update 1');
cy.uiPostMessageQuickly('/playbook update 1 ');
// # Get dialog modal.
cy.getStatusUpdateDialog().within(() => {

Просмотреть файл

@@ -85,6 +85,7 @@ describe('channels > slash command > test', {testIsolation: true}, () => {
EnableTesting: true,
},
});
cy.apiReloadConfig();
});
beforeEach(() => {
@@ -132,6 +133,7 @@ describe('channels > slash command > test', {testIsolation: true}, () => {
EnableTesting: false,
},
});
cy.apiReloadConfig();
});
beforeEach(() => {
@@ -178,6 +180,7 @@ describe('channels > slash command > test', {testIsolation: true}, () => {
EnableTesting: true,
},
});
cy.apiReloadConfig();
});
beforeEach(() => {

Просмотреть файл

@@ -175,6 +175,7 @@ describe('playbooks > list', {testIsolation: true}, () => {
// # Drop loaded fixture onto playbook list
cy.findByTestId('playbook-list-scroll-container').selectFile(validPlaybookExport, {
action: 'drag-drop',
force: true,
});
// * Verify that a new playbook was created.