@pie-lib/charting 6.1.1-next.0 → 6.2.0-next.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.
Files changed (85) hide show
  1. package/lib/actions-button.js +0 -5
  2. package/lib/actions-button.js.map +1 -1
  3. package/lib/axes.js +0 -23
  4. package/lib/axes.js.map +1 -1
  5. package/lib/bars/bar.js +0 -2
  6. package/lib/bars/bar.js.map +1 -1
  7. package/lib/bars/common/bars.js +0 -13
  8. package/lib/bars/common/bars.js.map +1 -1
  9. package/lib/bars/common/correct-check-icon.js +0 -1
  10. package/lib/bars/common/correct-check-icon.js.map +1 -1
  11. package/lib/bars/histogram.js +0 -2
  12. package/lib/bars/histogram.js.map +1 -1
  13. package/lib/chart-setup.js +0 -19
  14. package/lib/chart-setup.js.map +1 -1
  15. package/lib/chart-type.js +0 -1
  16. package/lib/chart-type.js.map +1 -1
  17. package/lib/chart-types.js +0 -1
  18. package/lib/chart-types.js.map +1 -1
  19. package/lib/chart.js +2 -18
  20. package/lib/chart.js.map +1 -1
  21. package/lib/common/correctness-indicators.js +0 -4
  22. package/lib/common/correctness-indicators.js.map +1 -1
  23. package/lib/common/drag-handle.js +0 -1
  24. package/lib/common/drag-handle.js.map +1 -1
  25. package/lib/common/drag-icon.js +0 -2
  26. package/lib/common/drag-icon.js.map +1 -1
  27. package/lib/common/styles.js +0 -1
  28. package/lib/common/styles.js.map +1 -1
  29. package/lib/grid.js +0 -4
  30. package/lib/grid.js.map +1 -1
  31. package/lib/index.js +0 -1
  32. package/lib/index.js.map +1 -1
  33. package/lib/key-legend.js +0 -1
  34. package/lib/key-legend.js.map +1 -1
  35. package/lib/line/common/drag-handle.js +0 -2
  36. package/lib/line/common/drag-handle.js.map +1 -1
  37. package/lib/line/common/line.js +2 -19
  38. package/lib/line/common/line.js.map +1 -1
  39. package/lib/line/line-cross.js +0 -16
  40. package/lib/line/line-cross.js.map +1 -1
  41. package/lib/line/line-dot.js +0 -2
  42. package/lib/line/line-dot.js.map +1 -1
  43. package/lib/mark-label.js +0 -21
  44. package/lib/mark-label.js.map +1 -1
  45. package/lib/plot/common/plot.js +0 -12
  46. package/lib/plot/common/plot.js.map +1 -1
  47. package/lib/plot/dot.js +0 -3
  48. package/lib/plot/dot.js.map +1 -1
  49. package/lib/plot/line.js +0 -3
  50. package/lib/plot/line.js.map +1 -1
  51. package/lib/tool-menu.js +0 -11
  52. package/lib/tool-menu.js.map +1 -1
  53. package/lib/utils.js +0 -12
  54. package/lib/utils.js.map +1 -1
  55. package/package.json +12 -9
  56. package/src/__tests__/actions-button.test.jsx +280 -0
  57. package/src/__tests__/axes.test.jsx +557 -16
  58. package/src/__tests__/chart-setup.test.jsx +495 -10
  59. package/src/__tests__/chart.test.jsx +1 -1
  60. package/src/__tests__/grid.test.jsx +2 -2
  61. package/src/__tests__/key-legend.test.jsx +223 -0
  62. package/src/__tests__/tool-menu.test.jsx +522 -0
  63. package/src/__tests__/utils.js +1 -1
  64. package/src/axes.jsx +10 -7
  65. package/src/bars/common/bars.jsx +32 -50
  66. package/src/chart-setup.jsx +6 -9
  67. package/src/chart-type.js +3 -6
  68. package/src/chart.jsx +2 -2
  69. package/src/common/__tests__/correctness-indicators.test.jsx +720 -0
  70. package/src/common/__tests__/drag-handle.test.jsx +0 -1
  71. package/src/common/correctness-indicators.jsx +8 -13
  72. package/src/common/drag-handle.jsx +2 -12
  73. package/src/grid.jsx +1 -1
  74. package/src/line/__tests__/line-cross.test.jsx +423 -1
  75. package/src/line/__tests__/utils.js +1 -1
  76. package/src/line/common/__tests__/drag-handle.test.jsx +1 -2
  77. package/src/line/common/drag-handle.jsx +2 -11
  78. package/src/line/common/line.jsx +2 -2
  79. package/src/line/line-cross.js +7 -13
  80. package/src/mark-label.jsx +3 -3
  81. package/src/plot/__tests__/dot.test.jsx +300 -1
  82. package/src/plot/__tests__/line.test.jsx +331 -1
  83. package/src/plot/common/plot.jsx +14 -13
  84. package/src/utils.js +0 -1
  85. package/NEXT.CHANGELOG.json +0 -16
