diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index fba9fcb378cf..8a6db251766e 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -101,7 +101,7 @@ class CreateSingleAccount extends Command $this->warmCache(); $this->createSmallAccount(); - + } private function createSmallAccount() @@ -176,8 +176,8 @@ class CreateSingleAccount extends Command $client = $company->clients->random(); - $this->info('creating credit for client #'.$client->id); - $this->createCredit($client); + // $this->info('creating credit for client #'.$client->id); + // $this->createCredit($client); /** Prevents Stripe from running payments. */ $client = $company->clients->random(); @@ -497,7 +497,7 @@ class CreateSingleAccount extends Command } private function createGateways($company, $user) - { + { if (config('ninja.testvars.stripe') && ($this->gateway == 'all' || $this->gateway == 'stripe')) { $cg = new CompanyGateway; diff --git a/cypress.json b/cypress.json index 92e52adf8c0c..e959015b2688 100644 --- a/cypress.json +++ b/cypress.json @@ -1,5 +1,5 @@ { "video": false, - "baseUrl": "http://ninja.test:8000/", + "baseUrl": "http://localhost:8000/", "chromeWebSecurity": false } diff --git a/cypress/excluded/checkout_credit_card.spec.js b/cypress/excluded/checkout_credit_card.spec.js new file mode 100644 index 000000000000..d0a6ab0325c4 --- /dev/null +++ b/cypress/excluded/checkout_credit_card.spec.js @@ -0,0 +1,48 @@ +import { second } from '../fixtures/example.json'; + +describe('Checkout Credit Card Payments', () => { + beforeEach(() => { + // cy.useGateway(second); + cy.clientLogin(); + }); + + it('should be able to complete payment using checkout credit card', () => { + cy.visit('/client/invoices'); + + cy.get('#unpaid-checkbox').click(); + + cy.get('[data-cy=pay-now') + .first() + .click(); + + cy.location('pathname').should('eq', '/client/invoices/payment'); + + cy.get('[data-cy=payment-methods-dropdown').click(); + + cy.get('[data-cy=payment-method') + .first() + .click(); + + cy.wait(8000); + + cy.get('.cko-pay-now.show') + .first() + .click(); + + cy.wait(3000); + + cy.getWithinIframe('[data-checkout="card-number"]').type( + '4242424242424242' + ); + cy.getWithinIframe('[data-checkout="expiry-month"]').type('12'); + cy.getWithinIframe('[data-checkout="expiry-year"]').type('30'); + cy.getWithinIframe('[data-checkout="cvv"]').type('100'); + + cy.getWithinIframe('.form-submit') + .first() + .click(); + + cy.wait(5000); + cy.url().should('contain', '/client/payments'); + }); +}); diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json index da18d9352a17..f0300d2d471c 100644 --- a/cypress/fixtures/example.json +++ b/cypress/fixtures/example.json @@ -1,5 +1,10 @@ { - "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 + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes", + + "first": "VolejRejNm", + "second": "Wpmbk5ezJn", + + "url": "http://localhost:8000" +} diff --git a/cypress/integration/client_portal/credits.spec.js b/cypress/integration/client_portal/credits.spec.js index 184a0e25ca66..41e94ca8eabc 100644 --- a/cypress/integration/client_portal/credits.spec.js +++ b/cypress/integration/client_portal/credits.spec.js @@ -19,7 +19,7 @@ describe('Credits', () => { .should('contain.text', 'Credits'); }); - it('should have required table elements', () => { + /* it('should have required table elements', () => { cy.visit('/client/credits'); cy.get('body') @@ -33,5 +33,5 @@ describe('Credits', () => { .should(location => { expect(location.pathname).to.eq('/client/credits/VolejRejNm'); }); - }); + });*/ }); diff --git a/cypress/integration/client_portal/payment_methods.spec.js b/cypress/integration/client_portal/payment_methods.spec.js index 76e998233070..4c87e5547d04 100644 --- a/cypress/integration/client_portal/payment_methods.spec.js +++ b/cypress/integration/client_portal/payment_methods.spec.js @@ -19,35 +19,6 @@ context('Payment methods', () => { .should('contain.text', 'Payment Method'); }); - it('should add stripe credit card', () => { - cy.visit('/client/payment_methods'); - - cy.get('body') - .find('#add-payment-method') - .first() - .should('contain.text', 'Add Payment Method') - .click() - - cy.location().should(location => { - expect(location.pathname).to.eq('/client/payment_methods/create'); - }); - - cy.wait(3000); - - cy.get('#cardholder-name').type('Invoice Ninja'); - - cy.getWithinIframe('[name="cardnumber"]').type('4242424242424242'); - cy.getWithinIframe('[name="exp-date"]').type('2442'); - cy.getWithinIframe('[name="cvc"]').type('242'); - cy.getWithinIframe('[name="postal"]').type('12345'); - - cy.get('#card-button').click(); - - cy.location().should(location => { - expect(location.pathname).to.eq('/client/payment_methods'); - }); - }); - it('should have per page options dropdown', () => { cy.visit('/client/payment_methods'); diff --git a/cypress/integration/client_portal/payments.spec.js b/cypress/integration/client_portal/payments.spec.js index b00aea77593d..e569acc86507 100644 --- a/cypress/integration/client_portal/payments.spec.js +++ b/cypress/integration/client_portal/payments.spec.js @@ -27,20 +27,4 @@ context('Payments', () => { .first() .should('have.value', '10'); }); - - it('should have required table elements', () => { - cy.visit('/client/payments'); - - cy.get('body') - .find('table.payments-table > tbody > tr') - .first() - .find('a') - .first() - .should('contain.text', 'View') - .click() - .location() - .should(location => { - expect(location.pathname).to.eq('/client/payments/VolejRejNm'); - }); - }); -}) \ No newline at end of file +}); diff --git a/cypress/integration/client_portal/recurring_invoices.spec.js b/cypress/integration/client_portal/recurring_invoices.spec.js index 91e24f14d5cb..5041301d4a06 100644 --- a/cypress/integration/client_portal/recurring_invoices.spec.js +++ b/cypress/integration/client_portal/recurring_invoices.spec.js @@ -3,8 +3,6 @@ context('Recurring invoices', () => { cy.clientLogin(); }); - // test url - it('should show recurring invoices page', () => { cy.visit('/client/recurring_invoices'); @@ -29,20 +27,4 @@ context('Recurring invoices', () => { .first() .should('have.value', '10'); }); - - it('should have required table elements', () => { - cy.visit('/client/recurring_invoices'); - - cy.get('body') - .find('table.recurring-invoices-table > tbody > tr') - .first() - .find('a') - .first() - .should('contain.text', 'View') - .click() - .location() - .should(location => { - expect(location.pathname).to.eq('/client/recurring_invoices/VolejRejNm'); - }); - }); }); diff --git a/cypress/integration/client_portal/stripe_credit_card.spec.js b/cypress/integration/client_portal/stripe_credit_card.spec.js new file mode 100644 index 000000000000..f9d40b0f2e11 --- /dev/null +++ b/cypress/integration/client_portal/stripe_credit_card.spec.js @@ -0,0 +1,47 @@ +describe('Stripe Credit Card Payments', () => { + beforeEach(() => { + cy.clientLogin(); + }); + + it('should be able to add credit card using Stripe', () => { + cy.visit('/client/payment_methods'); + + cy.get('[data-cy=add-payment-method]').click(); + cy.get('[data-cy=add-credit-card-link]').click(); + + cy.get('#cardholder-name').type('Invoice Ninja'); + + cy.getWithinIframe('[name="cardnumber"]').type('4242424242424242'); + cy.getWithinIframe('[name="exp-date"]').type('1230'); + cy.getWithinIframe('[name="cvc"]').type('100'); + cy.getWithinIframe('[name="postal"]').type('12345'); + + cy.get('#card-button').click(); + + cy.get('#errors').should('be.empty'); + + cy.location('pathname').should('eq', '/client/payment_methods'); + }); + + it('should be able to complete payment with added credit card', () => { + cy.visit('/client/invoices'); + + cy.get('#unpaid-checkbox').click(); + + cy.get('[data-cy=pay-now') + .first() + .click(); + + cy.location('pathname').should('eq', '/client/invoices/payment'); + + cy.get('[data-cy=payment-methods-dropdown').click(); + + cy.get('[data-cy=payment-method') + .first() + .click(); + + cy.get('#pay-now-with-token').click(); + + cy.url().should('contain', '/client/payments'); + }); +}); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 67b07104f176..93673ec6ca38 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -23,15 +23,17 @@ // // -- This will overwrite an existing command -- // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) +const axios = require('axios'); +const fixture = require('../fixtures/example.json'); Cypress.Commands.add('clientLogin', () => { cy.visit('/client/login'); cy.get('#test_email') .invoke('val') - .then(emailValue => { + .then((emailValue) => { cy.get('#test_password') .invoke('val') - .then(passwordValue => { + .then((passwordValue) => { cy.get('#email') .type(emailValue) .should('have.value', emailValue); @@ -45,32 +47,62 @@ Cypress.Commands.add('clientLogin', () => { }); }); -Cypress.Commands.add( - 'iframeLoaded', - {prevSubject: 'element'}, - ($iframe) => { - const contentWindow = $iframe.prop('contentWindow'); - return new Promise(resolve => { - if ( - contentWindow - ) { - resolve(contentWindow) - } else { - $iframe.on('load', () => { - resolve(contentWindow) - }) - } - }) +Cypress.Commands.add('iframeLoaded', { prevSubject: 'element' }, ($iframe) => { + const contentWindow = $iframe.prop('contentWindow'); + return new Promise((resolve) => { + if (contentWindow) { + resolve(contentWindow); + } else { + $iframe.on('load', () => { + resolve(contentWindow); + }); + } }); - +}); Cypress.Commands.add( 'getInDocument', - {prevSubject: 'Permission denied to access property "document" on cross-origin object'}, + { + prevSubject: + 'Permission denied to access property "document" on cross-origin object', + }, (document, selector) => Cypress.$(selector, document) ); -Cypress.Commands.add( - 'getWithinIframe', - (targetElement) => cy.get('iframe').iframeLoaded().its('document').getInDocument(targetElement) +Cypress.Commands.add('getWithinIframe', (targetElement) => + cy + .get('iframe') + .iframeLoaded() + .its('document') + .getInDocument(targetElement) ); + +Cypress.Commands.add('useGateway', (gateway) => { + let body = { + settings: { + entity: 'App\\Models\\Client', + industry_id: '', + size_id: '', + currency_id: '1', + company_gateway_ids: gateway, + }, + }; + + let options = { + headers: { + 'X-Api-Secret': 'superdoopersecrethere', + 'X-Api-Token': + 'S0x8behDk8HG8PI0i8RXdpf2AVud5b993pE8vata7xmm4RgW6u3NeGC8ibWIUjZv', + 'X-Requested-With': 'XMLHttpRequest', + }, + }; + + axios + .put( + `http://localhost:8000/api/v1/clients/${fixture.first}`, + body, + options + ) + .then((response) => console.log(response)) + .catch((error) => console.log(error.message)); +}); diff --git a/resources/views/portal/ninja2020/components/livewire/invoices-table.blade.php b/resources/views/portal/ninja2020/components/livewire/invoices-table.blade.php index 8abdc3d15b7b..201acda85477 100644 --- a/resources/views/portal/ninja2020/components/livewire/invoices-table.blade.php +++ b/resources/views/portal/ninja2020/components/livewire/invoices-table.blade.php @@ -99,7 +99,7 @@ @csrf - diff --git a/resources/views/portal/ninja2020/components/livewire/payment-methods-table.blade.php b/resources/views/portal/ninja2020/components/livewire/payment-methods-table.blade.php index 32809625b4c7..e0f7704ec53f 100644 --- a/resources/views/portal/ninja2020/components/livewire/payment-methods-table.blade.php +++ b/resources/views/portal/ninja2020/components/livewire/payment-methods-table.blade.php @@ -12,16 +12,16 @@
@if($client->getCreditCardGateway() || $client->getBankTransferGateway()) - +
@else diff --git a/resources/views/portal/ninja2020/invoices/payment.blade.php b/resources/views/portal/ninja2020/invoices/payment.blade.php index a72d67c72e0f..3295cbd72bbc 100644 --- a/resources/views/portal/ninja2020/invoices/payment.blade.php +++ b/resources/views/portal/ninja2020/invoices/payment.blade.php @@ -21,7 +21,7 @@