@thoughtspot/ts-chart-sdk 0.0.1-alpha.9 → 0.0.2-alpha.10

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 (174) hide show
  1. package/dist/ts-chart-sdk.d.ts +449 -31
  2. package/lib/index.d.ts +3 -0
  3. package/lib/index.d.ts.map +1 -1
  4. package/lib/index.js +3 -0
  5. package/lib/index.js.map +1 -1
  6. package/lib/main/custom-chart-context.d.ts +17 -5
  7. package/lib/main/custom-chart-context.d.ts.map +1 -1
  8. package/lib/main/custom-chart-context.js +74 -34
  9. package/lib/main/custom-chart-context.js.map +1 -1
  10. package/lib/main/custom-chart-context.spec.js +256 -257
  11. package/lib/main/custom-chart-context.spec.js.map +1 -1
  12. package/lib/main/post-message-event-bridge.d.ts +3 -3
  13. package/lib/main/post-message-event-bridge.d.ts.map +1 -1
  14. package/lib/main/post-message-event-bridge.js +24 -36
  15. package/lib/main/post-message-event-bridge.js.map +1 -1
  16. package/lib/main/post-message-event-bridge.spec.js +0 -2
  17. package/lib/main/post-message-event-bridge.spec.js.map +1 -1
  18. package/lib/main/util.d.ts +2 -0
  19. package/lib/main/util.d.ts.map +1 -0
  20. package/lib/main/util.js +9 -0
  21. package/lib/main/util.js.map +1 -0
  22. package/lib/react/use-custom-chart-context.spec.js +128 -121
  23. package/lib/react/use-custom-chart-context.spec.js.map +1 -1
  24. package/lib/test/test-conditional-formatting-utils.d.ts +5 -0
  25. package/lib/test/test-conditional-formatting-utils.d.ts.map +1 -0
  26. package/lib/test/test-conditional-formatting-utils.js +43 -0
  27. package/lib/test/test-conditional-formatting-utils.js.map +1 -0
  28. package/lib/types/answer-column.types.d.ts +54 -1
  29. package/lib/types/answer-column.types.d.ts.map +1 -1
  30. package/lib/types/answer-column.types.js +47 -0
  31. package/lib/types/answer-column.types.js.map +1 -1
  32. package/lib/types/common.types.d.ts +51 -4
  33. package/lib/types/common.types.d.ts.map +1 -1
  34. package/lib/types/common.types.js +15 -1
  35. package/lib/types/common.types.js.map +1 -1
  36. package/lib/types/conditional-formatting.types.d.ts +155 -0
  37. package/lib/types/conditional-formatting.types.d.ts.map +1 -0
  38. package/lib/types/conditional-formatting.types.js +60 -0
  39. package/lib/types/conditional-formatting.types.js.map +1 -0
  40. package/lib/types/configurator.types.d.ts +5 -0
  41. package/lib/types/configurator.types.d.ts.map +1 -1
  42. package/lib/types/ts-to-chart-event.types.d.ts +3 -0
  43. package/lib/types/ts-to-chart-event.types.d.ts.map +1 -1
  44. package/lib/types/ts-to-chart-event.types.js.map +1 -1
  45. package/lib/types/visual-prop.types.d.ts +3 -0
  46. package/lib/types/visual-prop.types.d.ts.map +1 -1
  47. package/lib/utils/conditional-formatting/conditional-formatting.d.ts +10 -0
  48. package/lib/utils/conditional-formatting/conditional-formatting.d.ts.map +1 -0
  49. package/lib/utils/conditional-formatting/conditional-formatting.js +103 -0
  50. package/lib/utils/conditional-formatting/conditional-formatting.js.map +1 -0
  51. package/lib/utils/conditional-formatting/conditional-formatting.spec.d.ts +2 -0
  52. package/lib/utils/conditional-formatting/conditional-formatting.spec.d.ts.map +1 -0
  53. package/lib/utils/conditional-formatting/conditional-formatting.spec.js +142 -0
  54. package/lib/utils/conditional-formatting/conditional-formatting.spec.js.map +1 -0
  55. package/lib/utils/date-formatting.d.ts +19 -0
  56. package/lib/utils/date-formatting.d.ts.map +1 -0
  57. package/lib/utils/date-formatting.js +56 -0
  58. package/lib/utils/date-formatting.js.map +1 -0
  59. package/lib/utils/date-formatting.spec.d.ts +2 -0
  60. package/lib/utils/date-formatting.spec.d.ts.map +1 -0
  61. package/lib/utils/date-formatting.spec.js +124 -0
  62. package/lib/utils/date-formatting.spec.js.map +1 -0
  63. package/package.json +10 -7
  64. package/src/index.ts +3 -0
  65. package/src/main/custom-chart-context.spec.ts +291 -266
  66. package/src/main/custom-chart-context.ts +164 -46
  67. package/src/main/post-message-event-bridge.spec.ts +0 -3
  68. package/src/main/post-message-event-bridge.ts +36 -62
  69. package/src/main/util.ts +11 -0
  70. package/src/react/use-custom-chart-context.spec.tsx +149 -122
  71. package/src/test/test-conditional-formatting-utils.ts +95 -0
  72. package/src/types/answer-column.types.ts +98 -0
  73. package/src/types/common.types.ts +82 -10
  74. package/src/types/conditional-formatting.types.ts +172 -0
  75. package/src/types/configurator.types.ts +21 -0
  76. package/src/types/ts-to-chart-event.types.ts +15 -0
  77. package/src/types/visual-prop.types.ts +7 -0
  78. package/src/utils/conditional-formatting/conditional-formatting.spec.ts +469 -0
  79. package/src/utils/conditional-formatting/conditional-formatting.ts +229 -0
  80. package/src/utils/date-formatting.spec.ts +168 -0
  81. package/src/utils/date-formatting.ts +109 -0
  82. package/cjs/index.d.ts +0 -9
  83. package/cjs/index.d.ts.map +0 -1
  84. package/cjs/index.js +0 -25
  85. package/cjs/index.js.map +0 -1
  86. package/cjs/main/custom-chart-context.d.ts +0 -47
  87. package/cjs/main/custom-chart-context.d.ts.map +0 -1
  88. package/cjs/main/custom-chart-context.js +0 -326
  89. package/cjs/main/custom-chart-context.js.map +0 -1
  90. package/cjs/main/custom-chart-context.spec.d.ts +0 -2
  91. package/cjs/main/custom-chart-context.spec.d.ts.map +0 -1
  92. package/cjs/main/custom-chart-context.spec.js +0 -699
  93. package/cjs/main/custom-chart-context.spec.js.map +0 -1
  94. package/cjs/main/post-message-event-bridge.d.ts +0 -6
  95. package/cjs/main/post-message-event-bridge.d.ts.map +0 -1
  96. package/cjs/main/post-message-event-bridge.js +0 -46
  97. package/cjs/main/post-message-event-bridge.js.map +0 -1
  98. package/cjs/main/post-message-event-bridge.spec.d.ts +0 -2
  99. package/cjs/main/post-message-event-bridge.spec.d.ts.map +0 -1
  100. package/cjs/main/post-message-event-bridge.spec.js +0 -124
  101. package/cjs/main/post-message-event-bridge.spec.js.map +0 -1
  102. package/cjs/react/custom-chart-context-service.d.ts +0 -33
  103. package/cjs/react/custom-chart-context-service.d.ts.map +0 -1
  104. package/cjs/react/custom-chart-context-service.js +0 -118
  105. package/cjs/react/custom-chart-context-service.js.map +0 -1
  106. package/cjs/react/custom-chart.context.d.ts +0 -26
  107. package/cjs/react/custom-chart.context.d.ts.map +0 -1
  108. package/cjs/react/custom-chart.context.js +0 -105
  109. package/cjs/react/custom-chart.context.js.map +0 -1
  110. package/cjs/react/custom-chart.spec.d.ts +0 -2
  111. package/cjs/react/custom-chart.spec.d.ts.map +0 -1
  112. package/cjs/react/custom-chart.spec.js +0 -72
  113. package/cjs/react/custom-chart.spec.js.map +0 -1
  114. package/cjs/react/mocks/custom-chart-context-mock.d.ts +0 -3
  115. package/cjs/react/mocks/custom-chart-context-mock.d.ts.map +0 -1
  116. package/cjs/react/mocks/custom-chart-context-mock.js +0 -100
  117. package/cjs/react/mocks/custom-chart-context-mock.js.map +0 -1
  118. package/cjs/react/use-custom-chart-context.d.ts +0 -4
  119. package/cjs/react/use-custom-chart-context.d.ts.map +0 -1
  120. package/cjs/react/use-custom-chart-context.js +0 -95
  121. package/cjs/react/use-custom-chart-context.js.map +0 -1
  122. package/cjs/react/use-custom-chart-context.spec.d.ts +0 -2
  123. package/cjs/react/use-custom-chart-context.spec.d.ts.map +0 -1
  124. package/cjs/react/use-custom-chart-context.spec.js +0 -391
  125. package/cjs/react/use-custom-chart-context.spec.js.map +0 -1
  126. package/cjs/react/use-custom-chart-context.util.d.ts +0 -6
  127. package/cjs/react/use-custom-chart-context.util.d.ts.map +0 -1
  128. package/cjs/react/use-custom-chart-context.util.js +0 -60
  129. package/cjs/react/use-custom-chart-context.util.js.map +0 -1
  130. package/cjs/react/use-custom-chart-types.d.ts +0 -23
  131. package/cjs/react/use-custom-chart-types.d.ts.map +0 -1
  132. package/cjs/react/use-custom-chart-types.js +0 -3
  133. package/cjs/react/use-custom-chart-types.js.map +0 -1
  134. package/cjs/test/test-utils.d.ts +0 -7
  135. package/cjs/test/test-utils.d.ts.map +0 -1
  136. package/cjs/test/test-utils.js +0 -14
  137. package/cjs/test/test-utils.js.map +0 -1
  138. package/cjs/types/answer-column.types.d.ts +0 -69
  139. package/cjs/types/answer-column.types.d.ts.map +0 -1
  140. package/cjs/types/answer-column.types.js +0 -59
  141. package/cjs/types/answer-column.types.js.map +0 -1
  142. package/cjs/types/chart-to-ts-event.types.d.ts +0 -98
  143. package/cjs/types/chart-to-ts-event.types.d.ts.map +0 -1
  144. package/cjs/types/chart-to-ts-event.types.js +0 -32
  145. package/cjs/types/chart-to-ts-event.types.js.map +0 -1
  146. package/cjs/types/common.types.d.ts +0 -51
  147. package/cjs/types/common.types.d.ts.map +0 -1
  148. package/cjs/types/common.types.js +0 -3
  149. package/cjs/types/common.types.js.map +0 -1
  150. package/cjs/types/configurator.types.d.ts +0 -15
  151. package/cjs/types/configurator.types.d.ts.map +0 -1
  152. package/cjs/types/configurator.types.js +0 -3
  153. package/cjs/types/configurator.types.js.map +0 -1
  154. package/cjs/types/ts-to-chart-event.types.d.ts +0 -91
  155. package/cjs/types/ts-to-chart-event.types.d.ts.map +0 -1
  156. package/cjs/types/ts-to-chart-event.types.js +0 -18
  157. package/cjs/types/ts-to-chart-event.types.js.map +0 -1
  158. package/cjs/types/visual-prop.types.d.ts +0 -73
  159. package/cjs/types/visual-prop.types.d.ts.map +0 -1
  160. package/cjs/types/visual-prop.types.js +0 -3
  161. package/cjs/types/visual-prop.types.js.map +0 -1
  162. package/lib/dist/ts-chart-sdk.d.ts +0 -312
  163. package/lib/react/custom-chart-context-service.d.ts +0 -33
  164. package/lib/react/custom-chart-context-service.d.ts.map +0 -1
  165. package/lib/react/custom-chart-context-service.js +0 -91
  166. package/lib/react/custom-chart-context-service.js.map +0 -1
  167. package/lib/react/custom-chart.context.d.ts +0 -26
  168. package/lib/react/custom-chart.context.d.ts.map +0 -1
  169. package/lib/react/custom-chart.context.js +0 -78
  170. package/lib/react/custom-chart.context.js.map +0 -1
  171. package/lib/react/custom-chart.spec.d.ts +0 -2
  172. package/lib/react/custom-chart.spec.d.ts.map +0 -1
  173. package/lib/react/custom-chart.spec.js +0 -67
  174. package/lib/react/custom-chart.spec.js.map +0 -1
