UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

332 lines (251 loc) 9.3 kB
const { _, $ } = Cypress describe('src/cy/commands/angular', () => { before(() => { cy.visit('/fixtures/angular.html') }) describe('#ng', () => { context('find by binding', () => { it('finds color.name binding elements', () => { const spans = cy.$$('.colors span.name') cy.ng('binding', 'color.name').then(($spans) => { $spans.each((i, span) => { expect(span).to.eq(spans[i]) }) }) }) describe('errors', { defaultCommandTimeout: 100, }, () => { beforeEach(function () { this.angular = cy.state('window').angular }) afterEach(function () { cy.state('window').angular = this.angular }) it('throws when cannot find angular', { retries: 2 }, (done) => { delete cy.state('window').angular cy.on('fail', (err) => { expect(err.message).to.include('Angular global (`window.angular`) was not found in your window. You cannot use `cy.ng()` methods without angular.') done() }) cy.ng('binding', 'phone') }) it('throws when binding cannot be found', (done) => { cy.on('fail', (err) => { expect(err.message).to.include('Could not find element for binding: \'not-found\'.') done() }) cy.ng('binding', 'not-found') }) it('cancels additional finds when aborted', (done) => { cy.timeout(1000) cy.stub(Cypress.runner, 'stop') let retry = _.after(2, () => { Cypress.stop() }) cy.on('command:retry', retry) cy.on('fail', (err) => { done(err) }) cy.on('stop', () => { retry = cy.spy(cy, 'retry') _.delay(() => { expect(retry.callCount).to.eq(0) done() }, 100) }) cy.ng('binding', 'not-found') }) }) }) context('find by repeater', () => { const ngPrefixes = { 'phone in phones': 'ng-', 'phone2 in phones': 'ng_', 'phone3 in phones': 'data-ng-', 'phone4 in phones': 'x-ng-' } _.each(ngPrefixes, (prefix, attr) => { it(`finds by ${prefix}repeat`, () => { // make sure we find this element const li = cy.$$(`[${prefix}repeat*='${attr}']`) expect(li).to.exist // and make sure they are the same DOM element cy.ng('repeater', attr).then(($li) => { expect($li.get(0)).to.eq(li.get(0)) }) }) }) it('favors earlier items in the array when duplicates are found', () => { const li = cy.$$('[ng-repeat*=\'foo in foos\']') cy.ng('repeater', 'foo in foos').then(($li) => { expect($li.get(0)).to.eq(li.get(0)) }) }) it('waits to find a missing input', () => { const missingLi = $('<li />', { 'data-ng-repeat': 'li in lis' }) // wait until we're ALMOST about to time out before // appending the missingInput cy.on('command:retry', _.after(2, () => { cy.$$('body').append(missingLi) })) cy.ng('repeater', 'li in lis').then(($li) => { expect($li).to.match(missingLi) }) }) describe('errors', { defaultCommandTimeout: 100, }, () => { beforeEach(function () { this.angular = cy.state('window').angular }) afterEach(function () { cy.state('window').angular = this.angular }) it('throws when repeater cannot be found', (done) => { cy.on('fail', (err) => { expect(err.message).to.include('Could not find element for repeater: \'not-found\'. Searched [ng-repeat*=\'not-found\'], [ng_repeat*=\'not-found\'], [data-ng-repeat*=\'not-found\'], [x-ng-repeat*=\'not-found\'].') done() }) cy.ng('repeater', 'not-found') }) it('cancels additional finds when aborted', (done) => { cy.timeout(1000) cy.stub(Cypress.runner, 'stop') let retry = _.after(2, () => { Cypress.stop() }) cy.on('command:retry', retry) cy.on('fail', (err) => { done(err) }) cy.on('stop', () => { retry = cy.spy(cy, 'retry') _.delay(() => { expect(retry.callCount).to.eq(0) done() }, 100) }) cy.ng('repeater', 'not-found') }) it('throws when cannot find angular', (done) => { delete cy.state('window').angular cy.on('fail', (err) => { expect(err.message).to.include('Angular global (`window.angular`) was not found in your window. You cannot use `cy.ng()` methods without angular.') done() }) cy.ng('repeater', 'phone in phones') }) }) describe('log', () => { beforeEach(function () { this.logs = [] cy.on('log:added', (attrs, log) => { if (attrs.name === 'assert') { this.lastLog = log this.logs.push(log) } }) return null }) it('does not incorrectly merge 2nd assertion into 1st', function () { cy .ng('repeater', 'foo in foos').should('have.length', 2) .url().should('include', ':') .then(() => { expect(this.logs.length).to.eq(2) expect(this.logs[0].get('state')).to.eq('passed') expect(this.logs[1].get('state')).to.eq('passed') }) }) }) }) context('find by model', () => { const ngPrefixes = { query: 'ng-', query2: 'ng_', query3: 'data-ng-', query4: 'x-ng-' } _.each(ngPrefixes, (prefix, attr) => { it(`finds element by ${prefix}model`, () => { // make sure we find this element const input = cy.$$(`[${prefix}model=${attr}]`) expect(input).to.exist // and make sure they are the same DOM element cy.ng('model', attr).then(($input) => { expect($input.get(0)).to.eq(input.get(0)) }) }) }) it('favors earlier items in the array when duplicates are found', () => { const input = cy.$$('[ng-model=foo]') cy.ng('model', 'foo').then(($input) => { expect($input.get(0)).to.eq(input.get(0)) }) }) it('waits to find a missing input', () => { const missingInput = $('<input />', { 'data-ng-model': 'missing-input' }) // wait until we're ALMOST about to time out before // appending the missingInput cy.on('command:retry', _.after(2, () => { cy.$$('body').append(missingInput) })) cy.ng('model', 'missing-input').then(($input) => { expect($input).to.match(missingInput) }) }) it('cancels other retries when one resolves', () => { const retry = cy.spy(cy, 'retry') const missingInput = $('<input />', { 'data-ng-model': 'missing-input' }) cy.on('command:retry', _.after(6, _.once(() => { cy.$$('body').append(missingInput) }))) // we want to make sure that the ng promises do not continue // to retry after the first one resolves cy.ng('model', 'missing-input') .then(() => { return retry.resetHistory() }) .wait(100) .then(() => { expect(retry.callCount).to.eq(0) }) }) describe('errors', { defaultCommandTimeout: 100, }, () => { beforeEach(function () { this.angular = cy.state('window').angular }) afterEach(function () { cy.state('window').angular = this.angular }) it('throws when model cannot be found', (done) => { cy.ng('model', 'not-found') cy.on('fail', (err) => { expect(err.message).to.include('Could not find element for model: \'not-found\'. Searched [ng-model=\'not-found\'], [ng_model=\'not-found\'], [data-ng-model=\'not-found\'], [x-ng-model=\'not-found\'].') done() }) }) it('cancels additional finds when aborted', (done) => { cy.timeout(1000) cy.stub(Cypress.runner, 'stop') let retry = _.after(2, () => { Cypress.stop() }) cy.on('command:retry', retry) cy.on('fail', (err) => { done(err) }) cy.on('stop', () => { retry = cy.spy(cy, 'retry') _.delay(() => { expect(retry.callCount).to.eq(0) done() }, 100) }) cy.ng('model', 'not-found') }) it('throws when cannot find angular', (done) => { delete cy.state('window').angular cy.on('fail', (err) => { expect(err.message).to.include('Angular global (`window.angular`) was not found in your window. You cannot use `cy.ng()` methods without angular.') done() }) cy.ng('model', 'query') }) }) }) }) })