From eda068c2ddc88d7c8b027e057a0da0c85c517f6a Mon Sep 17 00:00:00 2001 From: Kelly Phan Date: Wed, 4 Sep 2024 15:56:09 +0200 Subject: [PATCH 01/10] chore(cypress): bump package --- package.json | 2 +- yarn.lock | 42 +++++++++++++++++------------------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 9027ae854..36076b972 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "babel-plugin-prismjs": "2.1.0", "babel-plugin-styled-components": "2.1.4", "css-loader": "6.8.1", - "cypress": "13.6.0", + "cypress": "13.14.2", "dotenv": "16.3.1", "duplicate-package-checker-webpack-plugin": "3.0.0", "eslint": "8.56.0", diff --git a/yarn.lock b/yarn.lock index 02948df4b..307a1a46f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1186,7 +1186,7 @@ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cypress/request@^3.0.0": +"@cypress/request@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== @@ -3118,11 +3118,6 @@ dependencies: undici-types "~5.26.4" -"@types/node@^18.17.5": - version "18.17.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.16.tgz#ee7b103d102787fb1530bfc6d4a1e15014f10938" - integrity sha512-e0zgs7qe1XH/X3KEPnldfkD07LH9O1B9T31U8qoO7lqGSjj3/IrBuvqMeJ1aYejXRK3KOphIUDw6pLIplEW17A== - "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" @@ -4328,7 +4323,7 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.7.1: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -4984,20 +4979,19 @@ csstype@^3.0.2, csstype@^3.1.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -cypress@13.6.0: - version "13.6.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.6.0.tgz#b98b7b837679012ed09c7ecee5565bf7b31d4982" - integrity sha512-quIsnFmtj4dBUEJYU4OH0H12bABJpSujvWexC24Ju1gTlKMJbeT6tTO0vh7WNfiBPPjoIXLN+OUqVtiKFs6SGw== +cypress@13.14.2: + version "13.14.2" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.14.2.tgz#4237eb7b26de2baeaa1f01e585f965d88fca7f39" + integrity sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA== dependencies: - "@cypress/request" "^3.0.0" + "@cypress/request" "^3.0.1" "@cypress/xvfb" "^1.2.4" - "@types/node" "^18.17.5" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" arch "^2.2.0" blob-util "^2.0.2" bluebird "^3.7.2" - buffer "^5.6.0" + buffer "^5.7.1" cachedir "^2.3.0" chalk "^4.1.0" check-more-types "^2.24.0" @@ -5015,7 +5009,7 @@ cypress@13.6.0: figures "^3.2.0" fs-extra "^9.1.0" getos "^3.2.1" - is-ci "^3.0.0" + is-ci "^3.0.1" is-installed-globally "~0.4.0" lazy-ass "^1.6.0" listr2 "^3.8.3" @@ -5029,7 +5023,7 @@ cypress@13.6.0: request-progress "^3.0.0" semver "^7.5.3" supports-color "^8.1.1" - tmp "~0.2.1" + tmp "~0.2.3" untildify "^4.0.0" yauzl "^2.10.0" @@ -7083,9 +7077,9 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^3.0.0: +is-ci@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" @@ -9553,7 +9547,7 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -10332,12 +10326,10 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" +tmp@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== tmpl@1.0.5: version "1.0.5" From 05d8f2887f72b3356990284d93fd88f0f87ca7da Mon Sep 17 00:00:00 2001 From: Kelly Phan Date: Wed, 4 Sep 2024 15:56:32 +0200 Subject: [PATCH 02/10] chore(prettier): enable prettier on cypress tests files --- .gitignore | 1 + .prettierignore | 3 ++- cypress/support/e2e.ts | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8ccbb59a9..ff6621b4a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ dist .env yarn-error.log coverage +cypress/downloads \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 9ef1e9b73..7b0c0880a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,4 +4,5 @@ dist generated globals.d.ts ci -cypress/* \ No newline at end of file +cypress/downloads +cypress/screenshots \ No newline at end of file diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts index 8b63deb17..a2c923e34 100644 --- a/cypress/support/e2e.ts +++ b/cypress/support/e2e.ts @@ -30,7 +30,7 @@ beforeEach(() => { }, { cacheAcrossSpecs: true, - } + }, ) } From e311e27bb701a7686104b10bb9fe21ad16f83e63 Mon Sep 17 00:00:00 2001 From: Kelly Phan Date: Wed, 4 Sep 2024 15:58:24 +0200 Subject: [PATCH 03/10] fix(e2e): enable back auth tests --- cypress/e2e/00-auth/t0-signup.cy.ts | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/cypress/e2e/00-auth/t0-signup.cy.ts b/cypress/e2e/00-auth/t0-signup.cy.ts index 53022097d..fae376f4b 100644 --- a/cypress/e2e/00-auth/t0-signup.cy.ts +++ b/cypress/e2e/00-auth/t0-signup.cy.ts @@ -5,21 +5,18 @@ describe('Sign up page test', () => { cy.visit('sign-up') }) - it( - 'should create a new user and redirect to the home after signup', - { defaultCommandTimeout: 5000 }, - () => { - cy.visit('sign-up') - - cy.get('input[name="organizationName"]').type('Company name') - cy.get('input[name="email"]').type(userEmail) - cy.get('input[name="password"]').type(userPassword) - cy.get('[data-test="submit-button"]').click() - - cy.url().should('be.equal', Cypress.config().baseUrl + '/') - cy.get('[data-test="side-nav-name"]').contains('Company name') - } - ) + it('should create a new user and redirect to the home after signup', () => { + cy.visit('sign-up') + + cy.get('input[name="organizationName"]').type('Company name') + cy.get('input[name="email"]').type(userEmail) + cy.get('input[name="password"]').type(userPassword) + cy.get('[data-test="submit-button"]').click() + + // TODO: Why is it redirecting to customer page and why is it forbidden? + cy.url().should('be.equal', Cypress.config().baseUrl + '/') + cy.get('[data-test="side-nav-name"]').contains('Company name') + }) it('should have a disabled button on visiting', () => { cy.visit('sign-up') From 2aca9a9d65e37bbea2db91b1dec7ddf5816a6062 Mon Sep 17 00:00:00 2001 From: Kelly Phan Date: Thu, 5 Sep 2024 16:15:53 +0200 Subject: [PATCH 04/10] fix(e2e): enable back ressources tests --- .../e2e/10-resources/t10-create-taxes.cy.ts | 86 ++--- .../10-resources/t20-create-customer.cy.ts | 72 ++-- cypress/e2e/10-resources/t30-create-bm.cy.ts | 8 +- .../e2e/10-resources/t40-create-plan.cy.ts | 355 +++++++++--------- cypress/e2e/10-resources/t50-edit-plan.cy.ts | 169 +++++---- .../t60-coupons-create-edit-apply.cy.ts | 180 ++++----- .../10-resources/t70-addon-create-edit.cy.ts | 9 +- cypress/support/reusableConstants.ts | 3 +- .../customers/overview/CustomerOverview.tsx | 2 +- src/pages/AddOnDetails.tsx | 12 +- src/pages/CouponDetails.tsx | 13 +- src/pages/CustomerDetails.tsx | 7 +- 12 files changed, 471 insertions(+), 445 deletions(-) diff --git a/cypress/e2e/10-resources/t10-create-taxes.cy.ts b/cypress/e2e/10-resources/t10-create-taxes.cy.ts index 472180397..0be87c733 100644 --- a/cypress/e2e/10-resources/t10-create-taxes.cy.ts +++ b/cypress/e2e/10-resources/t10-create-taxes.cy.ts @@ -1,54 +1,50 @@ import { TAX_TEN_CODE, TAX_TWENTY_CODE } from '../../support/reusableConstants' describe('Create taxes', () => { - it('remove me when other tests are uncommented', () => { - expect(true).to.equal(true) - }) - // TODO: uncomment when clickhouse migration is dones - // it('should create taxes', () => { - // cy.visit('/settings/taxes') - // cy.url().should('include', '/settings/taxes') - // // Make sure no tax exists - // cy.get('[data-test="empty-title"]').should('exist') + it('should create taxes', () => { + cy.visit('/settings/taxes') + cy.url().should('include', '/settings/taxes') + + // Make sure no tax exists + cy.get('[data-test="empty-title"]').should('exist') - // // Create tax 10% - // cy.get('[data-test="create-tax-button"]').click() - // cy.url().should('include', '/create/tax') - // cy.get('input[name="name"]').type(TAX_TEN_CODE) - // cy.get('input[name="code"]').type(TAX_TEN_CODE) - // cy.get('input[name="rate"]').type('10') - // cy.get('[data-test="submit"]').click() - // // Create tax 20% - // cy.get('[data-test="create-tax-button"]').click() - // cy.url().should('include', '/create/tax') - // cy.get('input[name="name"]').type(TAX_TWENTY_CODE) - // cy.get('input[name="code"]').type(TAX_TWENTY_CODE) - // cy.get('input[name="rate"]').type('20') - // cy.get('[data-test="submit"]').click() + // Create tax 10% + cy.get('[data-test="create-tax-button"]').click() + cy.url().should('include', '/create/tax') + cy.get('input[name="name"]').type(TAX_TEN_CODE) + cy.get('input[name="code"]').type(TAX_TEN_CODE) + cy.get('input[name="rate"]').type('10') + cy.get('[data-test="submit"]').click() + // Create tax 20% + cy.get('[data-test="create-tax-button"]').click() + cy.url().should('include', '/create/tax') + cy.get('input[name="name"]').type(TAX_TWENTY_CODE) + cy.get('input[name="code"]').type(TAX_TWENTY_CODE) + cy.get('input[name="rate"]').type('20') + cy.get('[data-test="submit"]').click() - // cy.get(`[data-test="${TAX_TEN_CODE}"]`).should('exist') - // cy.get(`[data-test="${TAX_TWENTY_CODE}"]`).should('exist') - // }) + cy.get(`[data-test="${TAX_TEN_CODE}"]`).should('exist') + cy.get(`[data-test="${TAX_TWENTY_CODE}"]`).should('exist') + }) - // TODO: uncomment - // it('sould assign tax to organization', () => { - // cy.visit('/settings/invoice') - // cy.url().should('include', '/settings/invoice') + it('should assign tax to organization', () => { + cy.visit('/settings/invoice') + cy.url().should('include', '/settings/invoice') - // // Make sure no tax are already assigned - // cy.get('[data-test="empty-taxes"]') - // .scrollIntoView({ - // offset: { top: -100, left: 0 }, - // duration: 0, - // }) - // .should('exist') + // Make sure no tax are already assigned + cy.get('[data-test="empty-taxes"]') + .scrollIntoView({ + offset: { top: -100, left: 0 }, + duration: 0, + }) + .should('exist') - // // Assign tax 20% - // cy.get('[data-test="add-tax-button"]').click() - // cy.get('[data-test="add-organization-tax-dialog"]').should('exist') - // cy.get('input[name="selectTax"]').click() - // cy.get('[data-option-index="1"]').click() - // cy.get('[data-test="submit-add-organization-tax-dialog-assign-button"]').click() - // cy.get(`[data-test="applied-tax-${TAX_TWENTY_CODE}"]`).should('exist') - // }) + // Assign tax 20% + cy.get('[data-test="add-tax-button"]').click() + cy.get('[data-test="add-organization-tax-dialog"]').should('exist') + cy.get('input[name="selectTax"]').click() + cy.get('[data-option-index="1"]').click() + cy.get('[data-test="submit-add-organization-tax-dialog-assign-button"]').click() + cy.get(`[data-test="applied-tax-${TAX_TWENTY_CODE}"]`).should('exist') + }) }) diff --git a/cypress/e2e/10-resources/t20-create-customer.cy.ts b/cypress/e2e/10-resources/t20-create-customer.cy.ts index 8d3d0bf69..e765cd27b 100644 --- a/cypress/e2e/10-resources/t20-create-customer.cy.ts +++ b/cypress/e2e/10-resources/t20-create-customer.cy.ts @@ -1,40 +1,40 @@ -// import { customerName } from '../../support/reusableConstants' +import { customerName } from '../../support/reusableConstants' -// TODO: uncomment when CI e2e api setup is fixed describe('Create customer', () => { - it('runs this test', () => { - expect(true).to.equal(true) + beforeEach(() => { + cy.visit('/customers') + }) + + it('should create customer', () => { + cy.get('[data-test="create-customer"]').click() + cy.get('input[name="name"]').should('exist').type(customerName, { scrollBehavior: false }) + + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('input[name="externalId"]').type('id-george-de-la-jungle') + cy.get('[data-test="submit"]').click() + + cy.url().should('include', '/customer/') + + cy.contains(customerName).should('exist') + }) + + describe('anti-regression', () => { + // https://github.com/getlago/lago-front/pull/892 + it('should be able to edit VAT right after creating a customer', () => { + const randomNumber = Math.round(Math.random() * 1000) + const randomId = `Customer ${randomNumber}` + + cy.get('[data-test="create-customer"]').click() + cy.get('input[name="name"]').type(randomId, { scrollBehavior: false }) + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('input[name="externalId"]').type(randomId) + cy.get('[data-test="submit"]').click() + cy.url().should('include', '/customer/') + cy.contains(randomId).should('exist') + + cy.get('button[role="tab"]').contains('Settings').click() + cy.get('[data-test="add-vat-rate-button"]').last().click() + cy.get('[data-test="edit-customer-vat-rate-dialog"]').should('exist') + }) }) - // beforeEach(() => { - // cy.visit('/customers') - // }) - - // it('should create customer', () => { - // cy.get('[data-test="create-customer"]').click() - // cy.get('input[name="name"]').type(customerName) - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('input[name="externalId"]').type('id-george-de-la-jungle') - // cy.get('[data-test="submit"]').click() - // cy.url().should('include', '/customer/') - // cy.contains(customerName).should('exist') - // }) - // describe('anti-regression', () => { - // // https://github.com/getlago/lago-front/pull/892 - // it('should be able to edit VAT right after creating a customer', () => { - // const randomNumber = Math.round(Math.random() * 1000) - // const randomId = `Customer ${randomNumber}` - - // cy.get('[data-test="create-customer"]').click() - // cy.get('input[name="name"]').type(randomId) - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('input[name="externalId"]').type(randomId) - // cy.get('[data-test="submit"]').click() - // cy.url().should('include', '/customer/') - // cy.contains(randomId).should('exist') - - // cy.get('[data-test="tab-internal-button-link-settings"]').last().click() - // cy.get('[data-test="add-vat-rate-button"]').last().click() - // cy.get('[data-test="edit-customer-vat-rate-dialog"]').should('exist') - // }) - // }) }) diff --git a/cypress/e2e/10-resources/t30-create-bm.cy.ts b/cypress/e2e/10-resources/t30-create-bm.cy.ts index 8448356cf..a5bcde191 100644 --- a/cypress/e2e/10-resources/t30-create-bm.cy.ts +++ b/cypress/e2e/10-resources/t30-create-bm.cy.ts @@ -7,12 +7,13 @@ describe('Create billable metrics', () => { const randomId = Math.round(Math.random() * 1000) const bmName = `bm count ${randomId}` - cy.get('[data-test="create-bm"]').click() + cy.get('button[data-test="create-bm"]').click() cy.url().should('be.equal', Cypress.config().baseUrl + '/create/billable-metrics') cy.get('input[name="name"]').type(bmName) cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="code"]').type(bmName) cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="show-description"]').click() cy.get('textarea[name="description"]').type('I am a description') cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="aggregationType"]').click() @@ -34,6 +35,7 @@ describe('Create billable metrics', () => { cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="code"]').type(bmName) cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="show-description"]').click() cy.get('textarea[name="description"]').type('I am a description') cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="aggregationType"]').click() @@ -57,6 +59,7 @@ describe('Create billable metrics', () => { cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="code"]').type(bmName) cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="show-description"]').click() cy.get('textarea[name="description"]').type('I am a description') cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="aggregationType"]').click() @@ -79,6 +82,7 @@ describe('Create billable metrics', () => { cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="code"]').type(bmName) cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="show-description"]').click() cy.get('textarea[name="description"]').type('I am a description') cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="aggregationType"]').click() @@ -101,6 +105,7 @@ describe('Create billable metrics', () => { cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="code"]').type(bmName) cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="show-description"]').click() cy.get('textarea[name="description"]').type('I am a description') cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="aggregationType"]').click() @@ -124,6 +129,7 @@ describe('Create billable metrics', () => { cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="code"]').type(bmName) cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="show-description"]').click() cy.get('textarea[name="description"]').type('I am a description') cy.get('[data-test="submit"]').should('be.disabled') cy.get('input[name="aggregationType"]').click() diff --git a/cypress/e2e/10-resources/t40-create-plan.cy.ts b/cypress/e2e/10-resources/t40-create-plan.cy.ts index 25f5008c8..dd124ab11 100644 --- a/cypress/e2e/10-resources/t40-create-plan.cy.ts +++ b/cypress/e2e/10-resources/t40-create-plan.cy.ts @@ -10,182 +10,181 @@ describe('Create plan', () => { cy.get('[data-test="empty"]').should('exist') }) - // TODO: uncomment when CI e2e api setup is fixed - // it('should be able to create a simple plan', () => { - // const randomId = Math.round(Math.random() * 1000) - // const planName = `plan ${randomId}` - - // cy.get('[data-test="create-plan"]').click({ force: true }) - // cy.url().should('be.equal', Cypress.config().baseUrl + '/create/plans') - // cy.get('input[name="name"]').type(planName) - // cy.get('input[name="code"]').type(planName) - // cy.get('[data-test="show-description"]').click({ force: true }) - // cy.get('textarea[name="description"]').type('I am a description') - // cy.get('input[name="amountCents"]').type('30000') - // cy.get('[data-test="submit"]').click({ force: true }) - // cy.url().should('include', '/overview') - // cy.contains(planName).should('exist') - // }) - - // it('should be able to create a plan with all 0 dimension charges and submit', () => { - // cy.get('[data-test="create-plan"]').click({ force: true }) - // cy.url().should('be.equal', Cypress.config().baseUrl + '/create/plans') - // cy.get('input[name="name"]').type(planWithChargesName) - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('input[name="code"]').type(planWithChargesName) - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('[data-test="show-description"]').click({ force: true }) - // cy.get('textarea[name="description"]').type('I am a description') - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('input[name="amountCents"]').type('30000') - // cy.get('[data-test="submit"]').should('not.be.disabled') - // cy.get('input[name="amountCurrency"]').click({ force: true }) - // cy.get('[data-test="USD"]').click({ force: true }) - - // // Standard - // cy.get('[data-test="add-charge"]').first().click({ force: true }) - // cy.get('[data-test="add-metered-charge"]').first().click({ force: true }) - // cy.get('[data-option-index="0"]').click({ force: true }) - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('input[name="chargeModel"]').last().should('have.value', 'Standard pricing') - // cy.get('input[name="properties.amount"]').type('5000') - // cy.get('[data-test="submit"]').should('not.be.disabled') - - // // Graduated - // cy.get('[data-test="add-charge"]').last().click({ force: true }) - // cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) - // cy.get('[data-option-index="1"]').click({ force: true }) - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('input[name="chargeModel"]').last().click({ force: true }) - // cy.get('[data-test="graduated"]').click({ force: true }) - // cy.get('input[name="chargeModel"]').last().should('have.value', 'Graduated pricing') - // cy.get('[data-test="row-2"]').should('not.exist') - // cy.get('[data-test="add-tier"]').click({ force: true }) - // cy.get('[data-test="row-2"]').should('exist') - // cy.get('[data-test="cell-amount-0"]').type('1') - // cy.get('[data-test="cell-amount-1"]').type('1') - // cy.get('[data-test="cell-amount-2"]').type('1') - // cy.get('[data-test="submit"]').should('not.be.disabled') - - // // Graduated percentage - // cy.get('[data-test="add-charge"]').last().click({ force: true }) - // cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) - // cy.get('[data-option-index="1"]').click({ force: true }) - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('input[name="chargeModel"]').last().click({ force: true }) - // cy.get('[data-test="graduated_percentage"]').click({ force: true }) - // cy.get('[data-test="charge-accordion-2"]').within(() => { - // cy.get('input[name="chargeModel"]') - // .last() - // .should('have.value', 'Graduated percentage pricing') - // cy.get('[data-test="add-tier"]').last().click({ force: true }) - // cy.get('[data-test="cell-rate-0"]').type('1') - // cy.get('[data-test="cell-rate-1"]').type('1') - // cy.get('[data-test="cell-rate-2"]').type('1') - // }) - // cy.get('[data-test="row-2"]').should('have.length', 2) - // cy.get('[data-test="submit"]').should('not.be.disabled') - - // // Package - // cy.get('[data-test="add-charge"]').last().click({ force: true }) - // cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) - // cy.get('[data-option-index="1"]').click({ force: true }) - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('input[name="chargeModel"]').last().click({ force: true }) - // cy.get('[data-test="package"]').click({ force: true }) - // cy.get('input[name="chargeModel"]').last().should('have.value', 'Package pricing') - // cy.get('input[name="properties.amount"]').last().type('1') - // cy.get('[data-test="submit"]').should('not.be.disabled') - - // // Percentage - // cy.get('[data-test="add-charge"]').last().click({ force: true }) - // cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) - // cy.get('[data-option-index="1"]').click({ force: true }) - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('input[name="chargeModel"]').last().click({ force: true }) - // cy.get('[data-test="percentage"]').click({ force: true }) - // cy.get('input[name="chargeModel"]').last().should('have.value', 'Percentage pricing') - // cy.get('input[name="properties.rate"]').last().type('1') - // cy.get('[data-test="add-fixed-fee"]').click({ force: true }) - // cy.get('input[name="properties.fixedAmount"]').should('exist') - // cy.get('[data-test="add-free-units"]').click({ force: true }) - // cy.get('[data-test="add-free-units-events"]').click({ force: true }) - // cy.get('[data-test="free-unit-per-event"] input').should('exist') - // cy.get('[data-test="add-free-units"]').click({ force: true }) - // cy.get('[data-test="add-free-units-total-amount"]').click({ force: true }) - // cy.get('[data-test="free-unit-per-total-aggregation"] input').should('exist') - - // // Min max - // cy.get('[data-test="add-min-max-drowdown-cta"]').click({ force: true }) - // cy.get('[data-test="add-min-cta"]').click({ force: true }) - // cy.get('[data-test="per-transaction-min-amount"]').should('exist') - // cy.get('[data-test="add-min-max-drowdown-cta"]').click({ force: true }) - // cy.get('[data-test="add-max-cta"]').click({ force: true }) - // cy.get('[data-test="per-transaction-max-amount"]').should('exist') - // cy.get('[data-test="submit"]').should('not.be.disabled') - - // // Volume - // cy.get('[data-test="add-charge"]').last().click({ force: true }) - // cy.get('[data-test="add-recurring-charge"]').last().click({ force: true }) - // cy.get('[data-option-index="0"]').click({ force: true }) - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('input[name="chargeModel"]').last().click({ force: true }) - // cy.get('[data-test="volume"]').click({ force: true }) - // cy.get('input[name="chargeModel"]').last().should('have.value', 'Volume pricing') - // cy.get('[data-test="add-tier"]').last().click({ force: true }) - // cy.get('[data-test="cell-amount-0"]').last().type('1') - // cy.get('[data-test="cell-amount-1"]').last().type('1') - // cy.get('[data-test="cell-amount-2"]').last().type('1') - // cy.get('[data-test="submit"]').should('not.be.disabled') - - // cy.get('[data-test="submit"]').click({ force: true }) - // cy.url().should('include', '/overview') - // cy.contains(planWithChargesName).should('exist') - // }) - - // describe('anti-regression', () => { - // // https://github.com/getlago/lago-front/pull/792 - // it('should be able to edit percentage charge without data loss', () => { - // const randomId = Math.round(Math.random() * 1000) - // const planName = `plan ${randomId}` - - // // Default plan data - // cy.get('[data-test="create-plan"]').click({ force: true }) - // cy.url().should('be.equal', Cypress.config().baseUrl + '/create/plans') - // cy.get('input[name="name"]').type(planName) - // cy.get('input[name="code"]').type(planName) - // cy.get('[data-test="show-description"]').click({ force: true }) - // cy.get('textarea[name="description"]').type('I am a description') - // cy.get('input[name="amountCents"]').type('30000') - - // // Config charge - // cy.get('[data-test="add-charge"]').last().click({ force: true }) - // cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) - // cy.get('[data-option-index="1"]').click({ force: true }) - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('input[name="chargeModel"]').last().click({ force: true }) - // cy.get('[data-test="percentage"]').click({ force: true }) - // cy.get('input[name="chargeModel"]').last().should('have.value', 'Percentage pricing') - // cy.get('input[name="properties.rate"]').last().type('1') - // cy.get('[data-test="add-fixed-fee"]').click({ force: true }) - // cy.get('input[name="properties.fixedAmount"]').last().type('1') - // cy.get('[data-test="add-free-units"]').click({ force: true }) - // cy.get('[data-test="add-free-units-events"]').click({ force: true }) - // cy.get('[data-test="free-unit-per-event"] input').last().type('1') - // cy.get('[data-test="add-free-units"]').click({ force: true }) - // cy.get('[data-test="add-free-units-total-amount"]').click({ force: true }) - // cy.get('[data-test="free-unit-per-total-aggregation"] input').last().type('1') - - // // Test regression scenario - // cy.get('[data-test="remove-fixed-fee"]').click({ force: true }) - // cy.get('[data-test="remove-free-units-per-event"]').click({ force: true }) - // cy.get('[data-test="remove-free-unit-per-total-aggregation"]').click({ force: true }) - // cy.get('[data-test="submit"]').should('not.be.disabled') - // cy.get('input[name="properties.rate"]').should('have.value', '1') - - // cy.get('[data-test="submit"]').click({ force: true }) - // cy.url().should('include', '/overview') - // cy.contains(planName).should('exist') - // }) - // }) + it('should be able to create a simple plan', () => { + const randomId = Math.round(Math.random() * 1000) + const planName = `plan ${randomId}` + + cy.get('[data-test="create-plan"]').click({ force: true }) + cy.url().should('be.equal', Cypress.config().baseUrl + '/create/plans') + cy.get('input[name="name"]').type(planName) + cy.get('input[name="code"]').type(planName) + cy.get('[data-test="show-description"]').click({ force: true }) + cy.get('textarea[name="description"]').type('I am a description') + cy.get('input[name="amountCents"]').type('30000') + cy.get('[data-test="submit"]').click({ force: true }) + cy.url().should('include', '/overview') + cy.contains(planName).should('exist') + }) + + it('should be able to create a plan with all 0 dimension charges and submit', () => { + cy.get('[data-test="create-plan"]').click({ force: true }) + cy.url().should('be.equal', Cypress.config().baseUrl + '/create/plans') + cy.get('input[name="name"]').type(planWithChargesName) + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('input[name="code"]').type(planWithChargesName) + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="show-description"]').click({ force: true }) + cy.get('textarea[name="description"]').type('I am a description') + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('input[name="amountCents"]').type('30000') + cy.get('[data-test="submit"]').should('not.be.disabled') + cy.get('input[name="amountCurrency"]').click({ force: true }) + cy.get('[data-test="USD"]').click({ force: true }) + + // Standard + cy.get('[data-test="add-charge"]').first().click({ force: true }) + cy.get('[data-test="add-metered-charge"]').first().click({ force: true }) + cy.get('[data-option-index="0"]').click({ force: true }) + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('input[name="chargeModel"]').last().should('have.value', 'Standard pricing') + cy.get('input[name="properties.amount"]').type('5000') + cy.get('[data-test="submit"]').should('not.be.disabled') + + // Graduated + cy.get('[data-test="add-charge"]').last().click({ force: true }) + cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) + cy.get('[data-option-index="1"]').click({ force: true }) + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('input[name="chargeModel"]').last().click({ force: true }) + cy.get('[data-test="graduated"]').click({ force: true }) + cy.get('input[name="chargeModel"]').last().should('have.value', 'Graduated pricing') + cy.get('[data-test="row-2"]').should('not.exist') + cy.get('[data-test="add-tier"]').click({ force: true }) + cy.get('[data-test="row-2"]').should('exist') + cy.get('[data-test="cell-amount-0"]').type('1') + cy.get('[data-test="cell-amount-1"]').type('1') + cy.get('[data-test="cell-amount-2"]').type('1') + cy.get('[data-test="submit"]').should('not.be.disabled') + + // Graduated percentage + cy.get('[data-test="add-charge"]').last().click({ force: true }) + cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) + cy.get('[data-option-index="1"]').click({ force: true }) + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('input[name="chargeModel"]').last().click({ force: true }) + cy.get('[data-test="graduated_percentage"]').click({ force: true }) + cy.get('[data-test="charge-accordion-2"]').within(() => { + cy.get('input[name="chargeModel"]') + .last() + .should('have.value', 'Graduated percentage pricing') + cy.get('[data-test="add-tier"]').last().click({ force: true }) + cy.get('[data-test="cell-rate-0"]').type('1') + cy.get('[data-test="cell-rate-1"]').type('1') + cy.get('[data-test="cell-rate-2"]').type('1') + }) + cy.get('[data-test="row-2"]').should('have.length', 2) + cy.get('[data-test="submit"]').should('not.be.disabled') + + // Package + cy.get('[data-test="add-charge"]').last().click({ force: true }) + cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) + cy.get('[data-option-index="1"]').click({ force: true }) + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('input[name="chargeModel"]').last().click({ force: true }) + cy.get('[data-test="package"]').click({ force: true }) + cy.get('input[name="chargeModel"]').last().should('have.value', 'Package pricing') + cy.get('input[name="properties.amount"]').last().type('1') + cy.get('[data-test="submit"]').should('not.be.disabled') + + // Percentage + cy.get('[data-test="add-charge"]').last().click({ force: true }) + cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) + cy.get('[data-option-index="1"]').click({ force: true }) + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('input[name="chargeModel"]').last().click({ force: true }) + cy.get('[data-test="percentage"]').click({ force: true }) + cy.get('input[name="chargeModel"]').last().should('have.value', 'Percentage pricing') + cy.get('input[name="properties.rate"]').last().type('1') + cy.get('[data-test="add-fixed-fee"]').click({ force: true }) + cy.get('input[name="properties.fixedAmount"]').should('exist') + cy.get('[data-test="add-free-units"]').click({ force: true }) + cy.get('[data-test="add-free-units-events"]').click({ force: true }) + cy.get('[data-test="free-unit-per-event"] input').should('exist') + cy.get('[data-test="add-free-units"]').click({ force: true }) + cy.get('[data-test="add-free-units-total-amount"]').click({ force: true }) + cy.get('[data-test="free-unit-per-total-aggregation"] input').should('exist') + + // Min max + cy.get('[data-test="add-min-max-drowdown-cta"]').click({ force: true }) + cy.get('[data-test="add-min-cta"]').click({ force: true }) + cy.get('[data-test="per-transaction-min-amount"]').should('exist') + cy.get('[data-test="add-min-max-drowdown-cta"]').click({ force: true }) + cy.get('[data-test="add-max-cta"]').click({ force: true }) + cy.get('[data-test="per-transaction-max-amount"]').should('exist') + cy.get('[data-test="submit"]').should('not.be.disabled') + + // Volume + cy.get('[data-test="add-charge"]').last().click({ force: true }) + cy.get('[data-test="add-recurring-charge"]').last().click({ force: true }) + cy.get('[data-option-index="0"]').click({ force: true }) + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('input[name="chargeModel"]').last().click({ force: true }) + cy.get('[data-test="volume"]').click({ force: true }) + cy.get('input[name="chargeModel"]').last().should('have.value', 'Volume pricing') + cy.get('[data-test="add-tier"]').last().click({ force: true }) + cy.get('[data-test="cell-amount-0"]').last().type('1') + cy.get('[data-test="cell-amount-1"]').last().type('1') + cy.get('[data-test="cell-amount-2"]').last().type('1') + cy.get('[data-test="submit"]').should('not.be.disabled') + + cy.get('[data-test="submit"]').click({ force: true }) + cy.url().should('include', '/overview') + cy.contains(planWithChargesName).should('exist') + }) + + describe('anti-regression', () => { + // https://github.com/getlago/lago-front/pull/792 + it('should be able to edit percentage charge without data loss', () => { + const randomId = Math.round(Math.random() * 1000) + const planName = `plan ${randomId}` + + // Default plan data + cy.get('[data-test="create-plan"]').click({ force: true }) + cy.url().should('be.equal', Cypress.config().baseUrl + '/create/plans') + cy.get('input[name="name"]').type(planName) + cy.get('input[name="code"]').type(planName) + cy.get('[data-test="show-description"]').click({ force: true }) + cy.get('textarea[name="description"]').type('I am a description') + cy.get('input[name="amountCents"]').type('30000') + + // Config charge + cy.get('[data-test="add-charge"]').last().click({ force: true }) + cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) + cy.get('[data-option-index="1"]').click({ force: true }) + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('input[name="chargeModel"]').last().click({ force: true }) + cy.get('[data-test="percentage"]').click({ force: true }) + cy.get('input[name="chargeModel"]').last().should('have.value', 'Percentage pricing') + cy.get('input[name="properties.rate"]').last().type('1') + cy.get('[data-test="add-fixed-fee"]').click({ force: true }) + cy.get('input[name="properties.fixedAmount"]').last().type('1') + cy.get('[data-test="add-free-units"]').click({ force: true }) + cy.get('[data-test="add-free-units-events"]').click({ force: true }) + cy.get('[data-test="free-unit-per-event"] input').last().type('1') + cy.get('[data-test="add-free-units"]').click({ force: true }) + cy.get('[data-test="add-free-units-total-amount"]').click({ force: true }) + cy.get('[data-test="free-unit-per-total-aggregation"] input').last().type('1') + + // Test regression scenario + cy.get('[data-test="remove-fixed-fee"]').click({ force: true }) + cy.get('[data-test="remove-free-units-per-event"]').click({ force: true }) + cy.get('[data-test="remove-free-unit-per-total-aggregation"]').click({ force: true }) + cy.get('[data-test="submit"]').should('not.be.disabled') + cy.get('input[name="properties.rate"]').should('have.value', '1') + + cy.get('[data-test="submit"]').click({ force: true }) + cy.url().should('include', '/overview') + cy.contains(planName).should('exist') + }) + }) }) diff --git a/cypress/e2e/10-resources/t50-edit-plan.cy.ts b/cypress/e2e/10-resources/t50-edit-plan.cy.ts index 866ad2cc7..f91030128 100644 --- a/cypress/e2e/10-resources/t50-edit-plan.cy.ts +++ b/cypress/e2e/10-resources/t50-edit-plan.cy.ts @@ -1,95 +1,94 @@ -import { customerName, planWithChargesName } from '../../support/reusableConstants' +import { + customerName, + planWithChargeCode, + planWithChargesName, +} from '../../support/reusableConstants' describe('Edit plan', () => { - it('make sure file still exists', () => { - expect(true).to.equal(true) + it('should be able to close the form without warning dialog when no data has changed', () => { + cy.visit('/plans') + cy.get(`[data-test="${planWithChargesName}-wrapper"]`).within(() => { + cy.get('[data-test="plan-item-options"]').click({ force: true }) + }) + cy.get('[data-test="tab-internal-button-link-update-plan"]').click({ force: true }) + cy.get('input[name="name"]').should('exist') + cy.get('[data-test="close-create-plan-button"]').click({ force: true }) + cy.get('[data-test="close-create-plan-button"]').should('not.exist') + cy.url().should('include', '/overview') }) - // TODO: uncomment when CI e2e api setup is fixed - // it('should be able to close the form without warning dialog when no data has changed', () => { - // cy.visit('/plans') - // cy.get(`[data-test="${planWithChargesName}-wrapper"]`).within(() => { - // cy.get('[data-test="plan-item-options"]').click({ force: true }) - // }) - // cy.get('[data-test="tab-internal-button-link-update-plan"]').click({ force: true }) - // cy.get('input[name="name"]').should('exist') - // cy.get('[data-test="close-create-plan-button"]').click({ force: true }) - // cy.get('[data-test="close-create-plan-button"]').should('not.exist') - // cy.url().should('include', '/overview') - // }) - // it('should be able to update all information of unused plan', () => { - // cy.visit('/plans') - // cy.get(`[data-test="${planWithChargesName}-wrapper"]`).within(() => { - // cy.get('[data-test="plan-item-options"]').click({ force: true }) - // }) - // cy.get('[data-test="tab-internal-button-link-update-plan"]').click({ force: true }) - // cy.get('input[name="name"]').should('not.be.disabled') - // cy.get('input[name="code"]').should('not.be.disabled') - // cy.get('textarea[name="description"]', { timeout: 10000 }).should('not.be.disabled') - // cy.get(`[data-test="fixed-fee-section-accordion"]`).within(() => { - // cy.get(`.MuiAccordionSummary-root`).click({ force: true }) - // }) - // // cy.get('input[name="amountCents"]', { timeout: 10000 }).should('not.be.disabled') - // cy.get('input[name="amountCurrency"]').eq(0).should('not.be.disabled') - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('[data-test="open-charge"]').eq(1).click({ force: true }) - // cy.get('input[name="chargeModel"]').should('not.be.disabled') - // cy.get('input[name="properties.amount"]').should('not.be.disabled') - // // TODO: fix, cause with amountInput introduction - // // BE is expecting string where we manage amount as int - // // cy.get('[data-test="submit"]').should('be.disabled') + it('should be able to update all information of unused plan', () => { + cy.visit('/plans') + cy.get(`[data-test="${planWithChargesName}-wrapper"]`).within(() => { + cy.get('[data-test="plan-item-options"]').click({ force: true }) + }) + cy.get('[data-test="tab-internal-button-link-update-plan"]').click({ force: true }) + cy.get('input[name="name"]').should('not.be.disabled') + cy.get('input[name="code"]').should('not.be.disabled') + cy.get('textarea[name="description"]', { timeout: 10000 }).should('not.be.disabled') + cy.get(`[data-test="fixed-fee-section-accordion"]`).within(() => { + cy.get(`.MuiAccordionSummary-root`).click({ force: true }) + }) + // cy.get('input[name="amountCents"]', { timeout: 10000 }).should('not.be.disabled') + cy.get('input[name="amountCurrency"]').eq(0).should('not.be.disabled') + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('[data-test="open-charge"]').eq(1).click({ force: true }) + cy.get('input[name="chargeModel"]').should('not.be.disabled') + cy.get('input[name="properties.amount"]').should('not.be.disabled') + // TODO: fix, cause with amountInput introduction + // BE is expecting string where we manage amount as int + // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('input[name="code"]').type('new code plan with charge') - // cy.get('[data-test="submit"]').click({ force: true }) - // }) + cy.get('input[name="code"]').clear().type(planWithChargeCode) + cy.get('[data-test="submit"]').click({ force: true }) + }) + + it('should add plan to customer', () => { + cy.visit('/customers') + cy.get(`[data-test="${customerName}"]`).click() + cy.get(`[data-test="add-subscription"]`).click() - // it('should add plan to customer', () => { - // cy.visit('/customers') - // cy.get(`[data-test="${customerName}"]`).click({ force: true }) - // cy.get(`[data-test="add-subscription"]`).click({ force: true }) - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('input[name="planId"]').click({ force: true }) - // cy.get( - // '[data-test="combobox-item-a plan with charges - (a_plan_with_chargesnew_code_plan_with_charge)"]' - // ).click() - // cy.get('[data-test="submit"]').should('not.be.disabled') - // cy.get('[data-test="submit"]').click() - // cy.contains(customerName).should('exist') - // }) + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('input[name="planId"]').click() + cy.get(`[data-test^="combobox-item-"]`).contains(planWithChargeCode).click() - // it('should not be able to update all information of unused plan', () => { - // cy.visit('/plans') - // cy.get(`[data-test="${planWithChargesName}-wrapper"]`).within(() => { - // cy.get('[data-test="plan-item-options"]').click({ force: true }) - // }) - // cy.get('[data-test="tab-internal-button-link-update-plan"]').click({ force: true }) - // cy.get('input[name="name"]').should('not.be.disabled') - // cy.get('textarea[name="description"]', { timeout: 10000 }).should('not.be.disabled') - // cy.get(`[data-test="fixed-fee-section-accordion"]`).within(() => { - // cy.get(`.MuiAccordionSummary-root`).click({ force: true }) - // }) + cy.get('[data-test="submit"]').should('not.be.disabled') + cy.get('[data-test="submit"]').click() - // cy.get('input[name="amountCents"]') - // .scrollIntoView({ - // offset: { top: -100, left: 0 }, - // duration: 0, - // }) - // .should('be.disabled') - // cy.get('input[name="amountCurrency"]').should('be.disabled') - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('[data-test="open-charge"]').eq(1).click({ force: true }) - // cy.get('input[name="chargeModel"]').should('be.disabled') - // cy.get('input[name="properties.amount"]').should('not.be.disabled') - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('[data-test="open-charge"]').eq(1).click({ force: true }) + cy.get('[data-test="customer-details-name"]').should('have.text', customerName) + }) - // cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) - // cy.get('[data-option-index="1"]').click() - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') - // cy.get('input[name="chargeModel"]').last().should('have.value', 'Standard pricing') - // cy.get('input[name="properties.amount"]').last().type('3000') - // cy.get('[data-test="submit"]').should('not.be.disabled') - // cy.get('[data-test="submit"]').click({ force: true }) - // }) + it('should not be able to update all information of an used plan', () => { + cy.visit('/plans') + cy.get(`[data-test="${planWithChargesName}-wrapper"]`).within(() => { + cy.get('[data-test="plan-item-options"]').click({ force: true }) + }) + cy.get('[data-test="tab-internal-button-link-update-plan"]').click({ force: true }) + cy.get('input[name="name"]').should('not.be.disabled') + cy.get('textarea[name="description"]', { timeout: 10000 }).should('not.be.disabled') + cy.get(`[data-test="fixed-fee-section-accordion"]`).within(() => { + cy.get(`.MuiAccordionSummary-root`).click({ force: true }) + }) + cy.get('input[name="amountCents"]') + .scrollIntoView({ + offset: { top: -100, left: 0 }, + duration: 0, + }) + .should('be.enabled') + cy.get('input[name="amountCurrency"]').should('be.disabled') + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('[data-test="open-charge"]').eq(1).click({ force: true }) + cy.get('input[name="chargeModel"]').should('be.disabled') + cy.get('input[name="properties.amount"]').should('not.be.disabled') + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="open-charge"]').eq(1).click({ force: true }) + cy.get('[data-test="add-metered-charge"]').last().click({ force: true }) + cy.get('[data-option-index="1"]').click() + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="remove-charge"]').should('exist').and('not.be.disabled') + cy.get('input[name="chargeModel"]').last().should('have.value', 'Standard pricing') + cy.get('input[name="properties.amount"]').last().type('3000') + cy.get('[data-test="submit"]').should('not.be.disabled') + cy.get('[data-test="submit"]').click({ force: true }) + }) }) diff --git a/cypress/e2e/10-resources/t60-coupons-create-edit-apply.cy.ts b/cypress/e2e/10-resources/t60-coupons-create-edit-apply.cy.ts index 2ec37744f..5f40aaaad 100644 --- a/cypress/e2e/10-resources/t60-coupons-create-edit-apply.cy.ts +++ b/cypress/e2e/10-resources/t60-coupons-create-edit-apply.cy.ts @@ -3,95 +3,97 @@ import { customerName } from '../../support/reusableConstants' const couponName = `Coupon-${Math.round(Math.random() * 10000)}` describe('Coupons', () => { - it('make sure file still exists', () => { - expect(true).to.equal(true) + it('should be able create a coupon with plan limitation', () => { + cy.visit('/coupons') + cy.get(`[data-test="add-coupon"]`).click() + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('input[name="name"]').type(couponName) + cy.get('input[name="code"]').type(couponName) + cy.get('input[name="amountCents"]').type('30') + cy.get('[data-test="submit"]').should('be.enabled') + + // Set plan limitation + cy.get('[data-test="checkbox-hasPlanOrBillableMetricLimit"]').click() + cy.get('[data-test="add-plan-limit"]').click() + cy.get('input[name="selectedPlan"]').click() + cy.get('[data-option-index="0"]').click() + cy.get('[data-test="submitAddPlanToCouponDialog"]').click() + + // Submit form + cy.get('[data-test="submit"]').click() + cy.get('[data-test="coupon-details-name"]').should('contain.text', couponName) }) - // TODO: uncomment when CI e2e api setup is fixed - // it('should be able create a coupon with plan limitation', () => { - // cy.visit('/coupons') - // cy.get(`[data-test="add-coupon"]`).click() - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('input[name="name"]').type(couponName) - // cy.get('input[name="code"]').type(couponName) - // cy.get('input[name="amountCents"]').type('30') - // cy.get('[data-test="submit"]').should('be.enabled') - - // // Set plan limitation - // cy.get('[data-test="checkbox-hasPlanOrBillableMetricLimit"]').click() - // cy.get('[data-test="add-plan-limit"]').click() - // cy.get('input[name="selectedPlan"]').click() - // cy.get('[data-option-index="0"]').click() - // cy.get('[data-test="submitAddPlanToCouponDialog"]').click() - - // // Submit form - // cy.get('[data-test="submit"]').click() - // cy.get(`[data-test="${couponName}"]`).should('exist') - // }) - - // it('should be able to edit the same coupon', () => { - // cy.visit('/coupons') - // cy.get(`[data-test="${couponName}"]`).click() - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('[data-test="limited-plan-0"]').within(() => { - // cy.get(`[data-test="delete-limited-plan-0"]`).click() - // }) - // cy.get('[data-test="limited-plan-0"]').should('not.exist') - // cy.get('[data-test="add-plan-limit"]').click() - // cy.get('input[name="selectedPlan"]').click() - // cy.get('[data-option-index="0"]').click() - // cy.get('[data-test="submitAddPlanToCouponDialog"]').click() - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('input[name="amountCents"]').type('1') - - // cy.get('[data-test="submit"]').click() - // cy.get(`[data-test="${couponName}"]`).should('exist') - // }) - - - // it('should be able to apply the coupon to a customer', () => { - // cy.visit('/customers') - // cy.get(`[data-test="${customerName}"]`).click() - // cy.get('[data-test="customer-actions"]').click() - // cy.get('[data-test="apply-coupon-action"]').click() - // cy.get('input[name="selectCoupon"]').click() - // cy.get('[data-option-index="0"]').click() - // cy.get(`[data-test="plan-limitation-section"]`).should('exist') - - // // Test errors - // cy.get('input[name="amountCurrency"]').click() - // cy.get('[data-test="UAH"]').click() - // cy.get('[data-test="submit"]').click() - // cy.get(`[data-test="alert-type-danger"]`).should('exist', 1) - - // // Reset values to be valid - // cy.get('input[name="amountCurrency"]').click() - // cy.get('[data-test="USD"]').click() - - // cy.get('[data-test="submit"]').click() - // cy.get(`[data-test="customer-coupon-container"]`).within(() => { - // cy.get(`[data-test="${couponName}"]`).should('exist') - // }) - // }) - - // it('should not able to apply the same coupon to a customer multiple time', () => { - // cy.visit('/customers') - // cy.get(`[data-test="${customerName}"]`).click() - // cy.get('[data-test="customer-actions"]').click() - // cy.get('[data-test="apply-coupon-action"]').click() - // cy.get('input[name="selectCoupon"]').click() - // cy.get('[data-option-index="0"]').click() - // cy.get('[data-test="submit"]').click() - // cy.get(`[data-test="alert-type-danger"]`).should('exist', 1) - // }) - - // it('should not be able to edit an applied coupon', () => { - // cy.visit('/coupons') - // cy.get(`[data-test="${couponName}"]`).click() - // cy.get('input[name="name"]').should('not.be.disabled') - // cy.get('input[name="code"]').should('be.disabled') - // cy.get('[data-test="submit"]').should('be.disabled') - // cy.get('[data-test="checkbox-hasPlanOrBillableMetricLimit"] input').should('be.disabled') - // cy.get(`[data-test="delete-limited-plan-1"]`).should('not.exist') - // }) + it('should be able to edit the same coupon', () => { + cy.visit('/coupons') + cy.get(`[data-test="${couponName}"]`).click() + + cy.get(`button[data-test="coupon-details-actions"]`).click() + cy.get(`button[data-test="coupon-details-edit"]`).click() + + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="limited-plan-0"]').within(() => { + cy.get(`[data-test="delete-limited-plan-0"]`).click() + }) + cy.get('[data-test="limited-plan-0"]').should('not.exist') + cy.get('[data-test="add-plan-limit"]').click() + cy.get('input[name="selectedPlan"]').click() + cy.get('[data-option-index="0"]').click() + cy.get('[data-test="submitAddPlanToCouponDialog"]').click() + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('input[name="amountCents"]').type('1') + + cy.get('[data-test="submit"]').click() + cy.get('[data-test="coupon-details-name"]').should('contain.text', couponName) + }) + + it('should be able to apply the coupon to a customer', () => { + cy.visit('/customers') + cy.get(`[data-test="${customerName}"]`).click() + cy.get('[data-test="customer-actions"]').click() + cy.get('[data-test="apply-coupon-action"]').click() + cy.get('input[name="selectCoupon"]').click() + cy.get('[data-option-index="0"]').click() + cy.get(`[data-test="plan-limitation-section"]`).should('exist') + + // Test errors + cy.get('input[name="amountCurrency"]').click() + cy.get('[data-test="UAH"]').click() + cy.get('[data-test="submit"]').click() + cy.get(`[data-test="alert-type-danger"]`).should('exist', 1) + + // Reset values to be valid + cy.get('input[name="amountCurrency"]').click() + cy.get('[data-test="USD"]').click() + + cy.get('[data-test="submit"]').click() + cy.get(`[data-test="customer-coupon-container"]`).within(() => { + cy.get(`[data-test="${couponName}"]`).should('exist') + }) + }) + + it('should not be able to apply the same coupon to a customer multiple time', () => { + cy.visit('/customers') + cy.get(`[data-test="${customerName}"]`).click() + cy.get('[data-test="customer-actions"]').click() + cy.get('[data-test="apply-coupon-action"]').click() + cy.get('input[name="selectCoupon"]').click() + cy.get('[data-option-index="0"]').click() + cy.get('[data-test="submit"]').click() + cy.get(`[data-test="alert-type-danger"]`).should('exist', 1) + }) + + it('should not be able to edit an applied coupon', () => { + cy.visit('/coupons') + cy.get(`[data-test="${couponName}"]`).click() + + cy.get(`button[data-test="coupon-details-actions"]`).click() + cy.get(`button[data-test="coupon-details-edit"]`).click() + + cy.get('input[name="name"]').should('not.be.disabled') + cy.get('input[name="code"]').should('be.disabled') + cy.get('[data-test="submit"]').should('be.disabled') + cy.get('[data-test="checkbox-hasPlanOrBillableMetricLimit"] input').should('be.disabled') + cy.get(`[data-test="delete-limited-plan-1"]`).should('not.exist') + }) }) diff --git a/cypress/e2e/10-resources/t70-addon-create-edit.cy.ts b/cypress/e2e/10-resources/t70-addon-create-edit.cy.ts index 6be77a938..1e6aea59b 100644 --- a/cypress/e2e/10-resources/t70-addon-create-edit.cy.ts +++ b/cypress/e2e/10-resources/t70-addon-create-edit.cy.ts @@ -24,8 +24,7 @@ describe('Add On', () => { // Submit form cy.get('[data-test="submit"]').click() - cy.url().should('be.equal', Cypress.config().baseUrl + '/add-ons') - cy.get(`[data-test="${addOnName}"]`).should('exist') + cy.get(`[data-test="addon-details-name"]`).should('contain.text', addOnName) }) it('should be able to edit the same coupon', () => { @@ -33,6 +32,9 @@ describe('Add On', () => { cy.visit('/add-ons') cy.get(`[data-test="${addOnName}"]`).click() + cy.get('button[data-test="addon-details-actions"]').click() + cy.get('button[data-test="addon-details-edit"]').click() + // // Check taxes are still present // cy.get('[data-test="tax-chip-wrapper"]').children().should('have.length', 1) @@ -41,7 +43,6 @@ describe('Add On', () => { cy.get('textarea[name="description"]').should('exist') cy.get('input[name="amountCents"]').type('20') cy.get('[data-test="submit"]').click() - cy.url().should('be.equal', Cypress.config().baseUrl + '/add-ons') - cy.get(`[data-test="${addOnName}"]`).should('exist') + cy.get(`[data-test="addon-details-name"]`).should('contain.text', addOnName) }) }) diff --git a/cypress/support/reusableConstants.ts b/cypress/support/reusableConstants.ts index d3f6688df..dc7915c15 100644 --- a/cypress/support/reusableConstants.ts +++ b/cypress/support/reusableConstants.ts @@ -1,6 +1,7 @@ export const planWithChargesName = `a plan with charges` +export const planWithChargeCode = `a_plan_with_chargesnew_code_plan_with_charge` export const customerName = 'George de la jungle' -export const userEmail = 'usertest1@lago.comd' +export const userEmail = `user-e2e-tests@lago.com` export const userPassword = 'P@ssw0rdd' // Form variable diff --git a/src/components/customers/overview/CustomerOverview.tsx b/src/components/customers/overview/CustomerOverview.tsx index ec2ea28f2..4f1ccecb3 100644 --- a/src/components/customers/overview/CustomerOverview.tsx +++ b/src/components/customers/overview/CustomerOverview.tsx @@ -139,7 +139,7 @@ export const CustomerOverview: FC = ({ {translate('text_6670a7222702d70114cc7954')} + } > {({ closePopper }) => ( + } > {({ closePopper }) => ( {coupon && ( + } > {({ closePopper }) => ( @@ -158,6 +160,7 @@ const SubscriptionDetails = () => { {hasPermissions(['subscriptionsUpdate']) && (