@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,56 @@
1
+ import CodeHandler from "../../../../handlers/article_revisions/CodeHandler";
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 code 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 CodeHandler.edit_form(ctx);
26
+
27
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
28
+
29
+ expect(result).toEqual({
30
+ assigns: {
31
+ code_settings: {
32
+ id: revision.id,
33
+ originalId: revision.originalId,
34
+ scripts: JSON.stringify([]),
35
+ structured_data: JSON.stringify({}),
36
+ },
37
+ errors: {},
38
+ _translations: [],
39
+ },
40
+ });
41
+ });
42
+
43
+ test("edit_form when a revision does not exist", async () => {
44
+ const ctx = buildCtx({ id: "42" });
45
+
46
+ const mockFind = jest
47
+ .spyOn(ctx.client.articleRevisions, "find")
48
+ .mockImplementation(() => null);
49
+
50
+ expect(async () => {
51
+ await CodeHandler.edit_form(ctx);
52
+ }).rejects.toThrow("Missing revision #42");
53
+
54
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
55
+ });
56
+ });
@@ -0,0 +1,139 @@
1
+ import CodeHandler from "../../../../handlers/article_revisions/CodeHandler";
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
+ code_settings: updateSettings,
14
+ },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ describe("Article revision code settings", () => {
20
+ test("update successful", async () => {
21
+ const revision = Factory.build("article_revision");
22
+
23
+ const updateSettings = {
24
+ scripts: JSON.stringify([{ type: "bla" }]),
25
+ structured_data: JSON.stringify({ type: "article" }),
26
+ };
27
+
28
+ const ctx = buildCtx(revision, updateSettings);
29
+
30
+ const mockFind = jest
31
+ .spyOn(ctx.client.articleRevisions, "find")
32
+ .mockImplementation(() => revision);
33
+
34
+ const mockUpdate = jest
35
+ .spyOn(ctx.client.articleRevisions, "update")
36
+ .mockImplementation(() => ({
37
+ revision: {},
38
+ errors: null,
39
+ }));
40
+
41
+ const result = await CodeHandler.update(ctx);
42
+
43
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
44
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
45
+ slug: revision.slug,
46
+ title: revision.title,
47
+ visibility: revision.visibility,
48
+ publishAt: revision.publishAt,
49
+ widgets: JSON.stringify(revision.widgets),
50
+ tags: revision.tags.map((t) => t.id),
51
+ categories: revision.categories.map((c) => c.id),
52
+ settings: JSON.stringify({
53
+ ...revision.settings,
54
+ codes: {
55
+ scripts: [{ type: "bla" }],
56
+ structured_data: { type: "article" },
57
+ },
58
+ }),
59
+ });
60
+
61
+ expect(result).toEqual({
62
+ redirect: `/en/article_revisions/${revision.id}/codes/edit`,
63
+ });
64
+ });
65
+
66
+ test("update failed", async () => {
67
+ const revision = Factory.build("article_revision");
68
+
69
+ const updateSettings = {
70
+ scripts: JSON.stringify([{ type: "bla" }]),
71
+ structured_data: JSON.stringify({ type: "article" }),
72
+ };
73
+
74
+ const ctx = buildCtx(revision, updateSettings);
75
+
76
+ const mockFind = jest
77
+ .spyOn(ctx.client.articleRevisions, "find")
78
+ .mockImplementation(() => revision);
79
+
80
+ const mockUpdate = jest
81
+ .spyOn(ctx.client.articleRevisions, "update")
82
+ .mockImplementation(() => ({
83
+ revision: {},
84
+ errors: [{ key: "generalError", message: "some error" }],
85
+ }));
86
+
87
+ const result = await CodeHandler.update(ctx);
88
+
89
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
90
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
91
+ slug: revision.slug,
92
+ title: revision.title,
93
+ visibility: revision.visibility,
94
+ publishAt: revision.publishAt,
95
+ widgets: JSON.stringify(revision.widgets),
96
+ tags: revision.tags.map((t) => t.id),
97
+ categories: revision.categories.map((c) => c.id),
98
+ settings: JSON.stringify({
99
+ ...revision.settings,
100
+ codes: {
101
+ scripts: [{ type: "bla" }],
102
+ structured_data: { type: "article" },
103
+ },
104
+ }),
105
+ });
106
+
107
+ expect(result).toEqual({
108
+ assigns: {
109
+ code_settings: {
110
+ ...updateSettings,
111
+ id: revision.id,
112
+ originalId: revision.originalId,
113
+ },
114
+ errors: {
115
+ code_settings: { generalError: "some error" },
116
+ },
117
+ _translations: [],
118
+ },
119
+ });
120
+ });
121
+
122
+ test("update when a revision does not exist", async () => {
123
+ const revision = Factory.build("article_revision");
124
+
125
+ const updateSettings = {};
126
+
127
+ const ctx = buildCtx(revision, updateSettings);
128
+
129
+ const mockFind = jest
130
+ .spyOn(ctx.client.articleRevisions, "find")
131
+ .mockImplementation(() => null);
132
+
133
+ expect(async () => {
134
+ await CodeHandler.update(ctx);
135
+ }).rejects.toThrow(`Missing revision #${revision.id}`);
136
+
137
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
138
+ });
139
+ });
@@ -0,0 +1,65 @@
1
+ import GeneralHandler from "../../../../handlers/article_revisions/GeneralHandler";
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("Article revision genereal settings", () => {
19
+ test("edit_form when a revision exists", async () => {
20
+ const revision = Factory.build("article_revision", {
21
+ publishAt: "2024-08-30T16:05:00Z",
22
+ });
23
+ const ctx = buildCtx(revision);
24
+
25
+ const mockFind = jest
26
+ .spyOn(ctx.client.articleRevisions, "find")
27
+ .mockImplementation(() => revision);
28
+
29
+ const result = await GeneralHandler.edit_form(ctx);
30
+
31
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
32
+
33
+ expect(result).toEqual({
34
+ assigns: {
35
+ general_settings: {
36
+ id: revision.id,
37
+ originalId: revision.originalId,
38
+ title: revision.title,
39
+ slug: revision.slug,
40
+ visibility: revision.visibility,
41
+ publish_at: "2024-08-30T19:05",
42
+ username: revision.settings?.credentials?.user || "",
43
+ password: revision.settings?.credentials?.password || "",
44
+ },
45
+ errors: {},
46
+ visibilityOptions: ctx.client.articles.visibilityOptions(),
47
+ _translations: [],
48
+ },
49
+ });
50
+ });
51
+
52
+ test("edit_form when a revision does not exist", async () => {
53
+ const ctx = buildCtx({ id: "42" });
54
+
55
+ const mockFind = jest
56
+ .spyOn(ctx.client.articleRevisions, "find")
57
+ .mockImplementation(() => null);
58
+
59
+ expect(async () => {
60
+ await GeneralHandler.edit_form(ctx);
61
+ }).rejects.toThrow("Missing revision #42");
62
+
63
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
64
+ });
65
+ });
@@ -0,0 +1,150 @@
1
+ import GeneralHandler from "../../../../handlers/article_revisions/GeneralHandler";
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, updateSettings) {
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
+ general_settings: updateSettings,
16
+ },
17
+ locale: "en",
18
+ };
19
+ }
20
+
21
+ describe("Article revision general settings", () => {
22
+ test("update successful", async () => {
23
+ const revision = Factory.build("article_revision");
24
+
25
+ const updateSettings = {
26
+ title: "Updated title",
27
+ slug: "/updated-url",
28
+ visibility: "protected",
29
+ publish_at: "2024-08-30T19:05",
30
+ username: "user",
31
+ password: "admin123!@#",
32
+ };
33
+
34
+ const ctx = buildCtx(revision, updateSettings);
35
+
36
+ const mockFind = jest
37
+ .spyOn(ctx.client.articleRevisions, "find")
38
+ .mockImplementation(() => revision);
39
+
40
+ const mockUpdate = jest
41
+ .spyOn(ctx.client.articleRevisions, "update")
42
+ .mockImplementation(() => ({
43
+ revision: {},
44
+ errors: null,
45
+ }));
46
+
47
+ const result = await GeneralHandler.update(ctx);
48
+
49
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
50
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
51
+ slug: updateSettings.slug,
52
+ title: updateSettings.title,
53
+ visibility: updateSettings.visibility,
54
+ publishAt: "2024-08-30T16:05:00Z",
55
+ widgets: JSON.stringify(revision.widgets),
56
+ tags: revision.tags.map((t) => t.id),
57
+ categories: revision.categories.map((c) => c.id),
58
+ settings: JSON.stringify({
59
+ ...revision.settings,
60
+ credentials: {
61
+ user: updateSettings.username,
62
+ password: updateSettings.password,
63
+ },
64
+ }),
65
+ });
66
+
67
+ expect(result).toEqual({
68
+ redirect: `/en/article_revisions/${revision.id}/general/edit`,
69
+ });
70
+ });
71
+
72
+ test("update failed", async () => {
73
+ const revision = Factory.build("article_revision");
74
+
75
+ const updateSettings = {
76
+ title: "Updated title",
77
+ slug: "/updated-url",
78
+ visibility: "protected",
79
+ publish_at: "2024-08-30T19:05",
80
+ username: "user",
81
+ password: "admin123!@#",
82
+ };
83
+
84
+ const ctx = buildCtx(revision, updateSettings);
85
+
86
+ const mockFind = jest
87
+ .spyOn(ctx.client.articleRevisions, "find")
88
+ .mockImplementation(() => revision);
89
+
90
+ const mockUpdate = jest
91
+ .spyOn(ctx.client.articleRevisions, "update")
92
+ .mockImplementation(() => ({
93
+ revision: {},
94
+ errors: [{ key: "slug", message: "has invalid format" }],
95
+ }));
96
+
97
+ const result = await GeneralHandler.update(ctx);
98
+
99
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
100
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
101
+ slug: updateSettings.slug,
102
+ title: updateSettings.title,
103
+ visibility: updateSettings.visibility,
104
+ publishAt: "2024-08-30T16:05:00Z",
105
+ widgets: JSON.stringify(revision.widgets),
106
+ tags: revision.tags.map((t) => t.id),
107
+ categories: revision.categories.map((c) => c.id),
108
+ settings: JSON.stringify({
109
+ ...revision.settings,
110
+ credentials: {
111
+ user: updateSettings.username,
112
+ password: updateSettings.password,
113
+ },
114
+ }),
115
+ });
116
+
117
+ expect(result).toEqual({
118
+ assigns: {
119
+ general_settings: {
120
+ ...updateSettings,
121
+ id: revision.id,
122
+ originalId: revision.originalId,
123
+ },
124
+ errors: {
125
+ general_settings: { slug: "has invalid format" },
126
+ },
127
+ visibilityOptions: ctx.client.articles.visibilityOptions(),
128
+ _translations: [],
129
+ },
130
+ });
131
+ });
132
+
133
+ test("update when a revision does not exist", async () => {
134
+ const revision = Factory.build("article_revision");
135
+
136
+ const updateSettings = {};
137
+
138
+ const ctx = buildCtx(revision, updateSettings);
139
+
140
+ const mockFind = jest
141
+ .spyOn(ctx.client.articleRevisions, "find")
142
+ .mockImplementation(() => null);
143
+
144
+ expect(async () => {
145
+ await GeneralHandler.update(ctx);
146
+ }).rejects.toThrow(`Missing revision #${revision.id}`);
147
+
148
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
149
+ });
150
+ });
@@ -0,0 +1,57 @@
1
+ import MetaHandler from "../../../../handlers/article_revisions/MetaHandler";
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 meta 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 MetaHandler.edit_form(ctx);
26
+
27
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
28
+
29
+ expect(result).toEqual({
30
+ assigns: {
31
+ meta_settings: {
32
+ id: revision.id,
33
+ originalId: revision.originalId,
34
+ title: revision.settings.meta.title,
35
+ description: revision.settings.meta.description,
36
+ image: revision.settings.meta.image,
37
+ },
38
+ errors: {},
39
+ _translations: [],
40
+ },
41
+ });
42
+ });
43
+
44
+ test("edit_form when a revision does not exist", async () => {
45
+ const ctx = buildCtx({ id: "42" });
46
+
47
+ const mockFind = jest
48
+ .spyOn(ctx.client.articleRevisions, "find")
49
+ .mockImplementation(() => null);
50
+
51
+ expect(async () => {
52
+ await MetaHandler.edit_form(ctx);
53
+ }).rejects.toThrow("Missing revision #42");
54
+
55
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
56
+ });
57
+ });
@@ -0,0 +1,143 @@
1
+ import MetaHandler from "../../../../handlers/article_revisions/MetaHandler";
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
+ meta_settings: updateSettings,
14
+ },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ describe("Article revision meta settings", () => {
20
+ test("update successful", async () => {
21
+ const revision = Factory.build("article_revision");
22
+
23
+ const updateSettings = {
24
+ title: "An open graph title",
25
+ description: "An open graph description",
26
+ image: JSON.stringify({ id: 42 }),
27
+ };
28
+
29
+ const ctx = buildCtx(revision, updateSettings);
30
+
31
+ const mockFind = jest
32
+ .spyOn(ctx.client.articleRevisions, "find")
33
+ .mockImplementation(() => revision);
34
+
35
+ const mockUpdate = jest
36
+ .spyOn(ctx.client.articleRevisions, "update")
37
+ .mockImplementation(() => ({
38
+ revision: {},
39
+ errors: null,
40
+ }));
41
+
42
+ const result = await MetaHandler.update(ctx);
43
+
44
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
45
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
46
+ slug: revision.slug,
47
+ title: revision.title,
48
+ visibility: revision.visibility,
49
+ publishAt: revision.publishAt,
50
+ widgets: JSON.stringify(revision.widgets),
51
+ tags: revision.tags.map((t) => t.id),
52
+ categories: revision.categories.map((c) => c.id),
53
+ settings: JSON.stringify({
54
+ ...revision.settings,
55
+ meta: {
56
+ title: updateSettings.title,
57
+ description: updateSettings.description,
58
+ image: { id: 42 },
59
+ },
60
+ }),
61
+ });
62
+
63
+ expect(result).toEqual({
64
+ redirect: `/en/article_revisions/${revision.id}/meta/edit`,
65
+ });
66
+ });
67
+
68
+ test("update failed", async () => {
69
+ const revision = Factory.build("article_revision");
70
+
71
+ const updateSettings = {
72
+ title: "An open graph title",
73
+ description: "An open graph description",
74
+ image: JSON.stringify({ id: 42 }),
75
+ };
76
+
77
+ const ctx = buildCtx(revision, updateSettings);
78
+
79
+ const mockFind = jest
80
+ .spyOn(ctx.client.articleRevisions, "find")
81
+ .mockImplementation(() => revision);
82
+
83
+ const mockUpdate = jest
84
+ .spyOn(ctx.client.articleRevisions, "update")
85
+ .mockImplementation(() => ({
86
+ revision: {},
87
+ errors: [{ key: "generalError", message: "some error" }],
88
+ }));
89
+
90
+ const result = await MetaHandler.update(ctx);
91
+
92
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
93
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
94
+ slug: revision.slug,
95
+ title: revision.title,
96
+ visibility: revision.visibility,
97
+ publishAt: revision.publishAt,
98
+ widgets: JSON.stringify(revision.widgets),
99
+ tags: revision.tags.map((t) => t.id),
100
+ categories: revision.categories.map((c) => c.id),
101
+ settings: JSON.stringify({
102
+ ...revision.settings,
103
+ meta: {
104
+ title: updateSettings.title,
105
+ description: updateSettings.description,
106
+ image: { id: 42 },
107
+ },
108
+ }),
109
+ });
110
+
111
+ expect(result).toEqual({
112
+ assigns: {
113
+ meta_settings: {
114
+ ...updateSettings,
115
+ id: revision.id,
116
+ originalId: revision.originalId,
117
+ },
118
+ errors: {
119
+ meta_settings: { generalError: "some error" },
120
+ },
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 MetaHandler.update(ctx);
139
+ }).rejects.toThrow(`Missing revision #${revision.id}`);
140
+
141
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
142
+ });
143
+ });
@@ -0,0 +1,75 @@
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(articleID) {
7
+ return {
8
+ client: {
9
+ articleRevisions: new ArticleRevisions(testConfig, "token"),
10
+ },
11
+ params: { parent_id: articleID },
12
+ locale: "en",
13
+ };
14
+ }
15
+
16
+ describe("Article revisions", () => {
17
+ test("create successful", async () => {
18
+ const revision = Factory.build("article_revision", { originalId: 1 });
19
+ const ctx = buildCtx(revision.originalId);
20
+
21
+ const mockCreate = jest
22
+ .spyOn(ctx.client.articleRevisions, "create")
23
+ .mockImplementation(() => ({
24
+ revision,
25
+ errors: null,
26
+ articleErrors: null,
27
+ }));
28
+
29
+ const result = await ArticleRevisionsHandler.create(ctx);
30
+
31
+ expect(mockCreate).toHaveBeenCalledWith(revision.originalId, "en");
32
+
33
+ expect(result).toEqual({
34
+ redirect: `/en/articles/${revision.originalId}`,
35
+ });
36
+ });
37
+
38
+ test("create failed with errors", async () => {
39
+ const ctx = buildCtx(1);
40
+ const errors = [{ key: "generalError", message: "something went wrong" }];
41
+
42
+ const mockCreate = jest
43
+ .spyOn(ctx.client.articleRevisions, "create")
44
+ .mockImplementation(() => ({
45
+ revision: null,
46
+ errors,
47
+ articleErrors: null,
48
+ }));
49
+
50
+ expect(async () => {
51
+ await ArticleRevisionsHandler.create(ctx);
52
+ }).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
53
+
54
+ expect(mockCreate).toHaveBeenCalledWith(1, "en");
55
+ });
56
+
57
+ test("create failed with article errors", async () => {
58
+ const ctx = buildCtx(1);
59
+ const errors = [{ key: "generalError", message: "something went wrong" }];
60
+
61
+ const mockCreate = jest
62
+ .spyOn(ctx.client.articleRevisions, "create")
63
+ .mockImplementation(() => ({
64
+ revision: null,
65
+ errors: null,
66
+ articleErrors: errors,
67
+ }));
68
+
69
+ expect(async () => {
70
+ await ArticleRevisionsHandler.create(ctx);
71
+ }).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
72
+
73
+ expect(mockCreate).toHaveBeenCalledWith(1, "en");
74
+ });
75
+ });