@raketa-cloud/admin 1.8.9 → 1.8.11
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.
- package/dist/application.css +113 -24
- package/package.json +5 -3
- package/src/HonoAdapter.js +23 -23
- package/src/Logger.js +7 -8
- package/src/RaketaContext.js +1 -0
- package/src/cipher.js +2 -2
- package/src/cloud/ContentTasks.js +31 -0
- package/src/cloud/RaketaClient.js +1 -1
- package/src/cloud/Redirects.js +2 -2
- package/src/cloud/ResourceChanges.js +1 -1
- package/src/cloud/ResourceRevisions.js +2 -2
- package/src/cloud/Resources.js +28 -12
- package/src/cloud/Tags.js +4 -4
- package/src/cloud/documents/common.js +16 -0
- package/src/cloud/documents/contentTasksDocuments.js +59 -0
- package/src/cloud/documents/resourcesDocuments.js +12 -0
- package/src/filters.js +3 -3
- package/src/handlers/TagsHandler.js +2 -2
- package/src/handlers/_shared/getResourceUpdateDestination.js +1 -1
- package/src/handlers/categories/index.js +3 -3
- package/src/handlers/content_tasks/ContentTasksHandler.js +32 -0
- package/src/handlers/resource_revisions/LocksHandler.js +4 -1
- package/src/handlers/resources/ClonesHandler.js +1 -3
- package/src/handlers/resources/ExportsHandler.js +1 -5
- package/src/handlers/resources/ResourcesHandler.js +1 -1
- package/src/handlers/resources/TranslationsHandler.js +28 -19
- package/src/handlers/resources/URLsHandler.js +3 -1
- package/src/helpers/AuthHelper.js +1 -1
- package/src/helpers/FormBuilder.js +14 -14
- package/src/helpers/Pagination.js +5 -5
- package/src/helpers/historyUtils.js +3 -3
- package/src/helpers/utils.js +6 -1
- package/src/index.js +2 -1
- package/src/routeMember.js +9 -4
- package/src/routeNestedCollection.js +14 -29
- package/src/routeNestedMember.js +17 -6
- package/src/{routeResource.js → routeResourceModule.js} +25 -20
- package/src/routeStandard.js +8 -4
- package/src/setupAuthentication.js +1 -1
- package/src/setupCloud.js +5 -0
- package/src/tests/Adapter.test.js +2 -2
- package/src/tests/HonoAdapter.coverage.test.js +47 -25
- package/src/tests/HonoAdapter.filter.test.js +28 -18
- package/src/tests/HonoAdapter.test.js +3 -3
- package/src/tests/RaketaClient.test.js +427 -413
- package/src/tests/RaketaContext.test.js +1 -1
- package/src/tests/buildResourcePath.test.js +1 -1
- package/src/tests/cipher.test.js +16 -16
- package/src/tests/filters.test.js +24 -24
- package/src/tests/handlers/RedirectsHandler.test/destroy.test.js +1 -1
- package/src/tests/handlers/TagsHandler.test/create.test.js +2 -2
- package/src/tests/handlers/TagsHandler.test/destroy.test.js +1 -1
- package/src/tests/handlers/TagsHandler.test/update.test.js +2 -2
- package/src/tests/handlers/categories/create.test.js +2 -2
- package/src/tests/handlers/categories/destroy.test.js +1 -1
- package/src/tests/handlers/content_tasks/ContentTasksHandler.test/index.test.js +161 -0
- package/src/tests/handlers/resource_revisions/CancelSchedulesHandler.test/create.test.js +2 -2
- package/src/tests/handlers/resource_revisions/CodeHandler.test/update.test.js +1 -1
- package/src/tests/handlers/resource_revisions/GeneralHandler.test/update.test.js +1 -1
- package/src/tests/handlers/resource_revisions/LocksHandler.test/create.test.js +5 -5
- package/src/tests/handlers/resource_revisions/LocksHandler.test/create_form.test.js +6 -2
- package/src/tests/handlers/resource_revisions/MetaHandler.test/update.test.js +1 -1
- package/src/tests/handlers/resource_revisions/PublishesHandler.test/create.test.js +5 -5
- package/src/tests/handlers/resource_revisions/ResourceRevisionsHandler.test/create.test.js +2 -2
- package/src/tests/handlers/resource_revisions/ResourceRevisionsHandler.test/destroy.test.js +1 -1
- package/src/tests/handlers/resource_revisions/RevertsHandler.test/create.test.js +18 -3
- package/src/tests/handlers/resource_revisions/TagHandler.test/update.test.js +1 -1
- package/src/tests/handlers/resource_revisions/UnlocksHandler.test/create.test.js +2 -2
- package/src/tests/handlers/resource_revisions/VisualHandler.test/update.test.js +1 -1
- package/src/tests/handlers/resource_revisions/WidgetHandler.test/update.test.js +2 -2
- package/src/tests/handlers/resources/ChangeHandler.test/show.test.js +7 -2
- package/src/tests/handlers/resources/ClonesHandler.test/create.test.js +1 -3
- package/src/tests/handlers/resources/ExportsHandler.test/index.test.js +8 -8
- package/src/tests/handlers/resources/HistoryHandler.test/index.test.js +1 -1
- package/src/tests/handlers/resources/ResourcesAPIHandler.test/index.test.js +1 -5
- package/src/tests/handlers/resources/ResourcesHandler.test/create.test.js +2 -2
- package/src/tests/handlers/resources/ResourcesHandler.test/show.test.js +1 -1
- package/src/tests/handlers/resources/TranslationsHandler.test/create.test.js +24 -14
- package/src/tests/handlers/resources/TranslationsHandler.test/create_form.test.js +1 -1
- package/src/tests/handlers/resources/TranslationsHandler.test/index.test.js +3 -3
- package/src/tests/handlers/resources/URLsHandler.test/create.test.js +4 -6
- package/src/tests/helpers/AuthHelper.test.js +11 -12
- package/src/tests/helpers/CSVExportHelper.test.js +3 -3
- package/src/tests/helpers/FormBuilder.test.js +21 -21
- package/src/tests/helpers/HTMLBuilder.test.js +4 -4
- package/src/tests/helpers/Inflector.test.js +1 -1
- package/src/tests/helpers/Pagination.test.js +1 -1
- package/src/tests/helpers/utils.test.js +46 -0
- package/src/tests/routeCategoriesModule.test.js +10 -5
- package/src/tests/routeCollection.test.js +1 -1
- package/src/tests/routeMember.test.js +2 -2
- package/src/tests/routeNestedCollection.test.js +3 -3
- package/src/tests/routeNestedMember.test.js +3 -3
- package/src/tests/{routeResource.test.js → routeResourceModule.test.js} +28 -25
- package/src/tests/routeSettings.test.js +3 -3
- package/src/tests/routeStandard.test.js +31 -13
- package/src/tests/setupAuthentication.test.js +9 -6
- package/src/tests/support/factory.js +33 -0
- package/src/tests/utils.test.js +19 -19
- package/src/views/content_tasks/index.ejs +191 -0
- package/src/views/layouts/application.ejs +2 -1
- package/src/views/resources/_shared/_toolbar.ejs +33 -2
- package/src/views/resources/_shared/_translations_strip.ejs +71 -0
- package/src/views/resources/index.ejs +5 -0
- package/src/views/resources/show.ejs +1 -29
- package/src/views/resources/translations/create_form.ejs +13 -0
|
@@ -32,7 +32,12 @@ describe("Resource revision revert", () => {
|
|
|
32
32
|
|
|
33
33
|
const result = await RevertsHandler.create(ctx);
|
|
34
34
|
|
|
35
|
-
expect(mockRevert).toHaveBeenCalledWith(
|
|
35
|
+
expect(mockRevert).toHaveBeenCalledWith(
|
|
36
|
+
resourceId,
|
|
37
|
+
version,
|
|
38
|
+
"en",
|
|
39
|
+
"article",
|
|
40
|
+
);
|
|
36
41
|
|
|
37
42
|
expect(result).toEqual({
|
|
38
43
|
redirect: `/en/articles/${resourceId}`,
|
|
@@ -57,7 +62,12 @@ describe("Resource revision revert", () => {
|
|
|
57
62
|
await RevertsHandler.create(ctx);
|
|
58
63
|
}).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
|
|
59
64
|
|
|
60
|
-
expect(mockRevert).toHaveBeenCalledWith(
|
|
65
|
+
expect(mockRevert).toHaveBeenCalledWith(
|
|
66
|
+
resourceId,
|
|
67
|
+
version,
|
|
68
|
+
"en",
|
|
69
|
+
"article",
|
|
70
|
+
);
|
|
61
71
|
});
|
|
62
72
|
|
|
63
73
|
test("create failed with resource errors", async () => {
|
|
@@ -78,6 +88,11 @@ describe("Resource revision revert", () => {
|
|
|
78
88
|
await RevertsHandler.create(ctx);
|
|
79
89
|
}).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
|
|
80
90
|
|
|
81
|
-
expect(mockRevert).toHaveBeenCalledWith(
|
|
91
|
+
expect(mockRevert).toHaveBeenCalledWith(
|
|
92
|
+
resourceId,
|
|
93
|
+
version,
|
|
94
|
+
"en",
|
|
95
|
+
"article",
|
|
96
|
+
);
|
|
82
97
|
});
|
|
83
98
|
});
|
|
@@ -54,7 +54,7 @@ describe("Resource revision unlock", () => {
|
|
|
54
54
|
}));
|
|
55
55
|
|
|
56
56
|
await expect(UnlocksHandler.create(ctx)).rejects.toThrow(
|
|
57
|
-
`Failed to unlock revision: ${JSON.stringify(errors)}
|
|
57
|
+
`Failed to unlock revision: ${JSON.stringify(errors)}`,
|
|
58
58
|
);
|
|
59
59
|
|
|
60
60
|
expect(mockUnlock).toHaveBeenCalledWith(revision.id, "en", "article");
|
|
@@ -76,7 +76,7 @@ describe("Resource revision unlock", () => {
|
|
|
76
76
|
}));
|
|
77
77
|
|
|
78
78
|
await expect(UnlocksHandler.create(ctx)).rejects.toThrow(
|
|
79
|
-
`Failed to unlock revision: ${JSON.stringify(resourceErrors)}
|
|
79
|
+
`Failed to unlock revision: ${JSON.stringify(resourceErrors)}`,
|
|
80
80
|
);
|
|
81
81
|
|
|
82
82
|
expect(mockUnlock).toHaveBeenCalledWith(revision.id, "en", "article");
|
|
@@ -57,7 +57,7 @@ describe("Resource revision WidgetHandler", () => {
|
|
|
57
57
|
revision.id,
|
|
58
58
|
"en",
|
|
59
59
|
newWidgets,
|
|
60
|
-
"article"
|
|
60
|
+
"article",
|
|
61
61
|
);
|
|
62
62
|
expect(mockFind).toHaveBeenCalledWith(revision.id, "en", "article");
|
|
63
63
|
expect(mockSettings).toHaveBeenCalledWith("en");
|
|
@@ -103,7 +103,7 @@ describe("Resource revision WidgetHandler", () => {
|
|
|
103
103
|
revision.id,
|
|
104
104
|
"en",
|
|
105
105
|
newWidgets,
|
|
106
|
-
"article"
|
|
106
|
+
"article",
|
|
107
107
|
);
|
|
108
108
|
expect(mockFind).toHaveBeenCalledWith(revision.id, "en", "article");
|
|
109
109
|
|
|
@@ -33,7 +33,7 @@ describe("Resource ChangeHandler", () => {
|
|
|
33
33
|
resource.id,
|
|
34
34
|
49,
|
|
35
35
|
"en",
|
|
36
|
-
"article"
|
|
36
|
+
"article",
|
|
37
37
|
);
|
|
38
38
|
|
|
39
39
|
expect(result).toEqual({
|
|
@@ -52,6 +52,11 @@ describe("Resource ChangeHandler", () => {
|
|
|
52
52
|
await ChangeHandler.show(ctx);
|
|
53
53
|
}).rejects.toThrow("Missing article #42");
|
|
54
54
|
|
|
55
|
-
expect(mockedGetChangePreview).toHaveBeenCalledWith(
|
|
55
|
+
expect(mockedGetChangePreview).toHaveBeenCalledWith(
|
|
56
|
+
"42",
|
|
57
|
+
49,
|
|
58
|
+
"en",
|
|
59
|
+
"article",
|
|
60
|
+
);
|
|
56
61
|
});
|
|
57
62
|
});
|
|
@@ -48,9 +48,7 @@ describe("Clone resource", () => {
|
|
|
48
48
|
|
|
49
49
|
expect(async () => {
|
|
50
50
|
await ClonesHandler.create(ctx);
|
|
51
|
-
}).rejects.toThrow(
|
|
52
|
-
`Error cloning article: ${JSON.stringify(errors)}`
|
|
53
|
-
);
|
|
51
|
+
}).rejects.toThrow(`Error cloning article: ${JSON.stringify(errors)}`);
|
|
54
52
|
|
|
55
53
|
expect(mockClone).toHaveBeenCalledWith(resource.id, "en", "article");
|
|
56
54
|
});
|
|
@@ -53,13 +53,13 @@ describe("Resources ExportsHandler", () => {
|
|
|
53
53
|
expect(mockedListAll).toHaveBeenCalledWith({}, "en", "article");
|
|
54
54
|
|
|
55
55
|
expect(result.text).toContain(
|
|
56
|
-
"id,type,locale,title,URL,visibility,created_at,updated_at"
|
|
56
|
+
"id,type,locale,title,URL,visibility,created_at,updated_at",
|
|
57
57
|
);
|
|
58
58
|
expect(result.text).toContain(
|
|
59
|
-
"1,article,en,Resource 1,/resource-1,public,2024-01-01,2024-01-02"
|
|
59
|
+
"1,article,en,Resource 1,/resource-1,public,2024-01-01,2024-01-02",
|
|
60
60
|
);
|
|
61
61
|
expect(result.text).toContain(
|
|
62
|
-
"2,article,en,Resource 2,/resource-2,private,2024-01-03,2024-01-04"
|
|
62
|
+
"2,article,en,Resource 2,/resource-2,private,2024-01-03,2024-01-04",
|
|
63
63
|
);
|
|
64
64
|
|
|
65
65
|
expect(result.headers).toEqual({
|
|
@@ -94,11 +94,11 @@ describe("Resources ExportsHandler", () => {
|
|
|
94
94
|
expect(mockedListAll).toHaveBeenCalledWith(
|
|
95
95
|
{ locale: "es" },
|
|
96
96
|
"es",
|
|
97
|
-
"article"
|
|
97
|
+
"article",
|
|
98
98
|
);
|
|
99
99
|
|
|
100
100
|
expect(result.text).toContain(
|
|
101
|
-
"1,article,es,Recurso 1,/recurso-1,public,2024-01-01,2024-01-02"
|
|
101
|
+
"1,article,es,Recurso 1,/recurso-1,public,2024-01-01,2024-01-02",
|
|
102
102
|
);
|
|
103
103
|
});
|
|
104
104
|
|
|
@@ -144,7 +144,7 @@ describe("Resources ExportsHandler", () => {
|
|
|
144
144
|
const result = await ExportsHandler.index(ctx);
|
|
145
145
|
|
|
146
146
|
expect(result.text).toBe(
|
|
147
|
-
"id,type,locale,title,URL,visibility,created_at,updated_at,translations"
|
|
147
|
+
"id,type,locale,title,URL,visibility,created_at,updated_at,translations",
|
|
148
148
|
);
|
|
149
149
|
});
|
|
150
150
|
|
|
@@ -182,11 +182,11 @@ describe("Resources ExportsHandler", () => {
|
|
|
182
182
|
expect(mockedListAll).toHaveBeenCalledWith(
|
|
183
183
|
{},
|
|
184
184
|
"en",
|
|
185
|
-
"custom-resource-type"
|
|
185
|
+
"custom-resource-type",
|
|
186
186
|
);
|
|
187
187
|
|
|
188
188
|
expect(result.headers["Content-Disposition"]).toContain(
|
|
189
|
-
"custom-resource-type_export.csv"
|
|
189
|
+
"custom-resource-type_export.csv",
|
|
190
190
|
);
|
|
191
191
|
|
|
192
192
|
global.Date.mockRestore();
|
|
@@ -28,11 +28,7 @@ describe("Resources API Handler", () => {
|
|
|
28
28
|
|
|
29
29
|
const result = await ResourcesAPIHandler.index(ctx);
|
|
30
30
|
|
|
31
|
-
expect(mockedListAll).toHaveBeenCalledWith(
|
|
32
|
-
{ foo: "bar" },
|
|
33
|
-
"en",
|
|
34
|
-
"article"
|
|
35
|
-
);
|
|
31
|
+
expect(mockedListAll).toHaveBeenCalledWith({ foo: "bar" }, "en", "article");
|
|
36
32
|
|
|
37
33
|
expect(result).toEqual({
|
|
38
34
|
json: { list: [resource] },
|
|
@@ -74,7 +74,7 @@ describe("Resources Handler", () => {
|
|
|
74
74
|
categories: [],
|
|
75
75
|
},
|
|
76
76
|
"en",
|
|
77
|
-
"article"
|
|
77
|
+
"article",
|
|
78
78
|
);
|
|
79
79
|
|
|
80
80
|
expect(result).toEqual({
|
|
@@ -141,7 +141,7 @@ describe("Resources Handler", () => {
|
|
|
141
141
|
categories: [],
|
|
142
142
|
},
|
|
143
143
|
"en",
|
|
144
|
-
"article"
|
|
144
|
+
"article",
|
|
145
145
|
);
|
|
146
146
|
|
|
147
147
|
expect(result).toEqual({
|
|
@@ -29,9 +29,7 @@ describe("Resource Translations Handler", () => {
|
|
|
29
29
|
});
|
|
30
30
|
const ctx = buildCtx({}, resource);
|
|
31
31
|
|
|
32
|
-
jest
|
|
33
|
-
.spyOn(ctx.client.resources, "find")
|
|
34
|
-
.mockImplementation(() => resource);
|
|
32
|
+
jest.spyOn(ctx.client.resources, "find").mockImplementation(() => resource);
|
|
35
33
|
|
|
36
34
|
const result = await TranslationsHandler.create(ctx);
|
|
37
35
|
|
|
@@ -74,7 +72,7 @@ describe("Resource Translations Handler", () => {
|
|
|
74
72
|
locales.map(() => ({
|
|
75
73
|
resource: null,
|
|
76
74
|
errors: translationErrors,
|
|
77
|
-
}))
|
|
75
|
+
})),
|
|
78
76
|
);
|
|
79
77
|
|
|
80
78
|
const mockFormatErrors = jest
|
|
@@ -129,7 +127,7 @@ describe("Resource Translations Handler", () => {
|
|
|
129
127
|
locales.map((locale) => ({
|
|
130
128
|
resource: { id: `translated-resource-${locale}` },
|
|
131
129
|
errors: null,
|
|
132
|
-
}))
|
|
130
|
+
})),
|
|
133
131
|
);
|
|
134
132
|
|
|
135
133
|
const mockCreateRevisionBatch = jest
|
|
@@ -138,7 +136,7 @@ describe("Resource Translations Handler", () => {
|
|
|
138
136
|
revisionInputs.map(({ locale }) => ({
|
|
139
137
|
revision: { id: `revision-${locale}` },
|
|
140
138
|
errors: null,
|
|
141
|
-
}))
|
|
139
|
+
})),
|
|
142
140
|
);
|
|
143
141
|
|
|
144
142
|
const result = await TranslationsHandler.create(ctx);
|
|
@@ -155,13 +153,22 @@ describe("Resource Translations Handler", () => {
|
|
|
155
153
|
visibility: "private",
|
|
156
154
|
slug: resource.slug,
|
|
157
155
|
}),
|
|
158
|
-
"article"
|
|
156
|
+
"article",
|
|
157
|
+
undefined,
|
|
159
158
|
);
|
|
160
159
|
|
|
161
160
|
expect(mockCreateRevisionBatch).toHaveBeenCalledTimes(1);
|
|
162
161
|
expect(mockCreateRevisionBatch).toHaveBeenCalledWith([
|
|
163
|
-
{
|
|
164
|
-
|
|
162
|
+
{
|
|
163
|
+
resourceId: "translated-resource-fr",
|
|
164
|
+
resourceType: "article",
|
|
165
|
+
locale: "fr",
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
resourceId: "translated-resource-es",
|
|
169
|
+
resourceType: "article",
|
|
170
|
+
locale: "es",
|
|
171
|
+
},
|
|
165
172
|
]);
|
|
166
173
|
|
|
167
174
|
expect(result).toEqual({
|
|
@@ -219,7 +226,8 @@ describe("Resource Translations Handler", () => {
|
|
|
219
226
|
visibility: "private",
|
|
220
227
|
slug: resource.slug,
|
|
221
228
|
}),
|
|
222
|
-
"article"
|
|
229
|
+
"article",
|
|
230
|
+
undefined,
|
|
223
231
|
);
|
|
224
232
|
|
|
225
233
|
expect(result).toEqual({
|
|
@@ -259,9 +267,7 @@ describe("Resource Translations Handler", () => {
|
|
|
259
267
|
|
|
260
268
|
const ctx = buildCtx(params, resource);
|
|
261
269
|
|
|
262
|
-
jest
|
|
263
|
-
.spyOn(ctx.client.resources, "find")
|
|
264
|
-
.mockImplementation(() => resource);
|
|
270
|
+
jest.spyOn(ctx.client.resources, "find").mockImplementation(() => resource);
|
|
265
271
|
|
|
266
272
|
jest
|
|
267
273
|
.spyOn(ctx.client.resources, "translateBatch")
|
|
@@ -288,7 +294,11 @@ describe("Resource Translations Handler", () => {
|
|
|
288
294
|
const result = await TranslationsHandler.create(ctx);
|
|
289
295
|
|
|
290
296
|
expect(mockCreateRevisionBatch).toHaveBeenCalledWith([
|
|
291
|
-
{
|
|
297
|
+
{
|
|
298
|
+
resourceId: "translated-resource-fr",
|
|
299
|
+
resourceType: "article",
|
|
300
|
+
locale: "fr",
|
|
301
|
+
},
|
|
292
302
|
]);
|
|
293
303
|
expect(mockFormatErrors).toHaveBeenCalledWith(revisionErrors);
|
|
294
304
|
|
|
@@ -77,7 +77,7 @@ describe("Resource translation form", () => {
|
|
|
77
77
|
.mockImplementation(() => null);
|
|
78
78
|
|
|
79
79
|
await expect(TranslationsHandler.create_form(ctx)).rejects.toThrow(
|
|
80
|
-
"Cannot find article with id 42"
|
|
80
|
+
"Cannot find article with id 42",
|
|
81
81
|
);
|
|
82
82
|
|
|
83
83
|
expect(mockFind).toHaveBeenCalledWith("42", "en", "article");
|
|
@@ -62,17 +62,17 @@ describe("Resource Translations Handler", () => {
|
|
|
62
62
|
expect(mockedRevisions).toHaveBeenCalledWith(
|
|
63
63
|
"fr-resource-id",
|
|
64
64
|
"fr",
|
|
65
|
-
"article"
|
|
65
|
+
"article",
|
|
66
66
|
);
|
|
67
67
|
expect(mockedRevisions).toHaveBeenCalledWith(
|
|
68
68
|
"es-resource-id",
|
|
69
69
|
"es",
|
|
70
|
-
"article"
|
|
70
|
+
"article",
|
|
71
71
|
);
|
|
72
72
|
expect(mockedList).toHaveBeenCalledWith(
|
|
73
73
|
{ translations: "fr:fr-resource-id;es:es-resource-id" },
|
|
74
74
|
"en",
|
|
75
|
-
"article"
|
|
75
|
+
"article",
|
|
76
76
|
);
|
|
77
77
|
|
|
78
78
|
expect(result).toEqual({
|
|
@@ -51,7 +51,7 @@ describe("Resource change url", () => {
|
|
|
51
51
|
destination: `/en/blog/${updateSettings.slug}`,
|
|
52
52
|
httpResponseCode: 301,
|
|
53
53
|
note: "Created with changed URL for a article",
|
|
54
|
-
}
|
|
54
|
+
},
|
|
55
55
|
);
|
|
56
56
|
|
|
57
57
|
expect(result).toEqual({
|
|
@@ -74,9 +74,7 @@ describe("Resource change url", () => {
|
|
|
74
74
|
.spyOn(ctx.client.resources, "updateSlug")
|
|
75
75
|
.mockImplementation(() => ({
|
|
76
76
|
resource: null,
|
|
77
|
-
errors: [
|
|
78
|
-
{ codes: [], key: "slug", message: "has already been taken" },
|
|
79
|
-
],
|
|
77
|
+
errors: [{ codes: [], key: "slug", message: "has already been taken" }],
|
|
80
78
|
}));
|
|
81
79
|
|
|
82
80
|
const result = await URLsHandler.create(ctx);
|
|
@@ -87,7 +85,7 @@ describe("Resource change url", () => {
|
|
|
87
85
|
updateSettings.slug,
|
|
88
86
|
"en",
|
|
89
87
|
"article",
|
|
90
|
-
null
|
|
88
|
+
null,
|
|
91
89
|
);
|
|
92
90
|
|
|
93
91
|
expect(result).toEqual({
|
|
@@ -137,7 +135,7 @@ describe("Resource change url", () => {
|
|
|
137
135
|
destination: `/en/blog/${updateSettings.slug}`,
|
|
138
136
|
httpResponseCode: 301,
|
|
139
137
|
note: "Created with changed URL for a article",
|
|
140
|
-
}
|
|
138
|
+
},
|
|
141
139
|
);
|
|
142
140
|
|
|
143
141
|
expect(result).toEqual({
|
|
@@ -5,7 +5,7 @@ describe("AuthHelper", () => {
|
|
|
5
5
|
test("parses JWT token correctly", () => {
|
|
6
6
|
const payload = { user: "test", exp: 1735689600 };
|
|
7
7
|
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
|
|
8
|
-
"base64"
|
|
8
|
+
"base64",
|
|
9
9
|
);
|
|
10
10
|
const mockToken = `header.${encodedPayload}.signature`;
|
|
11
11
|
|
|
@@ -19,7 +19,7 @@ describe("AuthHelper", () => {
|
|
|
19
19
|
const futureTime = Math.floor(Date.now() / 1000) + 3600;
|
|
20
20
|
const payload = { exp: futureTime };
|
|
21
21
|
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
|
|
22
|
-
"base64"
|
|
22
|
+
"base64",
|
|
23
23
|
);
|
|
24
24
|
const mockToken = `header.${encodedPayload}.signature`;
|
|
25
25
|
|
|
@@ -31,7 +31,7 @@ describe("AuthHelper", () => {
|
|
|
31
31
|
const pastTime = Math.floor(Date.now() / 1000) - 3600;
|
|
32
32
|
const payload = { exp: pastTime };
|
|
33
33
|
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
|
|
34
|
-
"base64"
|
|
34
|
+
"base64",
|
|
35
35
|
);
|
|
36
36
|
const mockToken = `header.${encodedPayload}.signature`;
|
|
37
37
|
|
|
@@ -42,7 +42,7 @@ describe("AuthHelper", () => {
|
|
|
42
42
|
test("returns false for token without exp", () => {
|
|
43
43
|
const payload = { user: "test" };
|
|
44
44
|
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
|
|
45
|
-
"base64"
|
|
45
|
+
"base64",
|
|
46
46
|
);
|
|
47
47
|
const mockToken = `header.${encodedPayload}.signature`;
|
|
48
48
|
|
|
@@ -59,15 +59,14 @@ describe("AuthHelper", () => {
|
|
|
59
59
|
|
|
60
60
|
const result2 = AuthHelper.verifyJWT(invalidToken2);
|
|
61
61
|
expect(result2).toBe(false);
|
|
62
|
-
})
|
|
63
|
-
|
|
62
|
+
});
|
|
64
63
|
});
|
|
65
64
|
|
|
66
65
|
describe("isAuthenticated", () => {
|
|
67
66
|
test("returns true for allowed paths", () => {
|
|
68
67
|
expect(AuthHelper.isAuthenticated({ path: "/login" })).toBe(true);
|
|
69
68
|
expect(
|
|
70
|
-
AuthHelper.isAuthenticated({ path: "/auth/google/callback" })
|
|
69
|
+
AuthHelper.isAuthenticated({ path: "/auth/google/callback" }),
|
|
71
70
|
).toBe(true);
|
|
72
71
|
expect(AuthHelper.isAuthenticated({ path: "/remote/verify" })).toBe(true);
|
|
73
72
|
});
|
|
@@ -76,7 +75,7 @@ describe("AuthHelper", () => {
|
|
|
76
75
|
const futureTime = Math.floor(Date.now() / 1000) + 3600;
|
|
77
76
|
const payload = { exp: futureTime };
|
|
78
77
|
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
|
|
79
|
-
"base64"
|
|
78
|
+
"base64",
|
|
80
79
|
);
|
|
81
80
|
const mockToken = `header.${encodedPayload}.signature`;
|
|
82
81
|
|
|
@@ -84,7 +83,7 @@ describe("AuthHelper", () => {
|
|
|
84
83
|
AuthHelper.isAuthenticated({
|
|
85
84
|
path: "/protected",
|
|
86
85
|
token: mockToken,
|
|
87
|
-
})
|
|
86
|
+
}),
|
|
88
87
|
).toBe(true);
|
|
89
88
|
});
|
|
90
89
|
|
|
@@ -92,7 +91,7 @@ describe("AuthHelper", () => {
|
|
|
92
91
|
const pastTime = Math.floor(Date.now() / 1000) - 3600;
|
|
93
92
|
const payload = { exp: pastTime };
|
|
94
93
|
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
|
|
95
|
-
"base64"
|
|
94
|
+
"base64",
|
|
96
95
|
);
|
|
97
96
|
const mockToken = `header.${encodedPayload}.signature`;
|
|
98
97
|
|
|
@@ -100,7 +99,7 @@ describe("AuthHelper", () => {
|
|
|
100
99
|
AuthHelper.isAuthenticated({
|
|
101
100
|
path: "/protected",
|
|
102
101
|
token: mockToken,
|
|
103
|
-
})
|
|
102
|
+
}),
|
|
104
103
|
).toBe(false);
|
|
105
104
|
});
|
|
106
105
|
|
|
@@ -108,7 +107,7 @@ describe("AuthHelper", () => {
|
|
|
108
107
|
expect(
|
|
109
108
|
AuthHelper.isAuthenticated({
|
|
110
109
|
path: "/protected",
|
|
111
|
-
})
|
|
110
|
+
}),
|
|
112
111
|
).toBe(false);
|
|
113
112
|
});
|
|
114
113
|
});
|
|
@@ -208,8 +208,8 @@ describe("CSVExportHelper", () => {
|
|
|
208
208
|
updatedAt: "2024-01-02",
|
|
209
209
|
translations: {
|
|
210
210
|
es: {},
|
|
211
|
-
de: {}
|
|
212
|
-
}
|
|
211
|
+
de: {},
|
|
212
|
+
},
|
|
213
213
|
},
|
|
214
214
|
];
|
|
215
215
|
const headers = [...CSVExportHelper.standardHeaders];
|
|
@@ -363,7 +363,7 @@ describe("CSVExportHelper", () => {
|
|
|
363
363
|
"visibility",
|
|
364
364
|
"created_at",
|
|
365
365
|
"updated_at",
|
|
366
|
-
"translations"
|
|
366
|
+
"translations",
|
|
367
367
|
]);
|
|
368
368
|
});
|
|
369
369
|
});
|
|
@@ -20,7 +20,7 @@ describe("FormBuilder", () => {
|
|
|
20
20
|
<div class="mb-4">
|
|
21
21
|
<label for="f_resource_title">Title</label>
|
|
22
22
|
<input type="text" name="resource[title]" value="Test content" id="f_resource_title" />
|
|
23
|
-
</div>`)
|
|
23
|
+
</div>`),
|
|
24
24
|
);
|
|
25
25
|
});
|
|
26
26
|
|
|
@@ -35,7 +35,7 @@ describe("FormBuilder", () => {
|
|
|
35
35
|
resource: {
|
|
36
36
|
title: "Can't be blank",
|
|
37
37
|
},
|
|
38
|
-
}
|
|
38
|
+
},
|
|
39
39
|
);
|
|
40
40
|
|
|
41
41
|
const result = form.field("resource.title");
|
|
@@ -46,7 +46,7 @@ describe("FormBuilder", () => {
|
|
|
46
46
|
<label for="f_resource_title">Title</label>
|
|
47
47
|
<input type="text" name="resource[title]" value="Test content" id="f_resource_title" />
|
|
48
48
|
<span class="text-red-600">Can't be blank</span>
|
|
49
|
-
</div>`)
|
|
49
|
+
</div>`),
|
|
50
50
|
);
|
|
51
51
|
});
|
|
52
52
|
|
|
@@ -64,8 +64,8 @@ describe("FormBuilder", () => {
|
|
|
64
64
|
`<div class="mb-4">
|
|
65
65
|
<label for="f_resource_email">Electronic mail</label>
|
|
66
66
|
<input type="text" name="resource[email]" value="john@example.com" id="f_resource_email" />
|
|
67
|
-
</div
|
|
68
|
-
)
|
|
67
|
+
</div>`,
|
|
68
|
+
),
|
|
69
69
|
);
|
|
70
70
|
});
|
|
71
71
|
|
|
@@ -83,8 +83,8 @@ describe("FormBuilder", () => {
|
|
|
83
83
|
`<div class="mb-4">
|
|
84
84
|
<label for="f_resource_description">Description</label>
|
|
85
85
|
<textarea name="resource[description]" id="f_resource_description">Lorem ipsum dolor...</textarea>
|
|
86
|
-
</div
|
|
87
|
-
)
|
|
86
|
+
</div>`,
|
|
87
|
+
),
|
|
88
88
|
);
|
|
89
89
|
});
|
|
90
90
|
|
|
@@ -109,8 +109,8 @@ describe("FormBuilder", () => {
|
|
|
109
109
|
<input type="checkbox" value="yes" id="f_resource_description" name="resource[description]" />
|
|
110
110
|
<label for="f_resource_description">Description</label>
|
|
111
111
|
</div>
|
|
112
|
-
</div
|
|
113
|
-
)
|
|
112
|
+
</div>`,
|
|
113
|
+
),
|
|
114
114
|
);
|
|
115
115
|
});
|
|
116
116
|
|
|
@@ -133,8 +133,8 @@ describe("FormBuilder", () => {
|
|
|
133
133
|
<input type="checkbox" value="yes" id="f_resource_active" name="resource[active]" checked="checked" />
|
|
134
134
|
<label for="f_resource_active">Active</label>
|
|
135
135
|
</div>
|
|
136
|
-
</div
|
|
137
|
-
)
|
|
136
|
+
</div>`,
|
|
137
|
+
),
|
|
138
138
|
);
|
|
139
139
|
});
|
|
140
140
|
|
|
@@ -162,8 +162,8 @@ describe("FormBuilder", () => {
|
|
|
162
162
|
<option value="default" selected="selected">Default</option>
|
|
163
163
|
<option value="headless">Headless</option>
|
|
164
164
|
</select>
|
|
165
|
-
</div
|
|
166
|
-
)
|
|
165
|
+
</div>`,
|
|
166
|
+
),
|
|
167
167
|
);
|
|
168
168
|
});
|
|
169
169
|
|
|
@@ -192,8 +192,8 @@ describe("FormBuilder", () => {
|
|
|
192
192
|
<label ><input type="radio" name="resource[color]" value="blue" /> Blue</label>
|
|
193
193
|
<label ><input type="radio" name="resource[color]" value="green" /> Green</label>
|
|
194
194
|
</div>
|
|
195
|
-
</div
|
|
196
|
-
)
|
|
195
|
+
</div>`,
|
|
196
|
+
),
|
|
197
197
|
);
|
|
198
198
|
});
|
|
199
199
|
|
|
@@ -223,8 +223,8 @@ describe("FormBuilder", () => {
|
|
|
223
223
|
<label ><input type="checkbox" name="resource[color][]" value="green" /> Green</label>
|
|
224
224
|
<input type="hidden" name="resource[color][]" value="" />
|
|
225
225
|
</div>
|
|
226
|
-
</div
|
|
227
|
-
)
|
|
226
|
+
</div>`,
|
|
227
|
+
),
|
|
228
228
|
);
|
|
229
229
|
});
|
|
230
230
|
|
|
@@ -283,7 +283,7 @@ describe("FormBuilder", () => {
|
|
|
283
283
|
<option value="nofollow">No Follow</option>
|
|
284
284
|
</select>
|
|
285
285
|
</div>
|
|
286
|
-
</fieldset>`)
|
|
286
|
+
</fieldset>`),
|
|
287
287
|
);
|
|
288
288
|
});
|
|
289
289
|
|
|
@@ -338,8 +338,8 @@ describe("FormBuilder", () => {
|
|
|
338
338
|
<option value="nofollow">No Follow</option>
|
|
339
339
|
</select>
|
|
340
340
|
</div>
|
|
341
|
-
</fieldset
|
|
342
|
-
)
|
|
341
|
+
</fieldset>`,
|
|
342
|
+
),
|
|
343
343
|
);
|
|
344
344
|
});
|
|
345
345
|
});
|
|
@@ -350,7 +350,7 @@ describe("FormBuilder", () => {
|
|
|
350
350
|
const result = form.submit("Save", { class: "btn-primary" });
|
|
351
351
|
|
|
352
352
|
expect(normalizeHTML(result)).toEqual(
|
|
353
|
-
'<button type="submit" class="btn-primary">Save</button>'
|
|
353
|
+
'<button type="submit" class="btn-primary">Save</button>',
|
|
354
354
|
);
|
|
355
355
|
});
|
|
356
356
|
});
|