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>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
5f19d8513b
Коммит
948f8941f0
@@ -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.
|
||||
|
||||
Ссылка в новой задаче
Block a user