@osimatic/helpers-js 1.4.24 → 1.4.26

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 (68) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/chartjs.js +1 -1
  3. package/date_time.js +25 -16
  4. package/draw.js +3 -2
  5. package/duration.js +176 -130
  6. package/event_bus.js +2 -2
  7. package/file.js +20 -5
  8. package/form_helper.js +1 -1
  9. package/google_charts.js +2 -1
  10. package/http_client.js +2 -0
  11. package/jwt.js +18 -6
  12. package/location.js +5 -1
  13. package/media.js +7 -7
  14. package/multi_files_input.js +3 -1
  15. package/number.js +2 -3
  16. package/package.json +4 -2
  17. package/paging.js +2 -2
  18. package/social_network.js +5 -0
  19. package/string.js +11 -2
  20. package/tests/__mocks__/socket.io-client.js +13 -0
  21. package/tests/chartjs.test.js +273 -0
  22. package/tests/count_down.test.js +580 -0
  23. package/tests/date_time/DatePeriod.test.js +179 -0
  24. package/tests/date_time/DateTime.test.js +492 -0
  25. package/tests/date_time/SqlDate.test.js +205 -0
  26. package/tests/date_time/SqlDateTime.test.js +326 -0
  27. package/tests/date_time/SqlTime.test.js +162 -0
  28. package/tests/date_time/TimestampUnix.test.js +262 -0
  29. package/tests/details_sub_array.test.js +367 -0
  30. package/tests/draw.test.js +271 -0
  31. package/tests/duration.test.js +365 -0
  32. package/tests/event_bus.test.js +268 -0
  33. package/tests/file.test.js +568 -0
  34. package/tests/flash_message.test.js +297 -0
  35. package/tests/form_date.test.js +1559 -0
  36. package/tests/form_helper.test.js +1065 -0
  37. package/tests/google_charts.test.js +768 -0
  38. package/tests/google_maps.test.js +655 -0
  39. package/tests/google_recaptcha.test.js +441 -0
  40. package/tests/http_client.test.js +570 -0
  41. package/tests/import_from_csv.test.js +797 -0
  42. package/tests/jwt.test.js +804 -0
  43. package/tests/list_box.test.js +255 -0
  44. package/tests/location.test.js +86 -0
  45. package/tests/media.test.js +473 -0
  46. package/tests/multi_files_input.test.js +1015 -0
  47. package/tests/multiple_action_in_table.test.js +477 -0
  48. package/tests/network.test.js +489 -0
  49. package/tests/number.test.js +448 -0
  50. package/tests/open_street_map.test.js +388 -0
  51. package/tests/paging.test.js +646 -0
  52. package/tests/select_all.test.js +360 -0
  53. package/tests/shopping_cart.test.js +355 -0
  54. package/tests/social_network.test.js +333 -0
  55. package/tests/sortable_list.test.js +602 -0
  56. package/tests/string.test.js +489 -0
  57. package/tests/user.test.js +204 -0
  58. package/tests/util.test.js +99 -0
  59. package/tests/visitor.test.js +508 -0
  60. package/tests/web_rtc.test.js +458 -0
  61. package/tests/web_socket.test.js +538 -0
  62. package/visitor.js +2 -2
  63. package/tmpclaude-0fa4-cwd +0 -1
  64. package/tmpclaude-104f-cwd +0 -1
  65. package/tmpclaude-1468-cwd +0 -1
  66. package/tmpclaude-324b-cwd +0 -1
  67. package/tmpclaude-35d3-cwd +0 -1
  68. package/tmpclaude-4aa8-cwd +0 -1
