@strapi/strapi 4.10.0 → 4.10.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 (126) hide show
  1. package/coverage/clover.xml +1613 -0
  2. package/coverage/coverage-final.json +48 -0
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +87 -0
  5. package/coverage/lcov-report/commands/__tests__/data-transfer/shared/index.html +116 -0
  6. package/coverage/lcov-report/commands/__tests__/data-transfer/shared/transfer.test.utils.js.html +133 -0
  7. package/coverage/lcov-report/commands/admin-create.js.html +424 -0
  8. package/coverage/lcov-report/commands/admin-reset.js.html +241 -0
  9. package/coverage/lcov-report/commands/generate-template.js.html +373 -0
  10. package/coverage/lcov-report/commands/index.html +146 -0
  11. package/coverage/lcov-report/commands/transfer/export.js.html +619 -0
  12. package/coverage/lcov-report/commands/transfer/import.js.html +562 -0
  13. package/coverage/lcov-report/commands/transfer/index.html +146 -0
  14. package/coverage/lcov-report/commands/transfer/transfer.js.html +532 -0
  15. package/coverage/lcov-report/commands/utils/helpers.js.html +430 -0
  16. package/coverage/lcov-report/commands/utils/index.html +116 -0
  17. package/coverage/lcov-report/core/registries/custom-fields.js.html +301 -0
  18. package/coverage/lcov-report/core/registries/index.html +116 -0
  19. package/coverage/lcov-report/core-api/controller/collection-type.js.html +418 -0
  20. package/coverage/lcov-report/core-api/controller/index.html +161 -0
  21. package/coverage/lcov-report/core-api/controller/index.js.html +220 -0
  22. package/coverage/lcov-report/core-api/controller/single-type.js.html +274 -0
  23. package/coverage/lcov-report/core-api/controller/transform.js.html +376 -0
  24. package/coverage/lcov-report/core-api/service/collection-type.js.html +325 -0
  25. package/coverage/lcov-report/core-api/service/index.html +161 -0
  26. package/coverage/lcov-report/core-api/service/index.js.html +220 -0
  27. package/coverage/lcov-report/core-api/service/pagination.js.html +460 -0
  28. package/coverage/lcov-report/core-api/service/single-type.js.html +301 -0
  29. package/coverage/lcov-report/favicon.png +0 -0
  30. package/coverage/lcov-report/index.html +386 -0
  31. package/coverage/lcov-report/load/filepath-to-prop-path.js.html +151 -0
  32. package/coverage/lcov-report/load/index.html +116 -0
  33. package/coverage/lcov-report/prettify.css +1 -0
  34. package/coverage/lcov-report/prettify.js +2 -0
  35. package/coverage/lcov-report/services/content-api/index.html +116 -0
  36. package/coverage/lcov-report/services/content-api/index.js.html +307 -0
  37. package/coverage/lcov-report/services/content-api/permissions/engine.js.html +100 -0
  38. package/coverage/lcov-report/services/content-api/permissions/index.html +131 -0
  39. package/coverage/lcov-report/services/content-api/permissions/index.js.html +529 -0
  40. package/coverage/lcov-report/services/content-api/permissions/providers/action.js.html +142 -0
  41. package/coverage/lcov-report/services/content-api/permissions/providers/condition.js.html +142 -0
  42. package/coverage/lcov-report/services/content-api/permissions/providers/index.html +146 -0
  43. package/coverage/lcov-report/services/content-api/permissions/providers/index.js.html +112 -0
  44. package/coverage/lcov-report/services/core-store.js.html +520 -0
  45. package/coverage/lcov-report/services/entity-service/attributes/index.html +131 -0
  46. package/coverage/lcov-report/services/entity-service/attributes/index.js.html +178 -0
  47. package/coverage/lcov-report/services/entity-service/attributes/transforms.js.html +145 -0
  48. package/coverage/lcov-report/services/entity-service/components.js.html +1246 -0
  49. package/coverage/lcov-report/services/entity-service/index.html +146 -0
  50. package/coverage/lcov-report/services/entity-service/index.js.html +1120 -0
  51. package/coverage/lcov-report/services/entity-service/params.js.html +112 -0
  52. package/coverage/lcov-report/services/entity-validator/__tests__/relations/utils/index.html +116 -0
  53. package/coverage/lcov-report/services/entity-validator/__tests__/relations/utils/relations.testdata.js.html +544 -0
  54. package/coverage/lcov-report/services/entity-validator/index.html +131 -0
  55. package/coverage/lcov-report/services/entity-validator/index.js.html +1231 -0
  56. package/coverage/lcov-report/services/entity-validator/validators.js.html +733 -0
  57. package/coverage/lcov-report/services/event-hub.js.html +319 -0
  58. package/coverage/lcov-report/services/fs.js.html +259 -0
  59. package/coverage/lcov-report/services/index.html +161 -0
  60. package/coverage/lcov-report/services/metrics/admin-user-hash.js.html +148 -0
  61. package/coverage/lcov-report/services/metrics/index.html +206 -0
  62. package/coverage/lcov-report/services/metrics/index.js.html +265 -0
  63. package/coverage/lcov-report/services/metrics/is-truthy.js.html +112 -0
  64. package/coverage/lcov-report/services/metrics/middleware.js.html +184 -0
  65. package/coverage/lcov-report/services/metrics/rate-limiter.js.html +166 -0
  66. package/coverage/lcov-report/services/metrics/sender.js.html +394 -0
  67. package/coverage/lcov-report/services/metrics/stringify-deep.js.html +151 -0
  68. package/coverage/lcov-report/services/utils/index.html +116 -0
  69. package/coverage/lcov-report/services/utils/upload-files.js.html +322 -0
  70. package/coverage/lcov-report/services/worker-queue.js.html +262 -0
  71. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  72. package/coverage/lcov-report/sorter.js +196 -0
  73. package/coverage/lcov-report/utils/convert-custom-field-type.js.html +151 -0
  74. package/coverage/lcov-report/utils/index.html +146 -0
  75. package/coverage/lcov-report/utils/machine-id.js.html +127 -0
  76. package/coverage/lcov-report/utils/url-from-segments.js.html +121 -0
  77. package/lib/commands/__tests__/commands.test.js +20 -0
  78. package/lib/commands/__tests__/commands.test.utils.js +16 -0
  79. package/lib/commands/actions/admin/create-user/__tests__/admin.create-user.test.js +450 -0
  80. package/lib/commands/actions/admin/reset-user-password/__tests__/admin.reset-user-password.test.js +145 -0
  81. package/lib/commands/actions/build/action.js +18 -0
  82. package/lib/commands/actions/build/command.js +15 -0
  83. package/lib/commands/actions/export/__tests__/export.test.js +175 -0
  84. package/lib/commands/actions/import/__tests__/import.test.js +143 -0
  85. package/lib/commands/actions/templates/generate/__tests__/templates.generate.js +118 -0
  86. package/lib/commands/actions/transfer/__tests__/transfer.test.js +178 -0
  87. package/lib/core/registries/__tests__/custom-fields.test.js +152 -0
  88. package/lib/core-api/__tests__/controller.test.js +39 -0
  89. package/lib/core-api/controller/__tests__/transform.test.js +226 -0
  90. package/lib/core-api/service/__tests__/index.test.js +127 -0
  91. package/lib/core-api/service/__tests__/pagination.test.js +275 -0
  92. package/lib/load/__tests__/filepath-to-prop-path.test.js +30 -0
  93. package/lib/middlewares/__tests__/errors.test.js +21 -0
  94. package/lib/services/__tests__/content-api-permissions.test.js +291 -0
  95. package/lib/services/__tests__/core-store.test.js +148 -0
  96. package/lib/services/__tests__/event-hub.test.js +126 -0
  97. package/lib/services/__tests__/fs.test.js +78 -0
  98. package/lib/services/__tests__/worker-queue.test.js +47 -0
  99. package/lib/services/entity-service/__tests__/entity-service-events.test.js +117 -0
  100. package/lib/services/entity-service/__tests__/entity-service.test.js +587 -0
  101. package/lib/services/entity-validator/__tests__/biginteger-validators.test.js +220 -0
  102. package/lib/services/entity-validator/__tests__/date-validators.test.js +183 -0
  103. package/lib/services/entity-validator/__tests__/datetime-validators.test.js +183 -0
  104. package/lib/services/entity-validator/__tests__/email-validators.test.js +56 -0
  105. package/lib/services/entity-validator/__tests__/enumeration-validators.test.js +43 -0
  106. package/lib/services/entity-validator/__tests__/float-validators.test.js +278 -0
  107. package/lib/services/entity-validator/__tests__/index.test.js +609 -0
  108. package/lib/services/entity-validator/__tests__/integer-validators.test.js +278 -0
  109. package/lib/services/entity-validator/__tests__/relations/attribute-level.test.js +123 -0
  110. package/lib/services/entity-validator/__tests__/relations/component-level.test.js +275 -0
  111. package/lib/services/entity-validator/__tests__/relations/dynamic-zone-level.test.js +159 -0
  112. package/lib/services/entity-validator/__tests__/relations/media-level.test.js +74 -0
  113. package/lib/services/entity-validator/__tests__/relations/utils/relations.testdata.js +153 -0
  114. package/lib/services/entity-validator/__tests__/string-validators.test.js +374 -0
  115. package/lib/services/entity-validator/__tests__/time-validators.test.js +183 -0
  116. package/lib/services/entity-validator/__tests__/timestamp-validators.test.js +204 -0
  117. package/lib/services/entity-validator/__tests__/uid-validators.test.js +229 -0
  118. package/lib/services/metrics/__tests__/admin-user-hash.test.js +41 -0
  119. package/lib/services/metrics/__tests__/index.test.js +157 -0
  120. package/lib/services/metrics/__tests__/is-truthy.js +33 -0
  121. package/lib/services/metrics/__tests__/middleware.test.js +60 -0
  122. package/lib/services/metrics/__tests__/rate-limiter.test.js +50 -0
  123. package/lib/services/metrics/__tests__/stringify-deep.test.js +27 -0
  124. package/lib/utils/__tests__/convert-custom-field-type.test.js +69 -0
  125. package/lib/utils/__tests__/url-from-segments.test.js +40 -0
  126. package/package.json +15 -15
