v9: Fixing flaky cypress test "Macro in Grid" (#11485)

* fixed flaky macro test and updated cypress version

* fixed flaky macro test and updated cypress version

* Update package.json

* Fixed failing tabs test

* Amend magic numbers with actual wait

* Update tests/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/content.ts

* Updated UI to click on button instead of icon

* Make macro test click bottom to ensure we're not clicking on icon

Co-authored-by: Nikolaj Geisle <niko737@edu.ucl.dk>
(cherry picked from commit 34be464cf8)

# Conflicts:
#	tests/Umbraco.Tests.AcceptanceTest/cypress/integration/Tabs/tabs.ts
This commit is contained in:
Nikolaj Geisle
2021-10-26 15:01:14 +02:00
committed by Sebastiaan Janssen
parent 0bd82d33aa
commit a3797aaeef
3 changed files with 556 additions and 3 deletions

View File

@@ -766,7 +766,8 @@ context('Content', () => {
// Click macro
cy.get(':nth-child(4) > .umb-card-grid-item > :nth-child(1)').click();
// Select the macro
cy.get('.umb-card-grid-item').contains(macroName).click();
cy.get(`.umb-card-grid-item[title='${macroName}']`).click('bottom');
// Save and publish
cy.umbracoButtonByLabelKey('buttons_saveAndPublish').click();

View File

@@ -28,12 +28,12 @@
<p ng-bind="a11yInfo" role="alert"></p>
<ul class="umb-card-grid -three-in-row">
<li ng-repeat="availableItem in macros | orderBy:'name' | filter:model.searchTerm">
<button class="btn-reset umb-card-grid-item" title="{{availableItem.name}}" ng-click="selectMacro(availableItem)">
<button class="btn-reset umb-card-grid-item" title="{{availableItem.name}}" ng-click="selectMacro(availableItem)">
<span>
<umb-icon icon="icon-settings-alt"></umb-icon>
{{availableItem.name}}
</span>
</button>
</button>
</li>
</ul>

View File

@@ -0,0 +1,552 @@
/// <reference types="Cypress" />
import {
DocumentTypeBuilder,
AliasHelper
} from 'umbraco-cypress-testhelpers';
const tabsDocTypeName = 'Tabs Test Document';
const tabsDocTypeAlias = AliasHelper.toAlias(tabsDocTypeName);
context('Tabs', () => {
beforeEach(() => {
cy.umbracoLogin(Cypress.env('username'), Cypress.env('password'), false);
});
afterEach(() => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName)
});
function OpenDocTypeFolder(){
cy.umbracoSection('settings');
cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
cy.get('.umb-tree-item__inner > .umb-tree-item__arrow').eq(0).click();
cy.get('.umb-tree-item__inner > .umb-tree-item__label').contains(tabsDocTypeName).click();
}
function CreateDocWithTabAndNavigate(){
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withAlias("urlPicker")
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
}
it('Create tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
cy.deleteAllContent();
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addGroup()
.withName('Tabs1Group')
.addUrlPickerProperty()
.withAlias('picker')
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
//Create a tab
cy.get('.umb-group-builder__tabs__add-tab').click();
cy.get('ng-form.ng-invalid > .umb-group-builder__group-title-input').type('Tab 1');
//Create a 2nd tab manually
cy.get('.umb-group-builder__tabs__add-tab').click();
cy.get('ng-form.ng-invalid > .umb-group-builder__group-title-input').type('Tab 2');
//Create a textstring property
cy.get('[aria-hidden="false"] > .umb-box-content > .umb-group-builder__group-add-property').click();
cy.get('.editor-label').type('property name');
cy.get('[data-element="editor-add"]').click();
//Search for textstring
cy.get('#datatype-search').type('Textstring');
// Choose first item
cy.get('[title="Textstring"]').closest("li").click();
// Save property
cy.get('.btn-success').last().click();
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('[title="tab1"]').should('be.visible');
cy.get('[title="tab2"]').should('be.visible');
});
it('Delete tabs', () => {
CreateDocWithTabAndNavigate();
//Check if tab is there, else if it wasnt created, this test would always pass
cy.get('[title="aTab 1"]').should('be.visible');
//Delete a tab
cy.get('.btn-reset > [icon="icon-trash"]').first().click();
cy.get('.umb-button > .btn').last().click();
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.get('[title="aTab 1"]').should('not.exist');
//Clean
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
});
it('Delete property in tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withAlias("urlPicker")
.done()
.addContentPickerProperty()
.withAlias('picker')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
cy.get('[aria-label="Delete property"]').last().click();
cy.umbracoButtonByLabelKey('actions_delete').click();
cy.umbracoButtonByLabelKey('buttons_save').click()
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('[title=urlPicker]').should('be.visible');
cy.get('[title=picker]').should('not.exist');
});
it('Delete group in tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withAlias("urlPicker")
.done()
.done()
.addGroup()
.withName('Content Picker Group')
.addContentPickerProperty()
.withAlias('picker')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
//Delete group
cy.get('.umb-group-builder__group-remove > [icon="icon-trash"]').eq(1).click();
cy.umbracoButtonByLabelKey('actions_delete').click();
cy.umbracoButtonByLabelKey('buttons_save').click()
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('[title=picker]').should('be.visible');
cy.get('[title=urlPicker]').should('not.exist');
});
it('Reorders tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group 1')
.addUrlPickerProperty()
.withLabel('Url picker 1')
.withAlias("urlPicker")
.done()
.done()
.done()
.addTab()
.withName('Tab 2')
.addGroup()
.withName('Tab group 2')
.addUrlPickerProperty()
.withLabel('Url picker 2')
.withAlias("pickerTab 2")
.done()
.done()
.done()
.addTab()
.withName('Tab 3')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withLabel('Url picker 3')
.withAlias('pickerTab3')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
//Check if there are any tabs
cy.get('ng-form.ng-valid-required > .umb-group-builder__group-title-input').should('be.visible');
cy.get('[alias="reorder"]').click();
//Type order in
cy.get('.umb-group-builder__tab-sort-order > .umb-property-editor-tiny').first().type('3');
cy.get('[alias="reorder"]').click();
//Assert
cy.get('.umb-group-builder__group-title-input').eq(0).invoke('attr', 'title').should('eq', 'aTab 2')
cy.get('.umb-group-builder__group-title-input').eq(1).invoke('attr', 'title').should('eq', 'aTab 3')
cy.get('.umb-group-builder__group-title-input').eq(2).invoke('attr', 'title').should('eq', 'aTab 1')
});
it('Reorders groups in a tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group 1')
.addUrlPickerProperty()
.withLabel('Url picker 1')
.withAlias("urlPicker")
.done()
.done()
.addGroup()
.withName('Tab group 2')
.addUrlPickerProperty()
.withLabel('Url picker 2')
.withAlias('urlPickerTwo')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
cy.get('[alias="reorder"]').click();
cy.get('.umb-property-editor-tiny').eq(2).type('1');
cy.get('[alias="reorder"]').click();
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('.umb-group-builder__group-title-input').eq(2)
.invoke('attr', 'title').should('eq', 'aTab 1/aTab group 2');
});
it('Reorders properties in a tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withLabel('PickerOne')
.withAlias("urlPicker")
.done()
.addUrlPickerProperty()
.withLabel('PickerTwo')
.withAlias('urlPickerTwo')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
//Reorder
cy.get('[alias="reorder"]').click();
cy.get('.umb-group-builder__group-sort-value').first().type('2');
cy.get('[alias="reorder"]').click();
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('.umb-locked-field__input').last().invoke('attr', 'title').should('eq', 'urlPicker');
});
it('Tab name cannot be empty', () => {
CreateDocWithTabAndNavigate();
cy.get('.umb-group-builder__group-title-input').first().clear();
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoErrorNotification().should('be.visible');
});
it('Two tabs cannot have the same name', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withAlias("urlPicker")
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
//Create a 2nd tab manually
cy.get('.umb-group-builder__tabs__add-tab').click();
cy.get('ng-form.ng-invalid > .umb-group-builder__group-title-input').type('Tab 1');
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoErrorNotification().should('be.visible');
});
it('Group name cannot be empty', () => {
CreateDocWithTabAndNavigate();
cy.get('.clearfix > .-placeholder').click();
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoErrorNotification().should('be.visible');
});
it('Group name cannot have the same name', () => {
CreateDocWithTabAndNavigate();
cy.get('.clearfix > .-placeholder').click();
cy.get('.umb-group-builder__group-title-input').last().type('Tab group');
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoErrorNotification().should('be.visible');
});
it('Drag a group into another tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withAlias("urlPicker")
.done()
.done()
.done()
.addTab()
.withName('Tab 2')
.addGroup()
.withName('Tab group tab 2')
.addUrlPickerProperty()
.withAlias('urlPickerTabTwo')
.done()
.done()
.addGroup()
.withName('Tab group 2')
.addUrlPickerProperty()
.withAlias('urlPickerTwo')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
cy.get('[alias="reorder"]').click();
cy.get('body')
.then(($body) => {
while($body.find('.umb-group-builder__tabs-overflow--right > .caret').hasClass('active')){
cy.click();
}
});
cy.get('.umb-group-builder__tab').last().click();
cy.get('.umb-group-builder__group-title-icon').last().trigger('mousedown', { which: 1 })
cy.get('.umb-group-builder__tab').eq(1).trigger('mousemove', {which: 1, force: true});
cy.get('.umb-group-builder__tab').eq(1).should('have.class', 'is-active').trigger('mouseup', {force:true});
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('[title="aTab 1/aTab group 2"]').should('be.visible');
});
it('Drag and drop reorders a tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withAlias("urlPicker")
.done()
.done()
.done()
.addTab()
.withName('Tab 2')
.addGroup()
.withName('Tab group tab 2')
.addUrlPickerProperty()
.withAlias('urlPickerTabTwo')
.done()
.done()
.addGroup()
.withName('Tab group 2')
.addUrlPickerProperty()
.withAlias('urlPickerTwo')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
cy.get('[alias="reorder"]').click();
//Scroll right so we can see tab 2
cy.get('body')
.then(($body) => {
while($body.find('.umb-group-builder__tabs-overflow--right > .caret').hasClass('active')){
cy.click();
}
});
cy.get('.umb-group-builder__tab-title-icon').eq(1).trigger('mousedown', { which: 1 })
cy.get('.umb-group-builder__tab').eq(1).trigger('mousemove', {which: 1, force: true});
cy.get('.umb-group-builder__tab').eq(1).should('have.class', 'is-active').trigger('mouseup', {force:true});
cy.get('[alias="reorder"]').click();
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('[title="aTab 2"]').should('be.visible');
});
it('Drags and drops a property in a tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withAlias("urlPicker")
.withLabel('UrlPickerOne')
.done()
.done()
.done()
.addTab()
.withName('Tab 2')
.addGroup()
.withName('Tab group tab 2')
.addUrlPickerProperty()
.withAlias('urlPickerTabTwo')
.withLabel('UrlPickerTabTwo')
.done()
.addUrlPickerProperty()
.withAlias('urlPickerTwo')
.withLabel('UrlPickerTwo')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
cy.get('[alias="reorder"]').click();
//Scroll so we are sure we see tab 2
cy.get('body')
.then(($body) => {
while($body.find('.umb-group-builder__tabs-overflow--right > .caret').hasClass('active')){
cy.click();
}
});
//Navigate to tab 2
cy.get('.umb-group-builder__tab').last().click();
cy.get('.umb-group-builder__property-meta > .flex > .icon').eq(1).trigger('mousedown', {which: 1})
cy.get('.umb-group-builder__tab').eq(1).trigger('mousemove', {which: 1, force: true});
cy.get('.umb-group-builder__tab').eq(1).should('have.class', 'is-active');
cy.get('.umb-group-builder__property')
.first().trigger('mousemove', {which: 1, force: true}).trigger('mouseup', {which: 1, force:true});
cy.get('[alias="reorder"]').click();
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('[title="urlPickerTabTwo"]').should('be.visible');
});
it('Drags and drops a group and converts to tab', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(tabsDocTypeName);
const tabsDocType = new DocumentTypeBuilder()
.withName(tabsDocTypeName)
.withAlias(tabsDocTypeAlias)
.withAllowAsRoot(true)
.withDefaultTemplate(tabsDocTypeAlias)
.addTab()
.withName('Tab 1')
.addGroup()
.withName('Tab group')
.addUrlPickerProperty()
.withAlias("urlPicker")
.withLabel('UrlPickerOne')
.done()
.done()
.addGroup()
.withName('Tab group 2')
.addUrlPickerProperty()
.withAlias('urlPickerTwo')
.withLabel('UrlPickerTwo')
.done()
.done()
.done()
.addTab()
.withName('Tab 2')
.addGroup()
.withName('Tab group tab 2')
.addUrlPickerProperty()
.withAlias('urlPickerTabTwo')
.withLabel('UrlPickerTabTwo')
.done()
.done()
.done()
.build();
cy.saveDocumentType(tabsDocType);
OpenDocTypeFolder();
cy.get('[alias="reorder"]').click();
cy.get('.umb-group-builder__group-title-icon').eq(1).trigger('mousedown', {which: 1})
cy.get('.umb-group-builder__convert-dropzone').trigger('mousemove', {which: 1, force: true});
cy.get('.umb-group-builder__convert-dropzone').trigger('mouseup', {which: 1, force:true});
cy.umbracoButtonByLabelKey('buttons_save').click();
//Assert
cy.umbracoSuccessNotification().should('be.visible');
cy.get('[title="tabGroup"]').should('be.visible');
});
});