@raketa-cloud/admin 0.0.14 → 0.0.16
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/package.json +1 -1
- package/src/cloud/ArticleChanges.js +15 -0
- package/src/cloud/ArticleRevisions.js +152 -0
- package/src/cloud/Articles.js +133 -0
- package/src/cloud/EventChanges.js +15 -0
- package/src/cloud/EventRevisions.js +149 -0
- package/src/cloud/Events.js +135 -0
- package/src/cloud/documents/articlesDocuments.js +109 -469
- package/src/cloud/documents/common.js +20 -0
- package/src/cloud/documents/eventsDocuments.js +254 -0
- package/src/handlers/article_revisions/ArticleRevisionsHandler.js +49 -0
- package/src/handlers/article_revisions/CodeHandler.js +90 -0
- package/src/handlers/article_revisions/GeneralHandler.js +95 -0
- package/src/handlers/article_revisions/LocksHandler.js +54 -0
- package/src/handlers/article_revisions/MetaHandler.js +90 -0
- package/src/handlers/article_revisions/PublishesHandler.js +90 -0
- package/src/handlers/article_revisions/RevertsHandler.js +28 -0
- package/src/handlers/article_revisions/TagHandler.js +89 -0
- package/src/handlers/article_revisions/UnlocksHandler.js +22 -0
- package/src/handlers/article_revisions/VisualHandler.js +84 -0
- package/src/handlers/article_revisions/WidgetHandler.js +47 -0
- package/src/handlers/articles/ArticlesHandler.js +119 -0
- package/src/handlers/articles/ClonesHandler.js +17 -0
- package/src/handlers/articles/DeletesHandler.js +68 -0
- package/src/handlers/articles/TranslationsHandler.js +103 -0
- package/src/handlers/articles/URLsHandler.js +71 -0
- package/src/handlers/event_revisions/CodeHandler.js +86 -0
- package/src/handlers/event_revisions/EventRevisionsHandler.js +47 -0
- package/src/handlers/event_revisions/GeneralHandler.js +93 -0
- package/src/handlers/event_revisions/LocksHandler.js +51 -0
- package/src/handlers/event_revisions/MetaHandler.js +86 -0
- package/src/handlers/event_revisions/PublishesHandler.js +84 -0
- package/src/handlers/event_revisions/RevertsHandler.js +26 -0
- package/src/handlers/event_revisions/TagHandler.js +85 -0
- package/src/handlers/event_revisions/UnlocksHandler.js +22 -0
- package/src/handlers/event_revisions/VisualHandler.js +80 -0
- package/src/handlers/event_revisions/WidgetHandler.js +41 -0
- package/src/handlers/events/ClonesHandler.js +17 -0
- package/src/handlers/events/DeletesHandler.js +68 -0
- package/src/handlers/events/EventsHandler.js +121 -0
- package/src/handlers/events/TranslationsHandler.js +99 -0
- package/src/handlers/events/URLsHandler.js +71 -0
- package/src/handlers/pages/PagesHandler.js +4 -2
- package/src/handlers/pages/TranslationsHandler.js +7 -5
- package/src/index.js +44 -0
- package/src/routeArticles.js +65 -0
- package/src/routeEvents.js +55 -0
- package/src/routeStandard.js +4 -0
- package/src/setupCloud.js +24 -0
- package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +56 -0
- package/src/tests/handlers/article_revisions/CodesHandler.test/update.test.js +139 -0
- package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +65 -0
- package/src/tests/handlers/article_revisions/GeneralHandler.test/update.test.js +150 -0
- package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +57 -0
- package/src/tests/handlers/article_revisions/MetaHandler.test/update.test.js +143 -0
- package/src/tests/handlers/article_revisions/PageRevisionsHandler.test/create.test.js +75 -0
- package/src/tests/handlers/article_revisions/PageRevisionsHandler.test/destroy.test.js +53 -0
- package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +136 -0
- package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +47 -0
- package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +80 -0
- package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/article_revisions/TagHandler.test/update.test.js +143 -0
- package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
- package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +131 -0
- package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +46 -0
- package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +103 -0
- package/src/tests/handlers/articles/ArticlesHandler.test/create.test.js +144 -0
- package/src/tests/handlers/articles/ArticlesHandler.test/create_form.test.js +41 -0
- package/src/tests/handlers/articles/ArticlesHandler.test/index.test.js +49 -0
- package/src/tests/handlers/articles/ArticlesHandler.test/show.test.js +105 -0
- package/src/tests/handlers/articles/ConesHandler.test/create.test.js +54 -0
- package/src/tests/handlers/articles/DeletesHandler.test/create.test.js +110 -0
- package/src/tests/handlers/articles/DeletesHandler.test/create_form.test.js +54 -0
- package/src/tests/handlers/articles/URLsHandler.test/create.test.js +155 -0
- package/src/tests/handlers/articles/URLsHandler.test/create_form.test.js +51 -0
- package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +56 -0
- package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +143 -0
- package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +158 -0
- package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +57 -0
- package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +147 -0
- package/src/tests/handlers/event_revisions/PageRevisionsHandler.test/create.test.js +75 -0
- package/src/tests/handlers/event_revisions/PageRevisionsHandler.test/destroy.test.js +53 -0
- package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +136 -0
- package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +47 -0
- package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +80 -0
- package/src/tests/handlers/event_revisions/TagHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +147 -0
- package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
- package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +135 -0
- package/src/tests/handlers/event_revisions/WidgetHandler.test/show.test.js +46 -0
- package/src/tests/handlers/event_revisions/WidgetHandler.test/update.test.js +103 -0
- package/src/tests/handlers/events/ConesHandler.test/create.test.js +54 -0
- package/src/tests/handlers/events/DeletesHandler.test/create.test.js +110 -0
- package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +54 -0
- package/src/tests/handlers/events/EventsHandler.test/create.test.js +152 -0
- package/src/tests/handlers/events/EventsHandler.test/create_form.test.js +41 -0
- package/src/tests/handlers/events/EventsHandler.test/index.test.js +49 -0
- package/src/tests/handlers/events/EventsHandler.test/show.test.js +105 -0
- package/src/tests/handlers/events/URLsHandler.test/create.test.js +155 -0
- package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +51 -0
- package/src/tests/handlers/pages/PagesHandler.test/create.test.js +3 -3
- package/src/utils.js +46 -0
- package/src/views/article_revisions/_nav.ejs +40 -0
- package/src/views/article_revisions/codes/edit_form.ejs +39 -0
- package/src/views/article_revisions/general/edit_form.ejs +70 -0
- package/src/views/article_revisions/locks/create_form.ejs +35 -0
- package/src/views/article_revisions/meta/edit_form.ejs +41 -0
- package/src/views/article_revisions/publishes/_form.ejs +57 -0
- package/src/views/article_revisions/publishes/create_form.ejs +10 -0
- package/src/views/article_revisions/tags/edit_form.ejs +64 -0
- package/src/views/article_revisions/visuals/edit_form.ejs +42 -0
- package/src/views/articles/_form.ejs +86 -0
- package/src/views/articles/create_form.ejs +9 -0
- package/src/views/articles/deletes/create_form.ejs +55 -0
- package/src/views/articles/edit_form.ejs +3 -0
- package/src/views/articles/index.ejs +161 -0
- package/src/views/articles/show.ejs +281 -0
- package/src/views/articles/translations/_form.ejs +77 -0
- package/src/views/articles/translations/create_form.ejs +11 -0
- package/src/views/articles/urls/create_form.ejs +31 -0
- package/src/views/event_revisions/_nav.ejs +40 -0
- package/src/views/event_revisions/codes/edit_form.ejs +39 -0
- package/src/views/event_revisions/general/edit_form.ejs +72 -0
- package/src/views/event_revisions/locks/create_form.ejs +35 -0
- package/src/views/event_revisions/meta/edit_form.ejs +41 -0
- package/src/views/event_revisions/publishes/_form.ejs +57 -0
- package/src/views/event_revisions/publishes/create_form.ejs +10 -0
- package/src/views/event_revisions/tags/edit_form.ejs +64 -0
- package/src/views/event_revisions/visuals/edit_form.ejs +42 -0
- package/src/views/events/_form.ejs +88 -0
- package/src/views/events/create_form.ejs +9 -0
- package/src/views/events/deletes/create_form.ejs +55 -0
- package/src/views/events/edit_form.ejs +3 -0
- package/src/views/events/index.ejs +161 -0
- package/src/views/events/show.ejs +281 -0
- package/src/views/events/translations/_form.ejs +79 -0
- package/src/views/events/translations/create_form.ejs +11 -0
- package/src/views/events/urls/create_form.ejs +31 -0
- package/src/views/page_revisions/locks/create_form.ejs +1 -1
- package/test/factory.js +76 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import VisualHandler from "../../../../handlers/article_revisions/VisualHandler";
|
|
2
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
3
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
4
|
+
import Factory from "../../../../../test/factory";
|
|
5
|
+
|
|
6
|
+
function buildCtx(revision, updateSettings) {
|
|
7
|
+
return {
|
|
8
|
+
client: {
|
|
9
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
10
|
+
},
|
|
11
|
+
params: { parent_id: revision.id },
|
|
12
|
+
resourceParams: {
|
|
13
|
+
visual_settings: updateSettings,
|
|
14
|
+
},
|
|
15
|
+
locale: "en",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe("Article revision visuals settings", () => {
|
|
20
|
+
test("update successful", async () => {
|
|
21
|
+
const revision = Factory.build("article_revision");
|
|
22
|
+
|
|
23
|
+
const updateSettings = {
|
|
24
|
+
layout: "bla",
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
28
|
+
|
|
29
|
+
const mockFind = jest
|
|
30
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
31
|
+
.mockImplementation(() => revision);
|
|
32
|
+
|
|
33
|
+
const mockUpdate = jest
|
|
34
|
+
.spyOn(ctx.client.articleRevisions, "update")
|
|
35
|
+
.mockImplementation(() => ({
|
|
36
|
+
revision: {},
|
|
37
|
+
errors: null,
|
|
38
|
+
}));
|
|
39
|
+
|
|
40
|
+
const result = await VisualHandler.update(ctx);
|
|
41
|
+
|
|
42
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
43
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
|
|
44
|
+
slug: revision.slug,
|
|
45
|
+
title: revision.title,
|
|
46
|
+
visibility: revision.visibility,
|
|
47
|
+
publishAt: revision.publishAt,
|
|
48
|
+
widgets: JSON.stringify(revision.widgets),
|
|
49
|
+
tags: revision.tags.map((t) => t.id),
|
|
50
|
+
categories: revision.categories.map((c) => c.id),
|
|
51
|
+
settings: JSON.stringify({
|
|
52
|
+
...revision.settings,
|
|
53
|
+
layout: updateSettings.layout,
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
expect(result).toEqual({
|
|
58
|
+
redirect: `/en/article_revisions/${revision.id}/visuals/edit`,
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("update failed", async () => {
|
|
63
|
+
const revision = Factory.build("article_revision");
|
|
64
|
+
|
|
65
|
+
const updateSettings = {
|
|
66
|
+
layout: "bla",
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
70
|
+
|
|
71
|
+
const mockFind = jest
|
|
72
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
73
|
+
.mockImplementation(() => revision);
|
|
74
|
+
|
|
75
|
+
const mockUpdate = jest
|
|
76
|
+
.spyOn(ctx.client.articleRevisions, "update")
|
|
77
|
+
.mockImplementation(() => ({
|
|
78
|
+
revision: {},
|
|
79
|
+
errors: [{ key: "generalError", message: "some error" }],
|
|
80
|
+
}));
|
|
81
|
+
|
|
82
|
+
const result = await VisualHandler.update(ctx);
|
|
83
|
+
|
|
84
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
85
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
|
|
86
|
+
slug: revision.slug,
|
|
87
|
+
title: revision.title,
|
|
88
|
+
visibility: revision.visibility,
|
|
89
|
+
publishAt: revision.publishAt,
|
|
90
|
+
widgets: JSON.stringify(revision.widgets),
|
|
91
|
+
tags: revision.tags.map((t) => t.id),
|
|
92
|
+
categories: revision.categories.map((c) => c.id),
|
|
93
|
+
settings: JSON.stringify({
|
|
94
|
+
...revision.settings,
|
|
95
|
+
layout: updateSettings.layout,
|
|
96
|
+
}),
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
expect(result).toEqual({
|
|
100
|
+
assigns: {
|
|
101
|
+
visual_settings: {
|
|
102
|
+
...updateSettings,
|
|
103
|
+
id: revision.id,
|
|
104
|
+
originalId: revision.originalId,
|
|
105
|
+
},
|
|
106
|
+
errors: {
|
|
107
|
+
visual_settings: { generalError: "some error" },
|
|
108
|
+
},
|
|
109
|
+
_translations: [],
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("update when a revision does not exist", async () => {
|
|
115
|
+
const revision = Factory.build("article_revision");
|
|
116
|
+
|
|
117
|
+
const updateSettings = {};
|
|
118
|
+
|
|
119
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
120
|
+
|
|
121
|
+
const mockFind = jest
|
|
122
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
123
|
+
.mockImplementation(() => null);
|
|
124
|
+
|
|
125
|
+
expect(async () => {
|
|
126
|
+
await VisualHandler.update(ctx);
|
|
127
|
+
}).rejects.toThrow(`Missing revision #${revision.id}`);
|
|
128
|
+
|
|
129
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
130
|
+
});
|
|
131
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import WidgetHandler from "../../../../handlers/article_revisions/WidgetHandler";
|
|
2
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
3
|
+
import Settings from "../../../../cloud/Settings";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
import Factory from "../../../../../test/factory";
|
|
6
|
+
|
|
7
|
+
function buildCtx(revision) {
|
|
8
|
+
return {
|
|
9
|
+
client: {
|
|
10
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
11
|
+
settings: new Settings(testConfig, "token"),
|
|
12
|
+
},
|
|
13
|
+
params: { parent_id: revision.id },
|
|
14
|
+
locale: "en",
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe("WidgetHandler", () => {
|
|
19
|
+
test("show", async () => {
|
|
20
|
+
const revision = Factory.build("article_revision");
|
|
21
|
+
const settings = Factory.build("settings");
|
|
22
|
+
const ctx = buildCtx(revision);
|
|
23
|
+
|
|
24
|
+
const mockFind = jest
|
|
25
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
26
|
+
.mockImplementation(() => revision);
|
|
27
|
+
|
|
28
|
+
const mockSettings = jest
|
|
29
|
+
.spyOn(ctx.client.settings, "find")
|
|
30
|
+
.mockImplementation(() => settings);
|
|
31
|
+
|
|
32
|
+
const result = await WidgetHandler.show(ctx);
|
|
33
|
+
|
|
34
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
35
|
+
expect(mockSettings).toHaveBeenCalledWith("en");
|
|
36
|
+
|
|
37
|
+
expect(result).toEqual({
|
|
38
|
+
json: {
|
|
39
|
+
revision: {
|
|
40
|
+
...revision,
|
|
41
|
+
websiteSettings: { ...settings },
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import WidgetHandler from "../../../../handlers/article_revisions/WidgetHandler";
|
|
2
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
3
|
+
import Settings from "../../../../cloud/Settings";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
import Factory from "../../../../../test/factory";
|
|
6
|
+
|
|
7
|
+
function buildCtx(revision, newWidgets) {
|
|
8
|
+
return {
|
|
9
|
+
client: {
|
|
10
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
11
|
+
settings: new Settings(testConfig, "token"),
|
|
12
|
+
},
|
|
13
|
+
params: { parent_id: revision.id },
|
|
14
|
+
resourceParams: {
|
|
15
|
+
widgets: newWidgets,
|
|
16
|
+
},
|
|
17
|
+
locale: "en",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe("WidgetHandler", () => {
|
|
22
|
+
test("update successful", async () => {
|
|
23
|
+
const revision = Factory.build("article_revision");
|
|
24
|
+
const settings = Factory.build("settings");
|
|
25
|
+
const newWidgets = [
|
|
26
|
+
{
|
|
27
|
+
component: "SectionTitle",
|
|
28
|
+
settings: {},
|
|
29
|
+
id: "d2adwadw",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const ctx = buildCtx(revision, newWidgets);
|
|
34
|
+
|
|
35
|
+
const mockFind = jest
|
|
36
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
37
|
+
.mockImplementation(() => revision);
|
|
38
|
+
|
|
39
|
+
const mockSettings = jest
|
|
40
|
+
.spyOn(ctx.client.settings, "find")
|
|
41
|
+
.mockImplementation(() => settings);
|
|
42
|
+
|
|
43
|
+
const mockUpdate = jest
|
|
44
|
+
.spyOn(ctx.client.articleRevisions, "updateWidgets")
|
|
45
|
+
.mockImplementation(() => ({
|
|
46
|
+
revision: { ...revision, widgets: newWidgets },
|
|
47
|
+
errors: [],
|
|
48
|
+
}));
|
|
49
|
+
|
|
50
|
+
const result = await WidgetHandler.update(ctx);
|
|
51
|
+
|
|
52
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", newWidgets);
|
|
53
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
54
|
+
expect(mockSettings).toHaveBeenCalledWith("en");
|
|
55
|
+
|
|
56
|
+
expect(result).toEqual({
|
|
57
|
+
json: {
|
|
58
|
+
revision: {
|
|
59
|
+
...revision,
|
|
60
|
+
websiteSettings: { ...settings },
|
|
61
|
+
widgets: newWidgets,
|
|
62
|
+
},
|
|
63
|
+
errors: [],
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("update failed", async () => {
|
|
69
|
+
const revision = Factory.build("article_revision");
|
|
70
|
+
const newWidgets = [
|
|
71
|
+
{
|
|
72
|
+
component: "SectionTitle",
|
|
73
|
+
settings: {},
|
|
74
|
+
id: "d2adwadw",
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
const ctx = buildCtx(revision, newWidgets);
|
|
79
|
+
|
|
80
|
+
const mockFind = jest
|
|
81
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
82
|
+
.mockImplementation(() => revision);
|
|
83
|
+
|
|
84
|
+
const mockUpdate = jest
|
|
85
|
+
.spyOn(ctx.client.articleRevisions, "updateWidgets")
|
|
86
|
+
.mockImplementation(() => ({
|
|
87
|
+
revision: null,
|
|
88
|
+
errors: [{ key: "widgets", message: "Wrong format" }],
|
|
89
|
+
}));
|
|
90
|
+
|
|
91
|
+
const result = await WidgetHandler.update(ctx);
|
|
92
|
+
|
|
93
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", newWidgets);
|
|
94
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
95
|
+
|
|
96
|
+
expect(result).toEqual({
|
|
97
|
+
json: {
|
|
98
|
+
revision: null,
|
|
99
|
+
errors: [{ key: "widgets", message: "Wrong format" }],
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import ArticlesHandler from "../../../../handlers/articles/ArticlesHandler";
|
|
2
|
+
import Articles from "../../../../cloud/Articles";
|
|
3
|
+
import Tags from "../../../../cloud/Tags";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
import Factory from "../../../../../test/factory";
|
|
6
|
+
|
|
7
|
+
describe("Articles Handler", () => {
|
|
8
|
+
function buildCtx(params) {
|
|
9
|
+
return {
|
|
10
|
+
client: {
|
|
11
|
+
articles: new Articles(testConfig, "token"),
|
|
12
|
+
tags: new Tags(testConfig, "token"),
|
|
13
|
+
},
|
|
14
|
+
resourceParams: {
|
|
15
|
+
article: params,
|
|
16
|
+
},
|
|
17
|
+
locale: "en",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
test("create successfull", async () => {
|
|
22
|
+
const tag = Factory.build("tag");
|
|
23
|
+
const params = {
|
|
24
|
+
title: "Article title",
|
|
25
|
+
slug: "url",
|
|
26
|
+
visibility: "public",
|
|
27
|
+
publish_at: "2024-10-10T06:58",
|
|
28
|
+
layout: "default",
|
|
29
|
+
meta_title: "Meta title",
|
|
30
|
+
meta_description: "Meta description",
|
|
31
|
+
meta_image: JSON.stringify({ id: 42 }),
|
|
32
|
+
username: "admin",
|
|
33
|
+
password: "admin123!@#",
|
|
34
|
+
tags: [tag.id],
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const ctx = buildCtx(params);
|
|
38
|
+
|
|
39
|
+
const mockedCreate = jest
|
|
40
|
+
.spyOn(ctx.client.articles, "create")
|
|
41
|
+
.mockImplementation(() => ({ article: {}, errors: null }));
|
|
42
|
+
|
|
43
|
+
const result = await ArticlesHandler.create(ctx);
|
|
44
|
+
|
|
45
|
+
expect(mockedCreate).toHaveBeenCalledWith(
|
|
46
|
+
{
|
|
47
|
+
title: params.title,
|
|
48
|
+
slug: params.slug,
|
|
49
|
+
visibility: params.visibility,
|
|
50
|
+
publishAt: "2024-10-10T03:58:00Z",
|
|
51
|
+
settings: {
|
|
52
|
+
layout: params.layout,
|
|
53
|
+
meta: {
|
|
54
|
+
title: params.meta_title,
|
|
55
|
+
description: params.meta_description,
|
|
56
|
+
image: JSON.parse(params.meta_image || "{}"),
|
|
57
|
+
},
|
|
58
|
+
credentials: {
|
|
59
|
+
user: params.username,
|
|
60
|
+
password: params.password,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
widgets: [],
|
|
64
|
+
tags: params.tags,
|
|
65
|
+
categories: [],
|
|
66
|
+
},
|
|
67
|
+
"en",
|
|
68
|
+
"article"
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
expect(result).toEqual({
|
|
72
|
+
redirect: "/en/articles",
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("create failed", async () => {
|
|
77
|
+
const tag = Factory.build("tag");
|
|
78
|
+
const params = {
|
|
79
|
+
title: "Article title",
|
|
80
|
+
slug: "",
|
|
81
|
+
publish_at: "2024-10-10T06:58",
|
|
82
|
+
visibility: "public",
|
|
83
|
+
layout: "default",
|
|
84
|
+
meta_title: "Meta title",
|
|
85
|
+
meta_description: "Meta description",
|
|
86
|
+
meta_image: JSON.stringify({ id: 42 }),
|
|
87
|
+
username: "admin",
|
|
88
|
+
password: "admin123!@#",
|
|
89
|
+
tags: [tag.id],
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const ctx = buildCtx(params);
|
|
93
|
+
|
|
94
|
+
const mockedTagsList = jest
|
|
95
|
+
.spyOn(ctx.client.tags, "all")
|
|
96
|
+
.mockImplementation(() => ({ list: [tag] }));
|
|
97
|
+
|
|
98
|
+
const mockedCreate = jest
|
|
99
|
+
.spyOn(ctx.client.articles, "create")
|
|
100
|
+
.mockImplementation(() => ({
|
|
101
|
+
article: {},
|
|
102
|
+
errors: [{ key: "slug", message: "cannot be blank" }],
|
|
103
|
+
}));
|
|
104
|
+
|
|
105
|
+
const result = await ArticlesHandler.create(ctx);
|
|
106
|
+
|
|
107
|
+
expect(mockedTagsList).toHaveBeenCalledWith("en");
|
|
108
|
+
expect(mockedCreate).toHaveBeenCalledWith(
|
|
109
|
+
{
|
|
110
|
+
title: params.title,
|
|
111
|
+
slug: "",
|
|
112
|
+
visibility: params.visibility,
|
|
113
|
+
publishAt: "2024-10-10T03:58:00Z",
|
|
114
|
+
settings: {
|
|
115
|
+
layout: params.layout,
|
|
116
|
+
meta: {
|
|
117
|
+
title: params.meta_title,
|
|
118
|
+
description: params.meta_description,
|
|
119
|
+
image: JSON.parse(params.meta_image || "{}"),
|
|
120
|
+
},
|
|
121
|
+
credentials: {
|
|
122
|
+
user: params.username,
|
|
123
|
+
password: params.password,
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
widgets: [],
|
|
127
|
+
tags: params.tags,
|
|
128
|
+
categories: [],
|
|
129
|
+
},
|
|
130
|
+
"en",
|
|
131
|
+
"article"
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
expect(result).toEqual({
|
|
135
|
+
assigns: {
|
|
136
|
+
article: { ...params, meta_image: JSON.parse(params.meta_image) },
|
|
137
|
+
tags: [tag],
|
|
138
|
+
errors: { article: { slug: "cannot be blank" } },
|
|
139
|
+
visibilityOptions: ctx.client.articles.visibilityOptions(),
|
|
140
|
+
_translations: [],
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import ArticlesHandler from "../../../../handlers/articles/ArticlesHandler";
|
|
2
|
+
import Articles from "../../../../cloud/Articles";
|
|
3
|
+
import Tags from "../../../../cloud/Tags";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
import Factory from "../../../../../test/factory";
|
|
6
|
+
|
|
7
|
+
describe("Articles Handler", () => {
|
|
8
|
+
function buildCtx() {
|
|
9
|
+
return {
|
|
10
|
+
client: {
|
|
11
|
+
articles: new Articles(testConfig, "token"),
|
|
12
|
+
tags: new Tags(testConfig, "token"),
|
|
13
|
+
},
|
|
14
|
+
query: { foo: "bar" },
|
|
15
|
+
locale: "en",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
test("index", async () => {
|
|
20
|
+
const tags = [Factory.build("tag")];
|
|
21
|
+
const ctx = buildCtx();
|
|
22
|
+
|
|
23
|
+
const mockedTagList = jest
|
|
24
|
+
.spyOn(ctx.client.tags, "all")
|
|
25
|
+
.mockImplementation(() => ({ list: tags, pagination: null }));
|
|
26
|
+
|
|
27
|
+
const result = await ArticlesHandler.create_form(ctx);
|
|
28
|
+
|
|
29
|
+
expect(mockedTagList).toHaveBeenCalledWith("en");
|
|
30
|
+
|
|
31
|
+
expect(result).toEqual({
|
|
32
|
+
assigns: {
|
|
33
|
+
article: { ...ctx.client.articles.defaults(), meta_image: {} },
|
|
34
|
+
tags: tags,
|
|
35
|
+
errors: {},
|
|
36
|
+
visibilityOptions: ctx.client.articles.visibilityOptions(),
|
|
37
|
+
_translations: [],
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import ArticlesHandler from "../../../../handlers/articles/ArticlesHandler";
|
|
2
|
+
import Articles from "../../../../cloud/Articles";
|
|
3
|
+
import Tags from "../../../../cloud/Tags";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
import Factory from "../../../../../test/factory";
|
|
6
|
+
|
|
7
|
+
describe("Articles Handler", () => {
|
|
8
|
+
function buildCtx() {
|
|
9
|
+
return {
|
|
10
|
+
client: {
|
|
11
|
+
articles: new Articles(testConfig, "token"),
|
|
12
|
+
tags: new Tags(testConfig, "token"),
|
|
13
|
+
},
|
|
14
|
+
query: { foo: "bar" },
|
|
15
|
+
locale: "en",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
test("index", async () => {
|
|
20
|
+
const article = Factory.build("article");
|
|
21
|
+
const pagination = Factory.build("pagination");
|
|
22
|
+
const tags = [Factory.build("tag")];
|
|
23
|
+
const ctx = buildCtx();
|
|
24
|
+
|
|
25
|
+
const mockedArticleList = jest
|
|
26
|
+
.spyOn(ctx.client.articles, "list")
|
|
27
|
+
.mockImplementation(() => ({ list: [article], pagination }));
|
|
28
|
+
|
|
29
|
+
const mockedTagList = jest
|
|
30
|
+
.spyOn(ctx.client.tags, "all")
|
|
31
|
+
.mockImplementation(() => ({ list: tags, pagination: null }));
|
|
32
|
+
|
|
33
|
+
const result = await ArticlesHandler.index(ctx);
|
|
34
|
+
|
|
35
|
+
expect(mockedArticleList).toHaveBeenCalledWith({ foo: "bar" }, "en");
|
|
36
|
+
expect(mockedTagList).toHaveBeenCalledWith("en");
|
|
37
|
+
|
|
38
|
+
expect(result).toEqual({
|
|
39
|
+
assigns: {
|
|
40
|
+
items: {
|
|
41
|
+
list: [article],
|
|
42
|
+
pagination: pagination,
|
|
43
|
+
},
|
|
44
|
+
tags: tags,
|
|
45
|
+
visibilityOptions: ctx.client.articles.visibilityOptions(),
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import ArticlesHandler from "../../../../handlers/articles/ArticlesHandler";
|
|
2
|
+
import Articles from "../../../../cloud/Articles";
|
|
3
|
+
import ArticleChanges from "../../../../cloud/ArticleChanges";
|
|
4
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
5
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
6
|
+
import Factory from "../../../../../test/factory";
|
|
7
|
+
|
|
8
|
+
describe("Articles Handler", () => {
|
|
9
|
+
function buildCtx(article) {
|
|
10
|
+
return {
|
|
11
|
+
client: {
|
|
12
|
+
articles: new Articles(testConfig, "token"),
|
|
13
|
+
articleChanges: new ArticleChanges(testConfig, "token"),
|
|
14
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
15
|
+
},
|
|
16
|
+
params: { id: article.id },
|
|
17
|
+
locale: "en",
|
|
18
|
+
locales: {
|
|
19
|
+
en: {
|
|
20
|
+
name: "English",
|
|
21
|
+
code: "en-gb",
|
|
22
|
+
flag: "/static/_assets/flags/gb.svg",
|
|
23
|
+
},
|
|
24
|
+
bg: {
|
|
25
|
+
name: "Bulgarian",
|
|
26
|
+
code: "bg",
|
|
27
|
+
flag: "/static/_assets/flags/bg.svg",
|
|
28
|
+
},
|
|
29
|
+
de: {
|
|
30
|
+
name: "German",
|
|
31
|
+
code: "de",
|
|
32
|
+
flag: "/static/_assets/flags/de.svg",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
test("show for existing article", async () => {
|
|
39
|
+
const article = Factory.build("article", {
|
|
40
|
+
translations: {
|
|
41
|
+
de: {
|
|
42
|
+
id: 42,
|
|
43
|
+
},
|
|
44
|
+
bg: {
|
|
45
|
+
id: 69,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
const revision = Factory.build("article_revision", {
|
|
50
|
+
originalId: article.id,
|
|
51
|
+
});
|
|
52
|
+
const change = Factory.build("article_change");
|
|
53
|
+
const ctx = buildCtx(article);
|
|
54
|
+
|
|
55
|
+
const mockedArticleFind = jest
|
|
56
|
+
.spyOn(ctx.client.articles, "find")
|
|
57
|
+
.mockImplementation(() => article);
|
|
58
|
+
|
|
59
|
+
const mockedArticleRevisions = jest
|
|
60
|
+
.spyOn(ctx.client.articleRevisions, "all")
|
|
61
|
+
.mockImplementation(() => ({ list: [revision] }));
|
|
62
|
+
|
|
63
|
+
const mockedArticleChanges = jest
|
|
64
|
+
.spyOn(ctx.client.articleChanges, "all")
|
|
65
|
+
.mockImplementation(() => ({ list: [change] }));
|
|
66
|
+
|
|
67
|
+
const result = await ArticlesHandler.show(ctx);
|
|
68
|
+
|
|
69
|
+
expect(mockedArticleFind).toHaveBeenCalledWith(article.id, "en");
|
|
70
|
+
expect(mockedArticleRevisions).toHaveBeenCalledWith(article.id, "en");
|
|
71
|
+
expect(mockedArticleChanges).toHaveBeenCalledWith(article.id, "en");
|
|
72
|
+
|
|
73
|
+
expect(result).toEqual({
|
|
74
|
+
assigns: {
|
|
75
|
+
article,
|
|
76
|
+
revisions: [revision],
|
|
77
|
+
changes: [change],
|
|
78
|
+
_translations: [
|
|
79
|
+
{
|
|
80
|
+
locale: "bg",
|
|
81
|
+
path: "/bg/articles/69",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
locale: "de",
|
|
85
|
+
path: "/de/articles/42",
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("show for non existing article", async () => {
|
|
93
|
+
const ctx = buildCtx({ id: "42" });
|
|
94
|
+
|
|
95
|
+
const mockedArticleFind = jest
|
|
96
|
+
.spyOn(ctx.client.articles, "find")
|
|
97
|
+
.mockImplementation(() => null);
|
|
98
|
+
|
|
99
|
+
expect(async () => {
|
|
100
|
+
await ArticlesHandler.show(ctx);
|
|
101
|
+
}).rejects.toThrow("Missing article #42");
|
|
102
|
+
|
|
103
|
+
expect(mockedArticleFind).toHaveBeenCalledWith("42", "en");
|
|
104
|
+
});
|
|
105
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import Articles from "../../../../cloud/Articles";
|
|
2
|
+
import ClonesHandler from "../../../../handlers/articles/ClonesHandler";
|
|
3
|
+
import Factory from "../../../../../test/factory";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
|
|
6
|
+
function buildCtx(article) {
|
|
7
|
+
return {
|
|
8
|
+
client: {
|
|
9
|
+
articles: new Articles(testConfig, "token"),
|
|
10
|
+
},
|
|
11
|
+
params: { parent_id: article.id },
|
|
12
|
+
locale: "en",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe("Clone article", () => {
|
|
17
|
+
test("clone successful", async () => {
|
|
18
|
+
const article = Factory.build("article");
|
|
19
|
+
const ctx = buildCtx(article);
|
|
20
|
+
|
|
21
|
+
const mockClone = jest
|
|
22
|
+
.spyOn(ctx.client.articles, "clone")
|
|
23
|
+
.mockImplementation(() => article);
|
|
24
|
+
|
|
25
|
+
const result = await ClonesHandler.create(ctx);
|
|
26
|
+
|
|
27
|
+
expect(mockClone).toHaveBeenCalledWith(article.id, "en");
|
|
28
|
+
|
|
29
|
+
expect(result).toEqual({
|
|
30
|
+
redirect: "/en/articles",
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("clone failed", async () => {
|
|
35
|
+
const article = Factory.build("article");
|
|
36
|
+
|
|
37
|
+
const ctx = buildCtx(article);
|
|
38
|
+
|
|
39
|
+
const mockClone = jest
|
|
40
|
+
.spyOn(ctx.client.articles, "clone")
|
|
41
|
+
.mockImplementation(() => ({
|
|
42
|
+
article: null,
|
|
43
|
+
errors: [{ key: "generalError", message: "some error" }],
|
|
44
|
+
}));
|
|
45
|
+
|
|
46
|
+
expect(async () => {
|
|
47
|
+
await ClonesHandler.create(ctx);
|
|
48
|
+
}).rejects.toThrow(
|
|
49
|
+
`Error cloning article: ${JSON.stringify([{ key: "generalError", message: "some error" }])}`
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
expect(mockClone).toHaveBeenCalledWith(article.id, "en");
|
|
53
|
+
});
|
|
54
|
+
});
|