@w3-commons/js-build-resources 0.0.1-security → 1.0.4

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.

Potentially problematic release.


This version of @w3-commons/js-build-resources might be problematic. Click here for more details.

Files changed (98) hide show
  1. package/package.json +9 -3
  2. package/settings-service/.eslintrc.js +4 -0
  3. package/settings-service/.node-version +1 -0
  4. package/settings-service/.prettierrc +6 -0
  5. package/settings-service/.whitesource +15 -0
  6. package/settings-service/LICENSE +4 -0
  7. package/settings-service/README.md +50 -0
  8. package/settings-service/build.yml +56 -0
  9. package/settings-service/collectCodeCoverage.js +9 -0
  10. package/settings-service/db/cassandra/Dockerfile +3 -0
  11. package/settings-service/db/cassandra/createkeyspace.dev.cql +4 -0
  12. package/settings-service/db/cassandra/createkeyspace.dev.sh +3 -0
  13. package/settings-service/db/cassandra/schema_001.cql +15 -0
  14. package/settings-service/db/cassandra/schema_002.cql +8 -0
  15. package/settings-service/db/cassandra/schema_003.cql +10 -0
  16. package/settings-service/db/cassandra/schema_004.cql +1 -0
  17. package/settings-service/db/cassandra/schema_005.cql +39 -0
  18. package/settings-service/db/cassandra/schema_006.cql +255 -0
  19. package/settings-service/db/cassandra/schema_007.cql +40 -0
  20. package/settings-service/db/cassandra/schema_008.cql +2 -0
  21. package/settings-service/db/cassandra/schema_009.cql +143 -0
  22. package/settings-service/db/cassandra/schema_010.cql +143 -0
  23. package/settings-service/db/cassandra/schema_011.cql +2 -0
  24. package/settings-service/db/cassandra/schema_012.cql +8 -0
  25. package/settings-service/jest.config.fn.js +3 -0
  26. package/settings-service/jest.config.it.js +3 -0
  27. package/settings-service/jest.config.js +14 -0
  28. package/settings-service/jest.config.unit.js +19 -0
  29. package/settings-service/jest.setup.js +11 -0
  30. package/settings-service/package-lock.json +11772 -0
  31. package/settings-service/package.json +101 -0
  32. package/settings-service/scripts/run-fn-tests.sh +3 -0
  33. package/settings-service/sonar-project.properties +3 -0
  34. package/settings-service/src/__tests__/functional/controller/ApiKeyController.fn.ts +132 -0
  35. package/settings-service/src/__tests__/functional/middleware/AuthMiddlewareNextGenSSO.fn.ts +82 -0
  36. package/settings-service/src/__tests__/functional/repo/settingsRepo.fn.ts +302 -0
  37. package/settings-service/src/__tests__/functional/unified-profile/unified-profile.fn.ts +66 -0
  38. package/settings-service/src/__tests__/integration/repo/ApiKeyRepo.it.ts +43 -0
  39. package/settings-service/src/__tests__/integration/repo/settingsRepo.it.ts +142 -0
  40. package/settings-service/src/__tests__/integration/unified-profile/unified-profile.it.ts +31 -0
  41. package/settings-service/src/__tests__/unit/ErrResponse.ts +4 -0
  42. package/settings-service/src/__tests__/unit/JWTResponse.ts +18 -0
  43. package/settings-service/src/__tests__/unit/bluepagesResponse.ts +25 -0
  44. package/settings-service/src/__tests__/unit/controller/ApiKeyController.spec.ts +217 -0
  45. package/settings-service/src/__tests__/unit/controller/AppSettingsController.spec.ts +133 -0
  46. package/settings-service/src/__tests__/unit/controller/UserSettingsController.spec.ts +328 -0
  47. package/settings-service/src/__tests__/unit/controller/getAllSettings.spec.ts +83 -0
  48. package/settings-service/src/__tests__/unit/middleware/AuthMiddlewareNextGenSSO.spec.ts +282 -0
  49. package/settings-service/src/__tests__/unit/middleware/AuthenticationMiddleware.spec.ts +494 -0
  50. package/settings-service/src/__tests__/unit/repo/ApiKeyRepo.spec.ts +194 -0
  51. package/settings-service/src/__tests__/unit/repo/getAllSettings.spec.ts +100 -0
  52. package/settings-service/src/__tests__/unit/repo/getUserSettingsRepo.spec.ts +249 -0
  53. package/settings-service/src/__tests__/unit/repo/settingsRepo.spec.ts +614 -0
  54. package/settings-service/src/__tests__/unit/unified-profile/UnifiedProfileClient.spec.ts +31 -0
  55. package/settings-service/src/__tests__/unit/unified-profile/unifiedProfileUtils.spec.ts +36 -0
  56. package/settings-service/src/__tests__/utils/test-utils.ts +41 -0
  57. package/settings-service/src/config/config.ts +190 -0
  58. package/settings-service/src/controller/ApiKeyController.ts +114 -0
  59. package/settings-service/src/controller/AppSettingsController.ts +137 -0
  60. package/settings-service/src/controller/UserSettingsController.ts +202 -0
  61. package/settings-service/src/helpers/commons.ts +69 -0
  62. package/settings-service/src/logger/logger.ts +17 -0
  63. package/settings-service/src/middleware/AuthenticationMiddleware.ts +486 -0
  64. package/settings-service/src/middleware/AuthenticationMiddlewareFactory.ts +10 -0
  65. package/settings-service/src/repo/ApiKeyRepo.ts +135 -0
  66. package/settings-service/src/repo/ApiKeyRepoFactory.ts +10 -0
  67. package/settings-service/src/repo/CassandraClient.ts +33 -0
  68. package/settings-service/src/repo/CassandraClientFactory.ts +11 -0
  69. package/settings-service/src/repo/apiKeyQueries.ts +64 -0
  70. package/settings-service/src/repo/cassandraDBHelpers.ts +119 -0
  71. package/settings-service/src/repo/settingsRepo.ts +388 -0
  72. package/settings-service/src/repo/settingsRepoFactory.ts +10 -0
  73. package/settings-service/src/repo/settingsRepoQueries.ts +62 -0
  74. package/settings-service/src/routes/apiKeyRoutes.ts +27 -0
  75. package/settings-service/src/routes/appSettingsRoutes.ts +30 -0
  76. package/settings-service/src/routes/healthCheck.ts +10 -0
  77. package/settings-service/src/routes/swagger.ts +8 -0
  78. package/settings-service/src/routes/userSettingsRoutes.ts +30 -0
  79. package/settings-service/src/server.ts +77 -0
  80. package/settings-service/src/swagger.json +732 -0
  81. package/settings-service/src/types/ApiKey.ts +19 -0
  82. package/settings-service/src/types/IRequest.ts +9 -0
  83. package/settings-service/src/types/IRequestAuthorization.ts +5 -0
  84. package/settings-service/src/types/IRouteOptions.ts +5 -0
  85. package/settings-service/src/types/QueryResultsTypes.ts +6 -0
  86. package/settings-service/src/types/UserSettingsControllerTypes.ts +5 -0
  87. package/settings-service/src/types/W3IdUser.ts +36 -0
  88. package/settings-service/src/types/settingsRepoTypes.ts +61 -0
  89. package/settings-service/src/types/unifiedProfileTypes.ts +10 -0
  90. package/settings-service/src/unified-profile/UnifiedProfileClient.ts +29 -0
  91. package/settings-service/src/unified-profile/UnifiedProfileClientFactory.ts +10 -0
  92. package/settings-service/src/unified-profile/unifiedProfileUtils.ts +22 -0
  93. package/settings-service/src/util/downloadCassandra.ts +34 -0
  94. package/settings-service/src/util/isocodeMapper.ts +22 -0
  95. package/settings-service/src/util/languages.ts +1457 -0
  96. package/settings-service/test_resources/mockApiKeyDBResult.json +8 -0
  97. package/settings-service/tsconfig.json +40 -0
  98. package/README.md +0 -5
