@openedx/frontend-base 1.0.0-alpha.0 → 1.0.0-alpha.1

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 (159) hide show
  1. package/config/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js +66 -0
  2. package/package.json +8 -1
  3. package/runtime/__mocks__/file.js +1 -0
  4. package/runtime/__mocks__/svg.js +1 -0
  5. package/runtime/__mocks__/universal-cookie.js +6 -0
  6. package/runtime/analytics/interface.test.js +242 -0
  7. package/runtime/auth/AxiosJwtAuthService.test.jsx +1076 -0
  8. package/runtime/auth/interceptors/createRetryInterceptor.test.js +23 -0
  9. package/runtime/config/getExternalLinkUrl.test.js +76 -0
  10. package/runtime/i18n/lib.test.js +230 -0
  11. package/runtime/initialize.async.function.config.test.js +43 -0
  12. package/runtime/initialize.const.config.test.js +41 -0
  13. package/runtime/initialize.function.config.test.js +41 -0
  14. package/runtime/initialize.test.js +356 -0
  15. package/runtime/logging/NewRelicLoggingService.test.js +214 -0
  16. package/runtime/react/AuthenticatedPageRoute.test.jsx +135 -0
  17. package/runtime/react/ErrorBoundary.test.jsx +83 -0
  18. package/runtime/react/SiteProvider.test.jsx +66 -0
  19. package/runtime/react/hooks.test.jsx +104 -0
  20. package/runtime/routing/utils.test.ts +7 -0
  21. package/runtime/scripts/GoogleAnalyticsLoader.test.ts +77 -0
  22. package/runtime/site.config.test.tsx +33 -0
  23. package/runtime/slots/Slot.test.tsx +40 -0
  24. package/runtime/slots/layout/DefaultSlotLayout.test.tsx +31 -0
  25. package/runtime/slots/layout/hooks.test.tsx +178 -0
  26. package/runtime/slots/layout/utils.test.ts +67 -0
  27. package/runtime/slots/types.ts +1 -0
  28. package/runtime/slots/utils.test.ts +64 -0
  29. package/runtime/slots/utils.ts +28 -9
  30. package/runtime/testing/initializeMockApp.test.ts +66 -0
  31. package/runtime/utils.test.js +116 -0
  32. package/shell/Logo.test.tsx +32 -0
  33. package/shell/__mocks__/file.js +1 -0
  34. package/shell/__mocks__/svg.js +1 -0
  35. package/shell/__mocks__/universal-cookie.js +6 -0
  36. package/shell/app.ts +14 -0
  37. package/shell/dev/devHome/app.ts +2 -2
  38. package/shell/dev/slotShowcase/app.tsx +9 -9
  39. package/shell/header/app.tsx +3 -3
  40. package/shell/router/createRouter.test.tsx +50 -0
  41. package/shell/router/getAppRoutes.test.tsx +59 -0
  42. package/shell/site.config.dev.tsx +3 -3
  43. package/shell/site.config.test.tsx +16 -0
  44. package/tools/dist/cli/commands/release.js +3 -3
  45. package/tools/dist/cli/intl-imports.test.js +146 -0
  46. package/tools/dist/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js +66 -0
  47. package/types.ts +1 -1
  48. package/eslint.config.js +0 -18
  49. package/frontend-base.d.ts +0 -8
  50. package/jest.config.js +0 -7
  51. package/openedx-frontend-base.tgz +0 -0
  52. package/test-site/app.d.ts +0 -15
  53. package/test-site/dist/176.436443549ebb858db483.js +0 -2
  54. package/test-site/dist/176.436443549ebb858db483.js.map +0 -1
  55. package/test-site/dist/362.536eff787d2380fe246c.js +0 -2
  56. package/test-site/dist/362.536eff787d2380fe246c.js.map +0 -1
  57. package/test-site/dist/653.486966b108d224551296.js +0 -2
  58. package/test-site/dist/653.486966b108d224551296.js.map +0 -1
  59. package/test-site/dist/74e025d3fe9a7b7f8503054e2563b353.jpg +0 -0
  60. package/test-site/dist/806.323cf6496ad0a7fe73a7.js +0 -3
  61. package/test-site/dist/806.323cf6496ad0a7fe73a7.js.LICENSE.txt +0 -106
  62. package/test-site/dist/806.323cf6496ad0a7fe73a7.js.map +0 -1
  63. package/test-site/dist/95ec738c0b7faac5b5c9126794446bbd.svg +0 -4
  64. package/test-site/dist/app.612058b36c74787759ac.css +0 -61
  65. package/test-site/dist/app.612058b36c74787759ac.css.map +0 -1
  66. package/test-site/dist/app.612058b36c74787759ac.js +0 -2
  67. package/test-site/dist/app.612058b36c74787759ac.js.map +0 -1
  68. package/test-site/dist/cb28cdb1468c915e27e5cec9af64f22f.svg +0 -1
  69. package/test-site/dist/index.html +0 -1
  70. package/test-site/dist/report.html +0 -39
  71. package/test-site/dist/runtime.c7aeaf7b967496cb076f.js +0 -2
  72. package/test-site/dist/runtime.c7aeaf7b967496cb076f.js.map +0 -1
  73. package/test-site/eslint.config.js +0 -12
  74. package/test-site/package-lock.json +0 -19226
  75. package/test-site/package.json +0 -29
  76. package/test-site/public/index.html +0 -10
  77. package/test-site/site.config.build.tsx +0 -27
  78. package/test-site/site.config.dev.tsx +0 -27
  79. package/test-site/src/authenticated-page/AuthenticatedPage.tsx +0 -18
  80. package/test-site/src/authenticated-page/i18n/index.ts +0 -27
  81. package/test-site/src/authenticated-page/index.tsx +0 -28
  82. package/test-site/src/example-page/ExamplePage.tsx +0 -79
  83. package/test-site/src/example-page/Image.tsx +0 -11
  84. package/test-site/src/example-page/ParagonPreview.jsx +0 -66
  85. package/test-site/src/example-page/apple.jpg +0 -0
  86. package/test-site/src/example-page/apple.svg +0 -1
  87. package/test-site/src/example-page/index.ts +0 -16
  88. package/test-site/src/i18n/README.md +0 -3
  89. package/test-site/src/i18n/messages/frontend-app-sample/ar.json +0 -4
  90. package/test-site/src/i18n/messages/frontend-app-sample/eo.json +0 -1
  91. package/test-site/src/i18n/messages/frontend-app-sample/es_419.json +0 -4
  92. package/test-site/src/i18n/messages/frontend-component-emptylangs/ar.json +0 -1
  93. package/test-site/src/i18n/messages/frontend-component-singlelang/ar.json +0 -3
  94. package/test-site/src/iframe-widget/IframeWidget.tsx +0 -14
  95. package/test-site/src/iframe-widget/index.ts +0 -16
  96. package/test-site/src/index.tsx +0 -3
  97. package/test-site/src/messages.js +0 -11
  98. package/test-site/src/site.scss +0 -11
  99. package/test-site/tsconfig.json +0 -14
  100. package/tools/babel/babel.config.js +0 -27
  101. package/tools/babel.config.js +0 -3
  102. package/tools/cli/README.md +0 -29
  103. package/tools/cli/commands/pack.ts +0 -9
  104. package/tools/cli/commands/release.ts +0 -27
  105. package/tools/cli/commands/serve.ts +0 -43
  106. package/tools/cli/intl-imports.ts +0 -274
  107. package/tools/cli/openedx.ts +0 -101
  108. package/tools/cli/transifex-utils.ts +0 -75
  109. package/tools/cli/utils/ensureConfigFilenameOption.ts +0 -40
  110. package/tools/cli/utils/formatter.ts +0 -10
  111. package/tools/cli/utils/getResolvedConfigPath.ts +0 -23
  112. package/tools/cli/utils/prettyPrintTitle.ts +0 -15
  113. package/tools/cli/utils/printUsage.ts +0 -53
  114. package/tools/config-helpers/createConfig.ts +0 -8
  115. package/tools/config-helpers/createLintConfig.ts +0 -14
  116. package/tools/config-helpers/getBaseConfig.ts +0 -11
  117. package/tools/defaultConfigPaths.ts +0 -30
  118. package/tools/eslint/base.eslint.config.js +0 -124
  119. package/tools/eslint/modules.d.ts +0 -5
  120. package/tools/eslint.config.js +0 -15
  121. package/tools/index.ts +0 -3
  122. package/tools/jest/jest.config.js +0 -30
  123. package/tools/jest.config.js +0 -19
  124. package/tools/tsconfig.json +0 -24
  125. package/tools/types.ts +0 -21
  126. package/tools/typescript/tsconfig.json +0 -32
  127. package/tools/webpack/common-config/README.md +0 -15
  128. package/tools/webpack/common-config/all/getCodeRules.ts +0 -51
  129. package/tools/webpack/common-config/all/getFileLoaderRules.ts +0 -23
  130. package/tools/webpack/common-config/all/getIgnoreWarnings.ts +0 -13
  131. package/tools/webpack/common-config/all/getImageMinimizer.ts +0 -26
  132. package/tools/webpack/common-config/all/getStylesheetRule.ts +0 -111
  133. package/tools/webpack/common-config/dev/getDevServer.ts +0 -35
  134. package/tools/webpack/common-config/index.ts +0 -6
  135. package/tools/webpack/common-config/site/getHtmlWebpackPlugin.ts +0 -11
  136. package/tools/webpack/modules.d.ts +0 -6
  137. package/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts +0 -102
  138. package/tools/webpack/plugins/html-webpack-new-relic-plugin/LICENSE +0 -21
  139. package/tools/webpack/plugins/html-webpack-new-relic-plugin/README.md +0 -7
  140. package/tools/webpack/plugins/html-webpack-new-relic-plugin/index.js +0 -3
  141. package/tools/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js +0 -1
  142. package/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts +0 -134
  143. package/tools/webpack/plugins/paragon-webpack-plugin/index.ts +0 -3
  144. package/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts +0 -71
  145. package/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts +0 -72
  146. package/tools/webpack/plugins/paragon-webpack-plugin/utils/index.ts +0 -6
  147. package/tools/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.ts +0 -131
  148. package/tools/webpack/plugins/paragon-webpack-plugin/utils/scriptUtils.ts +0 -144
  149. package/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts +0 -106
  150. package/tools/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.ts +0 -54
  151. package/tools/webpack/types.ts +0 -69
  152. package/tools/webpack/utils/getLocalAliases.ts +0 -65
  153. package/tools/webpack/utils/getPublicPath.ts +0 -3
  154. package/tools/webpack/utils/getResolvedSiteConfigPath.ts +0 -28
  155. package/tools/webpack/utils/paragonUtils.ts +0 -152
  156. package/tools/webpack/webpack.config.build.ts +0 -93
  157. package/tools/webpack/webpack.config.dev.shell.ts +0 -122
  158. package/tools/webpack/webpack.config.dev.ts +0 -90
  159. package/tsconfig.json +0 -23
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const html_webpack_plugin_1 = __importDefault(require("html-webpack-plugin"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const webpack_1 = __importDefault(require("webpack"));
10
+ const HtmlWebpackNewRelicPlugin_1 = __importDefault(require("../HtmlWebpackNewRelicPlugin"));
11
+ const OUTPUT_DIR = path_1.default.join(__dirname, './dist');
12
+ describe('HtmlWebpackNewRelicPlugin', () => {
13
+ const testPluginOptions = {
14
+ accountID: '121212',
15
+ agentID: '343434',
16
+ trustKey: '565656',
17
+ licenseKey: '123456',
18
+ applicationID: '654321',
19
+ };
20
+ afterEach(() => {
21
+ if (fs_1.default.existsSync(OUTPUT_DIR)) {
22
+ fs_1.default.rmSync(OUTPUT_DIR, { recursive: true, force: true });
23
+ }
24
+ });
25
+ it('should append new relic script to body', done => {
26
+ (0, webpack_1.default)({
27
+ entry: path_1.default.resolve(__dirname, 'fixtures', 'entry.js'),
28
+ output: {
29
+ path: path_1.default.resolve(__dirname, './dist'),
30
+ },
31
+ plugins: [
32
+ new html_webpack_plugin_1.default(),
33
+ new HtmlWebpackNewRelicPlugin_1.default(testPluginOptions),
34
+ ],
35
+ }, (err) => {
36
+ const htmlFile = path_1.default.resolve(OUTPUT_DIR, 'index.html');
37
+ expect(err).toBeNull();
38
+ expect(fs_1.default.existsSync(htmlFile)).toBe(true);
39
+ const file = fs_1.default.readFileSync(path_1.default.resolve(OUTPUT_DIR, htmlFile), { encoding: 'utf-8' }, (error, data) => data.toString());
40
+ Object.entries(testPluginOptions).forEach(([optionName, optionValue]) => {
41
+ expect(file.indexOf(`${optionName}:"${optionValue}"`)).toBeGreaterThan(-1);
42
+ });
43
+ done();
44
+ });
45
+ });
46
+ describe('when its missing configuration variables', () => {
47
+ function testMissingOption(missingOptionName) {
48
+ it(`should throw error if ${missingOptionName} is missing`, done => {
49
+ const compiler = (0, webpack_1.default)({
50
+ entry: path_1.default.resolve(__dirname, 'fixtures', 'entry.js'),
51
+ output: {
52
+ path: path_1.default.resolve(__dirname, '../dist'),
53
+ },
54
+ plugins: [new html_webpack_plugin_1.default()],
55
+ });
56
+ const optionsMissingOne = { ...testPluginOptions };
57
+ delete optionsMissingOne[missingOptionName];
58
+ expect(() => compiler.options.plugins.push(new HtmlWebpackNewRelicPlugin_1.default(optionsMissingOne))).toThrow(`${missingOptionName} argument is required`);
59
+ done();
60
+ });
61
+ }
62
+ Object.keys(testPluginOptions).forEach((key) => {
63
+ testMissingOption(key);
64
+ });
65
+ });
66
+ });
package/package.json CHANGED
@@ -1,11 +1,18 @@
1
1
  {
2
2
  "name": "@openedx/frontend-base",
3
- "version": "1.0.0-alpha.0",
3
+ "version": "1.0.0-alpha.1",
4
4
  "description": "Build tools, setup and config for frontend apps",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
8
8
  "main": "index.ts",
9
+ "files": [
10
+ "/config",
11
+ "/runtime",
12
+ "/tools/dist",
13
+ "/shell",
14
+ "/types.ts"
15
+ ],
9
16
  "bin": {
10
17
  "intl-imports.js": "tools/dist/cli/scripts/intl-imports.js",
11
18
  "openedx": "tools/dist/cli/openedx.js",
@@ -0,0 +1 @@
1
+ export default 'FileMock';
@@ -0,0 +1 @@
1
+ export default 'SvgURL';
@@ -0,0 +1,6 @@
1
+ const mockCookiesImplementation = {
2
+ get: jest.fn(),
3
+ remove: jest.fn(),
4
+ };
5
+
6
+ module.exports = () => mockCookiesImplementation;
@@ -0,0 +1,242 @@
1
+ import {
2
+ configureAnalytics,
3
+ identifyAnonymousUser,
4
+ identifyAuthenticatedUser,
5
+ sendPageEvent,
6
+ sendTrackEvent,
7
+ sendTrackingLogEvent,
8
+ SegmentAnalyticsService,
9
+ } from './index';
10
+
11
+ const eventType = 'test.event';
12
+ const eventData = {
13
+ testShallow: 'test-shallow',
14
+ testObject: {
15
+ testDeep: 'test-deep',
16
+ },
17
+ };
18
+ const testUserId = 99;
19
+ const mockLoggingService = {
20
+ logError: jest.fn(),
21
+ logInfo: jest.fn(),
22
+ };
23
+ // The actual ApiClient is a function, so while this feels weird, it accurately models the real
24
+ // thing.
25
+ const mockAuthApiClient = () => {
26
+ };
27
+ mockAuthApiClient.post = jest.fn().mockResolvedValue(undefined);
28
+
29
+ // SegmentAnalyticsService inserts a script before the first script element
30
+ // in the document. Add one here.
31
+ document.body.innerHTML = '<script id="stub" />';
32
+
33
+ describe('Analytics', () => {
34
+ let service;
35
+ let userIdFunction;
36
+
37
+ beforeEach(() => {
38
+ window.analytics = [];
39
+ });
40
+
41
+ function afterConfigure() {
42
+ mockLoggingService.logError.mockReset();
43
+ mockAuthApiClient.post.mockReset();
44
+ mockAuthApiClient.post.mockResolvedValue(undefined);
45
+ window.analytics.identify = jest.fn();
46
+ window.analytics.page = jest.fn();
47
+ window.analytics.track = jest.fn();
48
+ window.analytics.reset = jest.fn();
49
+ userIdFunction = jest.fn();
50
+ window.analytics.user = jest.fn(() => ({
51
+ id: userIdFunction,
52
+ }));
53
+ window.analytics.ready = jest.fn((callback) => {
54
+ if (callback) {
55
+ callback();
56
+ }
57
+ });
58
+ }
59
+
60
+ describe('with valid segmentKey', () => {
61
+ beforeEach(() => {
62
+ service = configureAnalytics(SegmentAnalyticsService, {
63
+ loggingService: mockLoggingService,
64
+ httpClient: mockAuthApiClient,
65
+ config: {
66
+ lmsBaseUrl: 'https://example.com',
67
+ segmentKey: 'test-key',
68
+ },
69
+ });
70
+
71
+ afterConfigure();
72
+
73
+ expect(global.analytics.invoked).toBe(true);
74
+ expect(service.segmentInitialized).toBe(true);
75
+ });
76
+
77
+ describe('analytics sendTrackingLogEvent', () => {
78
+ it('posts expected data when successful', () => {
79
+ expect.assertions(6);
80
+ return sendTrackingLogEvent(eventType, eventData)
81
+ .then(() => {
82
+ expect(mockAuthApiClient.post.mock.calls.length).toEqual(1);
83
+ expect(mockAuthApiClient.post.mock.calls[0][0]).toEqual('https://example.com/event');
84
+ const expectedData = 'event_type=test.event&event=%7B%22test_shallow%22%3A%22test-shallow%22%2C%22test_object%22%3A%7B%22test_deep%22%3A%22test-deep%22%7D%7D&page=http%3A%2F%2Flocalhost%2F';
85
+ expect(mockAuthApiClient.post.mock.calls[0][1]).toEqual(expectedData);
86
+ const config = mockAuthApiClient.post.mock.calls[0][2];
87
+ expect(config.headers['Content-Type']).toEqual('application/x-www-form-urlencoded');
88
+ });
89
+ });
90
+
91
+ it('calls loggingService.logError on error', () => {
92
+ mockAuthApiClient.post.mockRejectedValue('test-error');
93
+ expect.assertions(4);
94
+ return sendTrackingLogEvent(eventType, eventData)
95
+ .then(() => {
96
+ expect(mockLoggingService.logError.mock.calls.length).toBe(1);
97
+ expect(mockLoggingService.logError).toBeCalledWith('test-error');
98
+ });
99
+ });
100
+ });
101
+
102
+ describe('analytics identifyAuthenticatedUser', () => {
103
+ it('calls Segment identify on success', () => {
104
+ const testTraits = { anything: 'Yay!' };
105
+ identifyAuthenticatedUser(testUserId, testTraits);
106
+
107
+ expect(window.analytics.identify.mock.calls.length).toBe(1);
108
+ expect(window.analytics.identify).toBeCalledWith(testUserId, testTraits);
109
+ });
110
+
111
+ it('throws error if userId is not supplied', () => {
112
+ expect(() => identifyAuthenticatedUser(null))
113
+ .toThrowError(new Error('UserId is required for identifyAuthenticatedUser.'));
114
+ });
115
+ });
116
+
117
+ describe('analytics identifyAnonymousUser', () => {
118
+ it('does not call segment reset for no previous segment user', () => {
119
+ window.analytics.user = () => ({ id: () => null });
120
+ const testTraits = { anything: 'Yay!' };
121
+ identifyAnonymousUser(testTraits);
122
+
123
+ expect(window.analytics.reset.mock.calls.length).toBe(0);
124
+ });
125
+
126
+ it('calls segment reset for a previous segment user', () => {
127
+ window.analytics.user = () => ({ id: () => 7 });
128
+ const testTraits = { anything: 'Yay!' };
129
+ identifyAnonymousUser(testTraits);
130
+
131
+ expect(window.analytics.reset.mock.calls.length).toBe(1);
132
+ });
133
+ });
134
+
135
+ function testSendPageAfterIdentify(identifyFunction) {
136
+ identifyFunction();
137
+
138
+ const testCategory = 'test-category';
139
+ const testName = 'test-name';
140
+ const testProperties = { anything: 'Yay!' };
141
+ sendPageEvent(testCategory, testName, testProperties);
142
+
143
+ expect(window.analytics.page.mock.calls.length).toBe(1);
144
+ expect(window.analytics.page).toBeCalledWith(testCategory, testName, testProperties);
145
+ }
146
+
147
+ describe('analytics send Page event', () => {
148
+ it('calls Segment page on success after identifyAuthenticatedUser', () => {
149
+ const userId = 1;
150
+ testSendPageAfterIdentify(() => identifyAuthenticatedUser(userId));
151
+ });
152
+
153
+ it('calls Segment page on success after identifyAnonymousUser', () => {
154
+ testSendPageAfterIdentify(identifyAnonymousUser);
155
+ });
156
+
157
+ it('fails if page called with no identify', () => {
158
+ sendPageEvent();
159
+
160
+ expect(mockLoggingService.logError.mock.calls.length).toBe(1);
161
+ expect(mockLoggingService.logError).toBeCalledWith('Identify must be called before other tracking events.');
162
+ });
163
+ });
164
+
165
+ function testSendTrackEventAfterIdentify(identifyFunction) {
166
+ identifyFunction();
167
+
168
+ const testName = 'test-name';
169
+ const testProperties = { anything: 'Yay!' };
170
+ sendTrackEvent(testName, testProperties);
171
+
172
+ expect(window.analytics.track.mock.calls.length).toBe(1);
173
+ expect(window.analytics.track).toBeCalledWith(testName, testProperties);
174
+ }
175
+
176
+ describe('analytics send Track event', () => {
177
+ it('calls Segment track on success after identifyAuthenticatedUser', () => {
178
+ const userId = 1;
179
+ testSendTrackEventAfterIdentify(() => identifyAuthenticatedUser(userId));
180
+ });
181
+
182
+ it('calls Segment track on success after identifyAnonymousUser', () => {
183
+ testSendTrackEventAfterIdentify(identifyAnonymousUser);
184
+ });
185
+
186
+ it('fails if track called with no identify', () => {
187
+ sendTrackEvent();
188
+
189
+ expect(mockLoggingService.logError.mock.calls.length).toBe(1);
190
+ expect(mockLoggingService.logError).toBeCalledWith('Identify must be called before other tracking events.');
191
+ });
192
+ });
193
+ });
194
+
195
+ describe('with invalid segmentKey', () => {
196
+ beforeEach(() => {
197
+ service = configureAnalytics(SegmentAnalyticsService, {
198
+ loggingService: mockLoggingService,
199
+ httpClient: mockAuthApiClient,
200
+ config: {
201
+ lmsBaseUrl: 'https://example.com',
202
+ segmentKey: '',
203
+ },
204
+ });
205
+
206
+ afterConfigure();
207
+ });
208
+
209
+ it('should not initialize Segment analytics', () => {
210
+ expect(global.analytics.invoked).toBeFalsy();
211
+ expect(service.segmentInitialized).toBe(false);
212
+ });
213
+
214
+ it('should not call segment track in sendTrackEvent', () => {
215
+ sendTrackEvent();
216
+ expect(window.analytics.track).not.toHaveBeenCalled();
217
+ });
218
+
219
+ it('should not call segment page in sendPageEvent', () => {
220
+ sendPageEvent();
221
+ expect(window.analytics.page).not.toHaveBeenCalled();
222
+ });
223
+
224
+ it('should not call ready, user, reset, or identify in identifyAnonymousUser', () => {
225
+ identifyAnonymousUser();
226
+
227
+ expect(window.analytics.ready).not.toHaveBeenCalled();
228
+ expect(window.analytics.user).not.toHaveBeenCalled();
229
+ expect(userIdFunction).not.toHaveBeenCalled();
230
+ expect(window.analytics.reset).not.toHaveBeenCalled();
231
+ expect(window.analytics.identify).not.toHaveBeenCalled();
232
+ expect(service.hasIdentifyBeenCalled).toBe(false);
233
+ });
234
+
235
+ it('should not call identify in identifyAuthenticatedUser', () => {
236
+ identifyAuthenticatedUser(testUserId);
237
+
238
+ expect(window.analytics.identify).not.toHaveBeenCalled();
239
+ expect(service.hasIdentifyBeenCalled).toBe(false);
240
+ });
241
+ });
242
+ });