import React from 'react'; import { Factory } from 'rosie'; import { sendTrackEvent } from '@edx/frontend-platform/analytics'; import { fireEvent, initializeTestStore, render, screen, } from '../../../../setupTest'; import LockPaywall from './LockPaywall'; jest.mock('@edx/frontend-platform/analytics'); describe('Lock Paywall', () => { let store; const mockData = { notificationTrayVisible: false }; beforeAll(async () => { store = await initializeTestStore(); const { courseware } = store.getState(); Object.assign(mockData, { courseId: courseware.courseId, }); }); it('displays unlock link with price', () => { const { currencySymbol, price, upgradeUrl, } = store.getState().models.courseHomeMeta[mockData.courseId].verifiedMode; render(); const upgradeLink = screen.getByRole('link', { name: `Upgrade for ${currencySymbol}${price}` }); expect(upgradeLink).toHaveAttribute('href', `${upgradeUrl}`); }); it('displays discounted price if there is an offer/first time purchase', async () => { const courseMetadata = Factory.build('courseMetadata', { offer: { code: 'EDXWELCOME', expiration_date: '2070-01-01T12:00:00Z', original_price: '$100', discounted_price: '$85', percentage: 15, upgrade_url: 'https://example.com/upgrade', }, }); const testStore = await initializeTestStore({ courseMetadata }, false); render(, { store: testStore }); expect(screen.getByText(/Upgrade for/).textContent).toMatch('$85 ($100)'); }); it('sends analytics event onClick of unlock link', () => { sendTrackEvent.mockClear(); const { currencySymbol, price, } = store.getState().models.courseHomeMeta[mockData.courseId].verifiedMode; render(); const upgradeLink = screen.getByRole('link', { name: `Upgrade for ${currencySymbol}${price}` }); fireEvent.click(upgradeLink); expect(sendTrackEvent).toHaveBeenCalledTimes(1); expect(sendTrackEvent).toHaveBeenCalledWith('edx.bi.ecommerce.upsell_links_clicked', { org_key: 'edX', courserun_key: mockData.courseId, linkCategory: '(none)', linkName: 'in_course_upgrade', linkType: 'link', pageName: 'in_course', }); }); it('does not display anything if course does not have verified mode', async () => { const courseHomeMetadata = Factory.build('courseHomeMetadata', { verified_mode: null }); const testStore = await initializeTestStore({ courseHomeMetadata, excludeFetchSequence: true }, false); render(, { store: testStore }); expect(screen.queryByTestId('lock-paywall-test-id')).not.toBeInTheDocument(); }); it('displays past expiration message if expiration date has expired', async () => { const courseMetadata = Factory.build('courseMetadata', { access_expiration: { expiration_date: '1995-02-22T05:00:00Z', }, marketing_url: 'https://example.com/course-details', }); const testStore = await initializeTestStore({ courseMetadata }, false); render(, { store: testStore }); expect(screen.getByText('The upgrade deadline for this course passed. To upgrade, enroll in the next available session.')).toBeInTheDocument(); expect(screen.getByText('View Course Details')) .toHaveAttribute('href', 'https://example.com/course-details'); }); it('sends analytics event onClick of past expiration course details link', async () => { sendTrackEvent.mockClear(); const courseMetadata = Factory.build('courseMetadata', { access_expiration: { expiration_date: '1995-02-22T05:00:00Z', }, marketing_url: 'https://example.com/course-details', }); const testStore = await initializeTestStore({ courseMetadata }, false); render(, { store: testStore }); const courseDetailsLink = await screen.getByText('View Course Details'); fireEvent.click(courseDetailsLink); expect(sendTrackEvent).toHaveBeenCalledTimes(1); expect(sendTrackEvent).toHaveBeenCalledWith('edx.bi.ecommerce.gated_content.past_expiration.link_clicked', { org_key: 'edX', courserun_key: mockData.courseId, linkCategory: 'gated_content', linkName: 'course_details', linkType: 'link', pageName: 'in_course', }); }); });