@pie-element/hotspot 11.2.0-beta.0 → 11.2.0-next.18

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 (236) hide show
  1. package/author.js +2 -0
  2. package/configure.js +2 -0
  3. package/controller.js +1 -0
  4. package/dist/author/DeleteWidget.d.ts +38 -0
  5. package/dist/author/DeleteWidget.js +46 -0
  6. package/dist/author/button.d.ts +31 -0
  7. package/dist/author/button.js +27 -0
  8. package/dist/author/buttons/circle.d.ts +18 -0
  9. package/dist/author/buttons/circle.js +25 -0
  10. package/dist/author/buttons/polygon.d.ts +18 -0
  11. package/dist/author/buttons/polygon.js +36 -0
  12. package/dist/author/buttons/rectangle.d.ts +18 -0
  13. package/dist/author/buttons/rectangle.js +36 -0
  14. package/dist/author/defaults.d.ts +157 -0
  15. package/dist/author/defaults.js +119 -0
  16. package/dist/author/hotspot-circle.d.ts +21 -0
  17. package/dist/author/hotspot-circle.js +124 -0
  18. package/dist/author/hotspot-container.d.ts +29 -0
  19. package/dist/author/hotspot-container.js +210 -0
  20. package/dist/author/hotspot-drawable.d.ts +31 -0
  21. package/dist/author/hotspot-drawable.js +312 -0
  22. package/dist/author/hotspot-palette.d.ts +14 -0
  23. package/dist/author/hotspot-palette.js +72 -0
  24. package/dist/author/hotspot-polygon.d.ts +38 -0
  25. package/dist/author/hotspot-polygon.js +200 -0
  26. package/dist/author/hotspot-rectangle.d.ts +20 -0
  27. package/dist/author/hotspot-rectangle.js +119 -0
  28. package/dist/author/icons.d.ts +9 -0
  29. package/dist/author/icons.js +4 -0
  30. package/dist/author/image-konva.d.ts +19 -0
  31. package/dist/author/image-konva.js +49 -0
  32. package/dist/author/index.d.ts +53 -0
  33. package/dist/author/index.js +146 -0
  34. package/dist/author/root.d.ts +15 -0
  35. package/dist/author/root.js +215 -0
  36. package/dist/author/shapes/circle.d.ts +18 -0
  37. package/dist/author/shapes/circle.js +47 -0
  38. package/dist/author/shapes/index.d.ts +12 -0
  39. package/dist/author/shapes/polygon.d.ts +19 -0
  40. package/dist/author/shapes/polygon.js +51 -0
  41. package/dist/author/shapes/rectagle.d.ts +18 -0
  42. package/dist/author/shapes/rectagle.js +57 -0
  43. package/dist/author/shapes/utils.d.ts +19 -0
  44. package/dist/author/shapes/utils.js +16 -0
  45. package/dist/author/upload-control.d.ts +29 -0
  46. package/dist/author/upload-control.js +28 -0
  47. package/dist/author/utils.d.ts +24 -0
  48. package/dist/author/utils.js +83 -0
  49. package/dist/browser/ReactKonva-e9jPRlPL.js +19304 -0
  50. package/dist/browser/ReactKonva-e9jPRlPL.js.map +1 -0
  51. package/dist/browser/assets/Symbola-4c507403.woff2 +0 -0
  52. package/dist/browser/author/index.js +37002 -0
  53. package/dist/browser/author/index.js.map +1 -0
  54. package/dist/browser/browser-D4gLESxz.js +226 -0
  55. package/dist/browser/browser-D4gLESxz.js.map +1 -0
  56. package/dist/browser/controller/index.js +198 -0
  57. package/dist/browser/controller/index.js.map +1 -0
  58. package/dist/browser/delivery/index.js +2673 -0
  59. package/dist/browser/delivery/index.js.map +1 -0
  60. package/dist/browser/dist-CJeYAWp3.js +100 -0
  61. package/dist/browser/dist-CJeYAWp3.js.map +1 -0
  62. package/dist/controller/defaults.d.ts +35 -0
  63. package/dist/controller/defaults.js +29 -0
  64. package/dist/controller/index.d.ts +22 -0
  65. package/dist/controller/index.js +154 -0
  66. package/dist/controller/utils.d.ts +10 -0
  67. package/dist/controller/utils.js +12 -0
  68. package/dist/delivery/hotspot/circle.d.ts +22 -0
  69. package/dist/delivery/hotspot/circle.js +113 -0
  70. package/dist/delivery/hotspot/container.d.ts +21 -0
  71. package/dist/delivery/hotspot/container.js +217 -0
  72. package/dist/delivery/hotspot/icons.d.ts +10 -0
  73. package/dist/delivery/hotspot/icons.js +4 -0
  74. package/dist/delivery/hotspot/image-konva-tooltip.d.ts +19 -0
  75. package/dist/delivery/hotspot/image-konva-tooltip.js +66 -0
  76. package/dist/delivery/hotspot/index.d.ts +18 -0
  77. package/dist/delivery/hotspot/index.js +119 -0
  78. package/dist/delivery/hotspot/polygon.d.ts +24 -0
  79. package/dist/delivery/hotspot/polygon.js +121 -0
  80. package/dist/delivery/hotspot/rectangle.d.ts +22 -0
  81. package/dist/delivery/hotspot/rectangle.js +116 -0
  82. package/dist/delivery/index.d.ts +20 -0
  83. package/dist/delivery/index.js +109 -0
  84. package/dist/delivery/session-updater.d.ts +10 -0
  85. package/dist/delivery/session-updater.js +14 -0
  86. package/dist/index.d.ts +1 -0
  87. package/dist/index.iife.d.ts +8 -0
  88. package/dist/index.iife.js +169 -0
  89. package/dist/index.js +2 -0
  90. package/dist/runtime-support.d.ts +12 -0
  91. package/dist/runtime-support.js +12 -0
  92. package/package.json +84 -19
  93. package/CHANGELOG.json +0 -997
  94. package/CHANGELOG.md +0 -2230
  95. package/LICENSE.md +0 -5
  96. package/README.md +0 -1
  97. package/configure/CHANGELOG.json +0 -682
  98. package/configure/CHANGELOG.md +0 -1964
  99. package/configure/lib/DeleteWidget.js +0 -64
  100. package/configure/lib/DeleteWidget.js.map +0 -1
  101. package/configure/lib/button.js +0 -42
  102. package/configure/lib/button.js.map +0 -1
  103. package/configure/lib/buttons/circle.js +0 -33
  104. package/configure/lib/buttons/circle.js.map +0 -1
  105. package/configure/lib/buttons/polygon.js +0 -39
  106. package/configure/lib/buttons/polygon.js.map +0 -1
  107. package/configure/lib/buttons/rectangle.js +0 -39
  108. package/configure/lib/buttons/rectangle.js.map +0 -1
  109. package/configure/lib/defaults.js +0 -155
  110. package/configure/lib/defaults.js.map +0 -1
  111. package/configure/lib/hotspot-circle.js +0 -192
  112. package/configure/lib/hotspot-circle.js.map +0 -1
  113. package/configure/lib/hotspot-container.js +0 -320
  114. package/configure/lib/hotspot-container.js.map +0 -1
  115. package/configure/lib/hotspot-drawable.js +0 -519
  116. package/configure/lib/hotspot-drawable.js.map +0 -1
  117. package/configure/lib/hotspot-palette.js +0 -107
  118. package/configure/lib/hotspot-palette.js.map +0 -1
  119. package/configure/lib/hotspot-polygon.js +0 -293
  120. package/configure/lib/hotspot-polygon.js.map +0 -1
  121. package/configure/lib/hotspot-rectangle.js +0 -190
  122. package/configure/lib/hotspot-rectangle.js.map +0 -1
  123. package/configure/lib/icons.js +0 -7
  124. package/configure/lib/icons.js.map +0 -1
  125. package/configure/lib/image-konva.js +0 -66
  126. package/configure/lib/image-konva.js.map +0 -1
  127. package/configure/lib/index.js +0 -198
  128. package/configure/lib/index.js.map +0 -1
  129. package/configure/lib/root.js +0 -331
  130. package/configure/lib/root.js.map +0 -1
  131. package/configure/lib/shapes/circle.js +0 -84
  132. package/configure/lib/shapes/circle.js.map +0 -1
  133. package/configure/lib/shapes/index.js +0 -50
  134. package/configure/lib/shapes/index.js.map +0 -1
  135. package/configure/lib/shapes/polygon.js +0 -82
  136. package/configure/lib/shapes/polygon.js.map +0 -1
  137. package/configure/lib/shapes/rectagle.js +0 -84
  138. package/configure/lib/shapes/rectagle.js.map +0 -1
  139. package/configure/lib/shapes/utils.js +0 -21
  140. package/configure/lib/shapes/utils.js.map +0 -1
  141. package/configure/lib/upload-control.js +0 -41
  142. package/configure/lib/upload-control.js.map +0 -1
  143. package/configure/lib/utils.js +0 -185
  144. package/configure/lib/utils.js.map +0 -1
  145. package/configure/package.json +0 -26
  146. package/configure/src/DeleteWidget.jsx +0 -51
  147. package/configure/src/__tests__/DeleteWidget.test.jsx +0 -366
  148. package/configure/src/__tests__/button.test.jsx +0 -198
  149. package/configure/src/__tests__/hotspot-circle.test.jsx +0 -259
  150. package/configure/src/__tests__/hotspot-container.test.js +0 -366
  151. package/configure/src/__tests__/hotspot-drawable.test.js +0 -271
  152. package/configure/src/__tests__/hotspot-palette.test.jsx +0 -71
  153. package/configure/src/__tests__/image-konva.test.jsx +0 -226
  154. package/configure/src/__tests__/index.test.js +0 -329
  155. package/configure/src/__tests__/root.test.js +0 -400
  156. package/configure/src/__tests__/utils.test.js +0 -241
  157. package/configure/src/button.jsx +0 -35
  158. package/configure/src/buttons/circle.jsx +0 -18
  159. package/configure/src/buttons/polygon.jsx +0 -29
  160. package/configure/src/buttons/rectangle.jsx +0 -29
  161. package/configure/src/defaults.js +0 -109
  162. package/configure/src/hotspot-circle.jsx +0 -183
  163. package/configure/src/hotspot-container.jsx +0 -330
  164. package/configure/src/hotspot-drawable.jsx +0 -527
  165. package/configure/src/hotspot-palette.jsx +0 -90
  166. package/configure/src/hotspot-polygon.jsx +0 -294
  167. package/configure/src/hotspot-rectangle.jsx +0 -169
  168. package/configure/src/icons.js +0 -5
  169. package/configure/src/image-konva.jsx +0 -63
  170. package/configure/src/index.js +0 -213
  171. package/configure/src/root.jsx +0 -342
  172. package/configure/src/shapes/circle.js +0 -81
  173. package/configure/src/shapes/index.js +0 -4
  174. package/configure/src/shapes/polygon.js +0 -81
  175. package/configure/src/shapes/rectagle.js +0 -82
  176. package/configure/src/shapes/utils.js +0 -16
  177. package/configure/src/upload-control.jsx +0 -33
  178. package/configure/src/utils.js +0 -210
  179. package/controller/CHANGELOG.json +0 -362
  180. package/controller/CHANGELOG.md +0 -1310
  181. package/controller/lib/defaults.js +0 -33
  182. package/controller/lib/defaults.js.map +0 -1
  183. package/controller/lib/index.js +0 -342
  184. package/controller/lib/index.js.map +0 -1
  185. package/controller/lib/utils.js +0 -32
  186. package/controller/lib/utils.js.map +0 -1
  187. package/controller/package.json +0 -18
  188. package/controller/src/__tests__/index.test.js +0 -419
  189. package/controller/src/__tests__/utils.test.js +0 -5
  190. package/controller/src/defaults.js +0 -19
  191. package/controller/src/index.js +0 -330
  192. package/controller/src/utils.js +0 -29
  193. package/docs/config-schema.json +0 -2023
  194. package/docs/config-schema.json.md +0 -1495
  195. package/docs/demo/config.js +0 -8
  196. package/docs/demo/generate.js +0 -122
  197. package/docs/demo/index.html +0 -1
  198. package/docs/demo/session.js +0 -11
  199. package/docs/pie-schema.json +0 -1204
  200. package/docs/pie-schema.json.md +0 -851
  201. package/lib/hotspot/circle.js +0 -160
  202. package/lib/hotspot/circle.js.map +0 -1
  203. package/lib/hotspot/container.js +0 -291
  204. package/lib/hotspot/container.js.map +0 -1
  205. package/lib/hotspot/icons.js +0 -8
  206. package/lib/hotspot/icons.js.map +0 -1
  207. package/lib/hotspot/image-konva-tooltip.js +0 -86
  208. package/lib/hotspot/image-konva-tooltip.js.map +0 -1
  209. package/lib/hotspot/index.js +0 -174
  210. package/lib/hotspot/index.js.map +0 -1
  211. package/lib/hotspot/polygon.js +0 -207
  212. package/lib/hotspot/polygon.js.map +0 -1
  213. package/lib/hotspot/rectangle.js +0 -178
  214. package/lib/hotspot/rectangle.js.map +0 -1
  215. package/lib/index.js +0 -214
  216. package/lib/index.js.map +0 -1
  217. package/lib/session-updater.js +0 -42
  218. package/lib/session-updater.js.map +0 -1
  219. package/src/__tests__/container.test.jsx +0 -58
  220. package/src/__tests__/index.test.js +0 -123
  221. package/src/__tests__/session-updater.test.jsx +0 -69
  222. package/src/hotspot/__tests__/circle.test.jsx +0 -464
  223. package/src/hotspot/__tests__/container.test.jsx +0 -546
  224. package/src/hotspot/__tests__/image-konva-tooltip.test.jsx +0 -510
  225. package/src/hotspot/__tests__/index.test.jsx +0 -64
  226. package/src/hotspot/__tests__/polygon.test.jsx +0 -502
  227. package/src/hotspot/__tests__/rectangle.test.jsx +0 -418
  228. package/src/hotspot/circle.jsx +0 -154
  229. package/src/hotspot/container.jsx +0 -297
  230. package/src/hotspot/icons.js +0 -7
  231. package/src/hotspot/image-konva-tooltip.jsx +0 -76
  232. package/src/hotspot/index.jsx +0 -179
  233. package/src/hotspot/polygon.jsx +0 -197
  234. package/src/hotspot/rectangle.jsx +0 -172
  235. package/src/index.js +0 -227
  236. package/src/session-updater.js +0 -29