@@ -4,7 +4,6 @@ import { ChartToTSEvent, ErrorType } from '../types/chart-to-ts-event.types';
4
4
  import { TSToChartEvent } from '../types/ts-to-chart-event.types';
5
5
  import { CustomChartContext, getChartContext } from './custom-chart-context';
6
6
  import * as PostMessageEventBridge from './post-message-event-bridge';
7
- jest.mock('./post-message-event-bridge');
8
7
  jest.spyOn(console, 'log').mockImplementation(() => {
9
8
  });
10
9
  describe('CustomChartContext', () => {
@@ -20,6 +19,7 @@ describe('CustomChartContext', () => {
20
19
  renderChart = jest.fn();
21
20
  mockInitMessage.mockImplementation((fn) => {
22
21
  eventProcessor = fn;
22
+ return () => null;
23
23
  });
24
24
  mockPostMessageToHost.mockImplementation(() => {
25
25
  return global.Promise.resolve();
@@ -54,54 +54,90 @@ describe('CustomChartContext', () => {
54
54
  test('should return a promise that resolves when the chart context is initialized', async () => {
55
55
  expect(mockInitMessage).toHaveBeenCalled();
56
56
  const promise = customChartContext.initialize();
57
- const mockPostMessage = jest.fn();
58
- eventProcessor({
59
- data: {
60
- payload: mockInitializeContextPayload,
61
- eventType: TSToChartEvent.Initialize,
62
- source: 'ts-host-app',
63
- },
64
- ports: [{ postMessage: mockPostMessage }],
57
+ const initResp = await eventProcessor({
58
+ payload: mockInitializeContextPayload,
59
+ eventType: TSToChartEvent.Initialize,
65
60
  });
66
61
  eventProcessor({
67
- data: {
68
- payload: {},
69
- eventType: TSToChartEvent.InitializeComplete,
70
- source: 'ts-host-app',
71
- },
72
- ports: [{ postMessage: mockPostMessage }],
62
+ payload: {},
63
+ eventType: TSToChartEvent.InitializeComplete,
73
64
  });
74
65
  await expect(promise).resolves.toBeUndefined();
75
- expect(mockPostMessage).toHaveBeenCalledTimes(2);
76
- expect(mockPostMessage.mock.calls[0][0]).toEqual({
66
+ expect(initResp).toEqual({
77
67
  isConfigValid: false,
78
68
  defaultChartConfig: undefined,
79
69
  chartConfigEditorDefinition: undefined,
80
70
  visualPropEditorDefinition: undefined,
71
+ allowedConfigurations: {
72
+ allowColumnNumberFormatting: false,
73
+ allowColumnConditionalFormatting: false,
74
+ allowMeasureNamesAndValues: false,
75
+ },
81
76
  });
82
- expect(mockPostMessage).toHaveBeenCalled();
83
77
  expect(mockPostMessageToHost).not.toHaveBeenCalled();
84
78
  });
85
- test('multiple intializations should throw an error', async () => {
79
+ test('type check string for visualProps on initialize payload should not throw an error.', async () => {
80
+ expect(mockInitMessage).toHaveBeenCalled();
86
81
  const promise = customChartContext.initialize();
87
- const mockPostMessage = jest.fn();
88
- eventProcessor({
89
- data: {
90
- payload: mockInitializeContextPayload,
91
- eventType: TSToChartEvent.Initialize,
92
- source: 'ts-host-app',
82
+ const mockInitializeContextPayloadWithVisualProps = {
83
+ ...mockInitializeContextPayload,
84
+ chartModel: {
85
+ ...mockInitializeContextPayload.chartModel,
86
+ visualProps: 'visualPropStringPayload',
93
87
  },
94
- ports: [{ postMessage: mockPostMessage }],
88
+ };
89
+ await eventProcessor({
90
+ payload: mockInitializeContextPayloadWithVisualProps,
91
+ eventType: TSToChartEvent.Initialize,
95
92
  });
96
93
  eventProcessor({
97
- data: {
98
- payload: {},
99
- eventType: TSToChartEvent.InitializeComplete,
100
- source: 'ts-host-app',
94
+ payload: {},
95
+ eventType: TSToChartEvent.InitializeComplete,
96
+ });
97
+ await expect(promise).resolves.toBeUndefined();
98
+ const chartModel = customChartContext.getChartModel();
99
+ expect(typeof chartModel.visualProps).toEqual('string');
100
+ expect(chartModel.visualProps).toEqual('visualPropStringPayload');
101
+ expect(mockPostMessageToHost).not.toHaveBeenCalled();
102
+ });
103
+ test('type check object for visualProps on initialize payload should not throw an error.', async () => {
104
+ expect(mockInitMessage).toHaveBeenCalled();
105
+ const promise = customChartContext.initialize();
106
+ const mockInitializeContextPayloadWithVisualProps = {
107
+ ...mockInitializeContextPayload,
108
+ chartModel: {
109
+ ...mockInitializeContextPayload.chartModel,
110
+ visualProps: {
111
+ data: 'sample data',
112
+ },
101
113
  },
102
- ports: [{ postMessage: mockPostMessage }],
114
+ };
115
+ await eventProcessor({
116
+ payload: mockInitializeContextPayloadWithVisualProps,
117
+ eventType: TSToChartEvent.Initialize,
118
+ });
119
+ eventProcessor({
120
+ payload: {},
121
+ eventType: TSToChartEvent.InitializeComplete,
103
122
  });
104
123
  await expect(promise).resolves.toBeUndefined();
124
+ const chartModel = customChartContext.getChartModel();
125
+ expect(typeof chartModel.visualProps).toEqual('object');
126
+ expect(chartModel.visualProps).toEqual({
127
+ data: 'sample data',
128
+ });
129
+ expect(mockPostMessageToHost).not.toHaveBeenCalled();
130
+ });
131
+ test('multiple intializations should throw an error', async () => {
132
+ getChartContext({
133
+ getDefaultChartConfig,
134
+ getQueriesFromChartConfig,
135
+ renderChart,
136
+ });
137
+ eventProcessor({
138
+ payload: {},
139
+ eventType: TSToChartEvent.InitializeComplete,
140
+ });
105
141
  let error;
106
142
  try {
107
143
  customChartContext = new CustomChartContext({
@@ -141,120 +177,169 @@ describe('CustomChartContext', () => {
141
177
  customChartContext.destroy();
142
178
  eventProcessor = null;
143
179
  });
144
- test('should not trigger post message if host is not accurate', () => {
145
- expect(mockInitMessage).toHaveBeenCalled();
146
- const mockPostMessage = jest.fn();
147
- eventProcessor({
148
- data: {
149
- payload: mockInitializeContextPayload,
150
- eventType: TSToChartEvent.ChartConfigValidate,
151
- source: 'incorrect-source',
180
+ test('TSToChartEvent.ChartConfigValidate validation response testing', async () => {
181
+ customChartContext = new CustomChartContext({
182
+ getDefaultChartConfig,
183
+ getQueriesFromChartConfig,
184
+ renderChart,
185
+ visualPropEditorDefinition: { elements: [] },
186
+ chartConfigEditorDefinition: [],
187
+ });
188
+ const responseWithInitialContext = await eventProcessor({
189
+ payload: mockInitializeContextPayload,
190
+ eventType: TSToChartEvent.ChartConfigValidate,
191
+ source: 'ts-host-app',
192
+ });
193
+ expect(responseWithInitialContext).toStrictEqual({
194
+ isValid: true,
195
+ visualPropEditorDefinition: { elements: [] },
196
+ chartConfigEditorDefinition: [],
197
+ });
198
+ customChartContext = new CustomChartContext({
199
+ getDefaultChartConfig,
200
+ getQueriesFromChartConfig,
201
+ renderChart,
202
+ visualPropEditorDefinition: () => {
203
+ return { elements: [] };
204
+ },
205
+ chartConfigEditorDefinition: () => {
206
+ return [
207
+ {
208
+ key: 'x',
209
+ columnSections: [{ label: 'x-axis', key: 'x' }],
210
+ },
211
+ ];
152
212
  },
153
- ports: [{ postMessage: mockPostMessage }],
154
213
  });
155
- expect(mockPostMessage).not.toHaveBeenCalled();
214
+ const responseWithUpdatedContext = await eventProcessor({
215
+ payload: mockInitializeContextPayload,
216
+ eventType: TSToChartEvent.ChartConfigValidate,
217
+ source: 'ts-host-app',
218
+ });
219
+ expect(responseWithUpdatedContext).toStrictEqual({
220
+ isValid: true,
221
+ visualPropEditorDefinition: { elements: [] },
222
+ chartConfigEditorDefinition: [
223
+ {
224
+ key: 'x',
225
+ columnSections: [{ label: 'x-axis', key: 'x' }],
226
+ },
227
+ ],
228
+ });
156
229
  });
157
- test('default internal function testing', () => {
158
- expect(mockInitMessage).toHaveBeenCalled();
159
- const mockPostMessage = jest.fn();
160
- eventProcessor({
161
- data: {
162
- payload: mockInitializeContextPayload,
163
- eventType: TSToChartEvent.ChartConfigValidate,
164
- source: 'ts-host-app',
165
- },
166
- ports: [{ postMessage: mockPostMessage }],
230
+ test('TSToChartEvent.validateVisualProps validation response testing', () => {
231
+ customChartContext = new CustomChartContext({
232
+ getDefaultChartConfig,
233
+ getQueriesFromChartConfig,
234
+ renderChart,
235
+ visualPropEditorDefinition: { elements: [] },
236
+ chartConfigEditorDefinition: [],
237
+ });
238
+ const responseWithInitialContext = eventProcessor({
239
+ payload: mockInitializeContextPayload,
240
+ eventType: TSToChartEvent.VisualPropsValidate,
241
+ source: 'ts-host-app',
167
242
  });
168
- expect(mockPostMessage).toHaveBeenCalledWith({
243
+ expect(responseWithInitialContext).toStrictEqual({
169
244
  isValid: true,
245
+ visualPropEditorDefinition: { elements: [] },
246
+ chartConfigEditorDefinition: [],
170
247
  });
171
- mockPostMessage.mockReset();
172
- eventProcessor({
173
- data: {
174
- payload: mockInitializeContextPayload,
175
- eventType: TSToChartEvent.VisualPropsValidate,
176
- source: 'ts-host-app',
248
+ customChartContext = new CustomChartContext({
249
+ getDefaultChartConfig,
250
+ getQueriesFromChartConfig,
251
+ renderChart,
252
+ visualPropEditorDefinition: () => {
253
+ return { elements: [] };
254
+ },
255
+ chartConfigEditorDefinition: () => {
256
+ return [
257
+ {
258
+ key: 'x',
259
+ columnSections: [{ label: 'x-axis', key: 'x' }],
260
+ },
261
+ ];
177
262
  },
178
- ports: [{ postMessage: mockPostMessage }],
179
263
  });
180
- expect(mockPostMessage).toHaveBeenCalledWith({
264
+ const responseWithFunctionReturnedValues = eventProcessor({
265
+ payload: mockInitializeContextPayload,
266
+ eventType: TSToChartEvent.VisualPropsValidate,
267
+ source: 'ts-host-app',
268
+ });
269
+ expect(responseWithFunctionReturnedValues).toStrictEqual({
181
270
  isValid: true,
271
+ visualPropEditorDefinition: { elements: [] },
272
+ chartConfigEditorDefinition: [
273
+ {
274
+ key: 'x',
275
+ columnSections: [{ label: 'x-axis', key: 'x' }],
276
+ },
277
+ ],
182
278
  });
183
- mockPostMessage.mockReset();
184
- eventProcessor({
185
- data: {
186
- payload: mockInitializeContextPayload,
187
- eventType: TSToChartEvent.TriggerRenderChart,
188
- source: 'ts-host-app',
189
- },
190
- ports: [{ postMessage: mockPostMessage }],
279
+ });
280
+ test('should not trigger post message if host is not accurate', async () => {
281
+ expect(mockInitMessage).toHaveBeenCalled();
282
+ const validateChartConfigResp = await eventProcessor({
283
+ payload: mockInitializeContextPayload,
284
+ eventType: TSToChartEvent.ChartConfigValidate,
285
+ });
286
+ expect(validateChartConfigResp).toEqual({
287
+ isValid: true,
288
+ });
289
+ const validateVisualPropsResp = await eventProcessor({
290
+ payload: mockInitializeContextPayload,
291
+ eventType: TSToChartEvent.VisualPropsValidate,
292
+ });
293
+ expect(validateVisualPropsResp).toEqual({
294
+ isValid: true,
295
+ });
296
+ const renderResp = await eventProcessor({
297
+ payload: mockInitializeContextPayload,
298
+ eventType: TSToChartEvent.TriggerRenderChart,
191
299
  });
192
- expect(mockPostMessage).toHaveBeenCalledWith({});
193
300
  expect(renderChart).toHaveBeenCalled();
194
- mockPostMessage.mockReset();
195
301
  eventProcessor({
196
- data: {
197
- payload: mockInitializeContextPayload,
198
- eventType: TSToChartEvent.GetDataQuery,
199
- source: 'ts-host-app',
200
- },
201
- ports: [{ postMessage: mockPostMessage }],
302
+ payload: mockInitializeContextPayload,
303
+ eventType: TSToChartEvent.GetDataQuery,
202
304
  });
203
- expect(mockPostMessage).toHaveBeenCalledWith({});
204
305
  expect(getQueriesFromChartConfig).toHaveBeenCalled();
205
306
  });
206
- test('default external function testing', () => {
307
+ test('default external function testing', async () => {
207
308
  expect(mockInitMessage).toHaveBeenCalled();
208
- const mockPostMessage = jest.fn();
209
- eventProcessor({
210
- data: {
211
- payload: {
212
- data: 'random data',
213
- },
214
- eventType: TSToChartEvent.DataUpdate,
215
- source: 'ts-host-app',
309
+ const dataUpdateResp = await eventProcessor({
310
+ payload: {
311
+ data: 'random data',
216
312
  },
217
- ports: [{ postMessage: mockPostMessage }],
313
+ eventType: TSToChartEvent.DataUpdate,
218
314
  });
219
- expect(mockPostMessage).toHaveBeenCalledWith({
315
+ expect(dataUpdateResp).toEqual({
220
316
  triggerRenderChart: true,
221
317
  });
222
318
  expect(customChartContext.getChartModel().data).toBe('random data');
223
- mockPostMessage.mockReset();
224
- eventProcessor({
225
- data: {
226
- payload: {
227
- chartModel: {
228
- data: 'random data2',
229
- visualProps: null,
230
- },
319
+ const modelUpdateResp = await eventProcessor({
320
+ payload: {
321
+ chartModel: {
322
+ data: 'random data2',
323
+ visualProps: null,
231
324
  },
232
- eventType: TSToChartEvent.ChartModelUpdate,
233
- source: 'ts-host-app',
234
325
  },
235
- ports: [{ postMessage: mockPostMessage }],
326
+ eventType: TSToChartEvent.ChartModelUpdate,
236
327
  });
237
- expect(mockPostMessage).toHaveBeenCalledWith({
328
+ expect(modelUpdateResp).toEqual({
238
329
  triggerRenderChart: true,
239
330
  });
240
331
  expect(customChartContext.getChartModel().data).toBe('random data2');
241
332
  expect(customChartContext.getChartModel().visualProps).toBe(null);
242
- mockPostMessage.mockReset();
243
- eventProcessor({
244
- data: {
245
- payload: {
246
- visualProps: 'random data',
247
- },
248
- eventType: TSToChartEvent.VisualPropsUpdate,
249
- source: 'ts-host-app',
333
+ const visualPropsUpdateResp = await eventProcessor({
334
+ payload: {
335
+ visualProps: 'random data',
250
336
  },
251
- ports: [{ postMessage: mockPostMessage }],
337
+ eventType: TSToChartEvent.VisualPropsUpdate,
252
338
  });
253
- expect(mockPostMessage).toHaveBeenCalledWith({
339
+ expect(visualPropsUpdateResp).toEqual({
254
340
  triggerRenderChart: true,
255
341
  });
256
342
  expect(customChartContext.getChartModel().visualProps).toBe('random data');
257
- mockPostMessage.mockReset();
258
343
  customChartContext.axisMenuCustomActionPreProcessor([
259
344
  {
260
345
  customActions: [
@@ -267,20 +352,16 @@ describe('CustomChartContext', () => {
267
352
  ],
268
353
  },
269
354
  ]);
270
- eventProcessor({
271
- data: {
272
- payload: {
273
- customAction: {
274
- id: 'custom-action-1',
275
- columnIds: ['9f96b5b0-f7e4-4a5e-aa11-4c77fdf42125'],
276
- },
355
+ const axisMenuClickResp = await eventProcessor({
356
+ payload: {
357
+ customAction: {
358
+ id: 'custom-action-1',
359
+ columnIds: ['9f96b5b0-f7e4-4a5e-aa11-4c77fdf42125'],
277
360
  },
278
- eventType: TSToChartEvent.AxisMenuActionClick,
279
- source: 'ts-host-app',
280
361
  },
281
- ports: [{ postMessage: mockPostMessage }],
362
+ eventType: TSToChartEvent.AxisMenuActionClick,
282
363
  });
283
- expect(mockPostMessage).toHaveBeenCalledWith({
364
+ expect(axisMenuClickResp).toEqual({
284
365
  isValid: true,
285
366
  });
286
367
  customChartContext.contextMenuCustomActionPreProcessor([
@@ -295,20 +376,16 @@ describe('CustomChartContext', () => {
295
376
  ],
296
377
  },
297
378
  ]);
298
- eventProcessor({
299
- data: {
300
- payload: {
301
- customAction: {
302
- id: 'custom-action-1',
303
- columnIds: ['9f96b5b0-f7e4-4a5e-aa11-4c77fdf42125'],
304
- },
379
+ const ctxMenuResp = await eventProcessor({
380
+ payload: {
381
+ customAction: {
382
+ id: 'custom-action-1',
383
+ columnIds: ['9f96b5b0-f7e4-4a5e-aa11-4c77fdf42125'],
305
384
  },
306
- eventType: TSToChartEvent.ContextMenuActionClick,
307
- source: 'ts-host-app',
308
385
  },
309
- ports: [{ postMessage: mockPostMessage }],
386
+ eventType: TSToChartEvent.ContextMenuActionClick,
310
387
  });
311
- expect(mockPostMessage).toHaveBeenCalledWith({
388
+ expect(ctxMenuResp).toEqual({
312
389
  isValid: true,
313
390
  });
314
391
  });
@@ -317,30 +394,20 @@ describe('CustomChartContext', () => {
317
394
  const TEST_EVENT_TYPE = 'testEventType';
318
395
  const testCallbackFn = jest.fn();
319
396
  customChartContext.on(TEST_EVENT_TYPE, testCallbackFn);
320
- const mockPostMessage = jest.fn();
321
397
  eventProcessor({
322
- data: {
323
- payload: mockInitializeContextPayload,
324
- eventType: TEST_EVENT_TYPE,
325
- source: 'ts-host-app',
326
- },
327
- ports: [{ postMessage: mockPostMessage }],
398
+ payload: mockInitializeContextPayload,
399
+ eventType: TEST_EVENT_TYPE,
328
400
  });
329
401
  expect(testCallbackFn).toHaveBeenCalled();
330
402
  });
331
- test('should respond with an error to an unspecified event type', () => {
403
+ test('should respond with an error to an unspecified event type', async () => {
332
404
  expect(mockInitMessage).toHaveBeenCalled();
333
405
  const TEST_EVENT_TYPE = 'testEventType';
334
- const mockPostMessage = jest.fn();
335
- eventProcessor({
336
- data: {
337
- payload: mockInitializeContextPayload,
338
- eventType: TEST_EVENT_TYPE,
339
- source: 'ts-host-app',
340
- },
341
- ports: [{ postMessage: mockPostMessage }],
406
+ const resp = await eventProcessor({
407
+ payload: mockInitializeContextPayload,
408
+ eventType: TEST_EVENT_TYPE,
342
409
  });
343
- expect(mockPostMessage).toHaveBeenCalledWith({
410
+ expect(resp).toEqual({
344
411
  hasError: true,
345
412
  error: `Event type not recognised or processed: ${TEST_EVENT_TYPE}`,
346
413
  });
@@ -364,14 +431,9 @@ describe('CustomChartContext', () => {
364
431
  const TEST_EVENT_TYPE = 'testEventType';
365
432
  const testCallbackFn = jest.fn();
366
433
  customChartContext.on(TEST_EVENT_TYPE, testCallbackFn);
367
- const mockPostMessage = jest.fn();
368
434
  eventProcessor({
369
- data: {
370
- payload: mockInitializeContextPayload,
371
- eventType: TEST_EVENT_TYPE,
372
- source: 'ts-host-app',
373
- },
374
- ports: [{ postMessage: mockPostMessage }],
435
+ payload: mockInitializeContextPayload,
436
+ eventType: TEST_EVENT_TYPE,
375
437
  });
376
438
  customChartContext.off(TEST_EVENT_TYPE);
377
439
  expect(testCallbackFn).toHaveBeenCalled();
@@ -386,22 +448,13 @@ describe('CustomChartContext', () => {
386
448
  customChartContext.on(TEST_EVENT_TYPE_2, testCallbackFn2);
387
449
  expect(customChartContext.eventListeners[TEST_EVENT_TYPE_1]).toHaveLength(1);
388
450
  expect(customChartContext.eventListeners[TEST_EVENT_TYPE_2]).toHaveLength(1);
389
- const mockPostMessage = jest.fn();
390
451
  eventProcessor({
391
- data: {
392
- payload: {},
393
- eventType: TEST_EVENT_TYPE_1,
394
- source: 'ts-host-app',
395
- },
396
- ports: [{ postMessage: mockPostMessage }],
452
+ payload: {},
453
+ eventType: TEST_EVENT_TYPE_1,
397
454
  });
398
455
  eventProcessor({
399
- data: {
400
- payload: {},
401
- eventType: TEST_EVENT_TYPE_2,
402
- source: 'ts-host-app',
403
- },
404
- ports: [{ postMessage: mockPostMessage }],
456
+ payload: {},
457
+ eventType: TEST_EVENT_TYPE_2,
405
458
  });
406
459
  expect(testCallbackFn1).toHaveBeenCalled();
407
460
  expect(testCallbackFn2).toHaveBeenCalled();
@@ -437,26 +490,16 @@ describe('CustomChartContext', () => {
437
490
  await expect(result).rejects.toBeDefined();
438
491
  });
439
492
  test('should resolve the promise if the chart context is initialized', async () => {
440
- const mockPostMessage = jest.fn();
441
493
  eventProcessor({
442
- data: {
443
- payload: mockInitializeContextPayload,
444
- eventType: TSToChartEvent.Initialize,
445
- source: 'ts-host-app',
446
- },
447
- ports: [{ postMessage: mockPostMessage }],
494
+ payload: mockInitializeContextPayload,
495
+ eventType: TSToChartEvent.Initialize,
448
496
  });
449
497
  eventProcessor({
450
- data: {
451
- payload: {},
452
- eventType: TSToChartEvent.InitializeComplete,
453
- source: 'ts-host-app',
454
- },
455
- ports: [{ postMessage: mockPostMessage }],
498
+ payload: {},
499
+ eventType: TSToChartEvent.InitializeComplete,
456
500
  });
457
501
  const promise = customChartContext.initialize();
458
502
  await expect(promise).resolves.toBeUndefined();
459
- expect(mockPostMessage).toHaveBeenCalledTimes(2);
460
503
  let resolve;
461
504
  mockPostMessageToHost.mockImplementation(() => new global.Promise((res) => {
462
505
  resolve = res;
@@ -477,24 +520,15 @@ describe('CustomChartContext', () => {
477
520
  expect(mockPostMessageToHost).toHaveBeenCalledWith(mockInitializeContextPayload.componentId, mockInitializeContextPayload.hostUrl, null, ChartToTSEvent.RenderStart);
478
521
  });
479
522
  test('should process the event payload for context menu custom actions', async () => {
480
- const mockPostMessage = jest.fn();
481
523
  const mockCustomAction = jest.fn();
482
524
  let resolve;
483
525
  eventProcessor({
484
- data: {
485
- payload: mockInitializeContextPayload,
486
- eventType: TSToChartEvent.Initialize,
487
- source: 'ts-host-app',
488
- },
489
- ports: [{ postMessage: mockPostMessage }],
526
+ payload: mockInitializeContextPayload,
527
+ eventType: TSToChartEvent.Initialize,
490
528
  });
491
529
  eventProcessor({
492
- data: {
493
- payload: {},
494
- eventType: TSToChartEvent.InitializeComplete,
495
- source: 'ts-host-app',
496
- },
497
- ports: [{ postMessage: mockPostMessage }],
530
+ payload: {},
531
+ eventType: TSToChartEvent.InitializeComplete,
498
532
  });
499
533
  customChartContext.initialize();
500
534
  mockPostMessageToHost.mockImplementation(() => new global.Promise((res) => {
@@ -522,19 +556,15 @@ describe('CustomChartContext', () => {
522
556
  ],
523
557
  }, TEST_EVENT_TYPE);
524
558
  eventProcessor({
525
- data: {
526
- payload: {
527
- customAction: {
528
- id: 'custom-action-1',
529
- clickedPoint: {},
530
- event: {},
531
- selectedPoints: [{}],
532
- },
559
+ payload: {
560
+ customAction: {
561
+ id: 'custom-action-1',
562
+ clickedPoint: {},
563
+ event: {},
564
+ selectedPoints: [{}],
533
565
  },
534
- eventType: TSToChartEvent.ContextMenuActionClick,
535
- source: 'ts-host-app',
536
566
  },
537
- ports: [{ postMessage: mockPostMessage }],
567
+ eventType: TSToChartEvent.ContextMenuActionClick,
538
568
  });
539
569
  expect(mockCustomAction).toHaveBeenCalled();
540
570
  expect(mockCustomAction).toHaveBeenCalledWith({
@@ -545,24 +575,15 @@ describe('CustomChartContext', () => {
545
575
  });
546
576
  });
547
577
  test('should process the event payload for axis menu custom actions', async () => {
548
- const mockPostMessage = jest.fn();
549
578
  const mockCustomAction = jest.fn();
550
579
  let resolve;
551
580
  eventProcessor({
552
- data: {
553
- payload: mockInitializeContextPayload,
554
- eventType: TSToChartEvent.Initialize,
555
- source: 'ts-host-app',
556
- },
557
- ports: [{ postMessage: mockPostMessage }],
581
+ payload: mockInitializeContextPayload,
582
+ eventType: TSToChartEvent.Initialize,
558
583
  });
559
584
  eventProcessor({
560
- data: {
561
- payload: {},
562
- eventType: TSToChartEvent.InitializeComplete,
563
- source: 'ts-host-app',
564
- },
565
- ports: [{ postMessage: mockPostMessage }],
585
+ payload: {},
586
+ eventType: TSToChartEvent.InitializeComplete,
566
587
  });
567
588
  customChartContext.initialize();
568
589
  mockPostMessageToHost.mockImplementation(() => new global.Promise((res) => {
@@ -590,18 +611,14 @@ describe('CustomChartContext', () => {
590
611
  ],
591
612
  }, TEST_EVENT_TYPE);
592
613
  eventProcessor({
593
- data: {
594
- payload: {
595
- customAction: {
596
- id: 'custom-action-1',
597
- columnIds: ['123'],
598
- event: {},
599
- },
614
+ payload: {
615
+ customAction: {
616
+ id: 'custom-action-1',
617
+ columnIds: ['123'],
618
+ event: {},
600
619
  },
601
- eventType: TSToChartEvent.AxisMenuActionClick,
602
- source: 'ts-host-app',
603
620
  },
604
- ports: [{ postMessage: mockPostMessage }],
621
+ eventType: TSToChartEvent.AxisMenuActionClick,
605
622
  });
606
623
  expect(mockCustomAction).toHaveBeenCalled();
607
624
  expect(mockCustomAction).toHaveBeenCalledWith({
@@ -611,23 +628,14 @@ describe('CustomChartContext', () => {
611
628
  });
612
629
  });
613
630
  test('should process the event payload for axis menu when custom actions are not defined', async () => {
614
- const mockPostMessage = jest.fn();
615
631
  let resolve;
616
632
  eventProcessor({
617
- data: {
618
- payload: mockInitializeContextPayload,
619
- eventType: TSToChartEvent.Initialize,
620
- source: 'ts-host-app',
621
- },
622
- ports: [{ postMessage: mockPostMessage }],
633
+ payload: mockInitializeContextPayload,
634
+ eventType: TSToChartEvent.Initialize,
623
635
  });
624
636
  eventProcessor({
625
- data: {
626
- payload: {},
627
- eventType: TSToChartEvent.InitializeComplete,
628
- source: 'ts-host-app',
629
- },
630
- ports: [{ postMessage: mockPostMessage }],
637
+ payload: {},
638
+ eventType: TSToChartEvent.InitializeComplete,
631
639
  });
632
640
  customChartContext.initialize();
633
641
  mockPostMessageToHost.mockImplementation(() => new global.Promise((res) => {
@@ -639,23 +647,14 @@ describe('CustomChartContext', () => {
639
647
  expect(mockPostMessageToHost).toHaveBeenCalledWith(mockInitializeContextPayload.componentId, mockInitializeContextPayload.hostUrl, {}, TEST_EVENT_TYPE);
640
648
  });
641
649
  test('should process the event payload for context menu when custom actions are not defined', async () => {
642
- const mockPostMessage = jest.fn();
643
650
  let resolve;
644
651
  eventProcessor({
645
- data: {
646
- payload: mockInitializeContextPayload,
647
- eventType: TSToChartEvent.Initialize,
648
- source: 'ts-host-app',
649
- },
650
- ports: [{ postMessage: mockPostMessage }],
652
+ payload: mockInitializeContextPayload,
653
+ eventType: TSToChartEvent.Initialize,
651
654
  });
652
655
  eventProcessor({
653
- data: {
654
- payload: {},
655
- eventType: TSToChartEvent.InitializeComplete,
656
- source: 'ts-host-app',
657
- },
658
- ports: [{ postMessage: mockPostMessage }],
656
+ payload: {},
657
+ eventType: TSToChartEvent.InitializeComplete,
659
658
  });
660
659
  customChartContext.initialize();
661
660
  mockPostMessageToHost.mockImplementation(() => new global.Promise((res) => {