diff --git a/README.md b/README.md index 373b9c86..7d438cbc 100644 --- a/README.md +++ b/README.md @@ -153,38 +153,24 @@ If manual deployment is needed, use the following. Only do this on the develop b The featured post is managed in the ButterCMS portal. To make a post featured, it must be given a tag of 'featured'. The actual featured post will be the most recently published post with the featured tag. Currently, this post will also appear in the regular list of posts. -## Cypress Integration +## Protractor Testing -This project uses Cypress for front end testing. +This project uses Protractor for front end testing. +It is neccesary to install protractor for tests. -It is neccesary to install Cypress for test writing ``` -npm install cypress --save-dev +npm install protractor ``` -This will install Cypress locally as a dev dependency -### Opening Cypress +### Run Test -To launch Cypress Test Runner, the next command is needed -``` -npx cypress open -``` -### Github Integration - -Cypress provides a Dashboard, it is neccesary for the integration. - -1.- Go to organization switcher and choose your organization. - -2.- Click on the project you wish to integrate +Protractor uses a command for test running. It is neccesary to have a file with all the specs for test running. The file is called conf.js -3.- Go to project settings - -4.- Click install Cypress Github app - -5.- Select repositary you wish to integrate - -6.- Done +To run a test the next command is needed. +``` +protractor protractor/conf.js +``` ## Deployment ``` diff --git a/cypress/README.md b/cypress/README.md deleted file mode 100644 index 7eb2854d..00000000 --- a/cypress/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Cypress Testing - -##### [Cypress Documentation] (https://www.cypress.io/) - -#### Installing cypress: -`npm install cypress` - -#### To run tests: -**Open the terminal:** - -1. Start the local dev server using: `npm run dev --es5` - -2. In a separate terminal window run: `npm run cypress` - this will open the test runner which will allow you to either run all of the tests, or select individual test files. - -#### To write or edit tests: - -All Cypress E2E testing files live within the cypress/integration folder. - -#### To run individual test suites or blocks: - -Add .only before the describe suites or it blocks in the cypress/integration/.spec files, such as: - -`describe.only('Contact Form')`, or - -`it.only('Should...)` - -#### To capture images of how the application appears after a given action: - -Add `cy.screenshot('nameOfYourChoosing')` inside of any 'it' block. -The image will then appear as a file within the cypress/screenshots directory after you run the tests. - diff --git a/cypress/cypress.json b/cypress/cypress.json deleted file mode 100644 index 0163f4f7..00000000 --- a/cypress/cypress.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "baseUrl": "http://localhost:3333", - "blacklistHosts": [], - "chromeWebSecurity": false -} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json deleted file mode 100644 index da18d935..00000000 --- a/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} \ No newline at end of file diff --git a/cypress/fixtures/profile.json b/cypress/fixtures/profile.json deleted file mode 100644 index b6c355ca..00000000 --- a/cypress/fixtures/profile.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "id": 8739, - "name": "Jane", - "email": "jane@example.com" -} \ No newline at end of file diff --git a/cypress/fixtures/test_resume.pdf b/cypress/fixtures/test_resume.pdf deleted file mode 100644 index f78bf290..00000000 Binary files a/cypress/fixtures/test_resume.pdf and /dev/null differ diff --git a/cypress/fixtures/users.json b/cypress/fixtures/users.json deleted file mode 100644 index 79b699aa..00000000 --- a/cypress/fixtures/users.json +++ /dev/null @@ -1,232 +0,0 @@ -[ - { - "id": 1, - "name": "Leanne Graham", - "username": "Bret", - "email": "Sincere@april.biz", - "address": { - "street": "Kulas Light", - "suite": "Apt. 556", - "city": "Gwenborough", - "zipcode": "92998-3874", - "geo": { - "lat": "-37.3159", - "lng": "81.1496" - } - }, - "phone": "1-770-736-8031 x56442", - "website": "hildegard.org", - "company": { - "name": "Romaguera-Crona", - "catchPhrase": "Multi-layered client-server neural-net", - "bs": "harness real-time e-markets" - } - }, - { - "id": 2, - "name": "Ervin Howell", - "username": "Antonette", - "email": "Shanna@melissa.tv", - "address": { - "street": "Victor Plains", - "suite": "Suite 879", - "city": "Wisokyburgh", - "zipcode": "90566-7771", - "geo": { - "lat": "-43.9509", - "lng": "-34.4618" - } - }, - "phone": "010-692-6593 x09125", - "website": "anastasia.net", - "company": { - "name": "Deckow-Crist", - "catchPhrase": "Proactive didactic contingency", - "bs": "synergize scalable supply-chains" - } - }, - { - "id": 3, - "name": "Clementine Bauch", - "username": "Samantha", - "email": "Nathan@yesenia.net", - "address": { - "street": "Douglas Extension", - "suite": "Suite 847", - "city": "McKenziehaven", - "zipcode": "59590-4157", - "geo": { - "lat": "-68.6102", - "lng": "-47.0653" - } - }, - "phone": "1-463-123-4447", - "website": "ramiro.info", - "company": { - "name": "Romaguera-Jacobson", - "catchPhrase": "Face to face bifurcated interface", - "bs": "e-enable strategic applications" - } - }, - { - "id": 4, - "name": "Patricia Lebsack", - "username": "Karianne", - "email": "Julianne.OConner@kory.org", - "address": { - "street": "Hoeger Mall", - "suite": "Apt. 692", - "city": "South Elvis", - "zipcode": "53919-4257", - "geo": { - "lat": "29.4572", - "lng": "-164.2990" - } - }, - "phone": "493-170-9623 x156", - "website": "kale.biz", - "company": { - "name": "Robel-Corkery", - "catchPhrase": "Multi-tiered zero tolerance productivity", - "bs": "transition cutting-edge web services" - } - }, - { - "id": 5, - "name": "Chelsey Dietrich", - "username": "Kamren", - "email": "Lucio_Hettinger@annie.ca", - "address": { - "street": "Skiles Walks", - "suite": "Suite 351", - "city": "Roscoeview", - "zipcode": "33263", - "geo": { - "lat": "-31.8129", - "lng": "62.5342" - } - }, - "phone": "(254)954-1289", - "website": "demarco.info", - "company": { - "name": "Keebler LLC", - "catchPhrase": "User-centric fault-tolerant solution", - "bs": "revolutionize end-to-end systems" - } - }, - { - "id": 6, - "name": "Mrs. Dennis Schulist", - "username": "Leopoldo_Corkery", - "email": "Karley_Dach@jasper.info", - "address": { - "street": "Norberto Crossing", - "suite": "Apt. 950", - "city": "South Christy", - "zipcode": "23505-1337", - "geo": { - "lat": "-71.4197", - "lng": "71.7478" - } - }, - "phone": "1-477-935-8478 x6430", - "website": "ola.org", - "company": { - "name": "Considine-Lockman", - "catchPhrase": "Synchronised bottom-line interface", - "bs": "e-enable innovative applications" - } - }, - { - "id": 7, - "name": "Kurtis Weissnat", - "username": "Elwyn.Skiles", - "email": "Telly.Hoeger@billy.biz", - "address": { - "street": "Rex Trail", - "suite": "Suite 280", - "city": "Howemouth", - "zipcode": "58804-1099", - "geo": { - "lat": "24.8918", - "lng": "21.8984" - } - }, - "phone": "210.067.6132", - "website": "elvis.io", - "company": { - "name": "Johns Group", - "catchPhrase": "Configurable multimedia task-force", - "bs": "generate enterprise e-tailers" - } - }, - { - "id": 8, - "name": "Nicholas Runolfsdottir V", - "username": "Maxime_Nienow", - "email": "Sherwood@rosamond.me", - "address": { - "street": "Ellsworth Summit", - "suite": "Suite 729", - "city": "Aliyaview", - "zipcode": "45169", - "geo": { - "lat": "-14.3990", - "lng": "-120.7677" - } - }, - "phone": "586.493.6943 x140", - "website": "jacynthe.com", - "company": { - "name": "Abernathy Group", - "catchPhrase": "Implemented secondary concept", - "bs": "e-enable extensible e-tailers" - } - }, - { - "id": 9, - "name": "Glenna Reichert", - "username": "Delphine", - "email": "Chaim_McDermott@dana.io", - "address": { - "street": "Dayna Park", - "suite": "Suite 449", - "city": "Bartholomebury", - "zipcode": "76495-3109", - "geo": { - "lat": "24.6463", - "lng": "-168.8889" - } - }, - "phone": "(775)976-6794 x41206", - "website": "conrad.com", - "company": { - "name": "Yost and Sons", - "catchPhrase": "Switchable contextually-based project", - "bs": "aggregate real-time technologies" - } - }, - { - "id": 10, - "name": "Clementina DuBuque", - "username": "Moriah.Stanton", - "email": "Rey.Padberg@karina.biz", - "address": { - "street": "Kattie Turnpike", - "suite": "Suite 198", - "city": "Lebsackbury", - "zipcode": "31428-2261", - "geo": { - "lat": "-38.2386", - "lng": "57.2232" - } - }, - "phone": "024-648-3804", - "website": "ambrose.net", - "company": { - "name": "Hoeger LLC", - "catchPhrase": "Centralized empowering task-force", - "bs": "target end-to-end models" - } - } -] \ No newline at end of file diff --git a/cypress/integration/app-contact.spec.js b/cypress/integration/app-contact.spec.js deleted file mode 100644 index 573fe096..00000000 --- a/cypress/integration/app-contact.spec.js +++ /dev/null @@ -1,126 +0,0 @@ -describe('Contact Page', function () { - describe('The contact form displays with all fields', () => { - it('Check that the form displays', function () { - cy.visit('localhost:3333/contact'); - cy.get('#second-content') - .contains('Get in Touch') - .should('exist') - .and('be.visible'); - cy.get('#second-content') - .contains("Tell us a little bit about what you're working on. We'll be in touch to tell you about the next steps toward accomplishing your goals!") - .should('exist') - .and('be.visible'); - - cy.get('#contact-form') - .contains('Full Name*') - .should('exist') - .and('be.visible'); - cy.get('#contact-form') - .contains('E-mail*') - .should('exist') - .and('be.visible'); - cy.get('#contact-form') - .contains('Phone') - .should('exist') - .and('be.visible'); - cy.get('#contact-form') - .contains('What are you working on?') - .should('exist') - .and('be.visible'); - }); - }); - - describe('User is able to successfully submit a contact form & view the successful submission animation', () => { - it('Check that the form fades and appears the animation', function () { - cy.visit('localhost:3333/contact'); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('Test@openforge.io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=message]').type('Testing'); - cy.get('button[type=submit]').click(); - cy.wait(9000); - cy.get('[data-cy=sub]').screenshot('exist'); //if the image is rendered the submit is done - }); - }); - - describe('User is not able to submit a contact form with a empty full name field', () => { - it('Check that the submit is disabled', function () { - cy.visit('localhost:3333/contact'); - cy.get('input[name=email]').type('Test@openforge.io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=message]').type('Testing'); - cy.get('button[type=submit]') - .should('exist') - .and('be.disabled'); - }); - }); - - describe('User is not able to submit a contact form with a empty email field', () => { - it('Check that the submit is disabled', function () { - cy.visit('localhost:3333/contact'); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=message]').type('Testing'); - cy.get('button[type=submit]') - .should('exist') - .and('be.disabled'); - }); - }); - - describe('User is not able to submit a contact form with a invalid email address', () => { - it('Check that the submit is disabled', function () { - cy.visit('localhost:3333/contact'); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('Test@openforge@io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=message]').type('Testing'); - cy.get('button[type=submit]') - .should('exist') - .and('be.disabled'); - }); - }); - - describe('The mailbox icon displays on the right hand side of the contact form', () => { - it('Check that the img exists', function () { - cy.visit('localhost:3333/contact'); - cy.get('[data-cy=mailbox-img]') - .should('exist') - .and('be.visible'); - }); - }); - - describe('User is not able to submit the contact form after clearing all of the fields', () => { - it('Check that the submit is disabled after clearing form', function () { - cy.visit('localhost:3333/contact'); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=name]').clear(); - cy.get('input[name=email]').type('wrong_email'); - cy.get('input[name=email]').clear(); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=phone]').clear(); - cy.get('input[name=message]').type('Testing'); - cy.get('input[name=message]').clear(); - cy.get('button[type=submit]') - .should('exist') - .and('be.disabled'); - }); - }); - - describe('User is unable to submit a empty contact form', () => { - it('Check that the button is disabled', function () { - cy.visit('localhost:3333/contact'); - cy.get('button[type=submit]') - .should('exist') - .and('be.disabled'); - }); - }); - - describe('The footer is visible on the "Contact" page', () => { - it('Check the footer exists', () => { - cy.visit('localhost:3333/contact'); - cy.get('footer') - .should('exist') - .and('be.visible'); - }); - }); -}); diff --git a/cypress/integration/app-home.spec.js b/cypress/integration/app-home.spec.js deleted file mode 100644 index 37b9fe71..00000000 --- a/cypress/integration/app-home.spec.js +++ /dev/null @@ -1,225 +0,0 @@ -describe('Home Page', function () { - var env = 'http://localhost:3333'; - beforeEach(() => { - cy.visit(env); - }); - - describe('Home Page', function () { - - describe('Hero', function () { - it('The home page hero text and animation displays', () => { - cy.get('[data-cy=title]').should('exist').and('contain', 'Mobile Solutions'); - cy.get('[data-cy=subtitle]').should('exist').and('contain', 'For A Digital World'); - cy.get('[data-cy=subpar]').should('exist').and('contain', 'As experts in user experience, design, and application development, we specialize in creating mobile first, user-centered solutions to bring your ideas to life on the small screen.'); - cy.get('.svg-header-desktop').should('exist').and('be.visible'); - }); - }); - - describe('App Displays', function () { - it('Mobile Measure app displays', function () { - cy.get('.mobilemeasures').scrollIntoView(); - cy.get('.mobilemeasures > .content-panel-image > h2 > .hydrated').should('exist').and('contain', 'Mobile Measures'); - cy.get('.mobilemeasures > .content-panel-image > .row > .behind-left > .hydrated > img') - .should('exist').and('be.visible'); - cy.get('.mobilemeasures > .content-panel-image > .row > .front-center > .hydrated > img') - .should('exist').and('be.visible'); - cy.get('.mobilemeasures > .content-panel-image > .row > .behind-right > .hydrated > img') - .should('exist').and('be.visible'); - // Apple - cy.get('[data-cy=mobilemeasures-apple]') - .should('exist') - .and('be.visible') - .and('have.attr', 'href') - .and('contain', 'apps.apple.com') - .and('contain', 'mobile-measures'); - - // Google - cy.get('[data-cy=mobilemeasures-google]') - .should('exist') - .and('be.visible') - .and('have.attr', 'href') - .and('contain', 'play.google.com') - .and('contain', 'mobilemeasures'); - - cy.get('.mobilemeasures') - .should('have.css', 'background-image') - .and('contain', 'mobilemeasures'); - }); - - it('LoudCloud app displays', function () { - cy.get('.loudcloud').scrollIntoView(); - cy.get('.loudcloud > .content-panel-image > h2 > .hydrated').should('exist').and('contain', 'LoudCloud'); - cy.get('.loudcloud > .content-panel-image > .row > .behind-left > .hydrated > img') - .should('exist').and('be.visible'); - cy.get('.loudcloud > .content-panel-image > .row > .front-center > .hydrated > img') - .should('exist').and('be.visible'); - cy.get('.loudcloud > .content-panel-image > .row > .behind-right > .hydrated > img') - .should('exist').and('be.visible'); - - cy.get('[data-cy=loudcloud-apple]') - .should('exist') - .and('be.visible') - .and('have.attr', 'href') - .and('contain', 'itunes.apple.com') - .and('contain', 'loudcloud'); - - cy.get('[data-cy=loudcloud-google]') - .should('exist') - .and('be.visible') - .and('have.attr', 'href') - .and('contain', 'play.google.com') - .and('contain', 'loudcloud'); - - cy.get('.loudcloud') - .should('have.css', 'background-image') - .and('contain', 'loudcloud'); - }); - - it('The Voyage app displays', function () { - cy.get('.voyage').scrollIntoView(); - - cy.get('.voyage > .content-panel-image > h2 > .hydrated').should('exist').and('contain', 'The Voyage by New Ocean'); - - cy.get('.voyage > .content-panel-image > .row > .behind-left > .hydrated > img') - .should('exist').and('be.visible'); - - cy.get('.voyage > .content-panel-image > .row > .front-center > .hydrated > img') - .should('exist').and('be.visible'); - - cy.get('.voyage > .content-panel-image > .row > .behind-right > .hydrated > img') - .should('exist').and('be.visible'); - - cy.get('[data-cy=voyage-apple]') - .should('exist') - .and('be.visible') - .and('have.attr', 'href') - .and('contain', 'itunes.apple.com') - .and('contain', 'the-voyage'); - - cy.get('[data-cy=voyage-google]') - .should('exist') - .and('be.visible') - .and('have.attr', 'href') - .and('contain', 'play.google.com') - .and('contain', 'carecaminnovations'); - - cy.get('.voyage') - .should('have.css', 'background-image') - .and('contain', 'voyage'); - - }); - - it('The Experts in scroll functionality displays all three text sections', () => { - cy.get('.mobilemeasures').scrollIntoView(); - cy.get('#content-panel-inner > .panel-inner-text > h2').should('exist') - .and('contain', 'Mobile & Web Applications'); - cy.get('#content-panel-inner > .panel-inner-text > p').should('exist').and('contain', 'We specialize in mobile application design, development, and App Store Optimization (ASO). Our team has been the top trusted partner of Ionic Framework since 2014 with experience in technologies such as Angular, React, Vue.js, Strapi, and VoIP.'); - - cy.get('.loudcloud').scrollIntoView(); - cy.get('#content-panel-inner > .panel-inner-text > h2').should('exist') - .and('contain', 'Mobile Technology'); - cy.get('#content-panel-inner > .panel-inner-text > p').should('exist').and('contain', 'With our combined expertise in design and marketing, you can rely on us to develop comprehensive strategies and graphics that will define your brand and inspire trust in your target audience.'); - - cy.get('.voyage').scrollIntoView(); - cy.get('#content-panel-inner > .panel-inner-text > h2').should('exist') - .and('contain', 'Design & User Experience'); - cy.get('#content-panel-inner > .panel-inner-text > p').should('exist').and('contain', 'By combining the psychology of design with the capabilities of the digital age, we are able to develop solutions that think outside the box. We go beyond the norms of basic menus and navigation layouts and truly immerse your users in a beautiful and intuitive interface that keeps them coming back for more.'); - }); - - it('All of the experts in text displays at the same time', () => { - cy.viewport('ipad-2'); - cy.get('.mobilemeasures > .content-panel-inner > .panel-inner-text > h2').should('exist') - .and('contain', 'Mobile & Web Applications'); - cy.get('.mobilemeasures > .content-panel-inner > .panel-inner-text > p').should('exist').and('contain', 'We specialize in mobile application design, development, and App Store Optimization (ASO). Our team has been the top trusted partner of Ionic Framework since 2014 with experience in technologies such as Angular, React, Vue.js, Strapi, and VoIP.'); - - cy.get('.loudcloud > .content-panel-inner > .panel-inner-text > h2').should('exist') - .and('contain', 'Mobile Technology'); - cy.get('.loudcloud > .content-panel-inner > .panel-inner-text > p').should('exist').and('contain', 'With our combined expertise in design and marketing, you can rely on us to develop comprehensive strategies and graphics that will define your brand and inspire trust in your target audience.'); - - cy.get('.voyage > .content-panel-inner > .panel-inner-text > h2').should('exist') - .and('contain', 'Design & User Experience'); - cy.get('.voyage > .content-panel-inner > .panel-inner-text > p').should('exist').and('contain', 'By combining the psychology of design with the capabilities of the digital age, we are able to develop solutions that think outside the box. We go beyond the norms of basic menus and navigation layouts and truly immerse your users in a beautiful and intuitive interface that keeps them coming back for more.'); - }); - - }); - - describe('Blog section', () => { - it('Should display "Whats new in Our Blog" title', () => { - cy.get('.blog-featured').scrollIntoView(); - cy.get('.d-none > h4').should('exist') - .and('be.visible').and('contain', "What's New in Our Blog"); - }); - }); - - describe('Process Section', function () { - it('Should scroll to the process section', function () { - cy.get('#process').scrollIntoView(); - }); - - it('The "Our Process" carousel title should display', () => { - cy.get('.header > h2 > .hydrated') - .contains('Our Process'); - }); - - it('The "Our Process" Carousel automatically rotates through all 5 slides and then started over', function () { - cy.get('.carousel-main-indicators > .carousel-indicators > [data-slide-to="0"]').click(); - cy.get('[data-cy=capp-head] > .hydrated').contains('Discovery'); - // Wait for carousel list el to change on the page - cy.wait(5000); - cy.wait(5000); - cy.wait(5000); - cy.wait(5000); - cy.wait(5000); - cy.get('[data-cy=capp-head] > .hydrated').contains('Discovery'); - }); - - it('The carousel displays the correct image and content on all five slides', function () { - cy.get('[data-cy=capp-img]').each(($el, index) => { - switch (index) { - case 0: - cy.wrap($el).should('have.prop', 'src').and('contain', 'discovery'); - break; - - case 1: - cy.wrap($el).should('have.prop', 'src').and('contain', 'design'); - break; - - case 2: - cy.wrap($el).should('have.prop', 'src').and('contain', 'development'); - break; - - case 3: - cy.wrap($el).should('have.prop', 'src').and('contain', 'deploy'); - break; - - case 4: - cy.wrap($el).should('have.prop', 'src').and('contain', 'userfeedback'); - break; - } - }); - }); - }); - describe('App-Cta', function () { - it('Should exist', function () { - cy.get('app-cta').should('exist'); - }); - it('Should navigate to the contact page', function () { - cy.get('app-cta').within(() => { - cy.get('stencil-route-link') - .should('exist') - .should('have.prop', 'url') - .and('contain', '/contact'); - }); - }); - }); - describe('Footer', function () { - beforeEach(() => { - cy.get('app-footer').as('footer'); - }); - it('Should exist and be visible', function () { - cy.get('@footer').scrollIntoView(); - cy.get('@footer').should('exist'); - }); - }); - }); -}); diff --git a/cypress/integration/app-opportunities.spec.js b/cypress/integration/app-opportunities.spec.js deleted file mode 100644 index f55fd407..00000000 --- a/cypress/integration/app-opportunities.spec.js +++ /dev/null @@ -1,1237 +0,0 @@ -describe('Opportunities Page', function() { - it('User can view the the opportunites page landing state', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('#hero .hero-text-container') - .contains('Looking for a New Adventure?') - .should('exist') - .and('be.visible'); - cy.get('#hero .hero-text-container') - .contains('If you’re a talented designer or developer, we want to hear from you! Choose the role that best describes you to continue.') - .should('exist') - .and('be.visible'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible'); - }); - - it('User can toggle between "Developer" and "Designer"', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('#hero').should('have.class', 'header-dev-active'); - cy.get('.hero-arrow-img') - .should('exist') - .contains('Let’s get to know each other…') - .and('be.visible'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('#hero').should('have.class', 'header-design-active'); - }); - - // DEVELOPER SELECTED - it('User can view the Developer opportunites page', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('#hero').should('have.class', 'header-dev-active'); - cy.get('.hero-arrow-img') - .should('exist') - .contains('Let’s get to know each other…') - .and('be.visible'); - cy.get('.hero-arrow-img img') - .should('exist') - .and('be.visible') - .click(); - cy.get('#interviews .content-graphic:first-child()') - .contains('Forget normal interviews!') - .should('exist') - .and('be.visible'); - cy.get('#interviews .content-graphic:first-child()') - .contains( - 'From our work to our interview process, we break the norm. We believe in Open Source contributions; so part of your interview assignment will be exactly that - build out a simple (open source) ' - ) - .should('exist') - .and('be.visible'); - cy.get('#interviews .content-graphic:last-child()') - .contains('We want to put you to the test!') - .should('exist') - .and('be.visible'); - cy.get('#interviews .content-graphic:last-child()') - .contains( - "Instead of asking you a million questions, we'd rather get to know you another way - seeing how you follow direction, develop, and learn a new technology or pattern that you have not used before." - ) - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('The Challenge') - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('Show us your skills in:') - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('Angular') - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('Redux') - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('API Integration') - .should('exist') - .and('be.visible'); - cy.get('#reputation .content-graphic') - .first() - .contains('Reputation is Everything.') - .should('exist') - .and('be.visible'); - cy.get('#reputation .content-graphic') - .first() - .contains( - "Because we value our partnerships. As a trusted partner of the Ionic Team our clients rely on us to provide enterprise quality applications for companies of all sizes; we need to make sure you're up to the task!" - ) - .should('exist') - .and('be.visible'); - cy.get('#reputation .content-graphic') - .last() - .contains('Are you prepared?') - .should('exist') - .and('be.visible'); - cy.get('#reputation .content-graphic') - .last() - .contains( - "We're looking for someone who’s ready to hit the ground running - someone who wants to turn big ideas into realities. A person who can work on a team, show humility, and is not afraid to learn and teach simultaneously." - ) - .should('exist') - .and('be.visible'); - }); - - it('User can fill out the Developer sliders', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('#apply').scrollIntoView(); - cy.get('#apply .slider-labels p') - .first() - .contains('N00b') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider-labels p') - .last() - .contains('Expert') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Angular') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Node') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Ionic') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Html') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Css') - .should('exist') - .and('be.visible'); - cy.get('#apply p') - .contains('Not quite...keep sliding or keep learning; you can do it!') - .should('exist') - .and('be.visible'); - cy.get('button[type=submit]').should('be.disabled'); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('header').scrollIntoView(); - cy.get('header') - .contains('Show Us What You’re Made Of') - .should('exist') - .and('be.visible'); - }); - - it('User is able to see the developer application page filler content', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('header').scrollIntoView(); - cy.get('header') - .contains('Show Us What You’re Made Of') - .should('exist') - .and('be.visible'); - cy.get('header') - .contains("If you're curious, hardworking, and adventurous, we're looking for you! Check out our job description and apply today.") - .should('exist') - .and('be.visible'); - cy.get('header button.apply-btn') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('The ideal candidate can....') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('Be a great team player experienced in working with agile teams with the ability to collaborate closely with developers, copywriters and UX designers.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('Continually keep yourself and your design team updated with the latest changes in your industry’s standards.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('Be self-starter.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('Be a team player -- you put the interests of the team and the company above your own.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('Be passionate about open source software') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('And can meet the following prerequisites:') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Three or more years of experience and proven track record.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Strong portfolio to be presented and defended during interview.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Experience using Firebase products (Database, Authentication, Notifications).') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Experience in CSS (SCSS, BEM, LESS, SASS).') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Experience in JavaScript (React, Angular, Node, Express).') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Experience in Hybrid Apps (Ionic).') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Experience with Heroku, Github Pages, or AWS is a plus.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Experience building web applications and/or mobile apps is a plus.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Experience in working on open source projects is a plus.') - .should('exist') - .and('be.visible'); - cy.get('#apply') - .contains('Submit your application') - .should('exist') - .and('be.visible'); - }); - - it('The developer application displays with all fields', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.get('#applyForm') - .contains('Resume/CV*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=file]').should('exist'); - cy.get('#applyForm') - .contains('Full Name*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=name]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('Phone*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=phone]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('E-mail*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=email]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('GitHub URL*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=github]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('What makes you unique?') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('In 200 characters or less, tell us what makes you unique.') - .should('exist') - .and('be.visible'); - cy.get('#applyForm textarea[name=message]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm button[type=submit]') - .should('exist') - .and('be.visible'); - }); - - it('User is not able to submit a developer application without a attachment', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge.io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a developer application with a empty full name field', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=email]').type('testing@openforge.io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a developer aplication with a empty email field', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a developer application with a invalid email address', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge@io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a developer application with a empty phone number', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge.io'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a developer application with a empty github URL', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge.io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a developer application after clearing all of the fields', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=name]').clear(); - cy.get('input[name=email]').type('testing@openforge@io'); - cy.get('input[name=email]').clear(); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=phone]').clear(); - cy.get('input[name=github]').type('google.com'); - cy.get('input[name=github]').clear(); - cy.get('textarea[name=message]').type('testing'); - cy.get('textarea[name=message]').clear(); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a developer application with a empty "what makes you unique" feild', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge@io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is unable to submit a empty developer application', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:first-child()') - .should('exist') - .contains('DEVELOP') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - // DESIGNER SELECTED - it('User can view the Designer opportunites page', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('#hero').should('have.class', 'header-design-active'); - cy.get('.hero-arrow-img') - .should('exist') - .contains('Let’s get to know each other…') - .and('be.visible'); - cy.get('.hero-arrow-img img') - .should('exist') - .and('be.visible') - .click(); - cy.get('#interviews .content-graphic:first-child()') - .contains('Forget normal interviews!') - .should('exist') - .and('be.visible'); - cy.get('#interviews .content-graphic:first-child()') - .contains( - 'At OpenForge, we believe that sometimes actions speak louder than words, so as part of your interview assignment, we’d like to challenge you to design 3 pages of an app of your choosing.' - ) - .should('exist') - .and('be.visible'); - cy.get('#interviews .content-graphic:last-child()') - .contains('We want to put you to the test!') - .should('exist') - .and('be.visible'); - cy.get('#interviews .content-graphic:last-child()') - .contains( - "Instead of asking you a million questions, we'd rather get to know you another way - seeing how you identify problems and solve them using design principles, hierarchy, and UX best practices." - ) - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('The Challenge') - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('Show us your skills in:') - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('Wireframing') - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('Prototyping') - .should('exist') - .and('be.visible'); - cy.get('.challenge .container') - .contains('Responsive Design') - .should('exist') - .and('be.visible'); - cy.get('#reputation .content-graphic') - .first() - .contains('Reputation is Everything.') - .should('exist') - .and('be.visible'); - cy.get('#reputation .content-graphic') - .first() - .contains( - "Because we value our partnerships. As a trusted partner of the Ionic Team our clients rely on us to provide enterprise quality applications for companies of all sizes; we need to make sure you're up to the task!" - ) - .should('exist') - .and('be.visible'); - cy.get('#reputation .content-graphic') - .last() - .contains('Are you prepared?') - .should('exist') - .and('be.visible'); - cy.get('#reputation .content-graphic') - .last() - .contains( - "We're looking for someone who’s ready to hit the ground running - someone who wants to turn big ideas into realities. A person who can work on a team, show humility, and is not afraid to learn and teach simultaneously." - ) - .should('exist') - .and('be.visible'); - }); - - it('User can fill out the Designer sliders', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('#apply').scrollIntoView(); - cy.get('#apply .slider-labels p') - .first() - .contains('N00b') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider-labels p') - .last() - .contains('Expert') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Sketch') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Photoshop CC') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Illustrator CC') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Adobe XD CC') - .should('exist') - .and('be.visible'); - cy.get('#apply .slider label') - .contains('Prototyping') - .should('exist') - .and('be.visible'); - cy.get('#apply p') - .contains('Not quite...keep sliding or keep learning; you can do it!') - .should('exist') - .and('be.visible'); - cy.get('button[type=submit]').should('be.disabled'); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('header').scrollIntoView(); - cy.get('header') - .contains('Show Us What You’re Made Of') - .should('exist') - .and('be.visible'); - }); - - it('User is able to see the designer application page filler content', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('header').scrollIntoView(); - cy.get('header') - .contains('Show Us What You’re Made Of') - .should('exist') - .and('be.visible'); - cy.get('header') - .contains("If you're curious, hardworking, and adventurous, we're looking for you! Check out our job description and apply today.") - .should('exist') - .and('be.visible'); - cy.get('header button.apply-btn') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('The ideal candidate can....') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('Be a great team player experienced in working with agile teams with the ability to collaborate closely with developers, copywriters and UX designers.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('Create, improve and utilize wireframes, prototypes, style guides, user flows, and effectively communicate your interaction ideas using any of these methods.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains( - 'Present and defend your design decisions. All your design decisions should be based on the overall design roadmap as well as your own design thinking and fundamental principles (i.e. color theory, visual weight, etc.)' - ) - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .first() - .contains('Continually keep yourself and your design team updated with the latest changes in your industry’s standards.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('And can meet the following prerequisites:') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Three or more years of experience and proven track record.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Strong portfolio to be presented and defended during the interview.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Hands-on experience creating wireframes, prototypes, storyboards, user flows, etc.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Proficiency with tools such as Photoshop, Sketch, Illustrator, InVision, MarvelApp, etc.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Understanding of basic front-end languages: HTML5, CSS3 Javascript.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('The ability to generate creative ideas with problem-solving mindset.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Experience working in an agile/scrum development process.') - .should('exist') - .and('be.visible'); - cy.get('#candidate-requisites .content-graphic') - .last() - .contains('Be open to receiving objective criticism and improving upon it.') - .should('exist') - .and('be.visible'); - cy.get('#apply') - .contains('Submit your application') - .should('exist') - .and('be.visible'); - }); - - it('The designer application displays with all fields', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.get('#applyForm') - .contains('Resume/CV*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=file]').should('exist'); - cy.get('#applyForm') - .contains('Full Name*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=name]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('Phone*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=phone]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('E-mail*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=email]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('Portfolio*') - .should('exist') - .and('be.visible'); - cy.get('#applyForm input[name=github]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('What makes you unique?') - .should('exist') - .and('be.visible'); - cy.get('#applyForm') - .contains('In 200 characters or less, tell us what makes you unique.') - .should('exist') - .and('be.visible'); - cy.get('#applyForm textarea[name=message]') - .should('exist') - .and('be.visible'); - cy.get('#applyForm button[type=submit]') - .should('exist') - .and('be.visible'); - }); - - it('User is not able to submit a designer application without a attachment', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge.io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a designer application with a empty full name field', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=email]').type('testing@openforge.io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a designer aplication with a empty email field', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a designer application with a invalid email address', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge@io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a designer application with a empty phone number', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge.io'); - cy.get('input[name=github]').type('google.com'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a designer application with a empty github URL', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge.io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('textarea[name=message]').type('testing'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a designer application after clearing all of the fields', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=name]').clear(); - cy.get('input[name=email]').type('testing@openforge@io'); - cy.get('input[name=email]').clear(); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=phone]').clear(); - cy.get('input[name=github]').type('google.com'); - cy.get('input[name=github]').clear(); - cy.get('textarea[name=message]').type('testing'); - cy.get('textarea[name=message]').clear(); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is not able to submit a designer application with a empty "what makes you unique" feild', function() { - const fileName = 'dummyPDF.pdf'; - const fileInput = 'input[type=file]'; - - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.upload_file(fileName, fileInput); - cy.get('input[name=name]').type('Tester'); - cy.get('input[name=email]').type('testing@openforge@io'); - cy.get('input[name=phone]').type('3333333333'); - cy.get('input[name=github]').type('google.com'); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); - - it('User is unable to submit a empty designer application', function() { - cy.visit('localhost:3333/opportunities'); - cy.get('.hero-type-buttons button:last-child()') - .should('exist') - .contains('DESIGNER') - .and('be.visible') - .click(); - cy.wait(1000); - cy.get('input[type=range]').each($ranges => { - const ranges = cy.wrap($ranges); - ranges.invoke('val', 92); - ranges.trigger('change'); - ranges.trigger('click'); - }); - cy.get('button[type=submit]') - .should('not.be.disabled') - .click(); - cy.get('#apply').scrollIntoView(); - cy.get('#applyForm button[type=submit]') - .should('be.disabled') - .and('be.visible'); - }); -}); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js deleted file mode 100644 index fd170fba..00000000 --- a/cypress/plugins/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} diff --git a/cypress/screenshots/Home Page -- Home Page -- Process Section -- Should have carousel components and activeIndex prop to change.png b/cypress/screenshots/Home Page -- Home Page -- Process Section -- Should have carousel components and activeIndex prop to change.png deleted file mode 100644 index ecbf82f9..00000000 Binary files a/cypress/screenshots/Home Page -- Home Page -- Process Section -- Should have carousel components and activeIndex prop to change.png and /dev/null differ diff --git a/cypress/screenshots/Home Page -- Navigation -- Nav bar options -- Should have 5 navigation options.png b/cypress/screenshots/Home Page -- Navigation -- Nav bar options -- Should have 5 navigation options.png deleted file mode 100644 index ecbf82f9..00000000 Binary files a/cypress/screenshots/Home Page -- Navigation -- Nav bar options -- Should have 5 navigation options.png and /dev/null differ diff --git a/cypress/screenshots/Home Page -- Navigation -- Stencil route links should navigate to the correct pages on click -- About page link.png b/cypress/screenshots/Home Page -- Navigation -- Stencil route links should navigate to the correct pages on click -- About page link.png deleted file mode 100644 index ecbf82f9..00000000 Binary files a/cypress/screenshots/Home Page -- Navigation -- Stencil route links should navigate to the correct pages on click -- About page link.png and /dev/null differ diff --git a/cypress/support/commands.js b/cypress/support/commands.js deleted file mode 100644 index dc8f3d2d..00000000 --- a/cypress/support/commands.js +++ /dev/null @@ -1,38 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add("login", (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This is will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) - -Cypress.Commands.add('upload_file', (fileName, selector) => { - cy.get(selector).then(subject => { - cy.fixture(fileName).then((content) => { - const el = subject[0] - const testFile = new File([content], fileName) - const dataTransfer = new DataTransfer() - - dataTransfer.items.add(testFile) - el.files = dataTransfer.files - }) - }) -}) diff --git a/cypress/support/index.js b/cypress/support/index.js deleted file mode 100644 index d68db96d..00000000 --- a/cypress/support/index.js +++ /dev/null @@ -1,20 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/cypress/videos/6vmli.mp4 b/cypress/videos/6vmli.mp4 deleted file mode 100644 index 36cdf632..00000000 Binary files a/cypress/videos/6vmli.mp4 and /dev/null differ diff --git a/package-lock.json b/package-lock.json index 63564d88..8d8a469a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@openforge/main-website", - "version": "2.5.2", + "version": "2.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -898,12 +898,38 @@ "integrity": "sha512-LC8ALj/24PhByn39nr5jnTvpE7MujK8y7LQmV74kHYF5iQ0odCPkMH4IZNZw+cobKfSXqaC8GgegcbIsQpffdA==", "dev": true }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=" + }, "@types/qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.5.2.tgz", "integrity": "sha512-47kAAs3yV/hROraCTQYDMh4p/6zI9+gtssjD0kq9OWsGdLcBge59rl49FnCuJ+iWxEKiqFz6KXzeGH5DRVjNJA==", "dev": true }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==" + }, + "@types/sinon": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.0.0.tgz", + "integrity": "sha512-cuK4xM8Lg2wd8cxshcQa8RG4IK/xfyB6TNE6tNVvkrShR4xdrYgsV04q6Dp6v1Lp6biEFdzD8k8zg/ujQeiw+A==", + "dev": true + }, + "@types/sinon-chai": { + "version": "2.7.29", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-2.7.29.tgz", + "integrity": "sha512-EkI/ZvJT4hglWo7Ipf9SX+J+R9htNOMjW8xiOhce7+0csqvgoF5IXqY5Ae1GqRgNtWCuaywR5HjVa1snkTqpOw==", + "dev": true, + "requires": { + "@types/chai": "*", + "@types/sinon": "*" + } + }, "@types/sizzle": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", @@ -983,6 +1009,19 @@ "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", "dev": true }, + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", @@ -1008,14 +1047,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "any-observable": { "version": "0.3.0", @@ -1093,6 +1130,19 @@ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -1102,8 +1152,7 @@ "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asap": { "version": "2.0.6", @@ -1115,7 +1164,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -1134,8 +1182,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -1167,8 +1214,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -1179,14 +1225,12 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-code-frame": { "version": "6.26.0", @@ -1446,8 +1490,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1508,7 +1551,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -1554,6 +1596,14 @@ } } }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "requires": { + "minimist": "^1.2.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1597,7 +1647,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1728,6 +1777,14 @@ "parse-asn1": "^5.0.0" } }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, "bser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", @@ -1859,14 +1916,12 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { "version": "1.1.3", "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -2122,7 +2177,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -2244,8 +2298,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -2940,8 +2993,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "4.0.0", @@ -3405,7 +3457,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -3524,11 +3575,24 @@ } } }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "des.js": { "version": "1.0.0", @@ -3630,7 +3694,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -3757,6 +3820,19 @@ "event-emitter": "~0.3.5" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", @@ -3807,8 +3883,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.11.0", @@ -4041,14 +4116,10 @@ } } }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "requires": { - "pify": "^2.2.0" - } + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, "exit-hook": { "version": "1.1.1", @@ -4179,8 +4250,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -4316,20 +4386,17 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -4594,14 +4661,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -4646,8 +4711,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.4", @@ -5386,7 +5450,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -5723,7 +5786,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5842,6 +5904,19 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "globule": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", @@ -5905,14 +5980,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -5922,7 +5995,6 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5936,7 +6008,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6117,18 +6188,35 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } }, "husky": { "version": "0.15.0-rc.13", @@ -6240,6 +6328,11 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -6292,7 +6385,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -6301,14 +6393,12 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "1.2.3", @@ -6601,11 +6691,23 @@ } } }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, "requires": { "path-is-inside": "^1.0.1" } @@ -6685,8 +6787,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -6709,8 +6810,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbuffer": { "version": "0.0.0", @@ -6733,8 +6833,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-api": { "version": "1.3.7", @@ -6859,6 +6958,26 @@ "handlebars": "^4.0.3" } }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + } + }, + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=" + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=" + }, "jest": { "version": "21.2.1", "resolved": "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz", @@ -8334,8 +8453,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsesc": { "version": "1.3.0", @@ -8352,14 +8470,12 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify": { "version": "1.0.1", @@ -8373,8 +8489,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "0.5.1", @@ -8413,7 +8528,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -8421,6 +8535,17 @@ "verror": "1.10.0" } }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -8682,6 +8807,14 @@ "type-check": "~0.3.2" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lint-staged": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-7.3.0.tgz", @@ -9654,14 +9787,12 @@ "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" }, "mime-types": { "version": "2.1.21", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, "requires": { "mime-db": "~1.37.0" } @@ -9688,7 +9819,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -9696,8 +9826,7 @@ "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "minimist-options": { "version": "3.0.2", @@ -9908,14 +10037,12 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -9997,7 +10124,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -10181,7 +10307,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -10190,14 +10315,12 @@ "minimist": { "version": "0.0.10", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, @@ -10230,8 +10353,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-cancelable": { "version": "0.3.0", @@ -10284,6 +10406,11 @@ "repeat-string": "^1.5.2" } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "parse-asn1": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", @@ -10372,14 +10499,12 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", @@ -10426,8 +10551,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { "version": "2.0.7", @@ -10438,20 +10562,17 @@ "pify": { "version": "2.3.0", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "^2.0.0" } @@ -10568,8 +10689,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "1.1.8", @@ -10586,6 +10706,89 @@ "asap": "~2.0.6" } }, + "protractor": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.3.tgz", + "integrity": "sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA==", + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -10601,8 +10804,7 @@ "psl": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" }, "public-encrypt": { "version": "4.0.3", @@ -10618,21 +10820,10 @@ "safe-buffer": "^5.1.2" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { "version": "1.0.0", @@ -10649,8 +10840,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystring": { "version": "0.2.0", @@ -10751,7 +10941,6 @@ "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11095,7 +11284,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -11207,8 +11395,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-json-parse": { "version": "1.0.1", @@ -11228,8 +11415,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "2.5.2", @@ -11292,17 +11478,44 @@ } } }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-compare": { "version": "1.0.0", @@ -11316,6 +11529,11 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -11554,7 +11772,6 @@ "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, "requires": { "source-map": "^0.5.6" }, @@ -11562,8 +11779,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -11652,7 +11868,6 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -11757,7 +11972,6 @@ "version": "1.1.1", "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -11783,7 +11997,6 @@ "version": "3.0.1", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -11837,8 +12050,7 @@ "supports-color": { "version": "2.0.0", "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "symbol-tree": { "version": "3.2.2", @@ -12426,7 +12638,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -12434,8 +12645,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type": { "version": "1.2.0", @@ -12587,17 +12797,10 @@ } } }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -12659,14 +12862,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -12682,7 +12883,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -12714,6 +12914,15 @@ "minimist": "^1.2.0" } }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -12942,8 +13151,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", @@ -12971,6 +13179,20 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index cee3a048..91c2349f 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "i18next": "^17.3.0", "jquery": "^3.4.1", "popper.js": "^1.16.0", + "protractor": "^5.4.3", "sticky-sidebar": "^3.3.1" }, "devDependencies": { diff --git a/protractor/conf.js b/protractor/conf.js new file mode 100644 index 00000000..53a8b953 --- /dev/null +++ b/protractor/conf.js @@ -0,0 +1,3 @@ +exports.config = { + specs: ['contact.spec.js'] +}; \ No newline at end of file diff --git a/protractor/contact.spec.js b/protractor/contact.spec.js new file mode 100644 index 00000000..ea831915 --- /dev/null +++ b/protractor/contact.spec.js @@ -0,0 +1,80 @@ +describe('contact test', function () { + var env = 'http://localhost:3333'; + beforeEach(() => { + browser.driver.get(env + '/contact/'); + }); + describe('The contact form displays with all fields', () => { + it('Check that the form displays', () => { + browser.driver.sleep(3000); + const sc = browser.driver.findElement(by.css('#second-content')).getText(); + expect(sc).toContain('Get in Touch'); + expect(sc).toContain("Tell us a little bit about what you're working on. We'll be in touch to tell you about the next steps toward accomplishing your goals!"); + const cf = browser.driver.findElement(by.css('#second-content')).getText(); + expect(cf).toContain('Full Name*'); + expect(cf).toContain('E-mail*'); + expect(cf).toContain('Phone'); + expect(cf).toContain('What are you working on?'); + }); + }); + + describe('User is able to successfully submit a contact form & view the successful submission animation', () => { + it('Check that the form fades and appears the animation', function () { + browser.driver.sleep(3000); + browser.driver.findElement(by.css('input[name=name]')).sendKeys('Tester'); + browser.driver.findElement(by.css('input[name=email]')).sendKeys('Test@openforge.io'); + browser.driver.findElement(by.css('input[name=phone]')).sendKeys('3333333333'); + browser.driver.findElement(by.css('input[name=message]')).sendKeys('Testing'); + browser.driver.findElement(by.css('button[type=submit]')).click(); + browser.driver.sleep(9000); + const img = browser.driver.findElement(by.css('#fimage')).getAttribute('alt'); + expect(img).toContain('Map page graphic'); + }); + }); + + describe('User is not able to submit a contact form with a empty email field', () => { + it('Check that the submit is disabled', function () { + browser.driver.sleep(3000); + browser.driver.findElement(by.css('input[name=name]')).sendKeys('Tester'); + browser.driver.findElement(by.css('input[name=email]')).sendKeys('Test@openforge@io'); + browser.driver.findElement(by.css('input[name=phone]')).sendKeys('3333333333'); + browser.driver.findElement(by.css('input[name=message]')).sendKeys('Testing'); + const button = browser.driver.findElement(by.css('button[type=submit]')) + expect(button.isEnabled()).toBe(false); + }); + }); + + describe('User is not able to submit a contact form with a invalid email address', () => { + it('Check that the submit is disabled', function () { + browser.driver.sleep(3000); + browser.driver.findElement(by.css('input[name=name]')).sendKeys('Tester'); + browser.driver.findElement(by.css('input[name=phone]')).sendKeys('3333333333'); + browser.driver.findElement(by.css('input[name=message]')).sendKeys('Testing'); + const button = browser.driver.findElement(by.css('button[type=submit]')) + expect(button.isEnabled()).toBe(false); + }); + }); + + describe('The mailbox icon displays on the right hand side of the contact form', () => { + it('Check that the img exists', function () { + browser.driver.sleep(3000); + const img = browser.driver.findElement(by.css('#simage')).getAttribute('alt'); + expect(img).toContain('Mail Box graphic'); + }); + }); + + describe('User is unable to submit a empty contact form', () => { + it('Check that the button is disabled', function () { + browser.driver.sleep(3000); + const button = browser.driver.findElement(by.css('button[type=submit]')); + expect(button.isEnabled()).toBe(false); + }); + }); + + describe('The footer is visible on the "Contact" page', () => { + it('Check the footer exists', () => { + browser.driver.sleep(3000); + const footer = browser.driver.findElement(by.css('.footer')); + expect(footer.isDisplayed()).toBe(true); + }); + }); +}); \ No newline at end of file diff --git a/src/components/app-footer/app-footer.scss b/src/components/app-footer/app-footer.scss index 4405ec66..4ecfbff5 100644 --- a/src/components/app-footer/app-footer.scss +++ b/src/components/app-footer/app-footer.scss @@ -14,13 +14,13 @@ font-size: 1.6rem; line-height: normal; margin-bottom: 1.5rem; - letter-spacing:normal; + letter-spacing: normal; text-align: left; @include media-breakpoint-down(md) { font-size: 1.3rem; margin-bottom: 1rem; } - @include media-breakpoint-down(sm){ + @include media-breakpoint-down(sm) { text-align: center; } } diff --git a/src/pages/app-about/app-about.tsx b/src/pages/app-about/app-about.tsx index 82584905..8581194c 100644 --- a/src/pages/app-about/app-about.tsx +++ b/src/pages/app-about/app-about.tsx @@ -25,7 +25,7 @@ export class AppAbout {
+