@@ -0,0 +1,100 @@
1
+ import { SettingsRepoFactory } from '../../../repo/settingsRepoFactory';
2
+ import { cassandraDBHelpers } from '../../../repo/cassandraDBHelpers';
3
+ import * as srq from '../../../repo/settingsRepoQueries';
4
+ import { TEST_APP_ID } from '../../utils/test-utils';
5
+
6
+ const mockAllUsersRows = [
7
+ {
8
+ user_id: 'ABCDEFGHI',
9
+ app_id: 'general',
10
+ setting_name: 'primaryLanguage',
11
+ setting_value: 'en',
12
+ },
13
+ {
14
+ user_id: 'AABBCCDDE',
15
+ app_id: 'general',
16
+ setting_name: 'primaryLanguage',
17
+ setting_value: 'en',
18
+ },
19
+ {
20
+ user_id: 'BBCCDDEEF',
21
+ app_id: 'general',
22
+ setting_name: 'primaryLanguage',
23
+ setting_value: 'en',
24
+ },
25
+ {
26
+ user_id: 'CCDDEEFFG',
27
+ app_id: 'general',
28
+ setting_name: 'primaryLanguage',
29
+ setting_value: 'en',
30
+ },
31
+ {
32
+ user_id: 'DDEEFFGGH',
33
+ app_id: 'general',
34
+ setting_name: 'primaryLanguage',
35
+ setting_value: 'en',
36
+ },
37
+ ];
38
+
39
+ describe('getAllSettings settingsRepo method', () => {
40
+ let settingsRepo;
41
+ beforeAll(() => {
42
+ settingsRepo = SettingsRepoFactory.accessOrCreateSingleton();
43
+ });
44
+ it('should query uses_settings with default values when no query params passed', async () => {
45
+ const mockResultSet: any = {
46
+ rows: mockAllUsersRows,
47
+ };
48
+ cassandraDBHelpers.paginate = jest.fn().mockResolvedValueOnce(mockResultSet);
49
+ const response = await settingsRepo.getAllSettings({});
50
+ expect(response).toBeDefined();
51
+ expect(response).toMatchObject(mockResultSet);
52
+ expect(cassandraDBHelpers.paginate).toHaveBeenCalledTimes(1);
53
+ expect(cassandraDBHelpers.paginate).toHaveBeenCalledWith(srq.allUserSettingsQuery, [], {
54
+ pageState: '',
55
+ fetchSize: 500,
56
+ });
57
+ });
58
+ it('should query user_settings_by_app with appId when no settingName passed', async () => {
59
+ const mockResultSet: any = {
60
+ rows: mockAllUsersRows,
61
+ };
62
+ cassandraDBHelpers.paginate = jest.fn().mockResolvedValueOnce(mockResultSet);
63
+ const testQueryParams = {
64
+ pageState: 'test-page-state',
65
+ settingName: undefined,
66
+ fetchSize: 10,
67
+ appId: TEST_APP_ID,
68
+ };
69
+ const response = await settingsRepo.getAllSettings(testQueryParams);
70
+ expect(response).toBeDefined();
71
+ expect(response).toMatchObject(mockResultSet);
72
+ expect(cassandraDBHelpers.paginate).toHaveBeenCalledTimes(1);
73
+ expect(cassandraDBHelpers.paginate).toHaveBeenCalledWith(
74
+ srq.allUserSettingsByAppIdQuery,
75
+ [testQueryParams.appId],
76
+ { pageState: testQueryParams.pageState, fetchSize: testQueryParams.fetchSize },
77
+ );
78
+ });
79
+ it('should query user_settings_by_app with appId and settingName', async () => {
80
+ const mockResultSet: any = {
81
+ rows: mockAllUsersRows,
82
+ };
83
+ cassandraDBHelpers.paginate = jest.fn().mockResolvedValueOnce(mockResultSet);
84
+ const testQueryParams = {
85
+ pageState: 'test-page-state',
86
+ settingName: 'test-setting-name',
87
+ fetchSize: 10,
88
+ appId: TEST_APP_ID,
89
+ };
90
+ const response = await settingsRepo.getAllSettings(testQueryParams);
91
+ expect(response).toBeDefined();
92
+ expect(response).toMatchObject(mockResultSet);
93
+ expect(cassandraDBHelpers.paginate).toHaveBeenCalledTimes(1);
94
+ expect(cassandraDBHelpers.paginate).toHaveBeenCalledWith(
95
+ srq.allUserSettingsBySettingNameQuery,
96
+ [testQueryParams.appId, testQueryParams.settingName],
97
+ { pageState: testQueryParams.pageState, fetchSize: testQueryParams.fetchSize },
98
+ );
99
+ });
100
+ });
@@ -0,0 +1,249 @@
1
+ import { SettingsRepoFactory } from '../../../repo/settingsRepoFactory';
2
+ import { cassandraDBHelpers } from '../../../repo/cassandraDBHelpers';
3
+ import { SettingsRepo } from '../../../repo/settingsRepo';
4
+ import { getUnifiedProfile } from '../../../unified-profile/unifiedProfileUtils';
5
+
6
+ jest.mock('../../../unified-profile/unifiedProfileUtils');
7
+
8
+ const USER_ID = 'AAABBBCCC';
9
+
10
+ const languageAppSettings = {
11
+ secondaryLanguages: {
12
+ options: ['en', 'fr', 'sk'],
13
+ setting_type: 'array',
14
+ },
15
+ primaryLanguage: {
16
+ options: ['en', 'fr', 'sk'],
17
+ setting_type: 'string',
18
+ default: 'en',
19
+ },
20
+ };
21
+
22
+ const settingsRepo: SettingsRepo = SettingsRepoFactory.accessOrCreateSingleton();
23
+ afterEach(() => {
24
+ jest.resetAllMocks();
25
+ });
26
+
27
+ describe('getUserSettings backup language', () => {
28
+ it('should get backup language from unified profile language array when no language found in general settings, looks up via taxonomy peoples array', async () => {
29
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
30
+ const mockUserResultSet = {
31
+ rows: [],
32
+ };
33
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
34
+ const spyOnUpdateSettings = jest
35
+ .spyOn(settingsRepo, 'updateUserSettings')
36
+ .mockResolvedValueOnce(true)
37
+ .mockResolvedValueOnce(true);
38
+
39
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
40
+ mockedProfileCall.mockResolvedValueOnce({ content: { languages: ['French (Belgium)'] } });
41
+
42
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
43
+ expect(userSettings).toBeDefined();
44
+ expect(userSettings.primaryLanguage).toBe('fr');
45
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
46
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
47
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'fr');
48
+ });
49
+ it('should get backup language from unified profile language array when no language found in general settings, looks up via taxonomy peoples string instead of array', async () => {
50
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
51
+ const mockUserResultSet = {
52
+ rows: [],
53
+ };
54
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
55
+ const spyOnUpdateSettings = jest
56
+ .spyOn(settingsRepo, 'updateUserSettings')
57
+ .mockResolvedValueOnce(true)
58
+ .mockResolvedValueOnce(true);
59
+
60
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
61
+ mockedProfileCall.mockResolvedValueOnce({ content: { languages: ['Finnish'] } });
62
+
63
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
64
+ expect(userSettings).toBeDefined();
65
+ expect(userSettings.primaryLanguage).toBe('fi');
66
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
67
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
68
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'fi');
69
+ });
70
+ it('should get backup language from unified profile preferredLanguage when no language in general settings and there is more than 1 language from UP', async () => {
71
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
72
+ const mockUserResultSet: any = {
73
+ rows: [],
74
+ };
75
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
76
+ const spyOnUpdateSettings = jest
77
+ .spyOn(settingsRepo, 'updateUserSettings')
78
+ .mockResolvedValueOnce(true)
79
+ .mockResolvedValueOnce(true);
80
+
81
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
82
+ mockedProfileCall.mockResolvedValueOnce({
83
+ content: { languages: ['Chinese', 'French (Belgium)'], preferredLanguage: 'French (Belgium)' },
84
+ });
85
+
86
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
87
+ expect(userSettings).toBeDefined();
88
+ expect(userSettings.primaryLanguage).toBe('fr');
89
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
90
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
91
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'fr');
92
+ });
93
+ it('should return default setting when no preferred language found from Unified Profile', async () => {
94
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
95
+ const mockUserResultSet = {
96
+ rows: [],
97
+ };
98
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
99
+ const spyOnUpdateSettings = jest
100
+ .spyOn(settingsRepo, 'updateUserSettings')
101
+ .mockResolvedValueOnce(true)
102
+ .mockResolvedValueOnce(true);
103
+
104
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
105
+ mockedProfileCall.mockResolvedValueOnce({ content: { languages: ['Chinese', 'French (Belgium)'] } });
106
+
107
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
108
+
109
+ expect(userSettings).toBeDefined();
110
+ expect(userSettings.primaryLanguage).toBe('en');
111
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
112
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
113
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'en');
114
+ });
115
+ it('should return default setting when no language found from Unified Profile', async () => {
116
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
117
+ const mockUserResultSet = {
118
+ rows: [],
119
+ };
120
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
121
+ const spyOnUpdateSettings = jest
122
+ .spyOn(settingsRepo, 'updateUserSettings')
123
+ .mockResolvedValueOnce(true)
124
+ .mockResolvedValueOnce(true);
125
+
126
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
127
+ mockedProfileCall.mockResolvedValueOnce({ content: {} });
128
+
129
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
130
+
131
+ expect(userSettings).toBeDefined();
132
+ expect(userSettings.primaryLanguage).toBe('en');
133
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
134
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
135
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'en');
136
+ });
137
+ it('should return default setting when an unsupported/bad language is found from Unified Profile languages array', async () => {
138
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
139
+ const mockUserResultSet = {
140
+ rows: [],
141
+ };
142
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
143
+ const spyOnUpdateSettings = jest
144
+ .spyOn(settingsRepo, 'updateUserSettings')
145
+ .mockResolvedValueOnce(true)
146
+ .mockResolvedValueOnce(true);
147
+
148
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
149
+ mockedProfileCall.mockResolvedValueOnce({ content: { languages: ['UngaBunga'] } });
150
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
151
+ expect(userSettings).toBeDefined();
152
+ expect(userSettings.primaryLanguage).toBe('en');
153
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
154
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
155
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'en');
156
+ });
157
+ it('should return default setting when an unsupported/bad language is found', async () => {
158
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
159
+ const mockUserResultSet = {
160
+ rows: [],
161
+ };
162
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
163
+ const spyOnUpdateSettings = jest
164
+ .spyOn(settingsRepo, 'updateUserSettings')
165
+ .mockResolvedValueOnce(true)
166
+ .mockResolvedValueOnce(true);
167
+
168
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
169
+ mockedProfileCall.mockResolvedValueOnce({
170
+ content: { languages: ['UngaBunga', 'French (Belgium)'], preferredLanguage: 'UngaBunga' },
171
+ });
172
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
173
+ expect(userSettings).toBeDefined();
174
+ expect(userSettings.primaryLanguage).toBe('en');
175
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
176
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
177
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'en');
178
+ });
179
+ it('should get backup language from unified profile preferredLanguage when no language in general settings and there is more than 1 language from UP, looks up peoples array', async () => {
180
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
181
+ const mockUserResultSet = {
182
+ rows: [],
183
+ };
184
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
185
+ const spyOnUpdateSettings = jest
186
+ .spyOn(settingsRepo, 'updateUserSettings')
187
+ .mockResolvedValueOnce(true)
188
+ .mockResolvedValueOnce(true);
189
+
190
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
191
+ mockedProfileCall.mockResolvedValueOnce({
192
+ content: { languages: ['Chinese', 'French'], preferredLanguage: 'Portuguese (Brazil)' },
193
+ });
194
+
195
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
196
+ expect(userSettings).toBeDefined();
197
+ expect(userSettings.primaryLanguage).toBe('pt');
198
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
199
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
200
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'pt');
201
+ });
202
+ it('should get backup language from unified profile preferredLanguage when an unsupported/bad language is found from Unified Profile languages array of size 1, looks up peoples array', async () => {
203
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
204
+ const mockUserResultSet = {
205
+ rows: [],
206
+ };
207
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
208
+ const spyOnUpdateSettings = jest
209
+ .spyOn(settingsRepo, 'updateUserSettings')
210
+ .mockResolvedValueOnce(true)
211
+ .mockResolvedValueOnce(true);
212
+
213
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
214
+ mockedProfileCall.mockResolvedValueOnce({
215
+ content: { languages: ['UngaBunga'], preferredLanguage: 'Portuguese (Brazil)' },
216
+ });
217
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
218
+ expect(userSettings).toBeDefined();
219
+ expect(userSettings.primaryLanguage).toBe('pt');
220
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
221
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
222
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'pt');
223
+ });
224
+ it('should get backup language from unified profile preferredLanguage when an unsupported/bad language is found from Unified Profile languages array, looks up peoples array', async () => {
225
+ settingsRepo.getAppSettings = jest.fn().mockReturnValue(languageAppSettings);
226
+ const mockUserResultSet = {
227
+ rows: [],
228
+ };
229
+ cassandraDBHelpers.execute = jest.fn().mockResolvedValueOnce(mockUserResultSet);
230
+ const spyOnUpdateSettings = jest
231
+ .spyOn(settingsRepo, 'updateUserSettings')
232
+ .mockResolvedValueOnce(true)
233
+ .mockResolvedValueOnce(true);
234
+
235
+ const mockedProfileCall = getUnifiedProfile as jest.Mock;
236
+ mockedProfileCall.mockResolvedValueOnce({
237
+ content: {
238
+ languages: ['UngaBunga', 'Portuguese (Brazil)'],
239
+ preferredLanguage: 'Portuguese (Brazil)',
240
+ },
241
+ });
242
+ const userSettings = await settingsRepo.getUserSettings(USER_ID, 'general');
243
+ expect(userSettings).toBeDefined();
244
+ expect(userSettings.primaryLanguage).toBe('pt');
245
+ expect(spyOnUpdateSettings).toHaveBeenCalled();
246
+ expect(spyOnUpdateSettings).toHaveBeenCalledTimes(2);
247
+ expect(spyOnUpdateSettings).toHaveBeenCalledWith(USER_ID, 'general', 'primaryLanguage', 'pt');
248
+ });
249
+ });