@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.
Files changed (141) hide show
  1. package/package.json +1 -1
  2. package/src/cloud/ArticleChanges.js +15 -0
  3. package/src/cloud/ArticleRevisions.js +152 -0
  4. package/src/cloud/Articles.js +133 -0
  5. package/src/cloud/EventChanges.js +15 -0
  6. package/src/cloud/EventRevisions.js +149 -0
  7. package/src/cloud/Events.js +135 -0
  8. package/src/cloud/documents/articlesDocuments.js +109 -469
  9. package/src/cloud/documents/common.js +20 -0
  10. package/src/cloud/documents/eventsDocuments.js +254 -0
  11. package/src/handlers/article_revisions/ArticleRevisionsHandler.js +49 -0
  12. package/src/handlers/article_revisions/CodeHandler.js +90 -0
  13. package/src/handlers/article_revisions/GeneralHandler.js +95 -0
  14. package/src/handlers/article_revisions/LocksHandler.js +54 -0
  15. package/src/handlers/article_revisions/MetaHandler.js +90 -0
  16. package/src/handlers/article_revisions/PublishesHandler.js +90 -0
  17. package/src/handlers/article_revisions/RevertsHandler.js +28 -0
  18. package/src/handlers/article_revisions/TagHandler.js +89 -0
  19. package/src/handlers/article_revisions/UnlocksHandler.js +22 -0
  20. package/src/handlers/article_revisions/VisualHandler.js +84 -0
  21. package/src/handlers/article_revisions/WidgetHandler.js +47 -0
  22. package/src/handlers/articles/ArticlesHandler.js +119 -0
  23. package/src/handlers/articles/ClonesHandler.js +17 -0
  24. package/src/handlers/articles/DeletesHandler.js +68 -0
  25. package/src/handlers/articles/TranslationsHandler.js +103 -0
  26. package/src/handlers/articles/URLsHandler.js +71 -0
  27. package/src/handlers/event_revisions/CodeHandler.js +86 -0
  28. package/src/handlers/event_revisions/EventRevisionsHandler.js +47 -0
  29. package/src/handlers/event_revisions/GeneralHandler.js +93 -0
  30. package/src/handlers/event_revisions/LocksHandler.js +51 -0
  31. package/src/handlers/event_revisions/MetaHandler.js +86 -0
  32. package/src/handlers/event_revisions/PublishesHandler.js +84 -0
  33. package/src/handlers/event_revisions/RevertsHandler.js +26 -0
  34. package/src/handlers/event_revisions/TagHandler.js +85 -0
  35. package/src/handlers/event_revisions/UnlocksHandler.js +22 -0
  36. package/src/handlers/event_revisions/VisualHandler.js +80 -0
  37. package/src/handlers/event_revisions/WidgetHandler.js +41 -0
  38. package/src/handlers/events/ClonesHandler.js +17 -0
  39. package/src/handlers/events/DeletesHandler.js +68 -0
  40. package/src/handlers/events/EventsHandler.js +121 -0
  41. package/src/handlers/events/TranslationsHandler.js +99 -0
  42. package/src/handlers/events/URLsHandler.js +71 -0
  43. package/src/handlers/pages/PagesHandler.js +4 -2
  44. package/src/handlers/pages/TranslationsHandler.js +7 -5
  45. package/src/index.js +44 -0
  46. package/src/routeArticles.js +65 -0
  47. package/src/routeEvents.js +55 -0
  48. package/src/routeStandard.js +4 -0
  49. package/src/setupCloud.js +24 -0
  50. package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +56 -0
  51. package/src/tests/handlers/article_revisions/CodesHandler.test/update.test.js +139 -0
  52. package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +65 -0
  53. package/src/tests/handlers/article_revisions/GeneralHandler.test/update.test.js +150 -0
  54. package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +57 -0
  55. package/src/tests/handlers/article_revisions/MetaHandler.test/update.test.js +143 -0
  56. package/src/tests/handlers/article_revisions/PageRevisionsHandler.test/create.test.js +75 -0
  57. package/src/tests/handlers/article_revisions/PageRevisionsHandler.test/destroy.test.js +53 -0
  58. package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +136 -0
  59. package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +47 -0
  60. package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +80 -0
  61. package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +69 -0
  62. package/src/tests/handlers/article_revisions/TagHandler.test/update.test.js +143 -0
  63. package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
  64. package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +131 -0
  65. package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +46 -0
  66. package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +103 -0
  67. package/src/tests/handlers/articles/ArticlesHandler.test/create.test.js +144 -0
  68. package/src/tests/handlers/articles/ArticlesHandler.test/create_form.test.js +41 -0
  69. package/src/tests/handlers/articles/ArticlesHandler.test/index.test.js +49 -0
  70. package/src/tests/handlers/articles/ArticlesHandler.test/show.test.js +105 -0
  71. package/src/tests/handlers/articles/ConesHandler.test/create.test.js +54 -0
  72. package/src/tests/handlers/articles/DeletesHandler.test/create.test.js +110 -0
  73. package/src/tests/handlers/articles/DeletesHandler.test/create_form.test.js +54 -0
  74. package/src/tests/handlers/articles/URLsHandler.test/create.test.js +155 -0
  75. package/src/tests/handlers/articles/URLsHandler.test/create_form.test.js +51 -0
  76. package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +56 -0
  77. package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +143 -0
  78. package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +69 -0
  79. package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +158 -0
  80. package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +57 -0
  81. package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +147 -0
  82. package/src/tests/handlers/event_revisions/PageRevisionsHandler.test/create.test.js +75 -0
  83. package/src/tests/handlers/event_revisions/PageRevisionsHandler.test/destroy.test.js +53 -0
  84. package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +136 -0
  85. package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +47 -0
  86. package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +80 -0
  87. package/src/tests/handlers/event_revisions/TagHandler.test/edit_form.test.js +69 -0
  88. package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +147 -0
  89. package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
  90. package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +135 -0
  91. package/src/tests/handlers/event_revisions/WidgetHandler.test/show.test.js +46 -0
  92. package/src/tests/handlers/event_revisions/WidgetHandler.test/update.test.js +103 -0
  93. package/src/tests/handlers/events/ConesHandler.test/create.test.js +54 -0
  94. package/src/tests/handlers/events/DeletesHandler.test/create.test.js +110 -0
  95. package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +54 -0
  96. package/src/tests/handlers/events/EventsHandler.test/create.test.js +152 -0
  97. package/src/tests/handlers/events/EventsHandler.test/create_form.test.js +41 -0
  98. package/src/tests/handlers/events/EventsHandler.test/index.test.js +49 -0
  99. package/src/tests/handlers/events/EventsHandler.test/show.test.js +105 -0
  100. package/src/tests/handlers/events/URLsHandler.test/create.test.js +155 -0
  101. package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +51 -0
  102. package/src/tests/handlers/pages/PagesHandler.test/create.test.js +3 -3
  103. package/src/utils.js +46 -0
  104. package/src/views/article_revisions/_nav.ejs +40 -0
  105. package/src/views/article_revisions/codes/edit_form.ejs +39 -0
  106. package/src/views/article_revisions/general/edit_form.ejs +70 -0
  107. package/src/views/article_revisions/locks/create_form.ejs +35 -0
  108. package/src/views/article_revisions/meta/edit_form.ejs +41 -0
  109. package/src/views/article_revisions/publishes/_form.ejs +57 -0
  110. package/src/views/article_revisions/publishes/create_form.ejs +10 -0
  111. package/src/views/article_revisions/tags/edit_form.ejs +64 -0
  112. package/src/views/article_revisions/visuals/edit_form.ejs +42 -0
  113. package/src/views/articles/_form.ejs +86 -0
  114. package/src/views/articles/create_form.ejs +9 -0
  115. package/src/views/articles/deletes/create_form.ejs +55 -0
  116. package/src/views/articles/edit_form.ejs +3 -0
  117. package/src/views/articles/index.ejs +161 -0
  118. package/src/views/articles/show.ejs +281 -0
  119. package/src/views/articles/translations/_form.ejs +77 -0
  120. package/src/views/articles/translations/create_form.ejs +11 -0
  121. package/src/views/articles/urls/create_form.ejs +31 -0
  122. package/src/views/event_revisions/_nav.ejs +40 -0
  123. package/src/views/event_revisions/codes/edit_form.ejs +39 -0
  124. package/src/views/event_revisions/general/edit_form.ejs +72 -0
  125. package/src/views/event_revisions/locks/create_form.ejs +35 -0
  126. package/src/views/event_revisions/meta/edit_form.ejs +41 -0
  127. package/src/views/event_revisions/publishes/_form.ejs +57 -0
  128. package/src/views/event_revisions/publishes/create_form.ejs +10 -0
  129. package/src/views/event_revisions/tags/edit_form.ejs +64 -0
  130. package/src/views/event_revisions/visuals/edit_form.ejs +42 -0
  131. package/src/views/events/_form.ejs +88 -0
  132. package/src/views/events/create_form.ejs +9 -0
  133. package/src/views/events/deletes/create_form.ejs +55 -0
  134. package/src/views/events/edit_form.ejs +3 -0
  135. package/src/views/events/index.ejs +161 -0
  136. package/src/views/events/show.ejs +281 -0
  137. package/src/views/events/translations/_form.ejs +79 -0
  138. package/src/views/events/translations/create_form.ejs +11 -0
  139. package/src/views/events/urls/create_form.ejs +31 -0
  140. package/src/views/page_revisions/locks/create_form.ejs +1 -1
  141. package/test/factory.js +76 -0
