@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.
Files changed (170) hide show
  1. package/package.json +1 -1
  2. package/src/Adapter.js +4 -4
  3. package/src/HonoAdapter.js +13 -19
  4. package/src/cloud/Articles.js +9 -5
  5. package/src/cloud/EventChanges.js +15 -0
  6. package/src/cloud/EventRevisions.js +149 -0
  7. package/src/cloud/Events.js +139 -0
  8. package/src/cloud/Pages.js +9 -5
  9. package/src/cloud/documents/common.js +10 -0
  10. package/src/cloud/documents/eventsDocuments.js +254 -0
  11. package/src/handlers/article_revisions/ArticleRevisionsHandler.js +4 -4
  12. package/src/handlers/article_revisions/CodeHandler.js +2 -2
  13. package/src/handlers/article_revisions/GeneralHandler.js +2 -2
  14. package/src/handlers/article_revisions/LocksHandler.js +2 -2
  15. package/src/handlers/article_revisions/MetaHandler.js +2 -2
  16. package/src/handlers/article_revisions/PublishesHandler.js +2 -2
  17. package/src/handlers/article_revisions/RevertsHandler.js +2 -2
  18. package/src/handlers/article_revisions/TagHandler.js +2 -2
  19. package/src/handlers/article_revisions/UnlocksHandler.js +2 -2
  20. package/src/handlers/article_revisions/VisualHandler.js +2 -2
  21. package/src/handlers/articles/ArticlesHandler.js +20 -16
  22. package/src/handlers/articles/ClonesHandler.js +5 -3
  23. package/src/handlers/articles/DeletesHandler.js +5 -5
  24. package/src/handlers/articles/TranslationsHandler.js +25 -22
  25. package/src/handlers/articles/URLsHandler.js +6 -6
  26. package/src/handlers/event_revisions/CodeHandler.js +86 -0
  27. package/src/handlers/event_revisions/EventRevisionsHandler.js +47 -0
  28. package/src/handlers/event_revisions/GeneralHandler.js +94 -0
  29. package/src/handlers/event_revisions/LocksHandler.js +51 -0
  30. package/src/handlers/event_revisions/MetaHandler.js +86 -0
  31. package/src/handlers/event_revisions/PublishesHandler.js +84 -0
  32. package/src/handlers/event_revisions/RevertsHandler.js +26 -0
  33. package/src/handlers/event_revisions/TagHandler.js +85 -0
  34. package/src/handlers/event_revisions/UnlocksHandler.js +22 -0
  35. package/src/handlers/event_revisions/VisualHandler.js +80 -0
  36. package/src/handlers/event_revisions/WidgetHandler.js +41 -0
  37. package/src/handlers/events/ClonesHandler.js +19 -0
  38. package/src/handlers/events/DeletesHandler.js +68 -0
  39. package/src/handlers/events/EventsHandler.js +125 -0
  40. package/src/handlers/events/TranslationsHandler.js +107 -0
  41. package/src/handlers/events/URLsHandler.js +71 -0
  42. package/src/handlers/page_revisions/CodeHandler.js +2 -2
  43. package/src/handlers/page_revisions/GeneralHandler.js +2 -2
  44. package/src/handlers/page_revisions/LocksHandler.js +2 -2
  45. package/src/handlers/page_revisions/MetaHandler.js +2 -2
  46. package/src/handlers/page_revisions/PageRevisionsHandler.js +4 -4
  47. package/src/handlers/page_revisions/PublishesHandler.js +2 -2
  48. package/src/handlers/page_revisions/RevertsHandler.js +2 -2
  49. package/src/handlers/page_revisions/TagHandler.js +2 -2
  50. package/src/handlers/page_revisions/UnlocksHandler.js +2 -2
  51. package/src/handlers/page_revisions/VisualHandler.js +2 -2
  52. package/src/handlers/pages/ClonesHandler.js +5 -3
  53. package/src/handlers/pages/DeletesHandler.js +5 -5
  54. package/src/handlers/pages/PagesHandler.js +21 -16
  55. package/src/handlers/pages/TranslationsHandler.js +24 -22
  56. package/src/handlers/pages/URLsHandler.js +6 -6
  57. package/src/index.js +24 -2
  58. package/src/routeArticlesModule.js +142 -0
  59. package/src/routeCollection.js +2 -2
  60. package/src/routeEventsModule.js +142 -0
  61. package/src/routeMember.js +2 -2
  62. package/src/routeNestedCollection.js +8 -2
  63. package/src/routeNestedMember.js +8 -2
  64. package/src/routePagesModule.js +155 -0
  65. package/src/routeStandard.js +6 -4
  66. package/src/setupCloud.js +12 -0
  67. package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/create.test.js +84 -0
  68. package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/destroy.test.js +59 -0
  69. package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +56 -0
  70. package/src/tests/handlers/article_revisions/CodesHandler.test/update.test.js +148 -0
  71. package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +65 -0
  72. package/src/tests/handlers/article_revisions/GeneralHandler.test/update.test.js +159 -0
  73. package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +57 -0
  74. package/src/tests/handlers/article_revisions/MetaHandler.test/update.test.js +152 -0
  75. package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +142 -0
  76. package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +47 -0
  77. package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +89 -0
  78. package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +69 -0
  79. package/src/tests/handlers/article_revisions/TagHandler.test/update.test.js +152 -0
  80. package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
  81. package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +140 -0
  82. package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +46 -0
  83. package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +103 -0
  84. package/src/tests/handlers/articles/ArticlesHandler.test/create.test.js +11 -5
  85. package/src/tests/handlers/articles/ArticlesHandler.test/create_form.test.js +5 -2
  86. package/src/tests/handlers/articles/ArticlesHandler.test/index.test.js +9 -2
  87. package/src/tests/handlers/articles/ArticlesHandler.test/show.test.js +9 -3
  88. package/src/tests/handlers/articles/{ConesHandler.test → ClonesHandler.test}/create.test.js +8 -2
  89. package/src/tests/handlers/articles/DeletesHandler.test/create.test.js +12 -3
  90. package/src/tests/handlers/articles/DeletesHandler.test/create_form.test.js +8 -2
  91. package/src/tests/handlers/articles/URLsHandler.test/create.test.js +18 -6
  92. package/src/tests/handlers/articles/URLsHandler.test/create_form.test.js +8 -2
  93. package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +56 -0
  94. package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +152 -0
  95. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/create.test.js +84 -0
  96. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/destroy.test.js +59 -0
  97. package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +69 -0
  98. package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +167 -0
  99. package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +57 -0
  100. package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +156 -0
  101. package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +142 -0
  102. package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +47 -0
  103. package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +89 -0
  104. package/src/tests/handlers/event_revisions/TagHandler.test/edit_form.test.js +69 -0
  105. package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +156 -0
  106. package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
  107. package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +144 -0
  108. package/src/tests/handlers/event_revisions/WidgetHandler.test/show.test.js +46 -0
  109. package/src/tests/handlers/event_revisions/WidgetHandler.test/update.test.js +103 -0
  110. package/src/tests/handlers/events/ClonesHandler.test/create.test.js +60 -0
  111. package/src/tests/handlers/events/DeletesHandler.test/create.test.js +119 -0
  112. package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +60 -0
  113. package/src/tests/handlers/events/EventsHandler.test/create.test.js +158 -0
  114. package/src/tests/handlers/events/EventsHandler.test/create_form.test.js +44 -0
  115. package/src/tests/handlers/events/EventsHandler.test/index.test.js +52 -0
  116. package/src/tests/handlers/events/EventsHandler.test/show.test.js +111 -0
  117. package/src/tests/handlers/events/URLsHandler.test/create.test.js +167 -0
  118. package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +57 -0
  119. package/src/tests/handlers/page_revisions/CodesHandler.test/update.test.js +12 -3
  120. package/src/tests/handlers/page_revisions/GeneralHandler.test/update.test.js +12 -3
  121. package/src/tests/handlers/page_revisions/MetaHandler.test/update.test.js +12 -3
  122. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/create.test.js +12 -3
  123. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/destroy.test.js +8 -2
  124. package/src/tests/handlers/page_revisions/PublishesHandler.test/create.test.js +8 -2
  125. package/src/tests/handlers/page_revisions/RevertsHandler.test/create.test.js +12 -3
  126. package/src/tests/handlers/page_revisions/TagHandler.test/update.test.js +8 -2
  127. package/src/tests/handlers/page_revisions/VisualHandler.test.test/update.test.js +12 -3
  128. package/src/tests/handlers/pages/ConesHandler.test/create.test.js +8 -2
  129. package/src/tests/handlers/pages/DeletesHandler.test/create.test.js +12 -3
  130. package/src/tests/handlers/pages/DeletesHandler.test/create_form.test.js +8 -2
  131. package/src/tests/handlers/pages/PagesHandler.test/create.test.js +11 -5
  132. package/src/tests/handlers/pages/PagesHandler.test/create_form.test.js +1 -1
  133. package/src/tests/handlers/pages/PagesHandler.test/index.test.js +5 -2
  134. package/src/tests/handlers/pages/PagesHandler.test/show.test.js +9 -3
  135. package/src/tests/handlers/pages/URLsHandler.test/create.test.js +16 -4
  136. package/src/tests/handlers/pages/URLsHandler.test/create_form.test.js +8 -2
  137. package/src/tests/routeCollection.test.js +118 -105
  138. package/src/tests/routeMember.test.js +60 -54
  139. package/src/tests/routeNestedCollection.test.js +132 -126
  140. package/src/tests/routeNestedMember.test.js +60 -54
  141. package/src/views/articles/_form.ejs +17 -17
  142. package/src/views/articles/show.ejs +9 -9
  143. package/src/views/articles/translations/_form.ejs +3 -3
  144. package/src/views/articles/translations/create_form.ejs +7 -9
  145. package/src/views/event_revisions/_nav.ejs +40 -0
  146. package/src/views/event_revisions/codes/edit_form.ejs +39 -0
  147. package/src/views/event_revisions/general/edit_form.ejs +72 -0
  148. package/src/views/event_revisions/locks/create_form.ejs +35 -0
  149. package/src/views/event_revisions/meta/edit_form.ejs +41 -0
  150. package/src/views/event_revisions/publishes/_form.ejs +57 -0
  151. package/src/views/event_revisions/publishes/create_form.ejs +10 -0
  152. package/src/views/event_revisions/tags/edit_form.ejs +64 -0
  153. package/src/views/event_revisions/visuals/edit_form.ejs +42 -0
  154. package/src/views/events/_form.ejs +88 -0
  155. package/src/views/events/create_form.ejs +9 -0
  156. package/src/views/events/deletes/create_form.ejs +55 -0
  157. package/src/views/events/edit_form.ejs +3 -0
  158. package/src/views/events/index.ejs +161 -0
  159. package/src/views/events/show.ejs +281 -0
  160. package/src/views/events/translations/_form.ejs +79 -0
  161. package/src/views/events/translations/create_form.ejs +10 -0
  162. package/src/views/events/urls/create_form.ejs +31 -0
  163. package/src/views/pages/_form.ejs +16 -16
  164. package/src/views/pages/create_form.ejs +1 -1
  165. package/src/views/pages/show.ejs +9 -9
  166. package/src/views/pages/translations/_form.ejs +3 -3
  167. package/src/views/pages/translations/create_form.ejs +7 -9
  168. package/test/factory.js +42 -3
  169. package/src/routeArticles.js +0 -65
  170. package/src/routePages.js +0 -55
