PluginProbe
Discount Rules for WooCommerce – Disco | Dynamic Pricing, Conditions, Bulk, Bundle, BOGO / 1.4.10
Discount Rules for WooCommerce – Disco | Dynamic Pricing, Conditions, Bulk, Bundle, BOGO v1.4.10
1.4.19 1.4.18 1.4.17 1.4.16 1.4.15 1.4.14 1.4.13 1.4.12 1.4.11 1.4.10 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.54 1.3.53 1.3.52 1.3.51 1.3.50 All 182 releases
disco / backend / views / components / Analytics / __tests__ / pages / CampaignDetails.test.jsx

CampaignDetails.test.jsx in Discount Rules for WooCommerce – Disco | Dynamic Pricing, Conditions, Bulk, Bundle, BOGO 1.4.10, at backend/views/components/Analytics/__tests__/pages/CampaignDetails.test.jsx

158 lines 4.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import '@testing-library/jest-dom';
2 import { fireEvent, screen } from '@testing-library/react';
3 import CampaignDetails from '../../pages/CampaignDetails';
4 import { createMockCampaign, renderWithProviders } from '../setup/helpers';
5
6 beforeAll(() => {
7 global.DISCO = { ...global.DISCO, base_currency: '$' };
8 });
9
10 jest.mock('../../features/campaigns/campaignsApi', () => ({
11 useGetCampaignQuery: jest.fn(),
12 }));
13
14 jest.mock('../../components/campaigns/CampaignProductsTable', () => {
15 return function MockCampaignProductsTable() {
16 return <div data-testid="campaign-products-table">Products Table</div>;
17 };
18 });
19
20 jest.mock('../../components/campaigns/CampaignCustomersTable', () => {
21 return function MockCampaignCustomersTable() {
22 return (
23 <div data-testid="campaign-customers-table">Customers Table</div>
24 );
25 };
26 });
27
28 const {
29 useGetCampaignQuery,
30 } = require('../../features/campaigns/campaignsApi');
31
32 jest.mock('react-router', () => ({
33 ...jest.requireActual('react-router'),
34 useParams: () => ({ campaignId: '1' }),
35 }));
36
37 const mockCampaign = createMockCampaign({
38 campaign_id: 1,
39 campaign_name: 'Summer Sale',
40 intent: 'Product',
41 status: 'active',
42 revenue: 12500.0,
43 average_order_value: 277.78,
44 total_orders: 45,
45 total_customers: 32,
46 });
47
48 describe('CampaignDetails', () => {
49 afterEach(() => {
50 jest.clearAllMocks();
51 });
52
53 describe('Rendering', () => {
54 it('renders campaign name and badges', () => {
55 useGetCampaignQuery.mockReturnValue({
56 data: mockCampaign,
57 isLoading: false,
58 });
59 renderWithProviders(<CampaignDetails />);
60
61 expect(screen.getByText('Summer Sale')).toBeInTheDocument();
62 expect(screen.getByText('Product')).toBeInTheDocument();
63 expect(screen.getByText('active')).toBeInTheDocument();
64 });
65
66 it('renders campaign metrics', () => {
67 useGetCampaignQuery.mockReturnValue({
68 data: mockCampaign,
69 isLoading: false,
70 });
71 renderWithProviders(<CampaignDetails />);
72
73 expect(screen.getByText('Revenue')).toBeInTheDocument();
74 expect(screen.getByText('$12,500.00')).toBeInTheDocument();
75 expect(screen.getByText('Total Orders')).toBeInTheDocument();
76 expect(screen.getByText('45')).toBeInTheDocument();
77 expect(screen.getByText('Avg Order Value')).toBeInTheDocument();
78 });
79
80 it('renders tabs for Products and Customers', () => {
81 useGetCampaignQuery.mockReturnValue({
82 data: mockCampaign,
83 isLoading: false,
84 });
85 renderWithProviders(<CampaignDetails />);
86
87 // Tab buttons
88 const tabs = screen.getAllByRole('button');
89 const tabLabels = tabs.map((t) => t.textContent);
90 expect(tabLabels).toContain('Products');
91 expect(tabLabels).toContain('Customers');
92 });
93 });
94
95 describe('Loading states', () => {
96 it('shows skeleton loading state', () => {
97 useGetCampaignQuery.mockReturnValue({
98 data: undefined,
99 isLoading: true,
100 });
101 const { container } = renderWithProviders(<CampaignDetails />);
102
103 const pulseElements = container.querySelectorAll(
104 '.disco-animate-pulse'
105 );
106 expect(pulseElements.length).toBeGreaterThan(0);
107 });
108 });
109
110 describe('Tab switching', () => {
111 it('shows products table by default', () => {
112 useGetCampaignQuery.mockReturnValue({
113 data: mockCampaign,
114 isLoading: false,
115 });
116 renderWithProviders(<CampaignDetails />);
117
118 expect(
119 screen.getByTestId('campaign-products-table')
120 ).toBeInTheDocument();
121 });
122
123 it('switches to customers tab on click', () => {
124 useGetCampaignQuery.mockReturnValue({
125 data: mockCampaign,
126 isLoading: false,
127 });
128 renderWithProviders(<CampaignDetails />);
129
130 // Find the Customers tab button specifically
131 const customersTab = screen
132 .getAllByText('Customers')
133 .find((el) => el.tagName === 'BUTTON');
134 fireEvent.click(customersTab);
135
136 expect(
137 screen.getByTestId('campaign-customers-table')
138 ).toBeInTheDocument();
139 expect(
140 screen.queryByTestId('campaign-products-table')
141 ).not.toBeInTheDocument();
142 });
143 });
144
145 describe('Edge cases', () => {
146 it('renders nothing when data is null and not loading', () => {
147 useGetCampaignQuery.mockReturnValue({
148 data: null,
149 isLoading: false,
150 });
151 renderWithProviders(<CampaignDetails />);
152
153 // Campaign header should not be rendered
154 expect(screen.queryByText('Summer Sale')).not.toBeInTheDocument();
155 });
156 });
157 });
158