UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

355 lines (281 loc) 11.2 kB
describe('Login', function () { beforeEach(function () { cy.fixture('user').as('user') cy.visitIndex().then(function (win) { let start = win.App.start this.win = win this.ipc = win.App.ipc cy.stub(this.ipc, 'onMenuClicked') cy.stub(this.ipc, 'onFocusTests') cy.stub(this.ipc, 'getOptions').resolves({}) cy.stub(this.ipc, 'getCurrentUser').resolves(null) cy.stub(this.ipc, 'updaterCheck').resolves(false) cy.stub(this.ipc, 'getProjects').resolves([]) cy.stub(this.ipc, 'getProjectStatuses').resolves([]) cy.stub(this.ipc, 'openProject').resolves(this.config) cy.stub(this.ipc, 'getSpecs').yields(null, this.specs) cy.stub(this.ipc, 'externalOpen') cy.stub(this.ipc, 'logOut').resolves() cy.stub(this.ipc, 'onAuthMessage').callsFake((function (_this) { return function (cb) { return _this.onAuthMessageCb = cb } })(this)) this.pingApiServer = this.util.deferred() cy.stub(this.ipc, 'pingApiServer').returns(this.pingApiServer.promise) this.beginAuth = this.util.deferred() cy.stub(this.ipc, 'beginAuth').returns(this.beginAuth.promise) start() cy.contains('Log In').click() }) }) it('pings api server', function () { expect(this.ipc.pingApiServer).to.be.called cy.get('.loader') }) describe('when connected to api server', function () { beforeEach(function () { this.pingApiServer.resolve() }) it('has dashboard login button', function () { cy.get('.login').contains('button', 'Log In to Dashboard') cy.percySnapshot() }) it('opens dashboard on clicking \'Cypress Dashboard\'', () => { cy.contains('Cypress Dashboard').click().then(function () { expect(this.ipc.externalOpen).to.be.calledWith('https://on.cypress.io/dashboard') }) }) describe('click Log In to Dashboard', function () { beforeEach(function () { cy.get('.login').contains('button', 'Log In to Dashboard').as('loginBtn').click() }) it('triggers ipc "begin:auth" on click', function () { cy.then(function () { expect(this.ipc.beginAuth).to.be.calledOnce }) }) it('passes utm code when it triggers ipc "begin:auth"', function () { cy.then(function () { // we match nav in this test since the outer beforeEach initializes the modal from the navbar expect(this.ipc.beginAuth).to.be.calledWith('Nav') }) }) it('shows spinner with Opening browser and disables button', () => { cy.get('@loginBtn').should('be.disabled') .invoke('text').should('contain', 'Opening browser...') cy.percySnapshot() }) context('on begin:auth', function () { it('when browser opened, shows spinner with Waiting...', function () { this.onAuthMessageCb(null, { name: '', message: '', stack: '', browserOpened: true, }) cy.get('@loginBtn').should('be.disabled') .invoke('text').should('contain', 'Waiting for browser login...') cy.percySnapshot() }) describe('on ipc begin:auth success', function () { context('when user name is not defined', () => { beforeEach(function () { this.user.name = '' this.beginAuth.resolve(this.user) }) it('displays user email in UI', function () { cy.get('.user-dropdown .dropdown-chosen').should('contain', this.user.email) }) it('displays user email in success dialog', function () { cy.get('.modal').contains(this.user.email) cy.percySnapshot() }) it('displays message with link to complete onboarding steps', () => { cy.get('.modal').contains('complete the onboarding steps') cy.contains('a', 'Cypress Dashboard') .click().then(function () { expect(this.ipc.externalOpen).to.be.calledWith('https://on.cypress.io/dashboard/profile') }) }) }) context('when user name is defined', () => { beforeEach(function () { this.beginAuth.resolve(this.user) }) it('goes to previous view', () => { cy.shouldBeOnIntro() }) it('displays username in UI', function () { cy.get('.user-dropdown .dropdown-chosen').should('contain', this.user.name) }) it('displays username in success dialog', () => { cy.get('.modal').contains('Jane Lane') cy.percySnapshot() }) it('can close modal by clicking Continue', () => { cy.get('.modal .btn:contains(Continue)').click() cy.get('.modal').should('not.be.visible') }) context('after clicking Continue', function () { beforeEach(function () { cy.get('.modal .btn:contains(Continue)').click() }) context('log out', function () { it('displays login button on logout', () => { cy.get('.user-dropdown .dropdown-chosen').contains('Jane').click() cy.contains('Log Out').click() cy.get('.nav').contains('Log In') }) it('calls log:out', function () { cy.get('.user-dropdown .dropdown-chosen').contains('Jane').click() cy.contains('Log Out').click().then(function () { expect(this.ipc.logOut).to.be.called }) }) it('has login button enabled when returning to login after logout', function () { cy.get('.user-dropdown .dropdown-chosen').contains('Jane').click() cy.contains('Log Out').click() cy.contains('Log In').click() cy.get('.login button').eq(1) .should('not.be.disabled').invoke('text') .should('include', 'Log In to Dashboard') }) }) }) }) }) describe('on ipc begin:auth error', function () { beforeEach(function () { this.beginAuth.reject({ name: 'foo', message: 'There\'s an error', }) }) it('displays error in ui', () => { cy.get('.alert-danger').should('be.visible') .contains('There\'s an error') cy.percySnapshot() }) it('login button should be enabled', () => { cy.get('@loginBtn').should('not.be.disabled') }) }) describe('on ipc on:auth:message', function () { beforeEach(function () { this.onAuthMessageCb(null, { message: 'some warning here', type: 'warning', }) }) it('displays warning in ui', () => { cy.get('.warning').should('be.visible') .contains('some warning here') cy.percySnapshot() }) it('login button should be disabled', () => { cy.get('@loginBtn').should('be.disabled') }) it('on AUTH_COULD_NOT_LAUNCH_BROWSER login button changes', function () { this.onAuthMessageCb(null, { name: 'AUTH_COULD_NOT_LAUNCH_BROWSER', type: 'warning', message: 'foo', }) cy.get('.login-content .btn-login') .should('be.disabled') .should('have.text', ' Could not open browser.') cy.percySnapshot() }) it('<pre> can be click-selected', function () { this.onAuthMessageCb(null, { message: 'foo\n```\nbar\n```', type: 'warning', }) cy.get('.login-content .message pre').click() cy.document().then(function ($doc) { const selection = $doc.getSelection().toString() expect(selection).to.eq('bar') }) }) }) }) }) describe('Dashboard link in message', function () { it('opens link to Dashboard Service on click', function () { cy.contains('a', 'Cypress Dashboard Service') .click().then(function () { expect(this.ipc.externalOpen).to.be.calledWith('https://on.cypress.io/dashboard') }) }) }) describe('terms and privacy message', () => { it('opens links to terms and privacy on click', function () { cy.contains('a', 'Terms of Use') .click().then(function () { expect(this.ipc.externalOpen).to.be.calledWith('https://on.cypress.io/terms-of-use') }) cy.contains('a', 'Privacy Policy') .click().then(function () { expect(this.ipc.externalOpen).to.be.calledWith('https://on.cypress.io/privacy-policy') }) }) }) }) describe('when not connected to api server', function () { beforeEach(function () { this.pingApiServerAgain = this.util.deferred() this.ipc.pingApiServer.onCall(1).returns(this.pingApiServerAgain.promise) this.pingApiServer.reject({ apiUrl: 'http://api.server', message: 'ECONNREFUSED', }) }) it('shows cannot connect to api server message', function () { cy.contains('Cannot connect to API server') cy.contains('http://api.server') cy.contains('ECONNREFUSED') cy.percySnapshot() }) describe('trying again', function () { beforeEach(() => { cy.contains('Try again').click() }) it('pings again', () => { cy.get('.loader').then(function () { expect(this.ipc.pingApiServer).to.be.calledTwice }) }) it('shows new error on failure', function () { this.pingApiServerAgain.reject({ apiUrl: 'http://api.server', message: 'WHADJAEXPECT', }) cy.contains('Cannot connect to API server') cy.contains('http://api.server') cy.contains('WHADJAEXPECT') }) it('shows login on success', function () { this.pingApiServerAgain.resolve() cy.get('.login').contains('button', 'Log In to Dashboard') }) }) describe('api help link', () => { it('goes to external api help link', () => { cy.get('.login').contains('Learn more').click().then(function () { expect(this.ipc.externalOpen).to.be.calledWith('https://on.cypress.io/help-connect-to-api') }) }) }) describe('closing login', function () { beforeEach(() => { cy.get('.login .close').click() }) it('shows log in if connected and opened again', function () { this.pingApiServerAgain.resolve() cy.contains('Log In').click() cy.get('.login').contains('button', 'Log In to Dashboard') }) }) }) })