@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,110 @@
1
+ import DeletesHandler from "../../../../handlers/events/DeletesHandler";
2
+ import Events from "../../../../cloud/Events";
3
+ import Factory from "../../../../../test/factory";
4
+ import { testConfig } from "../../../../../test//handlersHelper";
5
+
6
+ function buildCtx(event, updateSettings) {
7
+ return {
8
+ client: {
9
+ events: new Events(testConfig, "token"),
10
+ },
11
+ params: { parent_id: event.id },
12
+ resourceParams: {
13
+ deleteAction: updateSettings,
14
+ },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ describe("Event delete", () => {
20
+ test("create successful", async () => {
21
+ const event = Factory.build("event");
22
+ const updateSettings = {
23
+ redirect: "301",
24
+ destination: "/test-dest",
25
+ };
26
+ const ctx = buildCtx(event, updateSettings);
27
+
28
+ const mockFind = jest
29
+ .spyOn(ctx.client.events, "find")
30
+ .mockImplementation(() => event);
31
+
32
+ const mockDelete = jest
33
+ .spyOn(ctx.client.events, "delete")
34
+ .mockImplementation(() => ({ event, errors: null }));
35
+
36
+ const result = await DeletesHandler.create(ctx);
37
+
38
+ expect(mockFind).toHaveBeenCalledWith(event.id, "en");
39
+ expect(mockDelete).toHaveBeenCalledWith(event.id, "en", {
40
+ url: `/${event.slug}`,
41
+ destination: updateSettings.destination,
42
+ httpResponseCode: 301,
43
+ note: "Created via event deletion process",
44
+ });
45
+
46
+ expect(result).toEqual({
47
+ redirect: "/en/events",
48
+ });
49
+ });
50
+
51
+ test("create failed due to redirect create", async () => {
52
+ const event = Factory.build("event");
53
+ const updateSettings = {
54
+ redirect: "410",
55
+ destination: "/test-dest",
56
+ };
57
+ const ctx = buildCtx(event, updateSettings);
58
+
59
+ const mockFind = jest
60
+ .spyOn(ctx.client.events, "find")
61
+ .mockImplementation(() => event);
62
+
63
+ const mockDelete = jest
64
+ .spyOn(ctx.client.events, "delete")
65
+ .mockImplementation(() => ({
66
+ event: null,
67
+ errors: [
68
+ {
69
+ codes: [],
70
+ key: "generalError",
71
+ message: "url: has already been taken",
72
+ },
73
+ ],
74
+ }));
75
+
76
+ const result = await DeletesHandler.create(ctx);
77
+
78
+ expect(mockFind).toHaveBeenCalledWith(event.id, "en");
79
+ expect(mockDelete).toHaveBeenCalledWith(event.id, "en", {
80
+ url: `/${event.slug}`,
81
+ destination: "/",
82
+ httpResponseCode: 410,
83
+ note: "Created via event deletion process",
84
+ });
85
+
86
+ expect(result).toEqual({
87
+ assigns: {
88
+ deleteAction: { ...updateSettings, id: event.id },
89
+ errors: {
90
+ deleteAction: { redirect: "url: has already been taken" },
91
+ },
92
+ _translations: [],
93
+ },
94
+ });
95
+ });
96
+
97
+ test("create for non existing event", async () => {
98
+ const ctx = buildCtx({ id: "42" }, {});
99
+
100
+ const mockFind = jest
101
+ .spyOn(ctx.client.events, "find")
102
+ .mockImplementation(() => null);
103
+
104
+ expect(async () => {
105
+ await DeletesHandler.create(ctx);
106
+ }).rejects.toThrow("Missing event #42");
107
+
108
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
109
+ });
110
+ });
@@ -0,0 +1,54 @@
1
+ import DeletesHandler from "../../../../handlers/events/DeletesHandler";
2
+ import Events from "../../../../cloud/Events";
3
+ import Factory from "../../../../../test/factory";
4
+ import { testConfig } from "../../../../../test//handlersHelper";
5
+
6
+ function buildCtx(event) {
7
+ return {
8
+ client: {
9
+ events: new Events(testConfig, "token"),
10
+ },
11
+ params: { parent_id: event.id },
12
+ locale: "en",
13
+ };
14
+ }
15
+
16
+ describe("Event delete", () => {
17
+ test("create_form for existing event", async () => {
18
+ const event = Factory.build("event");
19
+ const ctx = buildCtx(event);
20
+
21
+ const mockFind = jest
22
+ .spyOn(ctx.client.events, "find")
23
+ .mockImplementation(() => event);
24
+
25
+ const result = await DeletesHandler.create_form(ctx);
26
+
27
+ expect(mockFind).toHaveBeenCalledWith(event.id, "en");
28
+
29
+ expect(result).toEqual({
30
+ assigns: {
31
+ deleteAction: {
32
+ id: event.id,
33
+ redirect: "",
34
+ },
35
+ errors: {},
36
+ _translations: [],
37
+ },
38
+ });
39
+ });
40
+
41
+ test("create_form for non existing event", async () => {
42
+ const ctx = buildCtx({ id: "42" });
43
+
44
+ const mockFind = jest
45
+ .spyOn(ctx.client.events, "find")
46
+ .mockImplementation(() => null);
47
+
48
+ expect(async () => {
49
+ await DeletesHandler.create_form(ctx);
50
+ }).rejects.toThrow("Missing event #42");
51
+
52
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
53
+ });
54
+ });
@@ -0,0 +1,152 @@
1
+ import EventsHandler from "../../../../handlers/events/EventsHandler";
2
+ import Events from "../../../../cloud/Events";
3
+ import Tags from "../../../../cloud/Tags";
4
+ import { testConfig } from "../../../../../test/handlersHelper";
5
+ import Factory from "../../../../../test/factory";
6
+
7
+ describe("Events Handler", () => {
8
+ function buildCtx(params) {
9
+ return {
10
+ client: {
11
+ events: new Events(testConfig, "token"),
12
+ tags: new Tags(testConfig, "token"),
13
+ },
14
+ resourceParams: {
15
+ event: params,
16
+ },
17
+ locale: "en",
18
+ };
19
+ }
20
+
21
+ test("create successfull", async () => {
22
+ const tag = Factory.build("tag");
23
+ const params = {
24
+ title: "event title",
25
+ slug: "url",
26
+ visibility: "public",
27
+ publish_at: "2024-10-10T06:40",
28
+ starts_at: "2024-10-10T06:50",
29
+ ends_at: "2024-10-10T06:59",
30
+ layout: "default",
31
+ meta_title: "Meta title",
32
+ meta_description: "Meta description",
33
+ meta_image: JSON.stringify({ id: 42 }),
34
+ username: "admin",
35
+ password: "admin123!@#",
36
+ tags: [tag.id],
37
+ };
38
+
39
+ const ctx = buildCtx(params);
40
+
41
+ const mockedCreate = jest
42
+ .spyOn(ctx.client.events, "create")
43
+ .mockImplementation(() => ({ event: {}, errors: null }));
44
+
45
+ const result = await EventsHandler.create(ctx);
46
+
47
+ expect(mockedCreate).toHaveBeenCalledWith(
48
+ {
49
+ title: params.title,
50
+ slug: params.slug,
51
+ visibility: params.visibility,
52
+ publishAt: "2024-10-10T03:40:00Z",
53
+ startsAt: "2024-10-10T03:50:00Z",
54
+ endsAt: "2024-10-10T03:59:00Z",
55
+ settings: {
56
+ layout: params.layout,
57
+ meta: {
58
+ title: params.meta_title,
59
+ description: params.meta_description,
60
+ image: JSON.parse(params.meta_image || "{}"),
61
+ },
62
+ credentials: {
63
+ user: params.username,
64
+ password: params.password,
65
+ },
66
+ },
67
+ widgets: [],
68
+ tags: params.tags,
69
+ categories: [],
70
+ },
71
+ "en",
72
+ "event"
73
+ );
74
+
75
+ expect(result).toEqual({
76
+ redirect: "/en/events",
77
+ });
78
+ });
79
+
80
+ test("create failed", async () => {
81
+ const tag = Factory.build("tag");
82
+ const params = {
83
+ title: "event title",
84
+ slug: "",
85
+ publish_at: "2024-10-10T06:40",
86
+ starts_at: "2024-10-10T06:50",
87
+ ends_at: "2024-10-10T06:59",
88
+ visibility: "public",
89
+ layout: "default",
90
+ meta_title: "Meta title",
91
+ meta_description: "Meta description",
92
+ meta_image: JSON.stringify({ id: 42 }),
93
+ username: "admin",
94
+ password: "admin123!@#",
95
+ tags: [tag.id],
96
+ };
97
+
98
+ const ctx = buildCtx(params);
99
+
100
+ const mockedTagsList = jest
101
+ .spyOn(ctx.client.tags, "all")
102
+ .mockImplementation(() => ({ list: [tag] }));
103
+
104
+ const mockedCreate = jest
105
+ .spyOn(ctx.client.events, "create")
106
+ .mockImplementation(() => ({
107
+ event: {},
108
+ errors: [{ key: "slug", message: "cannot be blank" }],
109
+ }));
110
+
111
+ const result = await EventsHandler.create(ctx);
112
+
113
+ expect(mockedTagsList).toHaveBeenCalledWith("en");
114
+ expect(mockedCreate).toHaveBeenCalledWith(
115
+ {
116
+ title: params.title,
117
+ slug: "",
118
+ visibility: params.visibility,
119
+ publishAt: "2024-10-10T03:40:00Z",
120
+ startsAt: "2024-10-10T03:50:00Z",
121
+ endsAt: "2024-10-10T03:59:00Z",
122
+ settings: {
123
+ layout: params.layout,
124
+ meta: {
125
+ title: params.meta_title,
126
+ description: params.meta_description,
127
+ image: JSON.parse(params.meta_image || "{}"),
128
+ },
129
+ credentials: {
130
+ user: params.username,
131
+ password: params.password,
132
+ },
133
+ },
134
+ widgets: [],
135
+ tags: params.tags,
136
+ categories: [],
137
+ },
138
+ "en",
139
+ "event"
140
+ );
141
+
142
+ expect(result).toEqual({
143
+ assigns: {
144
+ event: { ...params, meta_image: JSON.parse(params.meta_image) },
145
+ tags: [tag],
146
+ errors: { event: { slug: "cannot be blank" } },
147
+ visibilityOptions: ctx.client.events.visibilityOptions(),
148
+ _translations: [],
149
+ },
150
+ });
151
+ });
152
+ });
@@ -0,0 +1,41 @@
1
+ import EventsHandler from "../../../../handlers/events/EventsHandler";
2
+ import Events from "../../../../cloud/Events";
3
+ import Tags from "../../../../cloud/Tags";
4
+ import { testConfig } from "../../../../../test/handlersHelper";
5
+ import Factory from "../../../../../test/factory";
6
+
7
+ describe("Events Handler", () => {
8
+ function buildCtx() {
9
+ return {
10
+ client: {
11
+ events: new Events(testConfig, "token"),
12
+ tags: new Tags(testConfig, "token"),
13
+ },
14
+ query: { foo: "bar" },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ test("index", async () => {
20
+ const tags = [Factory.build("tag")];
21
+ const ctx = buildCtx();
22
+
23
+ const mockedTagList = jest
24
+ .spyOn(ctx.client.tags, "all")
25
+ .mockImplementation(() => ({ list: tags, pagination: null }));
26
+
27
+ const result = await EventsHandler.create_form(ctx);
28
+
29
+ expect(mockedTagList).toHaveBeenCalledWith("en");
30
+
31
+ expect(result).toEqual({
32
+ assigns: {
33
+ event: { ...ctx.client.events.defaults(), meta_image: {} },
34
+ tags: tags,
35
+ errors: {},
36
+ visibilityOptions: ctx.client.events.visibilityOptions(),
37
+ _translations: [],
38
+ },
39
+ });
40
+ });
41
+ });
@@ -0,0 +1,49 @@
1
+ import EventsHandler from "../../../../handlers/events/EventsHandler";
2
+ import Events from "../../../../cloud/Events";
3
+ import Tags from "../../../../cloud/Tags";
4
+ import { testConfig } from "../../../../../test/handlersHelper";
5
+ import Factory from "../../../../../test/factory";
6
+
7
+ describe("Events Handler", () => {
8
+ function buildCtx() {
9
+ return {
10
+ client: {
11
+ events: new Events(testConfig, "token"),
12
+ tags: new Tags(testConfig, "token"),
13
+ },
14
+ query: { foo: "bar" },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ test("index", async () => {
20
+ const event = Factory.build("event");
21
+ const pagination = Factory.build("pagination");
22
+ const tags = [Factory.build("tag")];
23
+ const ctx = buildCtx();
24
+
25
+ const mockedEventList = jest
26
+ .spyOn(ctx.client.events, "list")
27
+ .mockImplementation(() => ({ list: [event], pagination }));
28
+
29
+ const mockedTagList = jest
30
+ .spyOn(ctx.client.tags, "all")
31
+ .mockImplementation(() => ({ list: tags, pagination: null }));
32
+
33
+ const result = await EventsHandler.index(ctx);
34
+
35
+ expect(mockedEventList).toHaveBeenCalledWith({ foo: "bar" }, "en");
36
+ expect(mockedTagList).toHaveBeenCalledWith("en");
37
+
38
+ expect(result).toEqual({
39
+ assigns: {
40
+ items: {
41
+ list: [event],
42
+ pagination: pagination,
43
+ },
44
+ tags: tags,
45
+ visibilityOptions: ctx.client.events.visibilityOptions(),
46
+ },
47
+ });
48
+ });
49
+ });
@@ -0,0 +1,105 @@
1
+ import EventsHandler from "../../../../handlers/events/EventsHandler";
2
+ import Events from "../../../../cloud/Events";
3
+ import EventChanges from "../../../../cloud/EventChanges";
4
+ import EventRevisions from "../../../../cloud/EventRevisions";
5
+ import { testConfig } from "../../../../../test/handlersHelper";
6
+ import Factory from "../../../../../test/factory";
7
+
8
+ describe("Events Handler", () => {
9
+ function buildCtx(event) {
10
+ return {
11
+ client: {
12
+ events: new Events(testConfig, "token"),
13
+ eventChanges: new EventChanges(testConfig, "token"),
14
+ eventRevisions: new EventRevisions(testConfig, "token"),
15
+ },
16
+ params: { id: event.id },
17
+ locale: "en",
18
+ locales: {
19
+ en: {
20
+ name: "English",
21
+ code: "en-gb",
22
+ flag: "/static/_assets/flags/gb.svg",
23
+ },
24
+ bg: {
25
+ name: "Bulgarian",
26
+ code: "bg",
27
+ flag: "/static/_assets/flags/bg.svg",
28
+ },
29
+ de: {
30
+ name: "German",
31
+ code: "de",
32
+ flag: "/static/_assets/flags/de.svg",
33
+ },
34
+ },
35
+ };
36
+ }
37
+
38
+ test("show for existing event", async () => {
39
+ const event = Factory.build("event", {
40
+ translations: {
41
+ de: {
42
+ id: 42,
43
+ },
44
+ bg: {
45
+ id: 69,
46
+ },
47
+ },
48
+ });
49
+ const revision = Factory.build("event_revision", {
50
+ originalId: event.id,
51
+ });
52
+ const change = Factory.build("event_change");
53
+ const ctx = buildCtx(event);
54
+
55
+ const mockedeventFind = jest
56
+ .spyOn(ctx.client.events, "find")
57
+ .mockImplementation(() => event);
58
+
59
+ const mockedEventRevisions = jest
60
+ .spyOn(ctx.client.eventRevisions, "all")
61
+ .mockImplementation(() => ({ list: [revision] }));
62
+
63
+ const mockedEventChanges = jest
64
+ .spyOn(ctx.client.eventChanges, "all")
65
+ .mockImplementation(() => ({ list: [change] }));
66
+
67
+ const result = await EventsHandler.show(ctx);
68
+
69
+ expect(mockedeventFind).toHaveBeenCalledWith(event.id, "en");
70
+ expect(mockedEventRevisions).toHaveBeenCalledWith(event.id, "en");
71
+ expect(mockedEventChanges).toHaveBeenCalledWith(event.id, "en");
72
+
73
+ expect(result).toEqual({
74
+ assigns: {
75
+ event,
76
+ revisions: [revision],
77
+ changes: [change],
78
+ _translations: [
79
+ {
80
+ locale: "bg",
81
+ path: "/bg/events/69",
82
+ },
83
+ {
84
+ locale: "de",
85
+ path: "/de/events/42",
86
+ },
87
+ ],
88
+ },
89
+ });
90
+ });
91
+
92
+ test("show for non existing event", async () => {
93
+ const ctx = buildCtx({ id: "42" });
94
+
95
+ const mockedeventFind = jest
96
+ .spyOn(ctx.client.events, "find")
97
+ .mockImplementation(() => null);
98
+
99
+ expect(async () => {
100
+ await EventsHandler.show(ctx);
101
+ }).rejects.toThrow("Missing event #42");
102
+
103
+ expect(mockedeventFind).toHaveBeenCalledWith("42", "en");
104
+ });
105
+ });
@@ -0,0 +1,155 @@
1
+ import URLsHandler from "../../../../handlers/events/URLsHandler";
2
+ import Events from "../../../../cloud/Events";
3
+ import Factory from "../../../../../test/factory";
4
+ import { testConfig } from "../../../../../test/handlersHelper";
5
+
6
+ function buildCtx(event, updateSettings) {
7
+ return {
8
+ client: {
9
+ events: new Events(testConfig, "token"),
10
+ },
11
+ params: { parent_id: event.id },
12
+ resourceParams: {
13
+ change: updateSettings,
14
+ },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ describe("Event change url", () => {
20
+ test("create successful", async () => {
21
+ const event = Factory.build("event");
22
+ const updateSettings = {
23
+ slug: "new-slug",
24
+ redirect: "1",
25
+ };
26
+ const ctx = buildCtx(event, updateSettings);
27
+
28
+ const mockFind = jest
29
+ .spyOn(ctx.client.events, "find")
30
+ .mockImplementation(() => event);
31
+
32
+ const mockChange = jest
33
+ .spyOn(ctx.client.events, "updateSlug")
34
+ .mockImplementation(() => ({ event, errors: null }));
35
+
36
+ const result = await URLsHandler.create(ctx);
37
+
38
+ expect(mockFind).toHaveBeenCalledWith(event.id, "en");
39
+ expect(mockChange).toHaveBeenCalledWith(
40
+ event.id,
41
+ updateSettings.slug,
42
+ "en",
43
+ {
44
+ url: `/${event.slug}`,
45
+ destination: updateSettings.slug,
46
+ httpResponseCode: 301,
47
+ note: "Created with changed URL for a event",
48
+ }
49
+ );
50
+
51
+ expect(result).toEqual({
52
+ redirect: `/en/events/${event.id}`,
53
+ });
54
+ });
55
+
56
+ test("create failed due to slug error", async () => {
57
+ const event = Factory.build("event");
58
+ const updateSettings = {
59
+ slug: "new-slug",
60
+ };
61
+ const ctx = buildCtx(event, updateSettings);
62
+
63
+ const mockFind = jest
64
+ .spyOn(ctx.client.events, "find")
65
+ .mockImplementation(() => event);
66
+
67
+ const mockChange = jest
68
+ .spyOn(ctx.client.events, "updateSlug")
69
+ .mockImplementation(() => ({
70
+ event: null,
71
+ errors: [{ codes: [], key: "slug", message: "has already been taken" }],
72
+ }));
73
+
74
+ const result = await URLsHandler.create(ctx);
75
+
76
+ expect(mockFind).toHaveBeenCalledWith(event.id, "en");
77
+ expect(mockChange).toHaveBeenCalledWith(
78
+ event.id,
79
+ updateSettings.slug,
80
+ "en",
81
+ null
82
+ );
83
+
84
+ expect(result).toEqual({
85
+ assigns: {
86
+ change: { ...updateSettings, id: event.id },
87
+ errors: { change: { slug: "has already been taken" } },
88
+ _translations: [],
89
+ },
90
+ });
91
+ });
92
+
93
+ test("create failed due to redirect create", async () => {
94
+ const event = Factory.build("event");
95
+ const updateSettings = {
96
+ slug: "new-slug",
97
+ redirect: "1",
98
+ };
99
+ const ctx = buildCtx(event, updateSettings);
100
+
101
+ const mockFind = jest
102
+ .spyOn(ctx.client.events, "find")
103
+ .mockImplementation(() => event);
104
+
105
+ const mockChange = jest
106
+ .spyOn(ctx.client.events, "updateSlug")
107
+ .mockImplementation(() => ({
108
+ event: null,
109
+ errors: [
110
+ {
111
+ codes: [],
112
+ key: "generalError",
113
+ message: "url: has already been taken",
114
+ },
115
+ ],
116
+ }));
117
+
118
+ const result = await URLsHandler.create(ctx);
119
+
120
+ expect(mockFind).toHaveBeenCalledWith(event.id, "en");
121
+ expect(mockChange).toHaveBeenCalledWith(
122
+ event.id,
123
+ updateSettings.slug,
124
+ "en",
125
+ {
126
+ url: `/${event.slug}`,
127
+ destination: updateSettings.slug,
128
+ httpResponseCode: 301,
129
+ note: "Created with changed URL for a event",
130
+ }
131
+ );
132
+
133
+ expect(result).toEqual({
134
+ assigns: {
135
+ change: { ...updateSettings, id: event.id },
136
+ errors: { change: { redirect: "url: has already been taken" } },
137
+ _translations: [],
138
+ },
139
+ });
140
+ });
141
+
142
+ test("create for non existing event", async () => {
143
+ const ctx = buildCtx({ id: "42" }, {});
144
+
145
+ const mockFind = jest
146
+ .spyOn(ctx.client.events, "find")
147
+ .mockImplementation(() => null);
148
+
149
+ expect(async () => {
150
+ await URLsHandler.create(ctx);
151
+ }).rejects.toThrow("Cannot find event with id 42");
152
+
153
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
154
+ });
155
+ });