@@ -0,0 +1,204 @@
1
+ 'use strict';
2
+
3
+ const strapiUtils = require('@strapi/utils');
4
+ const {
5
+ errors: { YupValidationError },
6
+ } = require('@strapi/utils');
7
+ const validators = require('../validators');
8
+
9
+ describe('Time validator', () => {
10
+ describe('unique', () => {
11
+ const fakeFindOne = jest.fn();
12
+
13
+ global.strapi = {
14
+ db: {
15
+ query: jest.fn(() => ({
16
+ findOne: fakeFindOne,
17
+ })),
18
+ },
19
+ };
20
+
21
+ afterEach(() => {
22
+ jest.clearAllMocks();
23
+ fakeFindOne.mockReset();
24
+ });
25
+
26
+ const fakeModel = {
27
+ kind: 'contentType',
28
+ modelName: 'test-model',
29
+ uid: 'test-uid',
30
+ privateAttributes: [],
31
+ options: {},
32
+ attributes: {
33
+ attrTimestampUnique: { type: 'timestamp', unique: true },
34
+ },
35
+ };
36
+
37
+ test('it does not validates the unique constraint if the attribute is not set as unique', async () => {
38
+ fakeFindOne.mockResolvedValueOnce(null);
39
+
40
+ const validator = strapiUtils.validateYupSchema(
41
+ validators.timestamp(
42
+ {
43
+ attr: { type: 'timestamp' },
44
+ model: fakeModel,
45
+ updatedAttribute: {
46
+ name: 'attrTimestampUnique',
47
+ value: '1638140400',
48
+ },
49
+ entity: null,
50
+ },
51
+ { isDraft: false }
52
+ )
53
+ );
54
+
55
+ await validator('1638140400');
56
+
57
+ expect(fakeFindOne).not.toHaveBeenCalled();
58
+ });
59
+
60
+ test('it does not validates the unique constraint if the attribute value is `null`', async () => {
61
+ fakeFindOne.mockResolvedValueOnce(null);
62
+
63
+ const validator = strapiUtils.validateYupSchema(
64
+ validators
65
+ .timestamp(
66
+ {
67
+ attr: { type: 'timestamp', unique: true },
68
+ model: fakeModel,
69
+ updatedAttribute: {
70
+ name: 'attrTimestampUnique',
71
+ value: null,
72
+ },
73
+ entity: null,
74
+ },
75
+ { isDraft: false }
76
+ )
77
+ .nullable()
78
+ );
79
+
80
+ await validator(null);
81
+ expect(fakeFindOne).not.toHaveBeenCalled();
82
+ });
83
+
84
+ test('it validates the unique constraint if there is no other record in the database', async () => {
85
+ fakeFindOne.mockResolvedValueOnce(null);
86
+
87
+ const validator = strapiUtils.validateYupSchema(
88
+ validators.timestamp(
89
+ {
90
+ attr: { type: 'timestamp', unique: true },
91
+ model: fakeModel,
92
+ updatedAttribute: {
93
+ name: 'attrTimestampUnique',
94
+ value: '1638140400',
95
+ },
96
+ entity: null,
97
+ },
98
+ { isDraft: false }
99
+ )
100
+ );
101
+
102
+ expect(await validator('1638140400')).toBe('1638140400');
103
+ });
104
+
105
+ test('it fails the validation of the unique constraint if the database contains a record with the same attribute value', async () => {
106
+ expect.assertions(1);
107
+ fakeFindOne.mockResolvedValueOnce({ attrTimestampUnique: '1638140400' });
108
+
109
+ const validator = strapiUtils.validateYupSchema(
110
+ validators.timestamp(
111
+ {
112
+ attr: { type: 'timestamp', unique: true },
113
+ model: fakeModel,
114
+ updatedAttribute: {
115
+ name: 'attrTimestampUnique',
116
+ value: '1638140400',
117
+ },
118
+ entity: null,
119
+ },
120
+ { isDraft: false }
121
+ )
122
+ );
123
+
124
+ try {
125
+ await validator('1638140400');
126
+ } catch (err) {
127
+ expect(err).toBeInstanceOf(YupValidationError);
128
+ }
129
+ });
130
+
131
+ test('it validates the unique constraint if the attribute data has not changed even if there is a record in the database with the same attribute value', async () => {
132
+ fakeFindOne.mockResolvedValueOnce({ attrTimestampUnique: '1638140400' });
133
+
134
+ const validator = strapiUtils.validateYupSchema(
135
+ validators.timestamp(
136
+ {
137
+ attr: { type: 'timestamp', unique: true },
138
+ model: fakeModel,
139
+ updatedAttribute: {
140
+ name: 'attrTimestampUnique',
141
+ value: '1638140400',
142
+ },
143
+ entity: { id: 1, attrTimestampUnique: '1638140400' },
144
+ },
145
+ { isDraft: false }
146
+ )
147
+ );
148
+
149
+ expect(await validator('1638140400')).toBe('1638140400');
150
+ });
151
+
152
+ test('it checks the database for records with the same value for the checked attribute', async () => {
153
+ fakeFindOne.mockResolvedValueOnce(null);
154
+
155
+ const validator = strapiUtils.validateYupSchema(
156
+ validators.timestamp(
157
+ {
158
+ attr: { type: 'timestamp', unique: true },
159
+ model: fakeModel,
160
+ updatedAttribute: {
161
+ name: 'attrTimestampUnique',
162
+ value: '1638140400',
163
+ },
164
+ entity: null,
165
+ },
166
+ { isDraft: false }
167
+ )
168
+ );
169
+
170
+ await validator('1638140400');
171
+
172
+ expect(fakeFindOne).toHaveBeenCalledWith({
173
+ select: ['id'],
174
+ where: { attrTimestampUnique: '1638140400' },
175
+ });
176
+ });
177
+
178
+ test('it checks the database for records with the same value but not the same id for the checked attribute if an entity is passed', async () => {
179
+ fakeFindOne.mockResolvedValueOnce(null);
180
+
181
+ const validator = strapiUtils.validateYupSchema(
182
+ validators.timestamp(
183
+ {
184
+ attr: { type: 'timestamp', unique: true },
185
+ model: fakeModel,
186
+ updatedAttribute: {
187
+ name: 'attrTimestampUnique',
188
+ value: '1638140400',
189
+ },
190
+ entity: { id: 1, attrTimestampUnique: '1000000000' },
191
+ },
192
+ { isDraft: false }
193
+ )
194
+ );
195
+
196
+ await validator('1638140400');
197
+
198
+ expect(fakeFindOne).toHaveBeenCalledWith({
199
+ select: ['id'],
200
+ where: { $and: [{ attrTimestampUnique: '1638140400' }, { $not: { id: 1 } }] },
201
+ });
202
+ });
203
+ });
204
+ });
@@ -0,0 +1,229 @@
1
+ 'use strict';
2
+
3
+ const strapiUtils = require('@strapi/utils');
4
+ const {
5
+ errors: { YupValidationError },
6
+ } = require('@strapi/utils');
7
+ const validators = require('../validators');
8
+
9
+ describe('UID validator', () => {
10
+ const fakeFindOne = jest.fn();
11
+
12
+ global.strapi = {
13
+ db: {
14
+ query: jest.fn(() => ({
15
+ findOne: fakeFindOne,
16
+ })),
17
+ },
18
+ };
19
+
20
+ afterEach(() => {
21
+ jest.clearAllMocks();
22
+ fakeFindOne.mockReset();
23
+ });
24
+
25
+ const fakeModel = {
26
+ kind: 'contentType',
27
+ modelName: 'test-model',
28
+ uid: 'test-uid',
29
+ privateAttributes: [],
30
+ options: {},
31
+ attributes: {
32
+ attrUidUnique: { type: 'uid' },
33
+ },
34
+ };
35
+
36
+ describe('unique', () => {
37
+ test('it validates the unique constraint if there is no other record in the database', async () => {
38
+ fakeFindOne.mockResolvedValueOnce(null);
39
+
40
+ const validator = strapiUtils.validateYupSchema(
41
+ validators.uid(
42
+ {
43
+ attr: { type: 'uid', unique: true },
44
+ model: fakeModel,
45
+ updatedAttribute: { name: 'attrUidUnique', value: 'non-unique-uid' },
46
+ entity: null,
47
+ },
48
+ { isDraft: false }
49
+ )
50
+ );
51
+
52
+ expect(await validator('non-unique-uid')).toBe('non-unique-uid');
53
+ });
54
+
55
+ test('it does not validates the unique constraint if the attribute value is `null`', async () => {
56
+ fakeFindOne.mockResolvedValueOnce(null);
57
+
58
+ const validator = strapiUtils.validateYupSchema(
59
+ validators
60
+ .uid(
61
+ {
62
+ attr: { type: 'uid', unique: true },
63
+ model: fakeModel,
64
+ updatedAttribute: { name: 'attrUidUnique', value: null },
65
+ entity: null,
66
+ },
67
+ { isDraft: false }
68
+ )
69
+ .nullable()
70
+ );
71
+
72
+ await validator(null);
73
+
74
+ expect(fakeFindOne).not.toHaveBeenCalled();
75
+ });
76
+
77
+ test('it always validates the unique constraint even if the attribute is not set as unique', async () => {
78
+ fakeFindOne.mockResolvedValueOnce(null);
79
+
80
+ const validator = strapiUtils.validateYupSchema(
81
+ validators.uid(
82
+ {
83
+ attr: { type: 'uid' },
84
+ model: fakeModel,
85
+ updatedAttribute: { name: 'attrUidUnique', value: 'non-unique-uid' },
86
+ entity: null,
87
+ },
88
+ { isDraft: false }
89
+ )
90
+ );
91
+
92
+ expect(await validator('non-unique-uid')).toBe('non-unique-uid');
93
+ expect(fakeFindOne).toHaveBeenCalledWith({
94
+ select: ['id'],
95
+ where: { attrUidUnique: 'non-unique-uid' },
96
+ });
97
+ });
98
+
99
+ test('it fails the validation of the unique constraint if the database contains a record with the same attribute value', async () => {
100
+ expect.assertions(1);
101
+ fakeFindOne.mockResolvedValueOnce({ attrUidUnique: 'unique-uid' });
102
+
103
+ const validator = strapiUtils.validateYupSchema(
104
+ validators.uid(
105
+ {
106
+ attr: { type: 'uid', unique: true },
107
+ model: fakeModel,
108
+ updatedAttribute: { name: 'attrUidUnique', value: 'unique-uid' },
109
+ entity: null,
110
+ },
111
+ { isDraft: false }
112
+ )
113
+ );
114
+
115
+ try {
116
+ await validator('unique-uid');
117
+ } catch (err) {
118
+ expect(err).toBeInstanceOf(YupValidationError);
119
+ }
120
+ });
121
+
122
+ test('it validates the unique constraint if the attribute data has not changed even if there is a record in the database with the same attribute value', async () => {
123
+ fakeFindOne.mockResolvedValueOnce({ attrUidUnique: 'unchanged-unique-uid' });
124
+
125
+ const validator = strapiUtils.validateYupSchema(
126
+ validators.uid(
127
+ {
128
+ attr: { type: 'uid', unique: true },
129
+ model: fakeModel,
130
+ updatedAttribute: { name: 'attrUidUnique', value: 'unchanged-unique-uid' },
131
+ entity: { id: 1, attrUidUnique: 'unchanged-unique-uid' },
132
+ },
133
+ { isDraft: false }
134
+ )
135
+ );
136
+
137
+ expect(await validator('unchanged-unique-uid')).toBe('unchanged-unique-uid');
138
+ });
139
+
140
+ test('it checks the database for records with the same value for the checked attribute', async () => {
141
+ fakeFindOne.mockResolvedValueOnce(null);
142
+
143
+ const validator = strapiUtils.validateYupSchema(
144
+ validators.uid(
145
+ {
146
+ attr: { type: 'uid', unique: true },
147
+ model: fakeModel,
148
+ updatedAttribute: { name: 'attrUidUnique', value: 'unique-uid' },
149
+ entity: null,
150
+ },
151
+ { isDraft: false }
152
+ )
153
+ );
154
+
155
+ await validator('unique-uid');
156
+
157
+ expect(fakeFindOne).toHaveBeenCalledWith({
158
+ select: ['id'],
159
+ where: { attrUidUnique: 'unique-uid' },
160
+ });
161
+ });
162
+
163
+ test('it checks the database for records with the same value but not the same id for the checked attribute if an entity is passed', async () => {
164
+ fakeFindOne.mockResolvedValueOnce(null);
165
+
166
+ const validator = strapiUtils.validateYupSchema(
167
+ validators.uid(
168
+ {
169
+ attr: { type: 'uid', unique: true },
170
+ model: fakeModel,
171
+ updatedAttribute: { name: 'attrUidUnique', value: 'unique-uid' },
172
+ entity: { id: 1, attrUidUnique: 'other-uid' },
173
+ },
174
+ { isDraft: false }
175
+ )
176
+ );
177
+
178
+ await validator('unique-uid');
179
+
180
+ expect(fakeFindOne).toHaveBeenCalledWith({
181
+ select: ['id'],
182
+ where: { $and: [{ attrUidUnique: 'unique-uid' }, { $not: { id: 1 } }] },
183
+ });
184
+ });
185
+ });
186
+
187
+ describe('regExp', () => {
188
+ test('it fails to validate the uid if it does not fit the requried format', async () => {
189
+ expect.assertions(1);
190
+ fakeFindOne.mockResolvedValueOnce(null);
191
+
192
+ const validator = strapiUtils.validateYupSchema(
193
+ validators.uid(
194
+ {
195
+ attr: { type: 'uid', unique: true },
196
+ model: fakeModel,
197
+ updatedAttribute: { name: 'attrUidUnique', value: 'non-unique-uid' },
198
+ entity: null,
199
+ },
200
+ { isDraft: false }
201
+ )
202
+ );
203
+
204
+ try {
205
+ await validator('wrongly\\formated||UID');
206
+ } catch (err) {
207
+ expect(err).toBeInstanceOf(YupValidationError);
208
+ }
209
+ });
210
+
211
+ test('it validate the uid if it fit the required format', async () => {
212
+ fakeFindOne.mockResolvedValueOnce(null);
213
+
214
+ const validator = strapiUtils.validateYupSchema(
215
+ validators.uid(
216
+ {
217
+ attr: { type: 'uid', unique: true },
218
+ model: fakeModel,
219
+ updatedAttribute: { name: 'attrUidUnique', value: 'non-unique-uid' },
220
+ entity: null,
221
+ },
222
+ { isDraft: false }
223
+ )
224
+ );
225
+
226
+ expect(await validator('properly.formated-uid')).toBe('properly.formated-uid');
227
+ });
228
+ });
229
+ });
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ const crypto = require('crypto');
4
+ const { generateAdminUserHash } = require('../admin-user-hash');
5
+ const createContext = require('../../../../../../../test/helpers/create-context');
6
+
7
+ describe('user email hash', () => {
8
+ test('should create a hash from admin user email', () => {
9
+ const state = {
10
+ user: {
11
+ email: 'testemail@strapi.io',
12
+ },
13
+ };
14
+
15
+ const ctx = createContext({}, { state });
16
+
17
+ const strapi = {
18
+ requestContext: {
19
+ get: jest.fn(() => ctx),
20
+ },
21
+ };
22
+
23
+ const hash = crypto.createHash('sha256').update('testemail@strapi.io').digest('hex');
24
+
25
+ const userId = generateAdminUserHash(strapi);
26
+ expect(userId).toBe(hash);
27
+ });
28
+
29
+ test('should return empty string if user is not available on ctx', () => {
30
+ const ctx = createContext({}, {});
31
+
32
+ const strapi = {
33
+ requestContext: {
34
+ get: jest.fn(() => ctx),
35
+ },
36
+ };
37
+
38
+ const userId = generateAdminUserHash(strapi);
39
+ expect(userId).toBe('');
40
+ });
41
+ });
@@ -0,0 +1,157 @@
1
+ 'use strict';
2
+
3
+ jest.mock('node-fetch', () => jest.fn(() => Promise.resolve()));
4
+
5
+ const { get } = require('lodash/fp');
6
+ const metrics = require('../index');
7
+
8
+ const fetch = jest.fn(() => Promise.resolve());
9
+
10
+ describe('metrics', () => {
11
+ beforeEach(() => {
12
+ fetch.mockClear();
13
+ });
14
+ test('Initializes a middleware', () => {
15
+ const use = jest.fn();
16
+
17
+ const metricsInstance = metrics({
18
+ config: {
19
+ get(path) {
20
+ return get(path, this);
21
+ },
22
+ uuid: 'test',
23
+ environment: 'dev',
24
+ info: {
25
+ strapi: '0.0.0',
26
+ },
27
+ },
28
+ server: {
29
+ use,
30
+ },
31
+ dirs: {
32
+ app: {
33
+ root: process.cwd(),
34
+ },
35
+ },
36
+ requestContext: {
37
+ get: jest.fn(() => ({})),
38
+ },
39
+ fetch,
40
+ });
41
+
42
+ metricsInstance.register();
43
+
44
+ expect(use).toHaveBeenCalled();
45
+
46
+ metricsInstance.destroy();
47
+ });
48
+
49
+ test('Does not init middleware if disabled', () => {
50
+ const use = jest.fn();
51
+
52
+ const metricsInstance = metrics({
53
+ config: {
54
+ get(path) {
55
+ return get(path, this);
56
+ },
57
+ uuid: false,
58
+ environment: 'dev',
59
+ info: {
60
+ strapi: '0.0.0',
61
+ },
62
+ },
63
+ server: {
64
+ use,
65
+ },
66
+ dirs: {
67
+ app: {
68
+ root: process.cwd(),
69
+ },
70
+ },
71
+ requestContext: {
72
+ get: jest.fn(() => ({})),
73
+ },
74
+ fetch,
75
+ });
76
+
77
+ metricsInstance.register();
78
+
79
+ expect(use).not.toHaveBeenCalled();
80
+
81
+ metricsInstance.destroy();
82
+ });
83
+
84
+ test('Send payload with meta', () => {
85
+ const { send } = metrics({
86
+ config: {
87
+ get(path) {
88
+ return get(path, this);
89
+ },
90
+ uuid: 'test',
91
+ environment: 'dev',
92
+ info: {
93
+ strapi: '0.0.0',
94
+ },
95
+ },
96
+ server: {
97
+ use() {},
98
+ },
99
+ dirs: {
100
+ app: {
101
+ root: process.cwd(),
102
+ },
103
+ },
104
+ requestContext: {
105
+ get: jest.fn(() => ({})),
106
+ },
107
+ fetch,
108
+ });
109
+
110
+ send('someEvent');
111
+
112
+ expect(fetch).toHaveBeenCalled();
113
+ expect(fetch.mock.calls[0][0]).toBe('https://analytics.strapi.io/api/v2/track');
114
+ expect(fetch.mock.calls[0][1].method).toBe('POST');
115
+ expect(JSON.parse(fetch.mock.calls[0][1].body)).toMatchObject({
116
+ event: 'someEvent',
117
+ groupProperties: {
118
+ projectType: 'Community',
119
+ projectId: 'test',
120
+ },
121
+ });
122
+
123
+ fetch.mockClear();
124
+ });
125
+
126
+ test('Does not send payload when disabled', () => {
127
+ const { send } = metrics({
128
+ config: {
129
+ get(path) {
130
+ return get(path, this);
131
+ },
132
+ uuid: false,
133
+ packageJsonStrapi: {},
134
+ environment: 'dev',
135
+ info: {
136
+ strapi: '0.0.0',
137
+ },
138
+ },
139
+ server: {
140
+ use() {},
141
+ },
142
+ dirs: {
143
+ app: {
144
+ root: process.cwd(),
145
+ },
146
+ },
147
+ requestContext: {
148
+ get: jest.fn(() => ({})),
149
+ },
150
+ fetch,
151
+ });
152
+
153
+ send('someEvent');
154
+
155
+ expect(fetch).not.toHaveBeenCalled();
156
+ });
157
+ });
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ const isTruthyEnvVar = require('../is-truthy');
4
+
5
+ describe('isTruthyEnvVar', () => {
6
+ test('Handles boolean strings', () => {
7
+ expect(isTruthyEnvVar('true')).toBe(true);
8
+
9
+ expect(isTruthyEnvVar('false')).toBe(false);
10
+ });
11
+
12
+ test('Handle numbers', () => {
13
+ expect(isTruthyEnvVar(1)).toBe(true);
14
+
15
+ expect(isTruthyEnvVar(-1)).toBe(false);
16
+ expect(isTruthyEnvVar(0)).toBe(false);
17
+ expect(isTruthyEnvVar(2)).toBe(false);
18
+ });
19
+
20
+ test('Handles default booleans', () => {
21
+ expect(isTruthyEnvVar(true)).toBe(true);
22
+ expect(isTruthyEnvVar(false)).toBe(false);
23
+ });
24
+
25
+ test('Handles all the other values', () => {
26
+ expect(isTruthyEnvVar(null)).toBe(false);
27
+ expect(isTruthyEnvVar(undefined)).toBe(false);
28
+ expect(isTruthyEnvVar({})).toBe(false);
29
+ expect(isTruthyEnvVar([])).toBe(false);
30
+ expect(isTruthyEnvVar(new Date())).toBe(false);
31
+ expect(isTruthyEnvVar('some text')).toBe(false);
32
+ });
33
+ });