@@ -1,366 +0,0 @@
1
- import React from 'react';
2
- import { render, fireEvent } from '@testing-library/react';
3
- import Konva from 'konva';
4
- import DeleteWidget from '../DeleteWidget';
5
-
6
- Konva.isBrowser = false;
7
-
8
- jest.mock('react-konva', () => {
9
- const React = require('react');
10
- return {
11
- Group: ({ children, onClick, ...props }) => {
12
- return React.createElement('div', { 'data-testid': 'group', onClick, ...props }, children);
13
- },
14
- };
15
- });
16
-
17
- jest.mock('../image-konva', () => {
18
- return function ImageComponent({ src, x, y }) {
19
- return <div data-testid="delete-icon" data-src={src} data-x={x} data-y={y} />;
20
- };
21
- });
22
-
23
- jest.mock('../utils', () => ({
24
- calculate: jest.fn((points) => {
25
- const xValues = points.map(p => p.x);
26
- const yValues = points.map(p => p.y);
27
- return {
28
- x: Math.max(...xValues),
29
- y: Math.max(...yValues),
30
- };
31
- }),
32
- }));
33
-
34
- describe('DeleteWidget', () => {
35
- let defaultProps;
36
-
37
- beforeEach(() => {
38
- defaultProps = {
39
- id: 'shape1',
40
- x: 100,
41
- y: 150,
42
- handleWidgetClick: jest.fn(),
43
- };
44
- });
45
-
46
- describe('rendering', () => {
47
- it('should render without crashing', () => {
48
- const { container } = render(<DeleteWidget {...defaultProps} width={200} height={150} />);
49
- expect(container).toBeTruthy();
50
- });
51
-
52
- it('should render Group component', () => {
53
- const { getByTestId } = render(<DeleteWidget {...defaultProps} width={200} height={150} />);
54
- expect(getByTestId('group')).toBeInTheDocument();
55
- });
56
-
57
- it('should render delete icon', () => {
58
- const { getByTestId } = render(<DeleteWidget {...defaultProps} width={200} height={150} />);
59
- expect(getByTestId('delete-icon')).toBeInTheDocument();
60
- });
61
- });
62
-
63
- describe('rectangle positioning', () => {
64
- it('should position delete icon at bottom-right for rectangles', () => {
65
- const { getByTestId } = render(
66
- <DeleteWidget
67
- {...defaultProps}
68
- x={100}
69
- y={150}
70
- width={200}
71
- height={150}
72
- />
73
- );
74
-
75
- const icon = getByTestId('delete-icon');
76
- // positionX = x + width - offset = 100 + 200 - 20 = 280
77
- // positionY = y + height - offset = 150 + 150 - 20 = 280
78
- expect(icon).toHaveAttribute('data-x', '280');
79
- expect(icon).toHaveAttribute('data-y', '280');
80
- });
81
-
82
- it('should handle different rectangle dimensions', () => {
83
- const { getByTestId } = render(
84
- <DeleteWidget
85
- {...defaultProps}
86
- x={50}
87
- y={75}
88
- width={300}
89
- height={200}
90
- />
91
- );
92
-
93
- const icon = getByTestId('delete-icon');
94
- // positionX = 50 + 300 - 20 = 330
95
- // positionY = 75 + 200 - 20 = 255
96
- expect(icon).toHaveAttribute('data-x', '330');
97
- expect(icon).toHaveAttribute('data-y', '255');
98
- });
99
- });
100
-
101
- describe('circle positioning', () => {
102
- it('should position delete icon above circle', () => {
103
- const { getByTestId } = render(
104
- <DeleteWidget
105
- {...defaultProps}
106
- x={200}
107
- y={200}
108
- isCircle={true}
109
- radius={50}
110
- />
111
- );
112
-
113
- const icon = getByTestId('delete-icon');
114
- // positionX = x + radius - offset = 200 + 50 - 20 = 230
115
- // positionY = y = 200
116
- expect(icon).toHaveAttribute('data-x', '230');
117
- expect(icon).toHaveAttribute('data-y', '200');
118
- });
119
-
120
- it('should handle different circle sizes', () => {
121
- const { getByTestId } = render(
122
- <DeleteWidget
123
- {...defaultProps}
124
- x={100}
125
- y={100}
126
- isCircle={true}
127
- radius={75}
128
- />
129
- );
130
-
131
- const icon = getByTestId('delete-icon');
132
- // positionX = 100 + 75 - 20 = 155
133
- // positionY = 100
134
- expect(icon).toHaveAttribute('data-x', '155');
135
- expect(icon).toHaveAttribute('data-y', '100');
136
- });
137
-
138
- it('should handle small circles', () => {
139
- const { getByTestId } = render(
140
- <DeleteWidget
141
- {...defaultProps}
142
- x={150}
143
- y={150}
144
- isCircle={true}
145
- radius={20}
146
- />
147
- );
148
-
149
- const icon = getByTestId('delete-icon');
150
- // positionX = 150 + 20 - 20 = 150
151
- // positionY = 150
152
- expect(icon).toHaveAttribute('data-x', '150');
153
- expect(icon).toHaveAttribute('data-y', '150');
154
- });
155
- });
156
-
157
- describe('polygon positioning', () => {
158
- it('should position delete icon using calculate function for polygons', () => {
159
- const { calculate } = require('../utils');
160
- const points = [
161
- { x: 10, y: 10 },
162
- { x: 100, y: 20 },
163
- { x: 90, y: 90 },
164
- { x: 20, y: 80 },
165
- ];
166
-
167
- const { getByTestId } = render(
168
- <DeleteWidget
169
- {...defaultProps}
170
- points={points}
171
- />
172
- );
173
-
174
- expect(calculate).toHaveBeenCalledWith(points);
175
-
176
- const icon = getByTestId('delete-icon');
177
- // Based on mocked calculate function: max x = 100, max y = 90
178
- expect(icon).toHaveAttribute('data-x', '100');
179
- expect(icon).toHaveAttribute('data-y', '90');
180
- });
181
-
182
- it('should handle triangular polygons', () => {
183
- const { calculate } = require('../utils');
184
- const points = [
185
- { x: 50, y: 0 },
186
- { x: 100, y: 100 },
187
- { x: 0, y: 100 },
188
- ];
189
-
190
- render(
191
- <DeleteWidget
192
- {...defaultProps}
193
- points={points}
194
- />
195
- );
196
-
197
- expect(calculate).toHaveBeenCalledWith(points);
198
- });
199
-
200
- it('should handle complex polygons', () => {
201
- const { calculate } = require('../utils');
202
- const points = [
203
- { x: 10, y: 10 },
204
- { x: 50, y: 5 },
205
- { x: 90, y: 10 },
206
- { x: 100, y: 50 },
207
- { x: 90, y: 90 },
208
- { x: 50, y: 100 },
209
- { x: 10, y: 90 },
210
- { x: 0, y: 50 },
211
- ];
212
-
213
- render(
214
- <DeleteWidget
215
- {...defaultProps}
216
- points={points}
217
- />
218
- );
219
-
220
- expect(calculate).toHaveBeenCalledWith(points);
221
- });
222
- });
223
-
224
- describe('interactions', () => {
225
- it('should call handleWidgetClick when clicked', () => {
226
- const handleWidgetClick = jest.fn();
227
- const { getByTestId } = render(
228
- <DeleteWidget
229
- {...defaultProps}
230
- handleWidgetClick={handleWidgetClick}
231
- width={200}
232
- height={150}
233
- />
234
- );
235
-
236
- const group = getByTestId('group');
237
- fireEvent.click(group);
238
-
239
- expect(handleWidgetClick).toHaveBeenCalledWith('shape1');
240
- });
241
-
242
- it('should call handleWidgetClick with correct id for circles', () => {
243
- const handleWidgetClick = jest.fn();
244
- const { getByTestId } = render(
245
- <DeleteWidget
246
- {...defaultProps}
247
- id="circle1"
248
- handleWidgetClick={handleWidgetClick}
249
- isCircle={true}
250
- radius={50}
251
- />
252
- );
253
-
254
- const group = getByTestId('group');
255
- fireEvent.click(group);
256
-
257
- expect(handleWidgetClick).toHaveBeenCalledWith('circle1');
258
- });
259
-
260
- it('should call handleWidgetClick with correct id for polygons', () => {
261
- const handleWidgetClick = jest.fn();
262
- const points = [
263
- { x: 10, y: 10 },
264
- { x: 100, y: 20 },
265
- { x: 50, y: 100 },
266
- ];
267
- const { getByTestId } = render(
268
- <DeleteWidget
269
- {...defaultProps}
270
- id="polygon1"
271
- handleWidgetClick={handleWidgetClick}
272
- points={points}
273
- />
274
- );
275
-
276
- const group = getByTestId('group');
277
- fireEvent.click(group);
278
-
279
- expect(handleWidgetClick).toHaveBeenCalledWith('polygon1');
280
- });
281
- });
282
-
283
- describe('edge cases', () => {
284
- it('should handle zero dimensions for rectangles', () => {
285
- const { getByTestId } = render(
286
- <DeleteWidget
287
- {...defaultProps}
288
- x={0}
289
- y={0}
290
- width={0}
291
- height={0}
292
- />
293
- );
294
-
295
- const icon = getByTestId('delete-icon');
296
- // positionX = 0 + 0 - 20 = -20
297
- // positionY = 0 + 0 - 20 = -20
298
- expect(icon).toHaveAttribute('data-x', '-20');
299
- expect(icon).toHaveAttribute('data-y', '-20');
300
- });
301
-
302
- it('should handle zero radius for circles', () => {
303
- const { getByTestId } = render(
304
- <DeleteWidget
305
- {...defaultProps}
306
- x={100}
307
- y={100}
308
- isCircle={true}
309
- radius={0}
310
- />
311
- );
312
-
313
- const icon = getByTestId('delete-icon');
314
- // positionX = 100 + 0 - 20 = 80
315
- // positionY = 100
316
- expect(icon).toHaveAttribute('data-x', '80');
317
- expect(icon).toHaveAttribute('data-y', '100');
318
- });
319
-
320
- it('should handle negative coordinates', () => {
321
- const { getByTestId } = render(
322
- <DeleteWidget
323
- {...defaultProps}
324
- x={-50}
325
- y={-75}
326
- width={100}
327
- height={100}
328
- />
329
- );
330
-
331
- const icon = getByTestId('delete-icon');
332
- // positionX = -50 + 100 - 20 = 30
333
- // positionY = -75 + 100 - 20 = 5
334
- expect(icon).toHaveAttribute('data-x', '30');
335
- expect(icon).toHaveAttribute('data-y', '5');
336
- });
337
-
338
- it('should handle single point polygon', () => {
339
- const points = [{ x: 50, y: 50 }];
340
-
341
- const { container } = render(
342
- <DeleteWidget
343
- {...defaultProps}
344
- points={points}
345
- />
346
- );
347
-
348
- expect(container).toBeTruthy();
349
- });
350
- });
351
-
352
- describe('icon rendering', () => {
353
- it('should pass correct src to ImageComponent', () => {
354
- const { getByTestId } = render(
355
- <DeleteWidget
356
- {...defaultProps}
357
- width={200}
358
- height={150}
359
- />
360
- );
361
-
362
- const icon = getByTestId('delete-icon');
363
- expect(icon).toHaveAttribute('data-src');
364
- });
365
- });
366
- });
@@ -1,198 +0,0 @@
1
- import React from 'react';
2
- import { render, fireEvent } from '@testing-library/react';
3
- import RawButton from '../button';
4
-
5
- describe('RawButton', () => {
6
- describe('rendering', () => {
7
- it('should render without crashing', () => {
8
- const { container } = render(<RawButton />);
9
- expect(container).toBeTruthy();
10
- });
11
-
12
- it('should render with default label', () => {
13
- const { getByText } = render(<RawButton />);
14
- expect(getByText('Add')).toBeInTheDocument();
15
- });
16
-
17
- it('should render with custom label', () => {
18
- const { getByText } = render(<RawButton label="Custom Label" />);
19
- expect(getByText('Custom Label')).toBeInTheDocument();
20
- });
21
-
22
- it('should render as a button element', () => {
23
- const { getByRole } = render(<RawButton label="Test Button" />);
24
- expect(getByRole('button')).toBeInTheDocument();
25
- });
26
-
27
- it('should apply custom className', () => {
28
- const { getByRole } = render(<RawButton label="Test" className="custom-class" />);
29
- const button = getByRole('button');
30
- expect(button).toHaveClass('custom-class');
31
- });
32
- });
33
-
34
- describe('interactions', () => {
35
- it('should call onClick when clicked', () => {
36
- const onClick = jest.fn();
37
- const { getByRole } = render(<RawButton label="Click Me" onClick={onClick} />);
38
-
39
- const button = getByRole('button');
40
- fireEvent.click(button);
41
-
42
- expect(onClick).toHaveBeenCalledTimes(1);
43
- });
44
-
45
- it('should not call onClick when disabled', () => {
46
- const onClick = jest.fn();
47
- const { getByRole } = render(<RawButton label="Disabled" onClick={onClick} disabled={true} />);
48
-
49
- const button = getByRole('button');
50
- fireEvent.click(button);
51
-
52
- expect(onClick).not.toHaveBeenCalled();
53
- });
54
-
55
- it('should call onClick multiple times', () => {
56
- const onClick = jest.fn();
57
- const { getByRole } = render(<RawButton label="Multi Click" onClick={onClick} />);
58
-
59
- const button = getByRole('button');
60
- fireEvent.click(button);
61
- fireEvent.click(button);
62
- fireEvent.click(button);
63
-
64
- expect(onClick).toHaveBeenCalledTimes(3);
65
- });
66
- });
67
-
68
- describe('disabled state', () => {
69
- it('should be enabled by default', () => {
70
- const { getByRole } = render(<RawButton label="Test" />);
71
- const button = getByRole('button');
72
- expect(button).not.toBeDisabled();
73
- });
74
-
75
- it('should be disabled when disabled prop is true', () => {
76
- const { getByRole } = render(<RawButton label="Test" disabled={true} />);
77
- const button = getByRole('button');
78
- expect(button).toBeDisabled();
79
- });
80
-
81
- it('should be enabled when disabled prop is false', () => {
82
- const { getByRole } = render(<RawButton label="Test" disabled={false} />);
83
- const button = getByRole('button');
84
- expect(button).not.toBeDisabled();
85
- });
86
- });
87
-
88
- describe('default props', () => {
89
- it('should use default onClick when not provided', () => {
90
- const { getByRole } = render(<RawButton label="Test" />);
91
- const button = getByRole('button');
92
-
93
- // Should not throw error when clicked
94
- expect(() => fireEvent.click(button)).not.toThrow();
95
- });
96
-
97
- it('should use default label "Add" when not provided', () => {
98
- const { getByText } = render(<RawButton />);
99
- expect(getByText('Add')).toBeInTheDocument();
100
- });
101
-
102
- it('should use empty className by default', () => {
103
- const { getByRole } = render(<RawButton label="Test" />);
104
- const button = getByRole('button');
105
- expect(button.className).toBeTruthy(); // Will have MUI classes
106
- });
107
-
108
- it('should be enabled by default', () => {
109
- const { getByRole } = render(<RawButton label="Test" />);
110
- const button = getByRole('button');
111
- expect(button).not.toBeDisabled();
112
- });
113
- });
114
-
115
- describe('variant and size', () => {
116
- it('should render with contained variant', () => {
117
- const { getByRole } = render(<RawButton label="Test" />);
118
- const button = getByRole('button');
119
- expect(button).toHaveClass('MuiButton-contained');
120
- });
121
-
122
- it('should render with small size', () => {
123
- const { getByRole } = render(<RawButton label="Test" />);
124
- const button = getByRole('button');
125
- expect(button).toHaveClass('MuiButton-sizeSmall');
126
- });
127
- });
128
-
129
- describe('edge cases', () => {
130
- it('should handle empty label', () => {
131
- const { getByRole } = render(<RawButton label="" />);
132
- const button = getByRole('button');
133
- expect(button).toBeInTheDocument();
134
- expect(button.textContent).toBe('');
135
- });
136
-
137
- it('should handle very long label', () => {
138
- const longLabel = 'This is a very long button label that might wrap or overflow';
139
- const { getByText } = render(<RawButton label={longLabel} />);
140
- expect(getByText(longLabel)).toBeInTheDocument();
141
- });
142
-
143
- it('should handle special characters in label', () => {
144
- const specialLabel = '!@#$%^&*()_+-=[]{}|;:",.<>?/~`';
145
- const { getByText } = render(<RawButton label={specialLabel} />);
146
- expect(getByText(specialLabel)).toBeInTheDocument();
147
- });
148
-
149
- it('should handle Unicode characters in label', () => {
150
- const unicodeLabel = '🚀 Launch 你好 مرحبا';
151
- const { getByText } = render(<RawButton label={unicodeLabel} />);
152
- expect(getByText(unicodeLabel)).toBeInTheDocument();
153
- });
154
-
155
- it('should handle null onClick gracefully with default', () => {
156
- const { getByRole } = render(<RawButton label="Test" onClick={null} />);
157
- const button = getByRole('button');
158
-
159
- // Should use default onClick
160
- expect(() => fireEvent.click(button)).not.toThrow();
161
- });
162
- });
163
-
164
- describe('prop updates', () => {
165
- it('should update label when prop changes', () => {
166
- const { getByText, rerender } = render(<RawButton label="Initial" />);
167
- expect(getByText('Initial')).toBeInTheDocument();
168
-
169
- rerender(<RawButton label="Updated" />);
170
- expect(getByText('Updated')).toBeInTheDocument();
171
- });
172
-
173
- it('should update disabled state when prop changes', () => {
174
- const { getByRole, rerender } = render(<RawButton label="Test" disabled={false} />);
175
- const button = getByRole('button');
176
- expect(button).not.toBeDisabled();
177
-
178
- rerender(<RawButton label="Test" disabled={true} />);
179
- expect(button).toBeDisabled();
180
- });
181
-
182
- it('should update onClick handler when prop changes', () => {
183
- const onClick1 = jest.fn();
184
- const onClick2 = jest.fn();
185
- const { getByRole, rerender } = render(<RawButton label="Test" onClick={onClick1} />);
186
-
187
- const button = getByRole('button');
188
- fireEvent.click(button);
189
- expect(onClick1).toHaveBeenCalledTimes(1);
190
- expect(onClick2).not.toHaveBeenCalled();
191
-
192
- rerender(<RawButton label="Test" onClick={onClick2} />);
193
- fireEvent.click(button);
194
- expect(onClick1).toHaveBeenCalledTimes(1);
195
- expect(onClick2).toHaveBeenCalledTimes(1);
196
- });
197
- });
198
- });