66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import React from 'react';
|
|
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
|
import { act, render, screen, waitFor } from '@testing-library/react';
|
|
import { PaddleCheckout } from '../pages/WelcomeOrderSummaryPage';
|
|
|
|
const { createPaddleCheckoutMock } = vi.hoisted(() => ({
|
|
createPaddleCheckoutMock: vi.fn(),
|
|
}));
|
|
|
|
vi.mock('../../api', () => ({
|
|
assignFreeTenantPackage: vi.fn(),
|
|
createTenantPaddleCheckout: createPaddleCheckoutMock,
|
|
}));
|
|
|
|
describe('PaddleCheckout', () => {
|
|
beforeEach(() => {
|
|
createPaddleCheckoutMock.mockReset();
|
|
});
|
|
|
|
it('opens Paddle checkout when created successfully', async () => {
|
|
createPaddleCheckoutMock.mockResolvedValue({ checkout_url: 'https://paddle.example/checkout' });
|
|
const onSuccess = vi.fn();
|
|
const openSpy = vi.spyOn(window, 'open').mockImplementation(() => null);
|
|
|
|
render(
|
|
<PaddleCheckout
|
|
packageId={99}
|
|
onSuccess={onSuccess}
|
|
t={(key: string) => key}
|
|
/>
|
|
);
|
|
|
|
await act(async () => {
|
|
screen.getByRole('button').click();
|
|
});
|
|
|
|
await waitFor(() => {
|
|
expect(createPaddleCheckoutMock).toHaveBeenCalledWith(99);
|
|
expect(openSpy).toHaveBeenCalledWith('https://paddle.example/checkout', '_blank', 'noopener');
|
|
expect(onSuccess).toHaveBeenCalled();
|
|
});
|
|
|
|
openSpy.mockRestore();
|
|
});
|
|
|
|
it('shows an error message on failure', async () => {
|
|
createPaddleCheckoutMock.mockRejectedValue(new Error('boom'));
|
|
|
|
render(
|
|
<PaddleCheckout
|
|
packageId={99}
|
|
onSuccess={vi.fn()}
|
|
t={(key: string) => key}
|
|
/>
|
|
);
|
|
|
|
await act(async () => {
|
|
screen.getByRole('button').click();
|
|
});
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByText('summary.paddle.genericError')).toBeInTheDocument();
|
|
});
|
|
});
|
|
});
|