@@ -0,0 +1,53 @@
1
+ import ArticleRevisionsHandler from "../../../../handlers/article_revisions/ArticleRevisionsHandler";
2
+ import ArticleRevisions from "../../../../cloud/ArticleRevisions";
3
+ import { testConfig } from "../../../../../test/handlersHelper";
4
+ import Factory from "../../../../../test/factory";
5
+
6
+ function buildCtx(revisionID) {
7
+ return {
8
+ client: {
9
+ articleRevisions: new ArticleRevisions(testConfig, "token"),
10
+ },
11
+ params: { id: revisionID },
12
+ locale: "en",
13
+ };
14
+ }
15
+
16
+ describe("Article revisions", () => {
17
+ test("destroy successful", async () => {
18
+ const revision = Factory.build("article_revision");
19
+ const ctx = buildCtx(1);
20
+
21
+ const mockDelete = jest
22
+ .spyOn(ctx.client.articleRevisions, "delete")
23
+ .mockImplementation(() => ({ revision, errors: null }));
24
+
25
+ const result = await ArticleRevisionsHandler.destroy(ctx);
26
+
27
+ expect(mockDelete).toHaveBeenCalledWith(1, "en");
28
+
29
+ expect(result).toEqual({
30
+ headers: {
31
+ "HX-Redirect": `/en/articles/${revision.originalId}`,
32
+ },
33
+ json: {},
34
+ });
35
+ });
36
+
37
+ test("destroy failed", async () => {
38
+ const ctx = buildCtx(1);
39
+ const errors = [{ key: "generalError", message: "something went wrong" }];
40
+
41
+ const mockDelete = jest
42
+ .spyOn(ctx.client.articleRevisions, "delete")
43
+ .mockImplementation(() => ({ revision: null, errors }));
44
+
45
+ expect(async () => {
46
+ await ArticleRevisionsHandler.destroy(ctx);
47
+ }).rejects.toThrow(
48
+ `Failed to delete revision#${1}: ${JSON.stringify(errors)}`
49
+ );
50
+
51
+ expect(mockDelete).toHaveBeenCalledWith(1, "en");
52
+ });
53
+ });
@@ -0,0 +1,136 @@
1
+ import PublishesHandler from "../../../../handlers/article_revisions/PublishesHandler";
2
+ import ArticleRevisions from "../../../../cloud/ArticleRevisions";
3
+ import Articles from "../../../../cloud/Articles";
4
+ import { testConfig } from "../../../../../test/handlersHelper";
5
+ import Factory from "../../../../../test/factory";
6
+
7
+ function buildCtx(revision, resourceParams) {
8
+ return {
9
+ client: {
10
+ articleRevisions: new ArticleRevisions(testConfig, "token"),
11
+ articles: new Articles(testConfig, "token"),
12
+ },
13
+ params: { parent_id: revision.id },
14
+ resourceParams,
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ describe("Publish article revision", () => {
20
+ test("create successful", async () => {
21
+ const revision = Factory.build("article_revision");
22
+ const publishing = {
23
+ title: "A new revision!",
24
+ description: "Nice!",
25
+ visibility: "protected",
26
+ username: "admin",
27
+ password: "admin123!@#",
28
+ };
29
+
30
+ const ctx = buildCtx(revision, {
31
+ publishing,
32
+ });
33
+
34
+ const updatedArticle = Factory.build("article", {
35
+ id: revision.originalId,
36
+ settings: {
37
+ credentials: {
38
+ user: "admin",
39
+ password: "admin123!@#",
40
+ },
41
+ },
42
+ });
43
+
44
+ const mockFind = jest
45
+ .spyOn(ctx.client.articleRevisions, "find")
46
+ .mockImplementation(() => revision);
47
+
48
+ const mockPublish = jest
49
+ .spyOn(ctx.client.articleRevisions, "publish")
50
+ .mockImplementation(() => ({ article: updatedArticle, errors: null }));
51
+
52
+ const result = await PublishesHandler.create(ctx);
53
+
54
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
55
+ expect(mockPublish).toHaveBeenCalledWith(
56
+ revision.id,
57
+ "en",
58
+ {
59
+ title: publishing.title,
60
+ description: publishing.description,
61
+ },
62
+ {
63
+ visibility: publishing.visibility,
64
+ settings: JSON.stringify({
65
+ ...revision.settings,
66
+ credentials: {
67
+ user: publishing.username,
68
+ password: publishing.password,
69
+ },
70
+ }),
71
+ }
72
+ );
73
+
74
+ expect(result).toEqual({
75
+ redirect: `/en/articles/${updatedArticle.id}`,
76
+ });
77
+ });
78
+
79
+ test("create failed", async () => {
80
+ const revision = Factory.build("article_revision");
81
+ const publishing = {
82
+ title: "A new revision!",
83
+ description: "Nice!",
84
+ visibility: "public",
85
+ };
86
+
87
+ const ctx = buildCtx(revision, {
88
+ publishing,
89
+ });
90
+
91
+ const mockFind = jest
92
+ .spyOn(ctx.client.articleRevisions, "find")
93
+ .mockImplementation(() => revision);
94
+
95
+ const mockPublish = jest
96
+ .spyOn(ctx.client.articleRevisions, "publish")
97
+ .mockImplementation(() => ({
98
+ article: null,
99
+ errors: [{ key: "url", message: "Oops" }],
100
+ }));
101
+
102
+ const result = await PublishesHandler.create(ctx);
103
+
104
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
105
+ expect(mockPublish).toHaveBeenCalledWith(
106
+ revision.id,
107
+ "en",
108
+ {
109
+ title: publishing.title,
110
+ description: publishing.description,
111
+ },
112
+ {
113
+ visibility: publishing.visibility,
114
+ }
115
+ );
116
+
117
+ expect(result).toEqual({
118
+ assigns: {
119
+ publishing: {
120
+ id: revision.id,
121
+ originalId: revision.originalId,
122
+ title: publishing.title,
123
+ description: publishing.description,
124
+ visibility: publishing.visibility,
125
+ username: publishing.username,
126
+ password: publishing.password,
127
+ },
128
+ visibilityOptions: ctx.client.articles.visibilityOptions(),
129
+ errors: {
130
+ url: "Oops",
131
+ },
132
+ _translations: [],
133
+ },
134
+ });
135
+ });
136
+ });
@@ -0,0 +1,47 @@
1
+ import PublishesHandler from "../../../../handlers/article_revisions/PublishesHandler";
2
+ import ArticleRevisions from "../../../../cloud/ArticleRevisions";
3
+ import Articles from "../../../../cloud/Articles";
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
+ articles: new Articles(testConfig, "token"),
12
+ },
13
+ params: { parent_id: revision.id },
14
+ locale: "en",
15
+ };
16
+ }
17
+
18
+ describe("Publish article revision", () => {
19
+ test("create_form", async () => {
20
+ const revision = Factory.build("article_revision");
21
+ const ctx = buildCtx(revision);
22
+ const mockFind = jest
23
+ .spyOn(ctx.client.articleRevisions, "find")
24
+ .mockImplementation(() => revision);
25
+
26
+ const result = await PublishesHandler.create_form(ctx);
27
+
28
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
29
+
30
+ expect(result).toEqual({
31
+ assigns: {
32
+ publishing: {
33
+ id: revision.id,
34
+ originalId: revision.originalId,
35
+ title: revision.meta.title,
36
+ description: revision.meta.description,
37
+ visibility: revision.visibility,
38
+ username: revision.settings?.credentials?.user,
39
+ password: revision.settings?.credentials?.password,
40
+ },
41
+ visibilityOptions: ctx.client.articles.visibilityOptions(),
42
+ errors: {},
43
+ _translations: [],
44
+ },
45
+ });
46
+ });
47
+ });
@@ -0,0 +1,80 @@
1
+ import RevertsHandler from "../../../../handlers/article_revisions/RevertsHandler";
2
+ import ArticleRevisions from "../../../../cloud/ArticleRevisions";
3
+ import { testConfig } from "../../../../../test/handlersHelper";
4
+
5
+ function buildCtx(articleID, version) {
6
+ return {
7
+ client: {
8
+ articleRevisions: new ArticleRevisions(testConfig, "token"),
9
+ },
10
+ params: { parent_id: articleID },
11
+ resourceParams: { version },
12
+ locale: "en",
13
+ };
14
+ }
15
+
16
+ describe("Article revision revert", () => {
17
+ test("create successful", async () => {
18
+ const articleId = 42;
19
+ const version = 2;
20
+ const ctx = buildCtx(articleId, version);
21
+
22
+ const mockRevert = jest
23
+ .spyOn(ctx.client.articleRevisions, "revert")
24
+ .mockImplementation(() => ({
25
+ revision: {},
26
+ errors: null,
27
+ articleErrors: null,
28
+ }));
29
+
30
+ const result = await RevertsHandler.create(ctx);
31
+
32
+ expect(mockRevert).toHaveBeenCalledWith(articleId, version, "en");
33
+
34
+ expect(result).toEqual({
35
+ redirect: `/en/articles/${articleId}`,
36
+ });
37
+ });
38
+
39
+ test("create failed with errors", async () => {
40
+ const articleId = 42;
41
+ const version = 2;
42
+ const ctx = buildCtx(articleId, version);
43
+ const errors = [{ key: "generalError", message: "Some error" }];
44
+
45
+ const mockRevert = jest
46
+ .spyOn(ctx.client.articleRevisions, "revert")
47
+ .mockImplementation(() => ({
48
+ revision: null,
49
+ errors: errors,
50
+ articleErrors: null,
51
+ }));
52
+
53
+ expect(async () => {
54
+ await RevertsHandler.create(ctx);
55
+ }).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
56
+
57
+ expect(mockRevert).toHaveBeenCalledWith(articleId, version, "en");
58
+ });
59
+
60
+ test("create failed with article errors", async () => {
61
+ const articleId = 42;
62
+ const version = 2;
63
+ const ctx = buildCtx(articleId, version);
64
+ const errors = [{ key: "generalError", message: "Some error" }];
65
+
66
+ const mockRevert = jest
67
+ .spyOn(ctx.client.articleRevisions, "revert")
68
+ .mockImplementation(() => ({
69
+ revision: null,
70
+ errors: null,
71
+ articleErrors: errors,
72
+ }));
73
+
74
+ expect(async () => {
75
+ await RevertsHandler.create(ctx);
76
+ }).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
77
+
78
+ expect(mockRevert).toHaveBeenCalledWith(articleId, version, "en");
79
+ });
80
+ });
@@ -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,143 @@
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
+
48
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
49
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
50
+ slug: revision.slug,
51
+ title: revision.title,
52
+ visibility: revision.visibility,
53
+ publishAt: revision.publishAt,
54
+ widgets: JSON.stringify(revision.widgets),
55
+ tags: updateSettings.tags,
56
+ categories: revision.categories.map((c) => c.id),
57
+ settings: JSON.stringify(revision.settings),
58
+ });
59
+
60
+ expect(result).toEqual({
61
+ redirect: `/en/article_revisions/${revision.id}/tags/edit`,
62
+ });
63
+ });
64
+
65
+ test("update failed", async () => {
66
+ const tags = [
67
+ Factory.build("tag", { id: 42 }),
68
+ Factory.build("tag", { id: 69 }),
69
+ ];
70
+ const revision = Factory.build("article_revision", { tags: [tags[0]] });
71
+
72
+ const updateSettings = {
73
+ tags: [tags.map((t) => t.id)],
74
+ };
75
+
76
+ const ctx = buildCtx(revision, updateSettings);
77
+
78
+ const mockFind = jest
79
+ .spyOn(ctx.client.articleRevisions, "find")
80
+ .mockImplementation(() => revision);
81
+
82
+ const mockUpdate = jest
83
+ .spyOn(ctx.client.articleRevisions, "update")
84
+ .mockImplementation(() => ({
85
+ revision: {},
86
+ errors: [{ key: "generalError", message: "some error" }],
87
+ }));
88
+
89
+ const mockTags = jest
90
+ .spyOn(ctx.client.tags, "all")
91
+ .mockImplementation(() => ({
92
+ list: tags,
93
+ }));
94
+
95
+ const result = await TagHandler.update(ctx);
96
+
97
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
98
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
99
+ slug: revision.slug,
100
+ title: revision.title,
101
+ visibility: revision.visibility,
102
+ publishAt: revision.publishAt,
103
+ widgets: JSON.stringify(revision.widgets),
104
+ tags: updateSettings.tags,
105
+ categories: revision.categories.map((c) => c.id),
106
+ settings: JSON.stringify(revision.settings),
107
+ });
108
+ expect(mockTags).toHaveBeenCalledWith("en");
109
+
110
+ expect(result).toEqual({
111
+ assigns: {
112
+ tag_settings: {
113
+ ...updateSettings,
114
+ id: revision.id,
115
+ originalId: revision.originalId,
116
+ },
117
+ errors: {
118
+ tag_settings: { generalError: "some error" },
119
+ },
120
+ tags: tags,
121
+ _translations: [],
122
+ },
123
+ });
124
+ });
125
+
126
+ test("update when a revision does not exist", async () => {
127
+ const revision = Factory.build("article_revision");
128
+
129
+ const updateSettings = {};
130
+
131
+ const ctx = buildCtx(revision, updateSettings);
132
+
133
+ const mockFind = jest
134
+ .spyOn(ctx.client.articleRevisions, "find")
135
+ .mockImplementation(() => null);
136
+
137
+ expect(async () => {
138
+ await TagHandler.update(ctx);
139
+ }).rejects.toThrow(`Missing revision #${revision.id}`);
140
+
141
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
142
+ });
143
+ });
@@ -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
+ });