@akinon/ai-modal-table 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/__tests__/index.test.js +82 -0
- package/dist/cjs/__tests__/index.test.tsx +94 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.js +59 -0
- package/dist/cjs/ai-modal-table/__tests__/index.test.tsx +98 -0
- package/dist/cjs/ai-modal-table/index.d.ts +4 -0
- package/dist/cjs/ai-modal-table/index.d.ts.map +1 -0
- package/dist/cjs/ai-modal-table/index.js +54 -0
- package/dist/cjs/ai-table/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/__tests__/index.test.js +348 -0
- package/dist/cjs/ai-table/__tests__/index.test.tsx +572 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.js +1349 -0
- package/dist/cjs/ai-table/components/__tests__/content.test.tsx +1637 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.js +400 -0
- package/dist/cjs/ai-table/components/__tests__/filters.test.tsx +534 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.js +465 -0
- package/dist/cjs/ai-table/components/__tests__/footer.test.tsx +597 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.js +453 -0
- package/dist/cjs/ai-table/components/__tests__/mapper.test.tsx +601 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.js +430 -0
- package/dist/cjs/ai-table/components/__tests__/pagination.test.tsx +629 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.d.ts +2 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.js +382 -0
- package/dist/cjs/ai-table/components/__tests__/row-actions.test.tsx +507 -0
- package/dist/cjs/ai-table/components/content.d.ts +11 -0
- package/dist/cjs/ai-table/components/content.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/content.js +309 -0
- package/dist/cjs/ai-table/components/filters.d.ts +10 -0
- package/dist/cjs/ai-table/components/filters.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/filters.js +55 -0
- package/dist/cjs/ai-table/components/footer.d.ts +12 -0
- package/dist/cjs/ai-table/components/footer.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/footer.js +24 -0
- package/dist/cjs/ai-table/components/mapper.d.ts +11 -0
- package/dist/cjs/ai-table/components/mapper.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/mapper.js +21 -0
- package/dist/cjs/ai-table/components/pagination.d.ts +11 -0
- package/dist/cjs/ai-table/components/pagination.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/pagination.js +106 -0
- package/dist/cjs/ai-table/components/row-actions.d.ts +14 -0
- package/dist/cjs/ai-table/components/row-actions.d.ts.map +1 -0
- package/dist/cjs/ai-table/components/row-actions.js +52 -0
- package/dist/cjs/ai-table/constants/index.d.ts +17 -0
- package/dist/cjs/ai-table/constants/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/constants/index.js +19 -0
- package/dist/cjs/ai-table/i18n/index.d.ts +3 -0
- package/dist/cjs/ai-table/i18n/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/index.js +14 -0
- package/dist/cjs/ai-table/i18n/translations/en.d.ts +8 -0
- package/dist/cjs/ai-table/i18n/translations/en.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/translations/en.js +9 -0
- package/dist/cjs/ai-table/i18n/translations/tr.d.ts +8 -0
- package/dist/cjs/ai-table/i18n/translations/tr.d.ts.map +1 -0
- package/dist/cjs/ai-table/i18n/translations/tr.js +9 -0
- package/dist/cjs/ai-table/index.d.ts +4 -0
- package/dist/cjs/ai-table/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/index.js +71 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.js +146 -0
- package/dist/cjs/ai-table/utils/data-format/__tests__/index.test.ts +184 -0
- package/dist/cjs/ai-table/utils/data-format/index.d.ts +7 -0
- package/dist/cjs/ai-table/utils/data-format/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/data-format/index.js +43 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts +2 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.js +291 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx +399 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.d.ts +10 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.d.ts.map +1 -0
- package/dist/cjs/ai-table/utils/render-mapper-fields/index.js +48 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/types/index.d.ts +134 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +2 -0
- package/dist/esm/__tests__/index.test.d.ts +2 -0
- package/dist/esm/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/__tests__/index.test.js +80 -0
- package/dist/esm/__tests__/index.test.tsx +94 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.js +57 -0
- package/dist/esm/ai-modal-table/__tests__/index.test.tsx +98 -0
- package/dist/esm/ai-modal-table/index.d.ts +4 -0
- package/dist/esm/ai-modal-table/index.d.ts.map +1 -0
- package/dist/esm/ai-modal-table/index.js +50 -0
- package/dist/esm/ai-table/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/__tests__/index.test.js +346 -0
- package/dist/esm/ai-table/__tests__/index.test.tsx +572 -0
- package/dist/esm/ai-table/components/__tests__/content.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/content.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/content.test.js +1347 -0
- package/dist/esm/ai-table/components/__tests__/content.test.tsx +1637 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.js +398 -0
- package/dist/esm/ai-table/components/__tests__/filters.test.tsx +534 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.js +463 -0
- package/dist/esm/ai-table/components/__tests__/footer.test.tsx +597 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.js +451 -0
- package/dist/esm/ai-table/components/__tests__/mapper.test.tsx +601 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.js +428 -0
- package/dist/esm/ai-table/components/__tests__/pagination.test.tsx +629 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.d.ts +2 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.d.ts.map +1 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.js +380 -0
- package/dist/esm/ai-table/components/__tests__/row-actions.test.tsx +507 -0
- package/dist/esm/ai-table/components/content.d.ts +11 -0
- package/dist/esm/ai-table/components/content.d.ts.map +1 -0
- package/dist/esm/ai-table/components/content.js +305 -0
- package/dist/esm/ai-table/components/filters.d.ts +10 -0
- package/dist/esm/ai-table/components/filters.d.ts.map +1 -0
- package/dist/esm/ai-table/components/filters.js +51 -0
- package/dist/esm/ai-table/components/footer.d.ts +12 -0
- package/dist/esm/ai-table/components/footer.d.ts.map +1 -0
- package/dist/esm/ai-table/components/footer.js +20 -0
- package/dist/esm/ai-table/components/mapper.d.ts +11 -0
- package/dist/esm/ai-table/components/mapper.d.ts.map +1 -0
- package/dist/esm/ai-table/components/mapper.js +17 -0
- package/dist/esm/ai-table/components/pagination.d.ts +11 -0
- package/dist/esm/ai-table/components/pagination.d.ts.map +1 -0
- package/dist/esm/ai-table/components/pagination.js +102 -0
- package/dist/esm/ai-table/components/row-actions.d.ts +14 -0
- package/dist/esm/ai-table/components/row-actions.d.ts.map +1 -0
- package/dist/esm/ai-table/components/row-actions.js +48 -0
- package/dist/esm/ai-table/constants/index.d.ts +17 -0
- package/dist/esm/ai-table/constants/index.d.ts.map +1 -0
- package/dist/esm/ai-table/constants/index.js +16 -0
- package/dist/esm/ai-table/i18n/index.d.ts +3 -0
- package/dist/esm/ai-table/i18n/index.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/index.js +11 -0
- package/dist/esm/ai-table/i18n/translations/en.d.ts +8 -0
- package/dist/esm/ai-table/i18n/translations/en.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/translations/en.js +7 -0
- package/dist/esm/ai-table/i18n/translations/tr.d.ts +8 -0
- package/dist/esm/ai-table/i18n/translations/tr.d.ts.map +1 -0
- package/dist/esm/ai-table/i18n/translations/tr.js +7 -0
- package/dist/esm/ai-table/index.d.ts +4 -0
- package/dist/esm/ai-table/index.d.ts.map +1 -0
- package/dist/esm/ai-table/index.js +67 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.js +144 -0
- package/dist/esm/ai-table/utils/data-format/__tests__/index.test.ts +184 -0
- package/dist/esm/ai-table/utils/data-format/index.d.ts +7 -0
- package/dist/esm/ai-table/utils/data-format/index.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/data-format/index.js +38 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts +2 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.js +289 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/__tests__/index.test.tsx +399 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.d.ts +10 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.d.ts.map +1 -0
- package/dist/esm/ai-table/utils/render-mapper-fields/index.js +44 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/types/index.d.ts +134 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
|
|
6
|
+
import { DEFAULT_CURRENT_PAGE, PAGE_SIZE_OPTIONS } from '../../constants';
|
|
7
|
+
import { TablePagination } from '../pagination';
|
|
8
|
+
|
|
9
|
+
vi.mock('@akinon/ui-layout', () => ({
|
|
10
|
+
Flex: ({ children, align, gap, rootClassName, ...props }: any) => (
|
|
11
|
+
<div
|
|
12
|
+
data-testid="flex-container"
|
|
13
|
+
data-align={align}
|
|
14
|
+
data-gap={gap}
|
|
15
|
+
className={rootClassName}
|
|
16
|
+
{...props}
|
|
17
|
+
>
|
|
18
|
+
{children}
|
|
19
|
+
</div>
|
|
20
|
+
)
|
|
21
|
+
}));
|
|
22
|
+
|
|
23
|
+
vi.mock('@akinon/ui-pagination', () => ({
|
|
24
|
+
Pagination: ({
|
|
25
|
+
current,
|
|
26
|
+
onChange,
|
|
27
|
+
pageSize,
|
|
28
|
+
total,
|
|
29
|
+
className,
|
|
30
|
+
showSizeChanger,
|
|
31
|
+
theme,
|
|
32
|
+
...props
|
|
33
|
+
}: any) => (
|
|
34
|
+
<div
|
|
35
|
+
data-testid="pagination"
|
|
36
|
+
data-current={current}
|
|
37
|
+
data-page-size={pageSize}
|
|
38
|
+
data-total={total}
|
|
39
|
+
data-show-size-changer={showSizeChanger}
|
|
40
|
+
data-theme={theme}
|
|
41
|
+
className={className}
|
|
42
|
+
{...props}
|
|
43
|
+
>
|
|
44
|
+
<button
|
|
45
|
+
data-testid="pagination-prev"
|
|
46
|
+
onClick={() => onChange(current - 1)}
|
|
47
|
+
disabled={current === 1}
|
|
48
|
+
>
|
|
49
|
+
Prev
|
|
50
|
+
</button>
|
|
51
|
+
<span data-testid="current-page">{current}</span>
|
|
52
|
+
<button
|
|
53
|
+
data-testid="pagination-next"
|
|
54
|
+
onClick={() => onChange(current + 1)}
|
|
55
|
+
disabled={current === Math.ceil(total / pageSize)}
|
|
56
|
+
>
|
|
57
|
+
Next
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
)
|
|
61
|
+
}));
|
|
62
|
+
|
|
63
|
+
vi.mock('@akinon/ui-select', () => ({
|
|
64
|
+
Select: ({ value, onChange, options, ...props }: any) => (
|
|
65
|
+
<select
|
|
66
|
+
data-testid="page-size-select"
|
|
67
|
+
value={String(value)}
|
|
68
|
+
onChange={(e: any) => onChange(Number(e.target.value))}
|
|
69
|
+
{...props}
|
|
70
|
+
>
|
|
71
|
+
{options.map((opt: any) => (
|
|
72
|
+
<option key={opt.value} value={opt.value}>
|
|
73
|
+
{opt.label}
|
|
74
|
+
</option>
|
|
75
|
+
))}
|
|
76
|
+
</select>
|
|
77
|
+
)
|
|
78
|
+
}));
|
|
79
|
+
|
|
80
|
+
vi.mock('@akinon/ui-theme', () => ({
|
|
81
|
+
useToken: () => ({
|
|
82
|
+
token: { colorPrimary: '#1890ff' },
|
|
83
|
+
hashId: 'test-hash-id'
|
|
84
|
+
}),
|
|
85
|
+
getPrefixCls: vi.fn((cls: string) => `akinon-${cls}`)
|
|
86
|
+
}));
|
|
87
|
+
|
|
88
|
+
vi.mock('@ant-design/cssinjs', () => ({
|
|
89
|
+
useStyleRegister: vi.fn((_, callback: any) => {
|
|
90
|
+
callback();
|
|
91
|
+
return (node: React.ReactNode) => node;
|
|
92
|
+
})
|
|
93
|
+
}));
|
|
94
|
+
|
|
95
|
+
vi.mock('antd', () => ({
|
|
96
|
+
ConfigProvider: {
|
|
97
|
+
ConfigContext: React.createContext({
|
|
98
|
+
getPrefixCls: (cls: string) => `akinon-${cls}`,
|
|
99
|
+
theme: {}
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
}));
|
|
103
|
+
|
|
104
|
+
vi.mock('../../i18n', () => ({
|
|
105
|
+
i18n: {
|
|
106
|
+
t: (key: string) => {
|
|
107
|
+
const translations: Record<string, string> = {
|
|
108
|
+
'show.value': 'Show'
|
|
109
|
+
};
|
|
110
|
+
return translations[key] || key;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}));
|
|
114
|
+
|
|
115
|
+
describe('TablePagination', () => {
|
|
116
|
+
const mockOnPageChange = vi.fn();
|
|
117
|
+
const mockOnPageSizeChange = vi.fn();
|
|
118
|
+
|
|
119
|
+
const defaultProps = {
|
|
120
|
+
currentPage: 1,
|
|
121
|
+
pageSize: 20,
|
|
122
|
+
total: 100,
|
|
123
|
+
onPageChange: mockOnPageChange,
|
|
124
|
+
onPageSizeChange: mockOnPageSizeChange
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
beforeEach(() => {
|
|
128
|
+
vi.clearAllMocks();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const renderComponent = (props = {}) => {
|
|
132
|
+
return render(<TablePagination {...defaultProps} {...props} />);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
describe('Rendering', () => {
|
|
136
|
+
it('should render Flex container', () => {
|
|
137
|
+
renderComponent();
|
|
138
|
+
const flexContainers = screen.getAllByTestId('flex-container');
|
|
139
|
+
expect(flexContainers.length).toBeGreaterThan(0);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('should render Select for page size', () => {
|
|
143
|
+
renderComponent();
|
|
144
|
+
expect(screen.getByTestId('page-size-select')).toBeInTheDocument();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('should render Pagination component', () => {
|
|
148
|
+
renderComponent();
|
|
149
|
+
expect(screen.getByTestId('pagination')).toBeInTheDocument();
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it('should display show label', () => {
|
|
153
|
+
renderComponent();
|
|
154
|
+
expect(screen.getByText('Show')).toBeInTheDocument();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
describe('Page Size Select', () => {
|
|
159
|
+
it('should display current page size as value', () => {
|
|
160
|
+
renderComponent({ pageSize: 20 });
|
|
161
|
+
const select = screen.getByTestId(
|
|
162
|
+
'page-size-select'
|
|
163
|
+
) as HTMLSelectElement;
|
|
164
|
+
expect(select.value).toBe('20');
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('should have correct page size options', () => {
|
|
168
|
+
renderComponent();
|
|
169
|
+
const select = screen.getByTestId(
|
|
170
|
+
'page-size-select'
|
|
171
|
+
) as HTMLSelectElement;
|
|
172
|
+
const options = Array.from(select.options).map(opt => opt.value);
|
|
173
|
+
|
|
174
|
+
PAGE_SIZE_OPTIONS.forEach(opt => {
|
|
175
|
+
expect(options).toContain(String(opt.value));
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('should render all page size options', () => {
|
|
180
|
+
renderComponent();
|
|
181
|
+
const select = screen.getByTestId(
|
|
182
|
+
'page-size-select'
|
|
183
|
+
) as HTMLSelectElement;
|
|
184
|
+
expect(select.options.length).toBe(PAGE_SIZE_OPTIONS.length);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('should update value when pageSize prop changes', () => {
|
|
188
|
+
const { rerender } = renderComponent({ pageSize: 20 });
|
|
189
|
+
|
|
190
|
+
let select = screen.getByTestId('page-size-select') as HTMLSelectElement;
|
|
191
|
+
expect(select.value).toBe('20');
|
|
192
|
+
|
|
193
|
+
rerender(<TablePagination {...defaultProps} pageSize={50} />);
|
|
194
|
+
|
|
195
|
+
select = screen.getByTestId('page-size-select') as HTMLSelectElement;
|
|
196
|
+
expect(select.value).toBe('50');
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('should call onPageSizeChange when page size is changed', () => {
|
|
200
|
+
renderComponent();
|
|
201
|
+
const select = screen.getByTestId('page-size-select');
|
|
202
|
+
|
|
203
|
+
fireEvent.change(select, { target: { value: '20' } });
|
|
204
|
+
|
|
205
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(20);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('should call onPageChange with DEFAULT_CURRENT_PAGE when page size changes', () => {
|
|
209
|
+
renderComponent();
|
|
210
|
+
const select = screen.getByTestId('page-size-select');
|
|
211
|
+
|
|
212
|
+
fireEvent.change(select, { target: { value: '20' } });
|
|
213
|
+
|
|
214
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(DEFAULT_CURRENT_PAGE);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('should reset to page 1 when changing page size from page 2', () => {
|
|
218
|
+
mockOnPageChange.mockClear();
|
|
219
|
+
renderComponent({ currentPage: 2, pageSize: 10 });
|
|
220
|
+
const select = screen.getByTestId('page-size-select');
|
|
221
|
+
|
|
222
|
+
fireEvent.change(select, { target: { value: '20' } });
|
|
223
|
+
|
|
224
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(DEFAULT_CURRENT_PAGE);
|
|
225
|
+
expect(mockOnPageChange).toHaveBeenCalledTimes(1);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it('should handle all page size options', () => {
|
|
229
|
+
renderComponent({ pageSize: 20 });
|
|
230
|
+
const select = screen.getByTestId('page-size-select');
|
|
231
|
+
|
|
232
|
+
// Test first option
|
|
233
|
+
fireEvent.change(select, { target: { value: '20' } });
|
|
234
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(20);
|
|
235
|
+
|
|
236
|
+
mockOnPageSizeChange.mockClear();
|
|
237
|
+
|
|
238
|
+
// Test second option
|
|
239
|
+
fireEvent.change(select, { target: { value: '50' } });
|
|
240
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(50);
|
|
241
|
+
|
|
242
|
+
mockOnPageSizeChange.mockClear();
|
|
243
|
+
|
|
244
|
+
// Test third option
|
|
245
|
+
fireEvent.change(select, { target: { value: '100' } });
|
|
246
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(100);
|
|
247
|
+
|
|
248
|
+
mockOnPageSizeChange.mockClear();
|
|
249
|
+
|
|
250
|
+
// Test fourth option
|
|
251
|
+
fireEvent.change(select, { target: { value: '250' } });
|
|
252
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(250);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
describe('Pagination Component', () => {
|
|
257
|
+
it('should pass current page to Pagination', () => {
|
|
258
|
+
renderComponent({ currentPage: 1 });
|
|
259
|
+
const pagination = screen.getByTestId('pagination');
|
|
260
|
+
expect(pagination).toHaveAttribute('data-current', '1');
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('should pass page size to Pagination', () => {
|
|
264
|
+
renderComponent({ pageSize: 20 });
|
|
265
|
+
const pagination = screen.getByTestId('pagination');
|
|
266
|
+
expect(pagination).toHaveAttribute('data-page-size', '20');
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
it('should pass total to Pagination', () => {
|
|
270
|
+
renderComponent({ total: 500 });
|
|
271
|
+
const pagination = screen.getByTestId('pagination');
|
|
272
|
+
expect(pagination).toHaveAttribute('data-total', '500');
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it('should have dark theme', () => {
|
|
276
|
+
renderComponent();
|
|
277
|
+
const pagination = screen.getByTestId('pagination');
|
|
278
|
+
expect(pagination).toHaveAttribute('data-theme', 'dark');
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it('should not show size changer', () => {
|
|
282
|
+
renderComponent();
|
|
283
|
+
const pagination = screen.getByTestId('pagination');
|
|
284
|
+
expect(pagination).toHaveAttribute('data-show-size-changer', 'false');
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it('should display current page number', () => {
|
|
288
|
+
renderComponent({ currentPage: 1 });
|
|
289
|
+
expect(screen.getByTestId('current-page')).toHaveTextContent('1');
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it('should update current page display when prop changes', () => {
|
|
293
|
+
const { rerender } = renderComponent({ currentPage: 1 });
|
|
294
|
+
|
|
295
|
+
let currentPageDisplay = screen.getByTestId('current-page');
|
|
296
|
+
expect(currentPageDisplay).toHaveTextContent('1');
|
|
297
|
+
|
|
298
|
+
rerender(<TablePagination {...defaultProps} currentPage={5} />);
|
|
299
|
+
|
|
300
|
+
currentPageDisplay = screen.getByTestId('current-page');
|
|
301
|
+
expect(currentPageDisplay).toHaveTextContent('5');
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
describe('Page Navigation', () => {
|
|
306
|
+
it('should call onPageChange when next button is clicked', () => {
|
|
307
|
+
renderComponent({ currentPage: 1, total: 100, pageSize: 10 });
|
|
308
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
309
|
+
|
|
310
|
+
fireEvent.click(nextBtn);
|
|
311
|
+
|
|
312
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(2);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it('should call onPageChange when prev button is clicked', () => {
|
|
316
|
+
renderComponent({ currentPage: 3, total: 100, pageSize: 10 });
|
|
317
|
+
const prevBtn = screen.getByTestId('pagination-prev');
|
|
318
|
+
|
|
319
|
+
fireEvent.click(prevBtn);
|
|
320
|
+
|
|
321
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(2);
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it('should disable prev button on first page', () => {
|
|
325
|
+
renderComponent({ currentPage: 1 });
|
|
326
|
+
const prevBtn = screen.getByTestId('pagination-prev');
|
|
327
|
+
|
|
328
|
+
expect(prevBtn).toBeDisabled();
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('should enable prev button on page 2 or higher', () => {
|
|
332
|
+
renderComponent({ currentPage: 2, total: 100, pageSize: 10 });
|
|
333
|
+
const prevBtn = screen.getByTestId('pagination-prev');
|
|
334
|
+
|
|
335
|
+
expect(prevBtn).not.toBeDisabled();
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('should disable next button on last page', () => {
|
|
339
|
+
renderComponent({ currentPage: 10, total: 100, pageSize: 10 });
|
|
340
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
341
|
+
|
|
342
|
+
expect(nextBtn).toBeDisabled();
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
it('should navigate to next page', () => {
|
|
346
|
+
renderComponent({ currentPage: 1, total: 100, pageSize: 10 });
|
|
347
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
348
|
+
|
|
349
|
+
fireEvent.click(nextBtn);
|
|
350
|
+
|
|
351
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(2);
|
|
352
|
+
expect(mockOnPageChange).toHaveBeenCalledTimes(1);
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
describe('Total Items and Page Count', () => {
|
|
357
|
+
it('should calculate correct page count with 100 items and 10 per page', () => {
|
|
358
|
+
renderComponent({ total: 100, pageSize: 10 });
|
|
359
|
+
const pagination = screen.getByTestId('pagination');
|
|
360
|
+
|
|
361
|
+
expect(pagination).toHaveAttribute('data-total', '100');
|
|
362
|
+
expect(pagination).toHaveAttribute('data-page-size', '10');
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('should calculate correct page count with 95 items and 10 per page', () => {
|
|
366
|
+
renderComponent({ total: 95, pageSize: 10 });
|
|
367
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
368
|
+
|
|
369
|
+
// Current page 1 -> should be able to go to page 10 (95 / 10 = 9.5 -> 10 pages)
|
|
370
|
+
expect(nextBtn).not.toBeDisabled();
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it('should disable next on the actual last page', () => {
|
|
374
|
+
renderComponent({ currentPage: 10, total: 100, pageSize: 10 });
|
|
375
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
376
|
+
|
|
377
|
+
expect(nextBtn).toBeDisabled();
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
it('should handle zero total items', () => {
|
|
381
|
+
renderComponent({ total: 0, currentPage: 1, pageSize: 10 });
|
|
382
|
+
const pagination = screen.getByTestId('pagination');
|
|
383
|
+
|
|
384
|
+
expect(pagination).toHaveAttribute('data-total', '0');
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
it('should handle single item', () => {
|
|
388
|
+
renderComponent({ total: 1, currentPage: 1, pageSize: 10 });
|
|
389
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
390
|
+
|
|
391
|
+
expect(nextBtn).toBeDisabled();
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
describe('Different Page Sizes', () => {
|
|
396
|
+
it('should work with page size 20', () => {
|
|
397
|
+
renderComponent({ pageSize: 20, total: 200 });
|
|
398
|
+
const select = screen.getByTestId(
|
|
399
|
+
'page-size-select'
|
|
400
|
+
) as HTMLSelectElement;
|
|
401
|
+
|
|
402
|
+
expect(select.value).toBe('20');
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
it('should work with page size 50', () => {
|
|
406
|
+
renderComponent({ pageSize: 50, total: 500 });
|
|
407
|
+
const select = screen.getByTestId(
|
|
408
|
+
'page-size-select'
|
|
409
|
+
) as HTMLSelectElement;
|
|
410
|
+
|
|
411
|
+
expect(select.value).toBe('50');
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
it('should work with page size 100', () => {
|
|
415
|
+
renderComponent({ pageSize: 100, total: 1000 });
|
|
416
|
+
const select = screen.getByTestId(
|
|
417
|
+
'page-size-select'
|
|
418
|
+
) as HTMLSelectElement;
|
|
419
|
+
|
|
420
|
+
expect(select.value).toBe('100');
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
it('should work with page size 250', () => {
|
|
424
|
+
renderComponent({ pageSize: 250, total: 2500 });
|
|
425
|
+
const select = screen.getByTestId(
|
|
426
|
+
'page-size-select'
|
|
427
|
+
) as HTMLSelectElement;
|
|
428
|
+
|
|
429
|
+
expect(select.value).toBe('250');
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
it('should increase page count when page size decreases', () => {
|
|
433
|
+
// Test that changing page size calls the correct callbacks
|
|
434
|
+
renderComponent({ pageSize: 20, total: 100 });
|
|
435
|
+
|
|
436
|
+
const select = screen.getByTestId('page-size-select');
|
|
437
|
+
fireEvent.change(select, { target: { value: '50' } });
|
|
438
|
+
|
|
439
|
+
// Should call both callbacks
|
|
440
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(50);
|
|
441
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(DEFAULT_CURRENT_PAGE);
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
describe('Integration Tests', () => {
|
|
446
|
+
it('should handle complete page navigation workflow', () => {
|
|
447
|
+
const { rerender } = renderComponent({
|
|
448
|
+
currentPage: 1,
|
|
449
|
+
pageSize: 10,
|
|
450
|
+
total: 100
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
// Go to next page
|
|
454
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
455
|
+
fireEvent.click(nextBtn);
|
|
456
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(2);
|
|
457
|
+
|
|
458
|
+
// Rerender with updated page
|
|
459
|
+
mockOnPageChange.mockClear();
|
|
460
|
+
rerender(
|
|
461
|
+
<TablePagination
|
|
462
|
+
currentPage={2}
|
|
463
|
+
pageSize={10}
|
|
464
|
+
total={100}
|
|
465
|
+
onPageChange={mockOnPageChange}
|
|
466
|
+
onPageSizeChange={mockOnPageSizeChange}
|
|
467
|
+
/>
|
|
468
|
+
);
|
|
469
|
+
|
|
470
|
+
// Go to previous page
|
|
471
|
+
const prevBtn = screen.getByTestId('pagination-prev');
|
|
472
|
+
fireEvent.click(prevBtn);
|
|
473
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(1);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
it('should handle page size change and navigation', () => {
|
|
477
|
+
renderComponent({ currentPage: 1, pageSize: 10, total: 100 });
|
|
478
|
+
|
|
479
|
+
// Change page size (should reset to page 1)
|
|
480
|
+
const select = screen.getByTestId('page-size-select');
|
|
481
|
+
fireEvent.change(select, { target: { value: '20' } });
|
|
482
|
+
|
|
483
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(20);
|
|
484
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(DEFAULT_CURRENT_PAGE);
|
|
485
|
+
|
|
486
|
+
// Navigate
|
|
487
|
+
mockOnPageChange.mockClear();
|
|
488
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
489
|
+
fireEvent.click(nextBtn);
|
|
490
|
+
|
|
491
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(2);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
it('should maintain state through multiple page size changes', () => {
|
|
495
|
+
renderComponent({ currentPage: 1, pageSize: 10, total: 100 });
|
|
496
|
+
|
|
497
|
+
const select = screen.getByTestId('page-size-select');
|
|
498
|
+
|
|
499
|
+
fireEvent.change(select, { target: { value: '20' } });
|
|
500
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(20);
|
|
501
|
+
|
|
502
|
+
mockOnPageChange.mockClear();
|
|
503
|
+
mockOnPageSizeChange.mockClear();
|
|
504
|
+
|
|
505
|
+
fireEvent.change(select, { target: { value: '50' } });
|
|
506
|
+
expect(mockOnPageSizeChange).toHaveBeenCalledWith(50);
|
|
507
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(DEFAULT_CURRENT_PAGE);
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
it('should handle rapid page changes', () => {
|
|
511
|
+
renderComponent({ currentPage: 1, pageSize: 10, total: 100 });
|
|
512
|
+
|
|
513
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
514
|
+
|
|
515
|
+
// Click next button multiple times
|
|
516
|
+
fireEvent.click(nextBtn);
|
|
517
|
+
fireEvent.click(nextBtn);
|
|
518
|
+
fireEvent.click(nextBtn);
|
|
519
|
+
|
|
520
|
+
// Each click should call onPageChange with incremented page
|
|
521
|
+
expect(mockOnPageChange).toHaveBeenCalledTimes(3);
|
|
522
|
+
expect(mockOnPageChange).toHaveBeenNthCalledWith(1, 2);
|
|
523
|
+
expect(mockOnPageChange).toHaveBeenNthCalledWith(2, 2);
|
|
524
|
+
expect(mockOnPageChange).toHaveBeenNthCalledWith(3, 2);
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
it('should handle edge case of last page navigation', () => {
|
|
528
|
+
renderComponent({ currentPage: 9, pageSize: 10, total: 100 });
|
|
529
|
+
|
|
530
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
531
|
+
fireEvent.click(nextBtn); // -> page 10 (last page)
|
|
532
|
+
|
|
533
|
+
expect(mockOnPageChange).toHaveBeenCalledWith(10);
|
|
534
|
+
});
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
describe('Edge Cases', () => {
|
|
538
|
+
it('should handle very large total', () => {
|
|
539
|
+
renderComponent({ total: 1000000, pageSize: 10, currentPage: 1 });
|
|
540
|
+
const pagination = screen.getByTestId('pagination');
|
|
541
|
+
|
|
542
|
+
expect(pagination).toHaveAttribute('data-total', '1000000');
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
it('should handle current page at exactly total pages boundary', () => {
|
|
546
|
+
// total 100, pageSize 10 = 10 pages
|
|
547
|
+
renderComponent({ total: 100, pageSize: 10, currentPage: 10 });
|
|
548
|
+
|
|
549
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
550
|
+
expect(nextBtn).toBeDisabled();
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
it('should handle current page just before last page', () => {
|
|
554
|
+
renderComponent({ total: 100, pageSize: 10, currentPage: 9 });
|
|
555
|
+
|
|
556
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
557
|
+
expect(nextBtn).not.toBeDisabled();
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
it('should handle currentPage 1 explicitly', () => {
|
|
561
|
+
renderComponent({ currentPage: 1 });
|
|
562
|
+
const currentPageDisplay = screen.getByTestId('current-page');
|
|
563
|
+
|
|
564
|
+
expect(currentPageDisplay).toHaveTextContent('1');
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
it('should display correct page in select', () => {
|
|
568
|
+
renderComponent({ pageSize: 50 });
|
|
569
|
+
const select = screen.getByTestId(
|
|
570
|
+
'page-size-select'
|
|
571
|
+
) as HTMLSelectElement;
|
|
572
|
+
|
|
573
|
+
expect(select.value).toBe('50');
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
describe('Prop Updates', () => {
|
|
578
|
+
it('should update with new currentPage', () => {
|
|
579
|
+
const { rerender } = renderComponent({ currentPage: 1 });
|
|
580
|
+
|
|
581
|
+
let currentPageDisplay = screen.getByTestId('current-page');
|
|
582
|
+
expect(currentPageDisplay).toHaveTextContent('1');
|
|
583
|
+
|
|
584
|
+
rerender(<TablePagination {...defaultProps} currentPage={5} />);
|
|
585
|
+
|
|
586
|
+
currentPageDisplay = screen.getByTestId('current-page');
|
|
587
|
+
expect(currentPageDisplay).toHaveTextContent('5');
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
it('should update with new total', () => {
|
|
591
|
+
const { rerender } = renderComponent({ total: 100 });
|
|
592
|
+
|
|
593
|
+
let pagination = screen.getByTestId('pagination');
|
|
594
|
+
expect(pagination).toHaveAttribute('data-total', '100');
|
|
595
|
+
|
|
596
|
+
rerender(<TablePagination {...defaultProps} total={500} />);
|
|
597
|
+
|
|
598
|
+
pagination = screen.getByTestId('pagination');
|
|
599
|
+
expect(pagination).toHaveAttribute('data-total', '500');
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
it('should maintain callbacks through rerenders', () => {
|
|
603
|
+
const newOnPageChange = vi.fn();
|
|
604
|
+
const { rerender } = renderComponent();
|
|
605
|
+
|
|
606
|
+
const nextBtn = screen.getByTestId('pagination-next');
|
|
607
|
+
fireEvent.click(nextBtn);
|
|
608
|
+
|
|
609
|
+
expect(mockOnPageChange).toHaveBeenCalled();
|
|
610
|
+
|
|
611
|
+
rerender(
|
|
612
|
+
<TablePagination
|
|
613
|
+
currentPage={1}
|
|
614
|
+
pageSize={10}
|
|
615
|
+
total={100}
|
|
616
|
+
onPageChange={newOnPageChange}
|
|
617
|
+
onPageSizeChange={mockOnPageSizeChange}
|
|
618
|
+
/>
|
|
619
|
+
);
|
|
620
|
+
|
|
621
|
+
mockOnPageChange.mockClear();
|
|
622
|
+
|
|
623
|
+
fireEvent.click(screen.getByTestId('pagination-next'));
|
|
624
|
+
|
|
625
|
+
// New callback should be used
|
|
626
|
+
expect(newOnPageChange).toHaveBeenCalled();
|
|
627
|
+
});
|
|
628
|
+
});
|
|
629
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-actions.test.d.ts","sourceRoot":"","sources":["../../../../../src/ai-table/components/__tests__/row-actions.test.tsx"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC"}
|