import { mockAppRoot } from '@rocket.chat/mock-providers';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { axe } from 'jest-axe';
import ABACUpsellModal from './ABACUpsellModal';
import { createFakeLicenseInfo } from '../../../../tests/mocks/data';
jest.mock('../../GenericUpsellModal/hooks', () => ({
useUpsellActions: jest.fn(() => ({
shouldShowUpsell: true,
cloudWorkspaceHadTrial: false,
handleManageSubscription: jest.fn(),
handleTalkToSales: jest.fn(),
})),
}));
// Mock getURL utility
jest.mock('../../../../client/lib/getURL', () => ({
getURL: (url: string) => url,
}));
const appRoot = mockAppRoot()
.withTranslations('en', 'core', {
Premium_capability: 'Premium capability',
Attribute_based_access_control: 'Attribute-Based Access Control',
Attribute_based_access_control_title: 'Automate complex access management across your entire organization',
Attribute_based_access_control_description:
'ABAC automates room access, granting or revoking access based on dynamic user attributes rather than fixed roles.',
Upgrade: 'Upgrade',
Cancel: 'Cancel',
})
.withEndpoint('GET', '/v1/licenses.info', async () => ({
license: createFakeLicenseInfo(),
}))
.build();
describe('ABACUpsellModal', () => {
const mockOnClose = jest.fn();
const mockOnConfirm = jest.fn();
beforeEach(() => {
jest.clearAllMocks();
});
it('should render the modal with correct content', () => {
const { baseElement } = render(, { wrapper: appRoot });
expect(baseElement).toMatchSnapshot();
});
it('should have no accessibility violations', async () => {
const { container } = render(, { wrapper: appRoot });
const results = await axe(container);
expect(results).toHaveNoViolations();
});
it('should call onConfirm when upgrade button is clicked', async () => {
const user = userEvent.setup();
render(, { wrapper: appRoot });
const upgradeButton = screen.getByRole('button', { name: 'Upgrade' });
await user.click(upgradeButton);
expect(mockOnConfirm).toHaveBeenCalledTimes(1);
expect(mockOnClose).not.toHaveBeenCalled();
});
it('should call onClose when cancel button is clicked', async () => {
const user = userEvent.setup();
render(, { wrapper: appRoot });
const cancelButton = screen.getByRole('button', { name: 'Cancel' });
await user.click(cancelButton);
expect(mockOnClose).toHaveBeenCalledTimes(1);
expect(mockOnConfirm).not.toHaveBeenCalled();
});
it('should call onClose when close button is clicked', async () => {
const user = userEvent.setup();
render(, { wrapper: appRoot });
// Look for close button (usually has aria-label or is the X button)
const closeButton = screen.getByRole('button', { name: /close/i });
await user.click(closeButton);
expect(mockOnClose).toHaveBeenCalledTimes(1);
expect(mockOnConfirm).not.toHaveBeenCalled();
});
it('should handle multiple button clicks correctly', async () => {
const user = userEvent.setup();
render(, { wrapper: appRoot });
const upgradeButton = screen.getByRole('button', { name: 'Upgrade' });
const cancelButton = screen.getByRole('button', { name: 'Cancel' });
// Click upgrade first
await user.click(upgradeButton);
expect(mockOnConfirm).toHaveBeenCalledTimes(1);
// Click cancel
await user.click(cancelButton);
expect(mockOnClose).toHaveBeenCalledTimes(1);
// Total calls
expect(mockOnConfirm).toHaveBeenCalledTimes(1);
expect(mockOnClose).toHaveBeenCalledTimes(1);
});
});