@@ -0,0 +1,223 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import { createTheme, ThemeProvider } from '@mui/material/styles';
4
+ import KeyLegend from '../key-legend';
5
+
6
+ jest.mock('@pie-lib/translator', () => ({
7
+ __esModule: true,
8
+ default: {
9
+ translator: {
10
+ t: jest.fn((key) => {
11
+ const translations = {
12
+ 'charting.keyLegend.incorrectAnswer': 'Incorrect answer selected',
13
+ 'charting.keyLegend.correctAnswer': 'Correct answer selected',
14
+ 'charting.keyLegend.correctKeyAnswer': 'Correct answer',
15
+ };
16
+ return translations[key] || key;
17
+ }),
18
+ },
19
+ },
20
+ }));
21
+
22
+ jest.mock('@mui/icons-material/Check', () => {
23
+ return function Check(props) {
24
+ return <div data-testid="check-icon" {...props} />;
25
+ };
26
+ });
27
+
28
+ jest.mock('@mui/icons-material/Close', () => {
29
+ return function Close(props) {
30
+ return <div data-testid="close-icon" {...props} />;
31
+ };
32
+ });
33
+
34
+ let theme;
35
+
36
+ beforeAll(() => {
37
+ theme = createTheme();
38
+ });
39
+
40
+ describe('KeyLegend', () => {
41
+ const renderComponent = (extras = {}) => {
42
+ const defaults = {
43
+ language: 'en',
44
+ };
45
+ const props = { ...defaults, ...extras };
46
+ return render(
47
+ <ThemeProvider theme={theme}>
48
+ <KeyLegend {...props} />
49
+ </ThemeProvider>,
50
+ );
51
+ };
52
+
53
+ describe('rendering', () => {
54
+ it('renders without crashing', () => {
55
+ const { container } = renderComponent();
56
+ expect(container).toBeInTheDocument();
57
+ });
58
+
59
+ it('renders Key title', () => {
60
+ const { getByText } = renderComponent();
61
+ expect(getByText('Key')).toBeInTheDocument();
62
+ });
63
+
64
+ it('renders incorrect answer row', () => {
65
+ const { getByText } = renderComponent();
66
+ expect(getByText('Incorrect answer selected')).toBeInTheDocument();
67
+ });
68
+
69
+ it('renders correct answer row', () => {
70
+ const { getByText } = renderComponent();
71
+ expect(getByText('Correct answer selected')).toBeInTheDocument();
72
+ });
73
+
74
+ it('renders correct key answer row', () => {
75
+ const { getByText } = renderComponent();
76
+ expect(getByText('Correct answer')).toBeInTheDocument();
77
+ });
78
+
79
+ it('renders with custom language', () => {
80
+ const { container } = renderComponent({ language: 'es' });
81
+ expect(container).toBeInTheDocument();
82
+ });
83
+
84
+ it('renders with undefined language', () => {
85
+ const { container } = renderComponent({ language: undefined });
86
+ expect(container).toBeInTheDocument();
87
+ });
88
+ });
89
+
90
+ describe('icons', () => {
91
+ it('renders incorrect icon (Close)', () => {
92
+ const { getAllByTestId } = renderComponent();
93
+ const closeIcons = getAllByTestId('close-icon');
94
+ expect(closeIcons.length).toBeGreaterThan(0);
95
+ });
96
+
97
+ it('renders correct icons (Check)', () => {
98
+ const { getAllByTestId } = renderComponent();
99
+ const checkIcons = getAllByTestId('check-icon');
100
+ expect(checkIcons.length).toBe(2);
101
+ });
102
+
103
+ it('renders small check icon for correct key answer', () => {
104
+ const { getAllByTestId } = renderComponent();
105
+ const checkIcons = getAllByTestId('check-icon');
106
+
107
+ expect(checkIcons.length).toBeGreaterThan(0);
108
+
109
+ checkIcons.forEach((icon) => {
110
+ expect(icon).toBeInTheDocument();
111
+ });
112
+ });
113
+ });
114
+
115
+ describe('structure', () => {
116
+ it('has correct number of rows', () => {
117
+ const { container } = renderComponent();
118
+ const texts = ['Incorrect answer selected', 'Correct answer selected', 'Correct answer'];
119
+
120
+ texts.forEach((text) => {
121
+ expect(container.textContent).toContain(text);
122
+ });
123
+ });
124
+
125
+ it('displays title at the top', () => {
126
+ const { container } = renderComponent();
127
+ const firstChild = container.querySelector('div > div');
128
+ expect(firstChild?.textContent).toContain('Key');
129
+ });
130
+ });
131
+
132
+ describe('styling', () => {
133
+ it('applies styled container', () => {
134
+ const { container } = renderComponent();
135
+ const styledDiv = container.firstChild?.firstChild;
136
+ expect(styledDiv).toBeInTheDocument();
137
+ });
138
+
139
+ it('renders all content in proper structure', () => {
140
+ const { container } = renderComponent();
141
+ expect(container.querySelector('[data-testid="close-icon"]')).toBeInTheDocument();
142
+ expect(container.querySelectorAll('[data-testid="check-icon"]').length).toBe(2);
143
+ });
144
+ });
145
+
146
+ describe('accessibility', () => {
147
+ it('has readable text content', () => {
148
+ const { container } = renderComponent();
149
+ const text = container.textContent;
150
+
151
+ expect(text).toContain('Key');
152
+ expect(text).toContain('Incorrect answer selected');
153
+ expect(text).toContain('Correct answer selected');
154
+ expect(text).toContain('Correct answer');
155
+ });
156
+
157
+ it('icons have proper structure for screen readers', () => {
158
+ const { getAllByTestId } = renderComponent();
159
+ const icons = [...getAllByTestId('close-icon'), ...getAllByTestId('check-icon')];
160
+
161
+ expect(icons.length).toBeGreaterThan(0);
162
+ });
163
+ });
164
+
165
+ describe('edge cases', () => {
166
+ it('handles null language', () => {
167
+ const { container } = renderComponent({ language: null });
168
+ expect(container).toBeInTheDocument();
169
+ });
170
+
171
+ it('handles empty string language', () => {
172
+ const { container } = renderComponent({ language: '' });
173
+ expect(container).toBeInTheDocument();
174
+ });
175
+
176
+ it('renders consistently with different language codes', () => {
177
+ const languages = ['en', 'es', 'fr', 'de', 'zh'];
178
+
179
+ languages.forEach((lang) => {
180
+ const { container, unmount } = renderComponent({ language: lang });
181
+ expect(container).toBeInTheDocument();
182
+ unmount();
183
+ });
184
+ });
185
+ });
186
+
187
+ describe('translation integration', () => {
188
+ it('calls translator with language parameter', () => {
189
+ const Translator = require('@pie-lib/translator').default;
190
+ const { t } = Translator.translator;
191
+
192
+ renderComponent({ language: 'es' });
193
+
194
+ expect(t).toHaveBeenCalled();
195
+ });
196
+
197
+ it('displays all required translation keys', () => {
198
+ const { container } = renderComponent();
199
+ const text = container.textContent;
200
+
201
+ expect(text).toContain('Incorrect answer selected');
202
+ expect(text).toContain('Correct answer selected');
203
+ expect(text).toContain('Correct answer');
204
+ });
205
+ });
206
+
207
+ describe('layout', () => {
208
+ it('renders in a flex column layout', () => {
209
+ const { container } = renderComponent();
210
+ const mainContainer = container.firstChild?.firstChild;
211
+ expect(mainContainer).toBeInTheDocument();
212
+ });
213
+
214
+ it('has proper spacing between elements', () => {
215
+ const { getByText } = renderComponent();
216
+
217
+ expect(getByText('Key')).toBeInTheDocument();
218
+ expect(getByText('Incorrect answer selected')).toBeInTheDocument();
219
+ expect(getByText('Correct answer selected')).toBeInTheDocument();
220
+ expect(getByText('Correct answer')).toBeInTheDocument();
221
+ });
222
+ });
223
+ });