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 / Orders.test.jsx

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

153 lines 4.0 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 userEvent from '@testing-library/user-event';
4 import Orders from '../../pages/Orders';
5 import { createMockOrdersList, renderWithProviders } from '../setup/helpers';
6
7 jest.mock('../../features/orders/ordersApi', () => ({
8 useGetOrdersQuery: jest.fn(),
9 }));
10
11 const { useGetOrdersQuery } = require('../../features/orders/ordersApi');
12
13 const mockData = createMockOrdersList(3);
14
15 describe('Orders', () => {
16 afterEach(() => {
17 jest.clearAllMocks();
18 });
19
20 function setupLoaded(data = mockData) {
21 useGetOrdersQuery.mockReturnValue({
22 data,
23 isLoading: false,
24 isFetching: false,
25 });
26 }
27
28 describe('Rendering', () => {
29 it('renders page heading and subtitle', () => {
30 setupLoaded();
31 renderWithProviders(<Orders />);
32
33 expect(screen.getByText('Orders')).toBeInTheDocument();
34 expect(
35 screen.getByText('Orders influenced by Disco campaigns')
36 ).toBeInTheDocument();
37 });
38
39 it('renders order IDs with # prefix', () => {
40 setupLoaded();
41 renderWithProviders(<Orders />);
42
43 expect(screen.getByText('#101')).toBeInTheDocument();
44 expect(screen.getByText('#102')).toBeInTheDocument();
45 });
46
47 it('renders customer names', () => {
48 setupLoaded();
49 renderWithProviders(<Orders />);
50
51 expect(screen.getByText('Customer 1')).toBeInTheDocument();
52 });
53
54 it('renders table headers', () => {
55 setupLoaded();
56 renderWithProviders(<Orders />);
57
58 expect(screen.getByText('Order')).toBeInTheDocument();
59 expect(screen.getByText('Customer')).toBeInTheDocument();
60 expect(screen.getByText('Campaign')).toBeInTheDocument();
61 expect(screen.getByText(/Products/)).toBeInTheDocument();
62 expect(screen.getByText(/Total Spent/)).toBeInTheDocument();
63 expect(screen.getByText(/Date/)).toBeInTheDocument();
64 });
65 });
66
67 describe('Loading states', () => {
68 it('shows skeletons when loading', () => {
69 useGetOrdersQuery.mockReturnValue({
70 data: undefined,
71 isLoading: true,
72 isFetching: true,
73 });
74 const { container } = renderWithProviders(<Orders />);
75
76 const pulseElements = container.querySelectorAll(
77 '.disco-animate-pulse'
78 );
79 expect(pulseElements.length).toBeGreaterThan(0);
80 });
81 });
82
83 describe('Empty states', () => {
84 it('shows empty state when no orders', () => {
85 useGetOrdersQuery.mockReturnValue({
86 data: {
87 data: [],
88 collection: { count: 0, total: 0, total_pages: 1 },
89 },
90 isLoading: false,
91 isFetching: false,
92 });
93 renderWithProviders(<Orders />);
94
95 expect(screen.getByText('Orders Not Found!')).toBeInTheDocument();
96 });
97 });
98
99 describe('Sorting', () => {
100 it('default sort is by date descending', () => {
101 setupLoaded();
102 renderWithProviders(<Orders />);
103
104 const firstCall = useGetOrdersQuery.mock.calls[0][0];
105 expect(firstCall.sort_by).toBe('date');
106 expect(firstCall.order).toBe('desc');
107 });
108
109 it('toggles sort direction', () => {
110 setupLoaded();
111 renderWithProviders(<Orders />);
112
113 fireEvent.click(screen.getByText(/Date/));
114 const lastCall = useGetOrdersQuery.mock.calls.at(-1)[0];
115 expect(lastCall.order).toBe('asc');
116 });
117 });
118
119 describe('Search', () => {
120 it('calls hook with search param', async () => {
121 setupLoaded();
122 const user = userEvent.setup();
123 renderWithProviders(<Orders />);
124
125 const searchInput = screen.getByPlaceholderText('Search orders...');
126 await user.type(searchInput, '101');
127
128 const lastCall = useGetOrdersQuery.mock.calls.at(-1)[0];
129 expect(lastCall.search).toBe('101');
130 });
131 });
132
133 describe('Pagination', () => {
134 it('handles page navigation', () => {
135 useGetOrdersQuery.mockReturnValue({
136 data: {
137 ...mockData,
138 collection: { count: 20, total: 40, total_pages: 2 },
139 },
140 isLoading: false,
141 isFetching: false,
142 });
143 renderWithProviders(<Orders />);
144
145 expect(screen.getByText('Showing 1 of 2')).toBeInTheDocument();
146
147 fireEvent.click(screen.getByText('2'));
148 const lastCall = useGetOrdersQuery.mock.calls.at(-1)[0];
149 expect(lastCall.page).toBe(2);
150 });
151 });
152 });
153