import UpgradeSubscription from '@/features/group-management/components/upgrade-subscription/upgrade-subscription' import { SubscriptionChangePreview } from '../../../../../types/subscription/subscription-change-preview' describe('', function () { const resetPreviewAndRemount = (preview: SubscriptionChangePreview) => { cy.window().then(win => { win.metaAttributesCache.set('ol-subscriptionChangePreview', preview) }) cy.mount() } beforeEach(function () { this.totalLicenses = 2 this.preview = { change: { type: 'group-plan-upgrade', prevPlan: { name: 'Overleaf Standard Group' }, }, currency: 'USD', immediateCharge: { subtotal: 353.99, tax: 70.8, total: 424.79, discount: 0, }, paymentMethod: 'Visa **** 1111', nextPlan: { annual: true }, nextInvoice: { date: '2025-11-05T11:35:32.000Z', plan: { name: 'Overleaf Professional Group', amount: 0 }, addOns: [ { code: 'additional-license', name: 'Seat', quantity: 2, unitAmount: 399, amount: 798, }, ], subtotal: 798, tax: { rate: 0.2, amount: 159.6 }, total: 957.6, }, } cy.window().then(win => { win.metaAttributesCache.set('ol-groupName', 'My Awesome Team') win.metaAttributesCache.set('ol-totalLicenses', this.totalLicenses) }) resetPreviewAndRemount(this.preview) }) it('shows the group name', function () { cy.findByTestId('group-heading').within(() => { cy.findByRole('heading', { name: 'My Awesome Team' }) }) }) it('shows the "Add more licenses to my plan" label', function () { cy.findByText(/add more licenses to my plan/i).should( 'have.attr', 'href', '/user/subscription/group/add-users' ) }) it('shows the "Upgrade" and "Cancel" buttons', function () { cy.findByRole('button', { name: /upgrade/i }) cy.findByRole('button', { name: /cancel/i }).should( 'have.attr', 'href', '/user/subscription' ) }) describe('shows plan details', function () { it('shows per user price', function () { cy.findByTestId('per-user-price').within(() => { cy.findByText('$399') }) }) it('shows additional features', function () { cy.findByText(/unlimited collaborators per project/i) cy.findByText(/sso/i) cy.findByText(/managed user accounts/i) }) }) describe('shows upgrade summary', function () { it('shows subtotal, tax and total price', function () { cy.findByTestId('subtotal').within(() => { cy.findByText('$353.99') }) cy.findByTestId('tax').within(() => { cy.findByText('$70.80') }) cy.findByTestId('total').within(() => { cy.findByText('$424.79') }) cy.findByTestId('discount').should('not.exist') }) it('shows subtotal, discount, tax and total price', function () { resetPreviewAndRemount({ ...this.preview, immediateCharge: { subtotal: 353.99, tax: 70.8, total: 424.79, discount: 50, }, }) cy.findByTestId('subtotal').within(() => { cy.findByText('$353.99') }) cy.findByTestId('tax').within(() => { cy.findByText('$70.80') }) cy.findByTestId('total').within(() => { cy.findByText('$424.79') }) cy.findByTestId('discount').within(() => { cy.findByText('($50.00)') }) }) it('shows total users', function () { cy.findByText(/you have 2 licenses on your subscription./i) }) }) describe('submit upgrade request', function () { it('request succeeded', function () { cy.intercept('POST', '/user/subscription/group/upgrade-subscription', { statusCode: 200, }).as('upgradeRequest') cy.findByRole('button', { name: /upgrade/i }).click() cy.findByText(/you’ve upgraded your plan!/i) }) it('request failed', function () { cy.intercept('POST', '/user/subscription/group/upgrade-subscription', { statusCode: 400, }).as('upgradeRequest') cy.findByRole('button', { name: /upgrade/i }).click() cy.findByText(/something went wrong/i) }) }) })