@raketa-cloud/admin 1.8.10 → 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 +109 -0
- package/package.json +4 -2
- package/src/HonoAdapter.js +22 -13
- 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 +1 -0
- package/src/routeMember.js +9 -4
- package/src/routeNestedCollection.js +14 -29
- package/src/routeNestedMember.js +17 -6
- package/src/routeStandard.js +5 -1
- 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 +44 -22
- 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/routeResourceModule.test.js +15 -16
- package/src/tests/routeSettings.test.js +3 -3
- package/src/tests/routeStandard.test.js +27 -9
- 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
package/src/tests/cipher.test.js
CHANGED
|
@@ -3,10 +3,10 @@ import { randomBytes } from "node:crypto";
|
|
|
3
3
|
|
|
4
4
|
jest.mock("node:crypto", () => {
|
|
5
5
|
const originalModule = jest.requireActual("node:crypto");
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
// Mock implementation to make tests deterministic
|
|
8
8
|
const mockIV = Buffer.from("0123456789abcdef0123456789abcdef", "hex");
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
return {
|
|
11
11
|
...originalModule,
|
|
12
12
|
randomBytes: jest.fn(() => mockIV),
|
|
@@ -19,39 +19,39 @@ jest.mock("node:crypto", () => {
|
|
|
19
19
|
describe("cipher", () => {
|
|
20
20
|
const mockConfig = {
|
|
21
21
|
secrets: {
|
|
22
|
-
crypto_secret: "test-secret-key"
|
|
23
|
-
}
|
|
22
|
+
crypto_secret: "test-secret-key",
|
|
23
|
+
},
|
|
24
24
|
};
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
describe("encrypt", () => {
|
|
27
27
|
test("encrypts plaintext string", () => {
|
|
28
28
|
const plaintext = "sensitive data";
|
|
29
29
|
const encrypted = cipher.encrypt(plaintext, mockConfig);
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
// Check that the output has the expected format (IV:encryptedData)
|
|
32
32
|
expect(encrypted).toContain(":");
|
|
33
33
|
const [ivHex, encryptedData] = encrypted.split(":");
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
// IV should be 32 hex characters (16 bytes)
|
|
36
36
|
expect(ivHex.length).toBe(32);
|
|
37
37
|
// Encrypted data should be present
|
|
38
38
|
expect(encryptedData.length).toBeGreaterThan(0);
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
// Verify randomBytes was called to generate an IV
|
|
41
41
|
expect(randomBytes).toHaveBeenCalledWith(16);
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
describe("decrypt", () => {
|
|
46
46
|
test("decrypts encrypted string back to original plaintext", () => {
|
|
47
47
|
const plaintext = "sensitive data to encrypt and decrypt";
|
|
48
48
|
const encrypted = cipher.encrypt(plaintext, mockConfig);
|
|
49
49
|
const decrypted = cipher.decrypt(encrypted, mockConfig);
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
expect(decrypted).toBe(plaintext);
|
|
52
52
|
});
|
|
53
53
|
});
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
test("encrypt and decrypt cycle works for complex data", () => {
|
|
56
56
|
const complexData = JSON.stringify({
|
|
57
57
|
id: 12345,
|
|
@@ -60,14 +60,14 @@ describe("cipher", () => {
|
|
|
60
60
|
permissions: ["admin", "editor"],
|
|
61
61
|
metadata: {
|
|
62
62
|
lastLogin: "2024-05-15T12:30:00Z",
|
|
63
|
-
browser: "Chrome"
|
|
64
|
-
}
|
|
63
|
+
browser: "Chrome",
|
|
64
|
+
},
|
|
65
65
|
});
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
const encrypted = cipher.encrypt(complexData, mockConfig);
|
|
68
68
|
const decrypted = cipher.decrypt(encrypted, mockConfig);
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
expect(decrypted).toBe(complexData);
|
|
71
71
|
expect(JSON.parse(decrypted)).toEqual(JSON.parse(complexData));
|
|
72
72
|
});
|
|
73
|
-
});
|
|
73
|
+
});
|
|
@@ -6,11 +6,11 @@ class MockHonoAdapter {
|
|
|
6
6
|
this.globalBeforeFilters = [];
|
|
7
7
|
this.globalAfterFilters = [];
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
setBeforeFilter(pattern, filter) {
|
|
11
11
|
this.globalBeforeFilters.push({ pattern, filter });
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
setAfterFilter(pattern, filter) {
|
|
15
15
|
this.globalAfterFilters.push({ pattern, filter });
|
|
16
16
|
}
|
|
@@ -18,80 +18,80 @@ class MockHonoAdapter {
|
|
|
18
18
|
|
|
19
19
|
describe("filters", () => {
|
|
20
20
|
let adapter;
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
beforeEach(() => {
|
|
23
23
|
adapter = new MockHonoAdapter();
|
|
24
24
|
});
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
describe("setBeforeFilter", () => {
|
|
27
27
|
test("adds before filter to adapter", () => {
|
|
28
28
|
const pattern = /\/settings\/content/;
|
|
29
29
|
const filter = () => ({ assigns: { foo: "bar" } });
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
setBeforeFilter(adapter, pattern, filter);
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
expect(adapter.globalBeforeFilters).toHaveLength(1);
|
|
34
34
|
expect(adapter.globalBeforeFilters[0]).toEqual({
|
|
35
35
|
pattern,
|
|
36
|
-
filter
|
|
36
|
+
filter,
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
test("can add multiple before filters", () => {
|
|
41
41
|
const pattern1 = /\/settings\/content/;
|
|
42
42
|
const filter1 = () => ({ assigns: { foo: "bar" } });
|
|
43
|
-
|
|
43
|
+
|
|
44
44
|
const pattern2 = /\/pages/;
|
|
45
45
|
const filter2 = () => ({ assigns: { baz: "qux" } });
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
setBeforeFilter(adapter, pattern1, filter1);
|
|
48
48
|
setBeforeFilter(adapter, pattern2, filter2);
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
expect(adapter.globalBeforeFilters).toHaveLength(2);
|
|
51
51
|
expect(adapter.globalBeforeFilters[0]).toEqual({
|
|
52
52
|
pattern: pattern1,
|
|
53
|
-
filter: filter1
|
|
53
|
+
filter: filter1,
|
|
54
54
|
});
|
|
55
55
|
expect(adapter.globalBeforeFilters[1]).toEqual({
|
|
56
56
|
pattern: pattern2,
|
|
57
|
-
filter: filter2
|
|
57
|
+
filter: filter2,
|
|
58
58
|
});
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
describe("setAfterFilter", () => {
|
|
63
63
|
test("adds after filter to adapter", () => {
|
|
64
64
|
const pattern = /\/settings\/content/;
|
|
65
65
|
const filter = () => ({ assigns: { foo: "bar" } });
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
setAfterFilter(adapter, pattern, filter);
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
expect(adapter.globalAfterFilters).toHaveLength(1);
|
|
70
70
|
expect(adapter.globalAfterFilters[0]).toEqual({
|
|
71
71
|
pattern,
|
|
72
|
-
filter
|
|
72
|
+
filter,
|
|
73
73
|
});
|
|
74
74
|
});
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
test("can add multiple after filters", () => {
|
|
77
77
|
const pattern1 = /\/settings\/content/;
|
|
78
78
|
const filter1 = () => ({ assigns: { foo: "bar" } });
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
const pattern2 = /\/pages/;
|
|
81
81
|
const filter2 = () => ({ assigns: { baz: "qux" } });
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
setAfterFilter(adapter, pattern1, filter1);
|
|
84
84
|
setAfterFilter(adapter, pattern2, filter2);
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
expect(adapter.globalAfterFilters).toHaveLength(2);
|
|
87
87
|
expect(adapter.globalAfterFilters[0]).toEqual({
|
|
88
88
|
pattern: pattern1,
|
|
89
|
-
filter: filter1
|
|
89
|
+
filter: filter1,
|
|
90
90
|
});
|
|
91
91
|
expect(adapter.globalAfterFilters[1]).toEqual({
|
|
92
92
|
pattern: pattern2,
|
|
93
|
-
filter: filter2
|
|
93
|
+
filter: filter2,
|
|
94
94
|
});
|
|
95
95
|
});
|
|
96
96
|
});
|
|
97
|
-
});
|
|
97
|
+
});
|
|
@@ -36,7 +36,7 @@ describe("Tags Handler", () => {
|
|
|
36
36
|
name: tag.name,
|
|
37
37
|
slug: tag.slug,
|
|
38
38
|
},
|
|
39
|
-
"en"
|
|
39
|
+
"en",
|
|
40
40
|
);
|
|
41
41
|
|
|
42
42
|
expect(result).toEqual({
|
|
@@ -73,7 +73,7 @@ describe("Tags Handler", () => {
|
|
|
73
73
|
name: tag.name,
|
|
74
74
|
slug: tag.slug,
|
|
75
75
|
},
|
|
76
|
-
"en"
|
|
76
|
+
"en",
|
|
77
77
|
);
|
|
78
78
|
|
|
79
79
|
expect(mockedFormatErrors).toHaveBeenCalledWith(errors);
|
|
@@ -42,7 +42,7 @@ describe("Tags Handler", () => {
|
|
|
42
42
|
name: "Updated Tag",
|
|
43
43
|
slug: "updated-tag",
|
|
44
44
|
},
|
|
45
|
-
"en"
|
|
45
|
+
"en",
|
|
46
46
|
);
|
|
47
47
|
|
|
48
48
|
expect(result).toEqual({
|
|
@@ -81,7 +81,7 @@ describe("Tags Handler", () => {
|
|
|
81
81
|
name: "Updated Tag",
|
|
82
82
|
slug: "updated-tag",
|
|
83
83
|
},
|
|
84
|
-
"en"
|
|
84
|
+
"en",
|
|
85
85
|
);
|
|
86
86
|
|
|
87
87
|
expect(mockedFormatErrors).toHaveBeenCalledWith(errors);
|
|
@@ -41,7 +41,7 @@ describe("Categories create", () => {
|
|
|
41
41
|
settings: category.settings,
|
|
42
42
|
},
|
|
43
43
|
"en",
|
|
44
|
-
"cat"
|
|
44
|
+
"cat",
|
|
45
45
|
);
|
|
46
46
|
|
|
47
47
|
expect(result).toEqual({
|
|
@@ -72,7 +72,7 @@ describe("Categories create", () => {
|
|
|
72
72
|
settings: category.settings,
|
|
73
73
|
},
|
|
74
74
|
"en",
|
|
75
|
-
"cat"
|
|
75
|
+
"cat",
|
|
76
76
|
);
|
|
77
77
|
|
|
78
78
|
expect(result).toEqual({
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import ContentTasks from "../../../../cloud/ContentTasks";
|
|
2
|
+
import ContentTasksHandler from "../../../../handlers/content_tasks/ContentTasksHandler";
|
|
3
|
+
import Factory from "../../../support/factory";
|
|
4
|
+
|
|
5
|
+
describe("ContentTasksHandler", () => {
|
|
6
|
+
function buildCtx() {
|
|
7
|
+
return {
|
|
8
|
+
client: {
|
|
9
|
+
contentTasks: new ContentTasks(() => ({}), "token"),
|
|
10
|
+
},
|
|
11
|
+
query: { "f:locale": "en", "f:status": "IN_PROGRESS" },
|
|
12
|
+
locale: "en",
|
|
13
|
+
globalConfig: {
|
|
14
|
+
resourceRoutes: {
|
|
15
|
+
page: "pages",
|
|
16
|
+
author: "authors",
|
|
17
|
+
article: "articles",
|
|
18
|
+
"movie-type": "movie-types",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
test("index - returns content tasks with editors and buildResourceUrl helper", async () => {
|
|
25
|
+
const contentTasks = [
|
|
26
|
+
Factory.build("contentTask", {
|
|
27
|
+
id: "1",
|
|
28
|
+
workflow: "lokalise",
|
|
29
|
+
resource: {
|
|
30
|
+
id: "123",
|
|
31
|
+
title: "Test Page",
|
|
32
|
+
locale: "en",
|
|
33
|
+
resourceType: "page",
|
|
34
|
+
},
|
|
35
|
+
}),
|
|
36
|
+
Factory.build("contentTask", {
|
|
37
|
+
id: "2",
|
|
38
|
+
workflow: "default",
|
|
39
|
+
resource: {
|
|
40
|
+
id: "456",
|
|
41
|
+
title: "Test Movie",
|
|
42
|
+
locale: "de",
|
|
43
|
+
resourceType: "movie-type",
|
|
44
|
+
},
|
|
45
|
+
}),
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const editors = [
|
|
49
|
+
Factory.build("editor", { id: "user1", name: "John Doe" }),
|
|
50
|
+
Factory.build("editor", { id: "user2", name: "Jane Smith" }),
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const ctx = buildCtx();
|
|
54
|
+
|
|
55
|
+
const mockedList = jest
|
|
56
|
+
.spyOn(ctx.client.contentTasks, "list")
|
|
57
|
+
.mockImplementation(() => ({
|
|
58
|
+
list: contentTasks,
|
|
59
|
+
pagination: { currentPage: 1, pagesCount: 1 },
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
const mockedEditors = jest
|
|
63
|
+
.spyOn(ctx.client.contentTasks, "editors")
|
|
64
|
+
.mockImplementation(() => ({ list: editors }));
|
|
65
|
+
|
|
66
|
+
const result = await ContentTasksHandler.index(ctx);
|
|
67
|
+
|
|
68
|
+
expect(mockedList).toHaveBeenCalledWith({
|
|
69
|
+
"f:locale": "en",
|
|
70
|
+
"f:status": "IN_PROGRESS",
|
|
71
|
+
});
|
|
72
|
+
expect(mockedEditors).toHaveBeenCalled();
|
|
73
|
+
|
|
74
|
+
expect(result.assigns.items).toEqual({
|
|
75
|
+
list: contentTasks,
|
|
76
|
+
pagination: { currentPage: 1, pagesCount: 1 },
|
|
77
|
+
});
|
|
78
|
+
expect(result.assigns.editors).toEqual(editors);
|
|
79
|
+
expect(typeof result.assigns.buildResourceUrl).toBe("function");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test("index - throws error when resourceRoutes is missing", async () => {
|
|
83
|
+
const ctx = buildCtx();
|
|
84
|
+
ctx.globalConfig = {}; // No resourceRoutes
|
|
85
|
+
|
|
86
|
+
const mockedList = jest
|
|
87
|
+
.spyOn(ctx.client.contentTasks, "list")
|
|
88
|
+
.mockImplementation(() => ({ list: [], pagination: {} }));
|
|
89
|
+
|
|
90
|
+
const mockedEditors = jest
|
|
91
|
+
.spyOn(ctx.client.contentTasks, "editors")
|
|
92
|
+
.mockImplementation(() => ({ list: [] }));
|
|
93
|
+
|
|
94
|
+
await expect(ContentTasksHandler.index(ctx)).rejects.toThrow(
|
|
95
|
+
"Missing resourceRoutes in the admin config!",
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("buildResourceUrl helper - builds correct URL for standard resource", async () => {
|
|
100
|
+
const ctx = buildCtx();
|
|
101
|
+
|
|
102
|
+
const mockedList = jest
|
|
103
|
+
.spyOn(ctx.client.contentTasks, "list")
|
|
104
|
+
.mockImplementation(() => ({ list: [], pagination: {} }));
|
|
105
|
+
|
|
106
|
+
const mockedEditors = jest
|
|
107
|
+
.spyOn(ctx.client.contentTasks, "editors")
|
|
108
|
+
.mockImplementation(() => ({ list: [] }));
|
|
109
|
+
|
|
110
|
+
const result = await ContentTasksHandler.index(ctx);
|
|
111
|
+
const { buildResourceUrl } = result.assigns;
|
|
112
|
+
|
|
113
|
+
const resource = {
|
|
114
|
+
id: "123",
|
|
115
|
+
locale: "en",
|
|
116
|
+
resourceType: "page",
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
expect(buildResourceUrl(resource)).toBe("/en/pages/123");
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("buildResourceUrl helper - builds correct URL for custom route", async () => {
|
|
123
|
+
const ctx = buildCtx();
|
|
124
|
+
|
|
125
|
+
const mockedList = jest
|
|
126
|
+
.spyOn(ctx.client.contentTasks, "list")
|
|
127
|
+
.mockImplementation(() => ({ list: [], pagination: {} }));
|
|
128
|
+
|
|
129
|
+
const mockedEditors = jest
|
|
130
|
+
.spyOn(ctx.client.contentTasks, "editors")
|
|
131
|
+
.mockImplementation(() => ({ list: [] }));
|
|
132
|
+
|
|
133
|
+
const result = await ContentTasksHandler.index(ctx);
|
|
134
|
+
const { buildResourceUrl } = result.assigns;
|
|
135
|
+
|
|
136
|
+
const resource = {
|
|
137
|
+
id: "456",
|
|
138
|
+
locale: "de",
|
|
139
|
+
resourceType: "movie-type",
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
expect(buildResourceUrl(resource)).toBe("/de/movie-types/456");
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("buildResourceUrl helper - returns # for null resource", async () => {
|
|
146
|
+
const ctx = buildCtx();
|
|
147
|
+
|
|
148
|
+
const mockedList = jest
|
|
149
|
+
.spyOn(ctx.client.contentTasks, "list")
|
|
150
|
+
.mockImplementation(() => ({ list: [], pagination: {} }));
|
|
151
|
+
|
|
152
|
+
const mockedEditors = jest
|
|
153
|
+
.spyOn(ctx.client.contentTasks, "editors")
|
|
154
|
+
.mockImplementation(() => ({ list: [] }));
|
|
155
|
+
|
|
156
|
+
const result = await ContentTasksHandler.index(ctx);
|
|
157
|
+
const { buildResourceUrl } = result.assigns;
|
|
158
|
+
|
|
159
|
+
expect(buildResourceUrl(null)).toBe("#");
|
|
160
|
+
});
|
|
161
|
+
});
|
|
@@ -57,7 +57,7 @@ describe("Resource revision schedule cancel", () => {
|
|
|
57
57
|
}));
|
|
58
58
|
|
|
59
59
|
await expect(CancelSchedulesHandler.create(ctx)).rejects.toThrow(
|
|
60
|
-
`Failed to cancel schedule for revision: ${JSON.stringify(errors)}
|
|
60
|
+
`Failed to cancel schedule for revision: ${JSON.stringify(errors)}`,
|
|
61
61
|
);
|
|
62
62
|
|
|
63
63
|
expect(mockCancel).toHaveBeenCalledWith(revision.id, "en", "article");
|
|
@@ -82,7 +82,7 @@ describe("Resource revision schedule cancel", () => {
|
|
|
82
82
|
}));
|
|
83
83
|
|
|
84
84
|
await expect(CancelSchedulesHandler.create(ctx)).rejects.toThrow(
|
|
85
|
-
`Failed to cancel schedule for revision: ${JSON.stringify(resourceErrors)}
|
|
85
|
+
`Failed to cancel schedule for revision: ${JSON.stringify(resourceErrors)}`,
|
|
86
86
|
);
|
|
87
87
|
|
|
88
88
|
expect(mockCancel).toHaveBeenCalledWith(revision.id, "en", "article");
|
|
@@ -44,7 +44,7 @@ describe("Resource revision lock", () => {
|
|
|
44
44
|
revision.id,
|
|
45
45
|
"en",
|
|
46
46
|
lockSettings.message,
|
|
47
|
-
"article"
|
|
47
|
+
"article",
|
|
48
48
|
);
|
|
49
49
|
|
|
50
50
|
expect(result).toEqual({
|
|
@@ -77,7 +77,7 @@ describe("Resource revision lock", () => {
|
|
|
77
77
|
revision.id,
|
|
78
78
|
"en",
|
|
79
79
|
lockSettings.message,
|
|
80
|
-
"article"
|
|
80
|
+
"article",
|
|
81
81
|
);
|
|
82
82
|
|
|
83
83
|
expect(result).toEqual({
|
|
@@ -116,7 +116,7 @@ describe("Resource revision lock", () => {
|
|
|
116
116
|
}));
|
|
117
117
|
|
|
118
118
|
await expect(LocksHandler.create(ctx)).rejects.toThrow(
|
|
119
|
-
`Failed to lock revision: ${JSON.stringify(resourceErrors)}
|
|
119
|
+
`Failed to lock revision: ${JSON.stringify(resourceErrors)}`,
|
|
120
120
|
);
|
|
121
121
|
|
|
122
122
|
expect(mockFind).toHaveBeenCalledWith(revision.id, "en", "article");
|
|
@@ -124,7 +124,7 @@ describe("Resource revision lock", () => {
|
|
|
124
124
|
revision.id,
|
|
125
125
|
"en",
|
|
126
126
|
lockSettings.message,
|
|
127
|
-
"article"
|
|
127
|
+
"article",
|
|
128
128
|
);
|
|
129
129
|
});
|
|
130
130
|
|
|
@@ -137,7 +137,7 @@ describe("Resource revision lock", () => {
|
|
|
137
137
|
.mockImplementation(() => null);
|
|
138
138
|
|
|
139
139
|
await expect(LocksHandler.create(ctx)).rejects.toThrow(
|
|
140
|
-
`Missing revision #42
|
|
140
|
+
`Missing revision #42`,
|
|
141
141
|
);
|
|
142
142
|
|
|
143
143
|
expect(mockFind).toHaveBeenCalledWith(42, "en", "article");
|
|
@@ -51,9 +51,13 @@ describe("New resource revision lock", () => {
|
|
|
51
51
|
.mockImplementation(() => null);
|
|
52
52
|
|
|
53
53
|
await expect(LocksHandler.create_form(ctx)).rejects.toThrow(
|
|
54
|
-
`Missing revision #${nonExistentRevision.id}
|
|
54
|
+
`Missing revision #${nonExistentRevision.id}`,
|
|
55
55
|
);
|
|
56
56
|
|
|
57
|
-
expect(mockFind).toHaveBeenCalledWith(
|
|
57
|
+
expect(mockFind).toHaveBeenCalledWith(
|
|
58
|
+
nonExistentRevision.id,
|
|
59
|
+
"en",
|
|
60
|
+
"article",
|
|
61
|
+
);
|
|
58
62
|
});
|
|
59
63
|
});
|
|
@@ -72,7 +72,7 @@ describe("Publish resource revision", () => {
|
|
|
72
72
|
},
|
|
73
73
|
}),
|
|
74
74
|
},
|
|
75
|
-
"article"
|
|
75
|
+
"article",
|
|
76
76
|
);
|
|
77
77
|
|
|
78
78
|
expect(result).toEqual({
|
|
@@ -115,7 +115,7 @@ describe("Publish resource revision", () => {
|
|
|
115
115
|
{
|
|
116
116
|
visibility: publishing.visibility,
|
|
117
117
|
},
|
|
118
|
-
"article"
|
|
118
|
+
"article",
|
|
119
119
|
);
|
|
120
120
|
|
|
121
121
|
expect(result).toEqual({
|
|
@@ -187,7 +187,7 @@ describe("Publish resource revision", () => {
|
|
|
187
187
|
},
|
|
188
188
|
}),
|
|
189
189
|
},
|
|
190
|
-
"article"
|
|
190
|
+
"article",
|
|
191
191
|
);
|
|
192
192
|
|
|
193
193
|
expect(result).toEqual({
|
|
@@ -233,7 +233,7 @@ describe("Publish resource revision", () => {
|
|
|
233
233
|
{
|
|
234
234
|
visibility: publishing.visibility,
|
|
235
235
|
},
|
|
236
|
-
"article"
|
|
236
|
+
"article",
|
|
237
237
|
);
|
|
238
238
|
|
|
239
239
|
expect(result).toEqual({
|
|
@@ -295,7 +295,7 @@ describe("Publish resource revision", () => {
|
|
|
295
295
|
{
|
|
296
296
|
visibility: publishing.visibility,
|
|
297
297
|
},
|
|
298
|
-
"article"
|
|
298
|
+
"article",
|
|
299
299
|
);
|
|
300
300
|
|
|
301
301
|
expect(result).toEqual({
|
|
@@ -63,7 +63,7 @@ describe("Resource revisions", () => {
|
|
|
63
63
|
.mockResolvedValue({ revision: null, errors, resourceErrors: null });
|
|
64
64
|
|
|
65
65
|
await expect(ResourceRevisionsHandler.create(ctx)).rejects.toThrow(
|
|
66
|
-
`Failed to start revision: ${JSON.stringify(errors)}
|
|
66
|
+
`Failed to start revision: ${JSON.stringify(errors)}`,
|
|
67
67
|
);
|
|
68
68
|
});
|
|
69
69
|
|
|
@@ -81,7 +81,7 @@ describe("Resource revisions", () => {
|
|
|
81
81
|
});
|
|
82
82
|
|
|
83
83
|
await expect(ResourceRevisionsHandler.create(ctx)).rejects.toThrow(
|
|
84
|
-
`Failed to start revision: ${JSON.stringify(errors)}
|
|
84
|
+
`Failed to start revision: ${JSON.stringify(errors)}`,
|
|
85
85
|
);
|
|
86
86
|
});
|
|
87
87
|
});
|
|
@@ -49,7 +49,7 @@ describe("Resource revisions", () => {
|
|
|
49
49
|
expect(async () => {
|
|
50
50
|
await ResourceRevisionsHandler.destroy(ctx);
|
|
51
51
|
}).rejects.toThrow(
|
|
52
|
-
`Failed to delete revision#${1}: ${JSON.stringify(errors)}
|
|
52
|
+
`Failed to delete revision#${1}: ${JSON.stringify(errors)}`,
|
|
53
53
|
);
|
|
54
54
|
|
|
55
55
|
expect(mockDelete).toHaveBeenCalledWith(1, "en", "article");
|