@raketa-cloud/admin 0.0.15 → 0.0.17
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/Adapter.js +4 -4
- package/src/HonoAdapter.js +13 -19
- package/src/cloud/Articles.js +9 -5
- package/src/cloud/EventChanges.js +15 -0
- package/src/cloud/EventRevisions.js +149 -0
- package/src/cloud/Events.js +139 -0
- package/src/cloud/Pages.js +9 -5
- package/src/cloud/documents/common.js +10 -0
- package/src/cloud/documents/eventsDocuments.js +254 -0
- package/src/handlers/article_revisions/ArticleRevisionsHandler.js +4 -4
- package/src/handlers/article_revisions/CodeHandler.js +2 -2
- package/src/handlers/article_revisions/GeneralHandler.js +2 -2
- package/src/handlers/article_revisions/LocksHandler.js +2 -2
- package/src/handlers/article_revisions/MetaHandler.js +2 -2
- package/src/handlers/article_revisions/PublishesHandler.js +2 -2
- package/src/handlers/article_revisions/RevertsHandler.js +2 -2
- package/src/handlers/article_revisions/TagHandler.js +2 -2
- package/src/handlers/article_revisions/UnlocksHandler.js +2 -2
- package/src/handlers/article_revisions/VisualHandler.js +2 -2
- package/src/handlers/articles/ArticlesHandler.js +20 -16
- package/src/handlers/articles/ClonesHandler.js +5 -3
- package/src/handlers/articles/DeletesHandler.js +5 -5
- package/src/handlers/articles/TranslationsHandler.js +25 -22
- package/src/handlers/articles/URLsHandler.js +6 -6
- 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 +94 -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 +19 -0
- package/src/handlers/events/DeletesHandler.js +68 -0
- package/src/handlers/events/EventsHandler.js +125 -0
- package/src/handlers/events/TranslationsHandler.js +107 -0
- package/src/handlers/events/URLsHandler.js +71 -0
- package/src/handlers/page_revisions/CodeHandler.js +2 -2
- package/src/handlers/page_revisions/GeneralHandler.js +2 -2
- package/src/handlers/page_revisions/LocksHandler.js +2 -2
- package/src/handlers/page_revisions/MetaHandler.js +2 -2
- package/src/handlers/page_revisions/PageRevisionsHandler.js +4 -4
- package/src/handlers/page_revisions/PublishesHandler.js +2 -2
- package/src/handlers/page_revisions/RevertsHandler.js +2 -2
- package/src/handlers/page_revisions/TagHandler.js +2 -2
- package/src/handlers/page_revisions/UnlocksHandler.js +2 -2
- package/src/handlers/page_revisions/VisualHandler.js +2 -2
- package/src/handlers/pages/ClonesHandler.js +5 -3
- package/src/handlers/pages/DeletesHandler.js +5 -5
- package/src/handlers/pages/PagesHandler.js +21 -16
- package/src/handlers/pages/TranslationsHandler.js +24 -22
- package/src/handlers/pages/URLsHandler.js +6 -6
- package/src/index.js +24 -2
- package/src/routeArticlesModule.js +142 -0
- package/src/routeCollection.js +2 -2
- package/src/routeEventsModule.js +142 -0
- package/src/routeMember.js +2 -2
- package/src/routeNestedCollection.js +8 -2
- package/src/routeNestedMember.js +8 -2
- package/src/routePagesModule.js +155 -0
- package/src/routeStandard.js +6 -4
- package/src/setupCloud.js +12 -0
- package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/create.test.js +84 -0
- package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/destroy.test.js +59 -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 +148 -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 +159 -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 +152 -0
- package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +142 -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 +89 -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 +152 -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 +140 -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 +11 -5
- package/src/tests/handlers/articles/ArticlesHandler.test/create_form.test.js +5 -2
- package/src/tests/handlers/articles/ArticlesHandler.test/index.test.js +9 -2
- package/src/tests/handlers/articles/ArticlesHandler.test/show.test.js +9 -3
- package/src/tests/handlers/articles/{ConesHandler.test → ClonesHandler.test}/create.test.js +8 -2
- package/src/tests/handlers/articles/DeletesHandler.test/create.test.js +12 -3
- package/src/tests/handlers/articles/DeletesHandler.test/create_form.test.js +8 -2
- package/src/tests/handlers/articles/URLsHandler.test/create.test.js +18 -6
- package/src/tests/handlers/articles/URLsHandler.test/create_form.test.js +8 -2
- 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 +152 -0
- package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/create.test.js +84 -0
- package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/destroy.test.js +59 -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 +167 -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 +156 -0
- package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +142 -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 +89 -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 +156 -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 +144 -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/ClonesHandler.test/create.test.js +60 -0
- package/src/tests/handlers/events/DeletesHandler.test/create.test.js +119 -0
- package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +60 -0
- package/src/tests/handlers/events/EventsHandler.test/create.test.js +158 -0
- package/src/tests/handlers/events/EventsHandler.test/create_form.test.js +44 -0
- package/src/tests/handlers/events/EventsHandler.test/index.test.js +52 -0
- package/src/tests/handlers/events/EventsHandler.test/show.test.js +111 -0
- package/src/tests/handlers/events/URLsHandler.test/create.test.js +167 -0
- package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +57 -0
- package/src/tests/handlers/page_revisions/CodesHandler.test/update.test.js +12 -3
- package/src/tests/handlers/page_revisions/GeneralHandler.test/update.test.js +12 -3
- package/src/tests/handlers/page_revisions/MetaHandler.test/update.test.js +12 -3
- package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/create.test.js +12 -3
- package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/destroy.test.js +8 -2
- package/src/tests/handlers/page_revisions/PublishesHandler.test/create.test.js +8 -2
- package/src/tests/handlers/page_revisions/RevertsHandler.test/create.test.js +12 -3
- package/src/tests/handlers/page_revisions/TagHandler.test/update.test.js +8 -2
- package/src/tests/handlers/page_revisions/VisualHandler.test.test/update.test.js +12 -3
- package/src/tests/handlers/pages/ConesHandler.test/create.test.js +8 -2
- package/src/tests/handlers/pages/DeletesHandler.test/create.test.js +12 -3
- package/src/tests/handlers/pages/DeletesHandler.test/create_form.test.js +8 -2
- package/src/tests/handlers/pages/PagesHandler.test/create.test.js +11 -5
- package/src/tests/handlers/pages/PagesHandler.test/create_form.test.js +1 -1
- package/src/tests/handlers/pages/PagesHandler.test/index.test.js +5 -2
- package/src/tests/handlers/pages/PagesHandler.test/show.test.js +9 -3
- package/src/tests/handlers/pages/URLsHandler.test/create.test.js +16 -4
- package/src/tests/handlers/pages/URLsHandler.test/create_form.test.js +8 -2
- package/src/tests/routeCollection.test.js +118 -105
- package/src/tests/routeMember.test.js +60 -54
- package/src/tests/routeNestedCollection.test.js +132 -126
- package/src/tests/routeNestedMember.test.js +60 -54
- package/src/views/articles/_form.ejs +17 -17
- package/src/views/articles/show.ejs +9 -9
- package/src/views/articles/translations/_form.ejs +3 -3
- package/src/views/articles/translations/create_form.ejs +7 -9
- 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 +10 -0
- package/src/views/events/urls/create_form.ejs +31 -0
- package/src/views/pages/_form.ejs +16 -16
- package/src/views/pages/create_form.ejs +1 -1
- package/src/views/pages/show.ejs +9 -9
- package/src/views/pages/translations/_form.ejs +3 -3
- package/src/views/pages/translations/create_form.ejs +7 -9
- package/test/factory.js +42 -3
- package/src/routeArticles.js +0 -65
- package/src/routePages.js +0 -55
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import TagHandler from "../../../../handlers/article_revisions/TagHandler";
|
|
2
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
3
|
+
import Tags from "../../../../cloud/Tags";
|
|
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
|
+
tags: new Tags(testConfig, "token"),
|
|
12
|
+
},
|
|
13
|
+
params: { parent_id: revision.id },
|
|
14
|
+
locale: "en",
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe("Article revision tags settings", () => {
|
|
19
|
+
test("edit_form when a revision exists", async () => {
|
|
20
|
+
const tags = [
|
|
21
|
+
Factory.build("tag", { id: 42 }),
|
|
22
|
+
Factory.build("tag", { id: 69 }),
|
|
23
|
+
];
|
|
24
|
+
const revision = Factory.build("article_revision", { tags: [tags[0]] });
|
|
25
|
+
const ctx = buildCtx(revision);
|
|
26
|
+
|
|
27
|
+
const mockFind = jest
|
|
28
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
29
|
+
.mockImplementation(() => revision);
|
|
30
|
+
|
|
31
|
+
const mockTags = jest
|
|
32
|
+
.spyOn(ctx.client.tags, "all")
|
|
33
|
+
.mockImplementation(() => ({
|
|
34
|
+
list: tags,
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
const result = await TagHandler.edit_form(ctx);
|
|
38
|
+
|
|
39
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
40
|
+
expect(mockTags).toHaveBeenCalledWith("en");
|
|
41
|
+
|
|
42
|
+
expect(result).toEqual({
|
|
43
|
+
assigns: {
|
|
44
|
+
tag_settings: {
|
|
45
|
+
id: revision.id,
|
|
46
|
+
originalId: revision.originalId,
|
|
47
|
+
tags: revision.tags.map((t) => t.id),
|
|
48
|
+
},
|
|
49
|
+
tags: tags,
|
|
50
|
+
errors: {},
|
|
51
|
+
_translations: [],
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test("edit_form when a revision does not exist", async () => {
|
|
57
|
+
const ctx = buildCtx({ id: "42" });
|
|
58
|
+
|
|
59
|
+
const mockFind = jest
|
|
60
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
61
|
+
.mockImplementation(() => null);
|
|
62
|
+
|
|
63
|
+
expect(async () => {
|
|
64
|
+
await TagHandler.edit_form(ctx);
|
|
65
|
+
}).rejects.toThrow("Missing revision #42");
|
|
66
|
+
|
|
67
|
+
expect(mockFind).toHaveBeenCalledWith("42", "en");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import TagHandler from "../../../../handlers/article_revisions/TagHandler";
|
|
2
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
3
|
+
import Tags from "../../../../cloud/Tags";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
import Factory from "../../../../../test/factory";
|
|
6
|
+
|
|
7
|
+
function buildCtx(revision, updateSettings) {
|
|
8
|
+
return {
|
|
9
|
+
client: {
|
|
10
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
11
|
+
tags: new Tags(testConfig, "token"),
|
|
12
|
+
},
|
|
13
|
+
params: { parent_id: revision.id },
|
|
14
|
+
resourceParams: {
|
|
15
|
+
tag_settings: updateSettings,
|
|
16
|
+
},
|
|
17
|
+
locale: "en",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe("Article revision tags settings", () => {
|
|
22
|
+
test("update successful", async () => {
|
|
23
|
+
const tags = [
|
|
24
|
+
Factory.build("tag", { id: 42 }),
|
|
25
|
+
Factory.build("tag", { id: 69 }),
|
|
26
|
+
];
|
|
27
|
+
const revision = Factory.build("article_revision", { tags: [tags[0]] });
|
|
28
|
+
|
|
29
|
+
const updateSettings = {
|
|
30
|
+
tags: [tags.map((t) => t.id)],
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
34
|
+
|
|
35
|
+
const mockFind = jest
|
|
36
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
37
|
+
.mockImplementation(() => revision);
|
|
38
|
+
|
|
39
|
+
const mockUpdate = jest
|
|
40
|
+
.spyOn(ctx.client.articleRevisions, "update")
|
|
41
|
+
.mockImplementation(() => ({
|
|
42
|
+
revision: {},
|
|
43
|
+
errors: null,
|
|
44
|
+
}));
|
|
45
|
+
|
|
46
|
+
const result = await TagHandler.update(ctx, {
|
|
47
|
+
articleType: "article",
|
|
48
|
+
articleTypePlural: "articles",
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
52
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
|
|
53
|
+
slug: revision.slug,
|
|
54
|
+
title: revision.title,
|
|
55
|
+
visibility: revision.visibility,
|
|
56
|
+
publishAt: revision.publishAt,
|
|
57
|
+
widgets: JSON.stringify(revision.widgets),
|
|
58
|
+
tags: updateSettings.tags,
|
|
59
|
+
categories: revision.categories.map((c) => c.id),
|
|
60
|
+
settings: JSON.stringify(revision.settings),
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(result).toEqual({
|
|
64
|
+
redirect: `/en/article_revisions/${revision.id}/tags/edit`,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("update failed", async () => {
|
|
69
|
+
const tags = [
|
|
70
|
+
Factory.build("tag", { id: 42 }),
|
|
71
|
+
Factory.build("tag", { id: 69 }),
|
|
72
|
+
];
|
|
73
|
+
const revision = Factory.build("article_revision", { tags: [tags[0]] });
|
|
74
|
+
|
|
75
|
+
const updateSettings = {
|
|
76
|
+
tags: [tags.map((t) => t.id)],
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
80
|
+
|
|
81
|
+
const mockFind = jest
|
|
82
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
83
|
+
.mockImplementation(() => revision);
|
|
84
|
+
|
|
85
|
+
const mockUpdate = jest
|
|
86
|
+
.spyOn(ctx.client.articleRevisions, "update")
|
|
87
|
+
.mockImplementation(() => ({
|
|
88
|
+
revision: {},
|
|
89
|
+
errors: [{ key: "generalError", message: "some error" }],
|
|
90
|
+
}));
|
|
91
|
+
|
|
92
|
+
const mockTags = jest
|
|
93
|
+
.spyOn(ctx.client.tags, "all")
|
|
94
|
+
.mockImplementation(() => ({
|
|
95
|
+
list: tags,
|
|
96
|
+
}));
|
|
97
|
+
|
|
98
|
+
const result = await TagHandler.update(ctx, {
|
|
99
|
+
articleType: "article",
|
|
100
|
+
articleTypePlural: "articles",
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
104
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
|
|
105
|
+
slug: revision.slug,
|
|
106
|
+
title: revision.title,
|
|
107
|
+
visibility: revision.visibility,
|
|
108
|
+
publishAt: revision.publishAt,
|
|
109
|
+
widgets: JSON.stringify(revision.widgets),
|
|
110
|
+
tags: updateSettings.tags,
|
|
111
|
+
categories: revision.categories.map((c) => c.id),
|
|
112
|
+
settings: JSON.stringify(revision.settings),
|
|
113
|
+
});
|
|
114
|
+
expect(mockTags).toHaveBeenCalledWith("en");
|
|
115
|
+
|
|
116
|
+
expect(result).toEqual({
|
|
117
|
+
assigns: {
|
|
118
|
+
tag_settings: {
|
|
119
|
+
...updateSettings,
|
|
120
|
+
id: revision.id,
|
|
121
|
+
originalId: revision.originalId,
|
|
122
|
+
},
|
|
123
|
+
errors: {
|
|
124
|
+
tag_settings: { generalError: "some error" },
|
|
125
|
+
},
|
|
126
|
+
tags: tags,
|
|
127
|
+
_translations: [],
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test("update when a revision does not exist", async () => {
|
|
133
|
+
const revision = Factory.build("article_revision");
|
|
134
|
+
|
|
135
|
+
const updateSettings = {};
|
|
136
|
+
|
|
137
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
138
|
+
|
|
139
|
+
const mockFind = jest
|
|
140
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
141
|
+
.mockImplementation(() => null);
|
|
142
|
+
|
|
143
|
+
expect(async () => {
|
|
144
|
+
await TagHandler.update(ctx, {
|
|
145
|
+
articleType: "article",
|
|
146
|
+
articleTypePlural: "articles",
|
|
147
|
+
});
|
|
148
|
+
}).rejects.toThrow(`Missing revision #${revision.id}`);
|
|
149
|
+
|
|
150
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
151
|
+
});
|
|
152
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
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) {
|
|
7
|
+
return {
|
|
8
|
+
client: {
|
|
9
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
10
|
+
},
|
|
11
|
+
params: { parent_id: revision.id },
|
|
12
|
+
locale: "en",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe("Article revision visuals settings", () => {
|
|
17
|
+
test("edit_form when a revision exists", async () => {
|
|
18
|
+
const revision = Factory.build("article_revision");
|
|
19
|
+
const ctx = buildCtx(revision);
|
|
20
|
+
|
|
21
|
+
const mockFind = jest
|
|
22
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
23
|
+
.mockImplementation(() => revision);
|
|
24
|
+
|
|
25
|
+
const result = await VisualHandler.edit_form(ctx);
|
|
26
|
+
|
|
27
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
28
|
+
|
|
29
|
+
expect(result).toEqual({
|
|
30
|
+
assigns: {
|
|
31
|
+
visual_settings: {
|
|
32
|
+
id: revision.id,
|
|
33
|
+
originalId: revision.originalId,
|
|
34
|
+
layout: revision.settings.layout,
|
|
35
|
+
},
|
|
36
|
+
errors: {},
|
|
37
|
+
_translations: [],
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("edit_form when a revision does not exist", async () => {
|
|
43
|
+
const ctx = buildCtx({ id: "42" });
|
|
44
|
+
|
|
45
|
+
const mockFind = jest
|
|
46
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
47
|
+
.mockImplementation(() => null);
|
|
48
|
+
|
|
49
|
+
expect(async () => {
|
|
50
|
+
await VisualHandler.edit_form(ctx);
|
|
51
|
+
}).rejects.toThrow("Missing revision #42");
|
|
52
|
+
|
|
53
|
+
expect(mockFind).toHaveBeenCalledWith("42", "en");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,140 @@
|
|
|
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
|
+
articleType: "article",
|
|
42
|
+
articleTypePlural: "articles",
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
46
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
|
|
47
|
+
slug: revision.slug,
|
|
48
|
+
title: revision.title,
|
|
49
|
+
visibility: revision.visibility,
|
|
50
|
+
publishAt: revision.publishAt,
|
|
51
|
+
widgets: JSON.stringify(revision.widgets),
|
|
52
|
+
tags: revision.tags.map((t) => t.id),
|
|
53
|
+
categories: revision.categories.map((c) => c.id),
|
|
54
|
+
settings: JSON.stringify({
|
|
55
|
+
...revision.settings,
|
|
56
|
+
layout: updateSettings.layout,
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
expect(result).toEqual({
|
|
61
|
+
redirect: `/en/article_revisions/${revision.id}/visuals/edit`,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("update failed", async () => {
|
|
66
|
+
const revision = Factory.build("article_revision");
|
|
67
|
+
|
|
68
|
+
const updateSettings = {
|
|
69
|
+
layout: "bla",
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
73
|
+
|
|
74
|
+
const mockFind = jest
|
|
75
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
76
|
+
.mockImplementation(() => revision);
|
|
77
|
+
|
|
78
|
+
const mockUpdate = jest
|
|
79
|
+
.spyOn(ctx.client.articleRevisions, "update")
|
|
80
|
+
.mockImplementation(() => ({
|
|
81
|
+
revision: {},
|
|
82
|
+
errors: [{ key: "generalError", message: "some error" }],
|
|
83
|
+
}));
|
|
84
|
+
|
|
85
|
+
const result = await VisualHandler.update(ctx, {
|
|
86
|
+
articleType: "article",
|
|
87
|
+
articleTypePlural: "articles",
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
91
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
|
|
92
|
+
slug: revision.slug,
|
|
93
|
+
title: revision.title,
|
|
94
|
+
visibility: revision.visibility,
|
|
95
|
+
publishAt: revision.publishAt,
|
|
96
|
+
widgets: JSON.stringify(revision.widgets),
|
|
97
|
+
tags: revision.tags.map((t) => t.id),
|
|
98
|
+
categories: revision.categories.map((c) => c.id),
|
|
99
|
+
settings: JSON.stringify({
|
|
100
|
+
...revision.settings,
|
|
101
|
+
layout: updateSettings.layout,
|
|
102
|
+
}),
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
expect(result).toEqual({
|
|
106
|
+
assigns: {
|
|
107
|
+
visual_settings: {
|
|
108
|
+
...updateSettings,
|
|
109
|
+
id: revision.id,
|
|
110
|
+
originalId: revision.originalId,
|
|
111
|
+
},
|
|
112
|
+
errors: {
|
|
113
|
+
visual_settings: { generalError: "some error" },
|
|
114
|
+
},
|
|
115
|
+
_translations: [],
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("update when a revision does not exist", async () => {
|
|
121
|
+
const revision = Factory.build("article_revision");
|
|
122
|
+
|
|
123
|
+
const updateSettings = {};
|
|
124
|
+
|
|
125
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
126
|
+
|
|
127
|
+
const mockFind = jest
|
|
128
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
129
|
+
.mockImplementation(() => null);
|
|
130
|
+
|
|
131
|
+
expect(async () => {
|
|
132
|
+
await VisualHandler.update(ctx, {
|
|
133
|
+
articleType: "article",
|
|
134
|
+
articleTypePlural: "articles",
|
|
135
|
+
});
|
|
136
|
+
}).rejects.toThrow(`Missing revision #${revision.id}`);
|
|
137
|
+
|
|
138
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
@@ -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
|
+
});
|
|
@@ -12,7 +12,7 @@ describe("Articles Handler", () => {
|
|
|
12
12
|
tags: new Tags(testConfig, "token"),
|
|
13
13
|
},
|
|
14
14
|
resourceParams: {
|
|
15
|
-
|
|
15
|
+
resource: params,
|
|
16
16
|
},
|
|
17
17
|
locale: "en",
|
|
18
18
|
};
|
|
@@ -40,7 +40,10 @@ describe("Articles Handler", () => {
|
|
|
40
40
|
.spyOn(ctx.client.articles, "create")
|
|
41
41
|
.mockImplementation(() => ({ article: {}, errors: null }));
|
|
42
42
|
|
|
43
|
-
const result = await ArticlesHandler.create(ctx
|
|
43
|
+
const result = await ArticlesHandler.create(ctx, {
|
|
44
|
+
articleType: "article",
|
|
45
|
+
articleTypePlural: "articles",
|
|
46
|
+
});
|
|
44
47
|
|
|
45
48
|
expect(mockedCreate).toHaveBeenCalledWith(
|
|
46
49
|
{
|
|
@@ -102,7 +105,10 @@ describe("Articles Handler", () => {
|
|
|
102
105
|
errors: [{ key: "slug", message: "cannot be blank" }],
|
|
103
106
|
}));
|
|
104
107
|
|
|
105
|
-
const result = await ArticlesHandler.create(ctx
|
|
108
|
+
const result = await ArticlesHandler.create(ctx, {
|
|
109
|
+
articleType: "article",
|
|
110
|
+
articleTypePlural: "articles",
|
|
111
|
+
});
|
|
106
112
|
|
|
107
113
|
expect(mockedTagsList).toHaveBeenCalledWith("en");
|
|
108
114
|
expect(mockedCreate).toHaveBeenCalledWith(
|
|
@@ -133,9 +139,9 @@ describe("Articles Handler", () => {
|
|
|
133
139
|
|
|
134
140
|
expect(result).toEqual({
|
|
135
141
|
assigns: {
|
|
136
|
-
|
|
142
|
+
resource: { ...params, meta_image: JSON.parse(params.meta_image) },
|
|
137
143
|
tags: [tag],
|
|
138
|
-
errors: {
|
|
144
|
+
errors: { resource: { slug: "cannot be blank" } },
|
|
139
145
|
visibilityOptions: ctx.client.articles.visibilityOptions(),
|
|
140
146
|
_translations: [],
|
|
141
147
|
},
|
|
@@ -24,13 +24,16 @@ describe("Articles Handler", () => {
|
|
|
24
24
|
.spyOn(ctx.client.tags, "all")
|
|
25
25
|
.mockImplementation(() => ({ list: tags, pagination: null }));
|
|
26
26
|
|
|
27
|
-
const result = await ArticlesHandler.create_form(ctx
|
|
27
|
+
const result = await ArticlesHandler.create_form(ctx, {
|
|
28
|
+
articleType: "article",
|
|
29
|
+
articleTypePlural: "articles",
|
|
30
|
+
});
|
|
28
31
|
|
|
29
32
|
expect(mockedTagList).toHaveBeenCalledWith("en");
|
|
30
33
|
|
|
31
34
|
expect(result).toEqual({
|
|
32
35
|
assigns: {
|
|
33
|
-
|
|
36
|
+
resource: { ...ctx.client.articles.defaults(), meta_image: {} },
|
|
34
37
|
tags: tags,
|
|
35
38
|
errors: {},
|
|
36
39
|
visibilityOptions: ctx.client.articles.visibilityOptions(),
|
|
@@ -30,9 +30,16 @@ describe("Articles Handler", () => {
|
|
|
30
30
|
.spyOn(ctx.client.tags, "all")
|
|
31
31
|
.mockImplementation(() => ({ list: tags, pagination: null }));
|
|
32
32
|
|
|
33
|
-
const result = await ArticlesHandler.index(ctx
|
|
33
|
+
const result = await ArticlesHandler.index(ctx, {
|
|
34
|
+
articleType: "article",
|
|
35
|
+
articleTypePlural: "articles",
|
|
36
|
+
});
|
|
34
37
|
|
|
35
|
-
expect(mockedArticleList).toHaveBeenCalledWith(
|
|
38
|
+
expect(mockedArticleList).toHaveBeenCalledWith(
|
|
39
|
+
{ foo: "bar" },
|
|
40
|
+
"en",
|
|
41
|
+
"article"
|
|
42
|
+
);
|
|
36
43
|
expect(mockedTagList).toHaveBeenCalledWith("en");
|
|
37
44
|
|
|
38
45
|
expect(result).toEqual({
|
|
@@ -64,7 +64,10 @@ describe("Articles Handler", () => {
|
|
|
64
64
|
.spyOn(ctx.client.articleChanges, "all")
|
|
65
65
|
.mockImplementation(() => ({ list: [change] }));
|
|
66
66
|
|
|
67
|
-
const result = await ArticlesHandler.show(ctx
|
|
67
|
+
const result = await ArticlesHandler.show(ctx, {
|
|
68
|
+
articleType: "article",
|
|
69
|
+
articleTypePlural: "articles",
|
|
70
|
+
});
|
|
68
71
|
|
|
69
72
|
expect(mockedArticleFind).toHaveBeenCalledWith(article.id, "en");
|
|
70
73
|
expect(mockedArticleRevisions).toHaveBeenCalledWith(article.id, "en");
|
|
@@ -72,7 +75,7 @@ describe("Articles Handler", () => {
|
|
|
72
75
|
|
|
73
76
|
expect(result).toEqual({
|
|
74
77
|
assigns: {
|
|
75
|
-
article,
|
|
78
|
+
resource: article,
|
|
76
79
|
revisions: [revision],
|
|
77
80
|
changes: [change],
|
|
78
81
|
_translations: [
|
|
@@ -97,7 +100,10 @@ describe("Articles Handler", () => {
|
|
|
97
100
|
.mockImplementation(() => null);
|
|
98
101
|
|
|
99
102
|
expect(async () => {
|
|
100
|
-
await ArticlesHandler.show(ctx
|
|
103
|
+
await ArticlesHandler.show(ctx, {
|
|
104
|
+
articleType: "article",
|
|
105
|
+
articleTypePlural: "articles",
|
|
106
|
+
});
|
|
101
107
|
}).rejects.toThrow("Missing article #42");
|
|
102
108
|
|
|
103
109
|
expect(mockedArticleFind).toHaveBeenCalledWith("42", "en");
|