@@ -0,0 +1,155 @@
1
+ import routeCollection from "./routeCollection";
2
+ import routeNestedCollection from "./routeNestedCollection";
3
+ import routeNestedMember from "./routeNestedMember";
4
+ import TranslationsHandler from "./handlers/pages/TranslationsHandler";
5
+ import PageRevisionsHandler from "./handlers/page_revisions/PageRevisionsHandler";
6
+ import GeneralHandler from "./handlers/page_revisions/GeneralHandler";
7
+ import VisualHandler from "./handlers/page_revisions/VisualHandler";
8
+ import CodeHandler from "./handlers/page_revisions/CodeHandler";
9
+ import MetaHandler from "./handlers/page_revisions/MetaHandler";
10
+ import TagHandler from "./handlers/page_revisions/TagHandler";
11
+ import LocksHandler from "./handlers/page_revisions/LocksHandler";
12
+ import UnlocksHandler from "./handlers/page_revisions/UnlocksHandler";
13
+ import ClonesHandler from "./handlers/pages/ClonesHandler";
14
+ import URLsHandler from "./handlers/pages/URLsHandler";
15
+ import DeletesHandler from "./handlers/pages/DeletesHandler";
16
+ import RevertsHandler from "./handlers/page_revisions/RevertsHandler";
17
+ import PublishesHandler from "./handlers/page_revisions/PublishesHandler";
18
+ import WidgetHandler from "./handlers/page_revisions/WidgetHandler";
19
+ import PagesHandler from "./handlers/pages/PagesHandler";
20
+
21
+ function routePagesModule(
22
+ adapter,
23
+ pageType = "page",
24
+ pageTypePlural = "pages"
25
+ ) {
26
+ const baseResource = pageTypePlural;
27
+ const revisionsBaseResource = `${pageType}_revisions`;
28
+
29
+ const handlerOpts = {
30
+ pageType,
31
+ pageTypePlural,
32
+ };
33
+
34
+ routeCollection(adapter, pageTypePlural, PagesHandler, handlerOpts);
35
+ routeNestedCollection(
36
+ adapter,
37
+ baseResource,
38
+ "translations",
39
+ TranslationsHandler,
40
+ handlerOpts
41
+ );
42
+
43
+ routeNestedCollection(
44
+ adapter,
45
+ baseResource,
46
+ revisionsBaseResource,
47
+ PageRevisionsHandler,
48
+ handlerOpts
49
+ );
50
+
51
+ routeNestedMember(
52
+ adapter,
53
+ revisionsBaseResource,
54
+ "general",
55
+ GeneralHandler,
56
+ handlerOpts
57
+ );
58
+
59
+ routeNestedMember(
60
+ adapter,
61
+ revisionsBaseResource,
62
+ "visuals",
63
+ VisualHandler,
64
+ handlerOpts
65
+ );
66
+
67
+ routeNestedMember(
68
+ adapter,
69
+ revisionsBaseResource,
70
+ "codes",
71
+ CodeHandler,
72
+ handlerOpts
73
+ );
74
+
75
+ routeNestedMember(
76
+ adapter,
77
+ revisionsBaseResource,
78
+ "meta",
79
+ MetaHandler,
80
+ handlerOpts
81
+ );
82
+
83
+ routeNestedMember(
84
+ adapter,
85
+ revisionsBaseResource,
86
+ "tags",
87
+ TagHandler,
88
+ handlerOpts
89
+ );
90
+
91
+ routeNestedCollection(
92
+ adapter,
93
+ revisionsBaseResource,
94
+ "locks",
95
+ LocksHandler,
96
+ handlerOpts
97
+ );
98
+
99
+ routeNestedCollection(
100
+ adapter,
101
+ revisionsBaseResource,
102
+ "unlocks",
103
+ UnlocksHandler
104
+ );
105
+
106
+ routeNestedCollection(
107
+ adapter,
108
+ baseResource,
109
+ "clones",
110
+ ClonesHandler,
111
+ handlerOpts
112
+ );
113
+
114
+ routeNestedCollection(
115
+ adapter,
116
+ baseResource,
117
+ "urls",
118
+ URLsHandler,
119
+ handlerOpts
120
+ );
121
+
122
+ routeNestedCollection(
123
+ adapter,
124
+ baseResource,
125
+ "deletes",
126
+ DeletesHandler,
127
+ handlerOpts
128
+ );
129
+
130
+ routeNestedCollection(
131
+ adapter,
132
+ baseResource,
133
+ `${pageType}_changes/reverts`,
134
+ RevertsHandler,
135
+ handlerOpts
136
+ );
137
+
138
+ routeNestedCollection(
139
+ adapter,
140
+ revisionsBaseResource,
141
+ "publishes",
142
+ PublishesHandler,
143
+ handlerOpts
144
+ );
145
+
146
+ routeNestedMember(
147
+ adapter,
148
+ `api/${revisionsBaseResource}`,
149
+ "widgets",
150
+ WidgetHandler,
151
+ handlerOpts
152
+ );
153
+ }
154
+
155
+ export default routePagesModule;
@@ -1,7 +1,8 @@
1
1
  import routeCollection from "./routeCollection";