@@ -0,0 +1,268 @@
1
+ const { EventBus } = require('../event_bus');
2
+
3
+ describe('EventBus', () => {
4
+ let eventBus;
5
+
6
+ beforeEach(() => {
7
+ eventBus = new EventBus();
8
+ });
9
+
10
+ describe('constructor', () => {
11
+ test('should create an instance with empty events object', () => {
12
+ expect(eventBus.events).toEqual({});
13
+ });
14
+
15
+ test('should create a new EventBus instance', () => {
16
+ expect(eventBus).toBeInstanceOf(EventBus);
17
+ });
18
+ });
19
+
20
+ describe('subscribe', () => {
21
+ test('should subscribe a handler to an event', () => {
22
+ const handler = jest.fn();
23
+ eventBus.subscribe('test-event', handler);
24
+
25
+ expect(eventBus.events['test-event']).toContain(handler);
26
+ });
27
+
28
+ test('should allow multiple handlers for the same event', () => {
29
+ const handler1 = jest.fn();
30
+ const handler2 = jest.fn();
31
+
32
+ eventBus.subscribe('test-event', handler1);
33
+ eventBus.subscribe('test-event', handler2);
34
+
35
+ expect(eventBus.events['test-event']).toHaveLength(2);
36
+ expect(eventBus.events['test-event']).toContain(handler1);
37
+ expect(eventBus.events['test-event']).toContain(handler2);
38
+ });
39
+
40
+ test('should create event array if it does not exist', () => {
41
+ const handler = jest.fn();
42
+ eventBus.subscribe('new-event', handler);
43
+
44
+ expect(eventBus.events['new-event']).toEqual([handler]);
45
+ });
46
+
47
+ test('should allow subscribing to multiple different events', () => {
48
+ const handler1 = jest.fn();
49
+ const handler2 = jest.fn();
50
+
51
+ eventBus.subscribe('event1', handler1);
52
+ eventBus.subscribe('event2', handler2);
53
+
54
+ expect(eventBus.events['event1']).toContain(handler1);
55
+ expect(eventBus.events['event2']).toContain(handler2);
56
+ });
57
+
58
+ test('should allow subscribing same handler to multiple events', () => {
59
+ const handler = jest.fn();
60
+
61
+ eventBus.subscribe('event1', handler);
62
+ eventBus.subscribe('event2', handler);
63
+
64
+ expect(eventBus.events['event1']).toContain(handler);
65
+ expect(eventBus.events['event2']).toContain(handler);
66
+ });
67
+ });
68
+
69
+ describe('publish', () => {
70
+ test('should call subscribed handler when event is published', () => {
71
+ const handler = jest.fn();
72
+ eventBus.subscribe('test-event', handler);
73
+
74
+ eventBus.publish('test-event', { data: 'test' });
75
+
76
+ expect(handler).toHaveBeenCalledTimes(1);
77
+ expect(handler).toHaveBeenCalledWith({ data: 'test' });
78
+ });
79
+
80
+ test('should call all subscribed handlers', () => {
81
+ const handler1 = jest.fn();
82
+ const handler2 = jest.fn();
83
+ const handler3 = jest.fn();
84
+
85
+ eventBus.subscribe('test-event', handler1);
86
+ eventBus.subscribe('test-event', handler2);
87
+ eventBus.subscribe('test-event', handler3);
88
+
89
+ eventBus.publish('test-event', { data: 'test' });
90
+
91
+ expect(handler1).toHaveBeenCalledTimes(1);
92
+ expect(handler2).toHaveBeenCalledTimes(1);
93
+ expect(handler3).toHaveBeenCalledTimes(1);
94
+ });
95
+
96
+ test('should pass data to all handlers', () => {
97
+ const handler1 = jest.fn();
98
+ const handler2 = jest.fn();
99
+ const data = { message: 'hello', value: 42 };
100
+
101
+ eventBus.subscribe('test-event', handler1);
102
+ eventBus.subscribe('test-event', handler2);
103
+
104
+ eventBus.publish('test-event', data);
105
+
106
+ expect(handler1).toHaveBeenCalledWith(data);
107
+ expect(handler2).toHaveBeenCalledWith(data);
108
+ });
109
+
110
+ test('should do nothing if event has no handlers', () => {
111
+ expect(() => {
112
+ eventBus.publish('non-existent-event', { data: 'test' });
113
+ }).not.toThrow();
114
+ });
115
+
116
+ test('should publish with undefined data', () => {
117
+ const handler = jest.fn();
118
+ eventBus.subscribe('test-event', handler);
119
+
120
+ eventBus.publish('test-event');
121
+
122
+ expect(handler).toHaveBeenCalledWith(undefined);
123
+ });
124
+
125
+ test('should publish with null data', () => {
126
+ const handler = jest.fn();
127
+ eventBus.subscribe('test-event', handler);
128
+
129
+ eventBus.publish('test-event', null);
130
+
131
+ expect(handler).toHaveBeenCalledWith(null);
132
+ });
133
+
134
+ test('should publish multiple times', () => {
135
+ const handler = jest.fn();
136
+ eventBus.subscribe('test-event', handler);
137
+
138
+ eventBus.publish('test-event', { count: 1 });
139
+ eventBus.publish('test-event', { count: 2 });
140
+ eventBus.publish('test-event', { count: 3 });
141
+
142
+ expect(handler).toHaveBeenCalledTimes(3);
143
+ expect(handler).toHaveBeenNthCalledWith(1, { count: 1 });
144
+ expect(handler).toHaveBeenNthCalledWith(2, { count: 2 });
145
+ expect(handler).toHaveBeenNthCalledWith(3, { count: 3 });
146
+ });
147
+
148
+ test('should not affect other events', () => {
149
+ const handler1 = jest.fn();
150
+ const handler2 = jest.fn();
151
+
152
+ eventBus.subscribe('event1', handler1);
153
+ eventBus.subscribe('event2', handler2);
154
+
155
+ eventBus.publish('event1', { data: 'test' });
156
+
157
+ expect(handler1).toHaveBeenCalledTimes(1);
158
+ expect(handler2).not.toHaveBeenCalled();
159
+ });
160
+ });
161
+
162
+ describe('unsubscribe', () => {
163
+ test('should remove a subscribed handler', () => {
164
+ const handler = jest.fn();
165
+ eventBus.subscribe('test-event', handler);
166
+
167
+ eventBus.unsubscribe('test-event', handler);
168
+
169
+ eventBus.publish('test-event', { data: 'test' });
170
+ expect(handler).not.toHaveBeenCalled();
171
+ });
172
+
173
+ test('should remove only the specified handler', () => {
174
+ const handler1 = jest.fn();
175
+ const handler2 = jest.fn();
176
+ const handler3 = jest.fn();
177
+
178
+ eventBus.subscribe('test-event', handler1);
179
+ eventBus.subscribe('test-event', handler2);
180
+ eventBus.subscribe('test-event', handler3);
181
+
182
+ eventBus.unsubscribe('test-event', handler2);
183
+
184
+ eventBus.publish('test-event', { data: 'test' });
185
+
186
+ expect(handler1).toHaveBeenCalledTimes(1);
187
+ expect(handler2).not.toHaveBeenCalled();
188
+ expect(handler3).toHaveBeenCalledTimes(1);
189
+ });
190
+
191
+ test('should do nothing if event does not exist', () => {
192
+ const handler = jest.fn();
193
+
194
+ expect(() => {
195
+ eventBus.unsubscribe('non-existent-event', handler);
196
+ }).not.toThrow();
197
+ });
198
+
199
+ test('should do nothing if handler is not subscribed', () => {
200
+ const handler1 = jest.fn();
201
+ const handler2 = jest.fn();
202
+
203
+ eventBus.subscribe('test-event', handler1);
204
+
205
+ expect(() => {
206
+ eventBus.unsubscribe('test-event', handler2);
207
+ }).not.toThrow();
208
+ });
209
+
210
+ test('should handle multiple unsubscribes', () => {
211
+ const handler1 = jest.fn();
212
+ const handler2 = jest.fn();
213
+
214
+ eventBus.subscribe('test-event', handler1);
215
+ eventBus.subscribe('test-event', handler2);
216
+
217
+ eventBus.unsubscribe('test-event', handler1);
218
+ eventBus.unsubscribe('test-event', handler2);
219
+
220
+ eventBus.publish('test-event', { data: 'test' });
221
+
222
+ expect(handler1).not.toHaveBeenCalled();
223
+ expect(handler2).not.toHaveBeenCalled();
224
+ });
225
+ });
226
+
227
+ describe('integration', () => {
228
+ test('should handle subscribe-publish-unsubscribe flow', () => {
229
+ const handler = jest.fn();
230
+
231
+ eventBus.subscribe('test-event', handler);
232
+ eventBus.publish('test-event', { step: 1 });
233
+
234
+ expect(handler).toHaveBeenCalledTimes(1);
235
+
236
+ eventBus.unsubscribe('test-event', handler);
237
+ eventBus.publish('test-event', { step: 2 });
238
+
239
+ expect(handler).toHaveBeenCalledTimes(1); // Still 1, not called again
240
+ });
241
+
242
+ test('should handle multiple events with different handlers', () => {
243
+ const userHandler = jest.fn();
244
+ const orderHandler = jest.fn();
245
+
246
+ eventBus.subscribe('user-created', userHandler);
247
+ eventBus.subscribe('order-placed', orderHandler);
248
+
249
+ eventBus.publish('user-created', { userId: 123 });
250
+ eventBus.publish('order-placed', { orderId: 456 });
251
+
252
+ expect(userHandler).toHaveBeenCalledWith({ userId: 123 });
253
+ expect(orderHandler).toHaveBeenCalledWith({ orderId: 456 });
254
+ });
255
+
256
+ test('should handle re-subscribing after unsubscribe', () => {
257
+ const handler = jest.fn();
258
+
259
+ eventBus.subscribe('test-event', handler);
260
+ eventBus.unsubscribe('test-event', handler);
261
+ eventBus.subscribe('test-event', handler);
262
+
263
+ eventBus.publish('test-event', { data: 'test' });
264
+
265
+ expect(handler).toHaveBeenCalledTimes(1);
266
+ });
267
+ });
268
+ });