* Remove stale "You already have a subscription" notification after cancel/plan change The notification was derived from a server-rendered meta tag set at page load, so it persisted through cancel and plan-change flows. Now derived directly from the URL param on the client; the param is stripped on cancel button click (replaceState) and before plan-change reloads (location.replace via reloadWithoutHasSubscription helper). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix format * Update services/web/test/frontend/features/subscription/components/dashboard/subscription-dashboard.test.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix change-plan tests after location.reload → location.replace migration reloadWithoutHasSubscription calls location.replace() not location.reload(), so update assertions accordingly. Also stub toString() to return the jsdom origin so FlashMessage's replaceState call doesn't throw a SecurityError. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Guard reloadWithoutHasSubscription against empty URL When called after component unmount, useLocation's toString() returns '', causing new URL('') to throw. No-op early to avoid the exception. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Guard against empty URL in history state replacement for subscription cancellation --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> GitOrigin-RevId: 8408ee971adf038e2d819eae5df060ace62a7e14
98 lines
2.8 KiB
TypeScript
98 lines
2.8 KiB
TypeScript
import { expect } from 'chai'
|
||
import { screen } from '@testing-library/react'
|
||
import SubscriptionDashboard from '../../../../../../frontend/js/features/subscription/components/dashboard/subscription-dashboard'
|
||
import {
|
||
cleanUpContext,
|
||
renderWithSubscriptionDashContext,
|
||
} from '../../helpers/render-with-subscription-dash-context'
|
||
import { groupPlans, plans } from '../../fixtures/plans'
|
||
import { annualActiveSubscription } from '../../fixtures/subscriptions'
|
||
|
||
describe('<SubscriptionDashboard />', function () {
|
||
afterEach(function () {
|
||
cleanUpContext()
|
||
})
|
||
|
||
describe('With an active subscription', function () {
|
||
beforeEach(function () {
|
||
renderWithSubscriptionDashContext(<SubscriptionDashboard />, {
|
||
metaTags: [
|
||
{ name: 'ol-plans', value: plans },
|
||
{
|
||
name: 'ol-groupPlans',
|
||
value: groupPlans,
|
||
},
|
||
{ name: 'ol-subscription', value: annualActiveSubscription },
|
||
{
|
||
name: 'ol-recommendedCurrency',
|
||
value: 'USD',
|
||
},
|
||
],
|
||
})
|
||
})
|
||
|
||
it('renders the "Get the most from your subscription" text', function () {
|
||
screen.getByText(/Get the most out of your subscription/i)
|
||
})
|
||
})
|
||
|
||
describe('Free Plan', function () {
|
||
beforeEach(function () {
|
||
renderWithSubscriptionDashContext(<SubscriptionDashboard />)
|
||
})
|
||
|
||
it('does not render the "Get the most out of your" subscription text', function () {
|
||
const text = screen.queryByText('Get the most out of your subscription', {
|
||
exact: false,
|
||
})
|
||
expect(text).to.be.null
|
||
})
|
||
|
||
it('does not render the contact Support message', function () {
|
||
const text = screen.queryByText(
|
||
`You’re on an Overleaf Paid plan. Contact`,
|
||
{
|
||
exact: false,
|
||
}
|
||
)
|
||
expect(text).to.be.null
|
||
})
|
||
})
|
||
|
||
describe('Custom subscription', function () {
|
||
it('renders the contact Support message', function () {
|
||
renderWithSubscriptionDashContext(<SubscriptionDashboard />, {
|
||
metaTags: [
|
||
{
|
||
name: 'ol-currentInstitutionsWithLicence',
|
||
value: [],
|
||
},
|
||
{
|
||
name: 'ol-hasSubscription',
|
||
value: true,
|
||
},
|
||
],
|
||
})
|
||
|
||
screen.getByText(`You’re on an Overleaf Paid plan.`, {
|
||
exact: false,
|
||
})
|
||
screen.getByText(`Contact Support`, {
|
||
exact: false,
|
||
})
|
||
})
|
||
})
|
||
|
||
it('Show a warning when coming from plans page', function () {
|
||
window.history.pushState({}, '', '?hasSubscription=true')
|
||
|
||
try {
|
||
renderWithSubscriptionDashContext(<SubscriptionDashboard />)
|
||
|
||
screen.getByText('You already have a subscription')
|
||
} finally {
|
||
window.history.replaceState({}, '', window.location.pathname)
|
||
}
|
||
})
|
||
})
|