2
2
  import routeSettings from "./routeSettings";
3
- import routePages from "./routePages";
4
- import routeArticles from "./routeArticles";
3
+ import routePagesModule from "./routePagesModule";
4
+ import routeArticlesModule from "./routeArticlesModule";
5
+ import routeEventsModule from "./routeEventsModule";
5
6
  import RedirectsHandler from "./handlers/RedirectsHandler";
6
7
  import TagsHandler from "./handlers/TagsHandler";
7
8
 
@@ -9,8 +10,9 @@ function routeStandard(adapter) {
9
10
  routeCollection(adapter, "redirects", RedirectsHandler);
10
11
  routeCollection(adapter, "tags", TagsHandler);
11
12
  routeSettings(adapter);
12
- routePages(adapter);
13
- routeArticles(adapter);
13
+ routePagesModule(adapter);
14
+ routeArticlesModule(adapter);
15
+ routeEventsModule(adapter);
14
16
  }
15
17
 
16
18
  export default routeStandard;
package/src/setupCloud.js CHANGED
@@ -7,6 +7,9 @@ import PageChanges from "./cloud/PageChanges";
7
7
  import Articles from "./cloud/Articles";
8
8
  import ArticleRevisions from "./cloud/ArticleRevisions";
9
9
  import ArticleChanges from "./cloud/ArticleChanges";
10
+ import Events from "./cloud/Events";
11
+ import EventRevisions from "./cloud/EventRevisions";
12
+ import EventChanges from "./cloud/EventChanges";
10
13
 
11
14
  function setupCloud(ctx, getConfig) {
12
15
  if (!ctx?.authentication?.token) return;
@@ -31,6 +34,15 @@ function setupCloud(ctx, getConfig) {
31
34
  getConfig,
32
35
  ctx.authentication.token
33
36
  );
37
+ ctx.client.events = new Events(getConfig, ctx.authentication.token);
38
+ ctx.client.eventRevisions = new EventRevisions(
39
+ getConfig,
40
+ ctx.authentication.token
41
+ );
42
+ ctx.client.eventChanges = new EventChanges(
43
+ getConfig,
44
+ ctx.authentication.token
45
+ );
34
46
  }
35
47
 
36
48
  export default setupCloud;
@@ -0,0 +1,84 @@
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
+ articleType: "article",
31
+ articleTypePlural: "articles",
32
+ });
33
+
34
+ expect(mockCreate).toHaveBeenCalledWith(revision.originalId, "en");
35
+
36
+ expect(result).toEqual({
37
+ redirect: `/en/articles/${revision.originalId}`,
38
+ });
39
+ });
40
+
41
+ test("create failed with errors", async () => {
42
+ const ctx = buildCtx(1);
43
+ const errors = [{ key: "generalError", message: "something went wrong" }];
44
+
45
+ const mockCreate = jest
46
+ .spyOn(ctx.client.articleRevisions, "create")
47
+ .mockImplementation(() => ({
48
+ revision: null,
49
+ errors,
50
+ articleErrors: null,
51
+ }));
52
+
53
+ expect(async () => {
54
+ await ArticleRevisionsHandler.create(ctx, {
55
+ articleType: "article",
56
+ articleTypePlural: "articles",
57
+ });
58
+ }).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
59
+
60
+ expect(mockCreate).toHaveBeenCalledWith(1, "en");
61
+ });
62
+
63
+ test("create failed with article errors", async () => {
64
+ const ctx = buildCtx(1);
65
+ const errors = [{ key: "generalError", message: "something went wrong" }];
66
+
67
+ const mockCreate = jest
68
+ .spyOn(ctx.client.articleRevisions, "create")
69
+ .mockImplementation(() => ({
70
+ revision: null,
71
+ errors: null,
72
+ articleErrors: errors,
73
+ }));
74
+
75
+ expect(async () => {
76
+ await ArticleRevisionsHandler.create(ctx, {
77
+ articleType: "article",
78
+ articleTypePlural: "articles",
79
+ });
80
+ }).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
81
+
82
+ expect(mockCreate).toHaveBeenCalledWith(1, "en");
83
+ });
84
+ });
@@ -0,0 +1,59 @@
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
+ articleType: "article",
27
+ articleTypePlural: "articles",
28
+ });
29
+
30
+ expect(mockDelete).toHaveBeenCalledWith(1, "en");
31
+
32
+ expect(result).toEqual({
33
+ headers: {
34
+ "HX-Redirect": `/en/articles/${revision.originalId}`,
35
+ },
36
+ json: {},
37
+ });
38
+ });
39
+
40
+ test("destroy failed", async () => {
41
+ const ctx = buildCtx(1);
42
+ const errors = [{ key: "generalError", message: "something went wrong" }];
43
+
44
+ const mockDelete = jest
45
+ .spyOn(ctx.client.articleRevisions, "delete")
46
+ .mockImplementation(() => ({ revision: null, errors }));
47
+
48
+ expect(async () => {
49
+ await ArticleRevisionsHandler.destroy(ctx, {
50
+ articleType: "article",
51
+ articleTypePlural: "articles",
52
+ });
53
+ }).rejects.toThrow(
54
+ `Failed to delete revision#${1}: ${JSON.stringify(errors)}`
55
+ );
56
+
57
+ expect(mockDelete).toHaveBeenCalledWith(1, "en");
58
+ });
59
+ });
@@ -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,148 @@
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
+ articleType: "article",
43
+ articleTypePlural: "articles",
44
+ });
45
+
46
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
47
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
48
+ slug: revision.slug,
49
+ title: revision.title,
50
+ visibility: revision.visibility,
51
+ publishAt: revision.publishAt,
52
+ widgets: JSON.stringify(revision.widgets),
53
+ tags: revision.tags.map((t) => t.id),
54
+ categories: revision.categories.map((c) => c.id),
55
+ settings: JSON.stringify({
56
+ ...revision.settings,
57
+ codes: {
58
+ scripts: [{ type: "bla" }],
59
+ structured_data: { type: "article" },
60
+ },
61
+ }),
62
+ });
63
+
64
+ expect(result).toEqual({
65
+ redirect: `/en/article_revisions/${revision.id}/codes/edit`,
66
+ });
67
+ });
68
+
69
+ test("update failed", async () => {
70
+ const revision = Factory.build("article_revision");
71
+
72
+ const updateSettings = {
73
+ scripts: JSON.stringify([{ type: "bla" }]),
74
+ structured_data: JSON.stringify({ type: "article" }),
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 CodeHandler.update(ctx, {
91
+ articleType: "article",
92
+ articleTypePlural: "articles",
93
+ });
94
+
95
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
96
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
97
+ slug: revision.slug,
98
+ title: revision.title,
99
+ visibility: revision.visibility,
100
+ publishAt: revision.publishAt,
101
+ widgets: JSON.stringify(revision.widgets),
102
+ tags: revision.tags.map((t) => t.id),
103
+ categories: revision.categories.map((c) => c.id),
104
+ settings: JSON.stringify({
105
+ ...revision.settings,
106
+ codes: {
107
+ scripts: [{ type: "bla" }],
108
+ structured_data: { type: "article" },
109
+ },
110
+ }),
111
+ });
112
+
113
+ expect(result).toEqual({
114
+ assigns: {
115
+ code_settings: {
116
+ ...updateSettings,
117
+ id: revision.id,
118
+ originalId: revision.originalId,
119
+ },
120
+ errors: {
121
+ code_settings: { generalError: "some error" },
122
+ },
123
+ _translations: [],
124
+ },
125
+ });
126
+ });
127
+
128
+ test("update when a revision does not exist", async () => {
129
+ const revision = Factory.build("article_revision");
130
+
131
+ const updateSettings = {};
132
+
133
+ const ctx = buildCtx(revision, updateSettings);
134
+
135
+ const mockFind = jest
136
+ .spyOn(ctx.client.articleRevisions, "find")
137
+ .mockImplementation(() => null);
138
+
139
+ expect(async () => {
140
+ await CodeHandler.update(ctx, {
141
+ articleType: "article",
142
+ articleTypePlural: "articles",
143
+ });
144
+ }).rejects.toThrow(`Missing revision #${revision.id}`);
145
+
146
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
147
+ });
148
+ });
@@ -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
+ });