@raketa-cloud/admin 0.0.4 → 0.0.5

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 (33) hide show
  1. package/package.json +2 -2
  2. package/src/Adapter.js +61 -6
  3. package/src/HonoAdapter.js +191 -63
  4. package/src/RaketaContext.js +13 -0
  5. package/src/helpers/AuthHelper.js +44 -0
  6. package/src/helpers/FormBuilder.js +226 -0
  7. package/src/helpers/HTMLBuilder.js +38 -0
  8. package/src/helpers/Pagination.js +92 -0
  9. package/src/helpers/SortButton.js +102 -0
  10. package/src/helpers/form_for.js +6 -0
  11. package/src/helpers/pagination_helper.js +5 -0
  12. package/src/helpers/sort_button.js +5 -0
  13. package/src/index.js +6 -2
  14. package/src/{createResource.js → routeCollection.js} +13 -6
  15. package/src/routeMember.js +40 -0
  16. package/src/{createNestedResource.js → routeNestedCollection.js} +12 -5
  17. package/src/routeNestedMember.js +40 -0
  18. package/src/setGlobalConfig.js +5 -0
  19. package/src/setGlobalContext.js +5 -0
  20. package/src/setupAuthentication.js +99 -0
  21. package/src/styles/application.css +465 -3
  22. package/src/tests/Adapter.test.js +39 -0
  23. package/src/tests/HonoAdapter.test.js +1 -0
  24. package/src/tests/helpers/Pagination.test.js +65 -0
  25. package/src/tests/helpers/SortButton.test.js +85 -0
  26. package/src/tests/{createResource.test.js → routeCollection.test.js} +51 -16
  27. package/src/tests/routeMember.test.js +91 -0
  28. package/src/tests/{createNestedResource.test.js → routeNestedCollection.test.js} +36 -10
  29. package/src/tests/routeNestedMember.test.js +96 -0
  30. package/src/views/_auth/login.ejs +92 -0
  31. package/src/views/layouts/application.ejs +144 -19
  32. package/src/views/layouts/header.ejs +49 -0
  33. package/tailwind.config.js +32 -1
@@ -0,0 +1,65 @@
1
+ import Pagination from "../../helpers/Pagination";
2
+
3
+ function buildPagination({ currentPage, pagesCount }) {
4
+ return new Pagination(
5
+ {
6
+ currentPage: currentPage,
7
+ pagesCount: pagesCount,
8
+ },
9
+ {
10
+ path: "/example",
11
+ query: {
12
+ page: currentPage,
13
+ },
14
+ }
15
+ );
16
+ }
17
+
18
+ describe("Pagination", () => {
19
+ test("build for a single page", () => {
20
+ const pagination = buildPagination({ currentPage: 1, pagesCount: 1 });
21
+
22
+ const result = pagination.build();
23
+
24
+ expect(result).toEqual("");
25
+ });
26
+
27
+ test("build for the first page", () => {
28
+ const pagination = buildPagination({ currentPage: 1, pagesCount: 10 });
29
+
30
+ const result = pagination.build();
31
+
32
+ expect(result)
33
+ .toEqual(`<div class=\"pagination\"><div ><span class=\"btn-text is-inactive\">First</span>
34
+ <span class=\"btn-text is-inactive\">Previous</span>
35
+ <form action=\"/example\" method=\"GET\"><input type=\"number\" value=\"1\" /> of 10</form>
36
+ <a class=\"btn-text\" href=\"/example?page=2\">Next</a>
37
+ <a class=\"btn-text\" href=\"/example?page=10\">Last</a></div></div>`);
38
+ });
39
+
40
+ test("build for the last page", () => {
41
+ const pagination = buildPagination({ currentPage: 10, pagesCount: 10 });
42
+
43
+ const result = pagination.build();
44
+
45
+ expect(result)
46
+ .toEqual(`<div class=\"pagination\"><div ><a class=\"btn-text\" href=\"/example?page=1\">First</a>
47
+ <a class=\"btn-text\" href=\"/example?page=9\">Previous</a>
48
+ <form action=\"/example\" method=\"GET\"><input type=\"number\" value=\"10\" /> of 10</form>
49
+ <span class=\"btn-text is-inactive\">Next</span>
50
+ <span class=\"btn-text is-inactive\">Last</span></div></div>`);
51
+ });
52
+
53
+ test("build for the a middle page", () => {
54
+ const pagination = buildPagination({ currentPage: 5, pagesCount: 10 });
55
+
56
+ const result = pagination.build();
57
+
58
+ expect(result)
59
+ .toEqual(`<div class=\"pagination\"><div ><a class=\"btn-text\" href=\"/example?page=1\">First</a>
60
+ <a class=\"btn-text\" href=\"/example?page=4\">Previous</a>
61
+ <form action=\"/example\" method=\"GET\"><input type=\"number\" value=\"5\" /> of 10</form>
62
+ <a class=\"btn-text\" href=\"/example?page=6\">Next</a>
63
+ <a class=\"btn-text\" href=\"/example?page=10\">Last</a></div></div>`);
64
+ });
65
+ });
@@ -0,0 +1,85 @@
1
+ import SortButton from "../../helpers/SortButton";
2
+
3
+ describe("SortButton", () => {
4
+ test("build for inactive button without order parameters", () => {
5
+ const button = new SortButton("Sort Button", "url", {
6
+ path: "/example",
7
+ query: {
8
+ "f:keyword": "test",
9
+ },
10
+ });
11
+
12
+ const result = button.build();
13
+
14
+ expect(result)
15
+ .toEqual(`<a href=\"/example?f%3Akeyword=test&order_direction=ASC&order_by=url\" class=\"btn-sort\"><svg
16
+ xmlns=\"http://www.w3.org/2000/svg\"
17
+ viewBox=\"0 0 20 20\"
18
+ fill=\"currentColor\"
19
+ class=\"size-4\"
20
+ >
21
+ <path
22
+ fill-rule=\"evenodd\"
23
+ d=\"M2.24 6.8a.75.75 0 0 0 1.06-.04l1.95-2.1v8.59a.75.75 0 0 0 1.5 0V4.66l1.95 2.1a.75.75 0 1 0 1.1-1.02l-3.25-3.5a.75.75 0 0 0-1.1 0L2.2 5.74a.75.75 0 0 0 .04 1.06Zm8 6.4a.75.75 0 0 0-.04 1.06l3.25 3.5a.75.75 0 0 0 1.1 0l3.25-3.5a.75.75 0 1 0-1.1-1.02l-1.95 2.1V6.75a.75.75 0 0 0-1.5 0v8.59l-1.95-2.1a.75.75 0 0 0-1.06-.04Z\"
24
+ clip-rule=\"evenodd\"
25
+ />
26
+ </svg>
27
+ Sort Button</a>`);
28
+ });
29
+
30
+ test("build for active button in ASC direction", () => {
31
+ const button = new SortButton("Sort Button", "url", {
32
+ path: "/example",
33
+ query: {
34
+ order_by: "url",
35
+ order_direction: "ASC",
36
+ "f:keyword": "test",
37
+ },
38
+ });
39
+
40
+ const result = button.build();
41
+
42
+ expect(result)
43
+ .toEqual(`<a href=\"/example?f%3Akeyword=test&order_direction=DESC&order_by=url\" class=\"btn-sort is-active\"><svg
44
+ xmlns=\"http://www.w3.org/2000/svg\"
45
+ viewBox=\"0 0 20 20\"
46
+ fill=\"currentColor\"
47
+ class=\"size-4\"
48
+ >
49
+ <path
50
+ fill-rule=\"evenodd\"
51
+ d=\"M10 17a.75.75 0 0 1-.75-.75V5.612L5.29 9.77a.75.75 0 0 1-1.08-1.04l5.25-5.5a.75.75 0 0 1 1.08 0l5.25 5.5a.75.75 0 1 1-1.08 1.04l-3.96-4.158V16.25A.75.75 0 0 1 10 17Z\"
52
+ clip-rule=\"evenodd\"
53
+ />
54
+ </svg>
55
+ Sort Button</a>`);
56
+ });
57
+
58
+ test("build for active button in DESC direction", () => {
59
+ const button = new SortButton("Sort Button", "url", {
60
+ path: "/example",
61
+ query: {
62
+ order_by: "url",
63
+ order_direction: "DESC",
64
+ "f:keyword": "test",
65
+ },
66
+ });
67
+
68
+ const result = button.build();
69
+
70
+ expect(result)
71
+ .toEqual(`<a href=\"/example?f%3Akeyword=test&order_direction=ASC&order_by=url\" class=\"btn-sort is-active\"><svg
72
+ xmlns=\"http://www.w3.org/2000/svg\"
73
+ viewBox=\"0 0 20 20\"
74
+ fill=\"currentColor\"
75
+ class=\"size-4\"
76
+ >
77
+ <path
78
+ fill-rule=\"evenodd\"
79
+ d=\"M10 3a.75.75 0 0 1 .75.75v10.638l3.96-4.158a.75.75 0 1 1 1.08 1.04l-5.25 5.5a.75.75 0 0 1-1.08 0l-5.25-5.5a.75.75 0 1 1 1.08-1.04l3.96 4.158V3.75A.75.75 0 0 1 10 3Z\"
80
+ clip-rule=\"evenodd\"
81
+ />
82
+ </svg>
83
+ Sort Button</a>`);
84
+ });
85
+ });
@@ -1,4 +1,4 @@
1
- import createResource from "../createResource";
1
+ import routeCollection from "../routeCollection";
2
2
 
3
3
  const UsersHandler = {
4
4
  index: () => {},
@@ -23,34 +23,63 @@ const UsersHandlerWithFilters = {
23
23
  };
24
24
 
25
25
  const honoAdapter = {
26
- createResource: (_mapping) => {},
26
+ routeCollection: (_mapping) => {},
27
27
  };
28
28
 
29
- const adapterSpy = jest.spyOn(honoAdapter, "createResource");
29
+ const adapterSpy = jest.spyOn(honoAdapter, "routeCollection");
30
30
 
31
- describe("createResource", () => {
31
+ describe("routeCollection", () => {
32
32
  test("Valid handler mapping is passed to router", () => {
33
- createResource(honoAdapter, "users", UsersHandler);
33
+ routeCollection(honoAdapter, "users", UsersHandler);
34
34
 
35
35
  expect(adapterSpy).toHaveBeenCalledWith([
36
- ["GET", "/users", "users", "index", UsersHandler.index],
37
- ["GET", "/users/new", "users", "create_form", UsersHandler.create_form],
38
- ["GET", "/users/:id", "users", "show", UsersHandler.show],
39
- ["GET", "/users/:id/edit", "users", "edit_form", UsersHandler.edit_form],
40
- ["POST", "/users", "users", "create", UsersHandler.create],
41
- ["PUT", "/users/:id", "users", "update", UsersHandler.update],
42
- ["DELETE", "/users/:id", "users", "destroy", UsersHandler.destroy],
36
+ ["GET", "/users", "users", "users", "index", UsersHandler.index],
37
+ [
38
+ "GET",
39
+ "/users/new",
40
+ "users",
41
+ "users",
42
+ "create_form",
43
+ UsersHandler.create_form,
44
+ ],
45
+ ["GET", "/users/:id", "users", "users", "show", UsersHandler.show],
46
+ [
47
+ "GET",
48
+ "/users/:id/edit",
49
+ "users",
50
+ "users",
51
+ "edit_form",
52
+ UsersHandler.edit_form,
53
+ ],
54
+ ["POST", "/users", "users", "users", "create_form", UsersHandler.create],
55
+ [
56
+ "POST",
57
+ "/users/:id",
58
+ "users",
59
+ "users",
60
+ "edit_form",
61
+ UsersHandler.update,
62
+ ],
63
+ [
64
+ "DELETE",
65
+ "/users/:id",
66
+ "users",
67
+ "users",
68
+ "destroy",
69
+ UsersHandler.destroy,
70
+ ],
43
71
  ]);
44
72
  });
45
73
 
46
74
  test("Valid handler mapping is passed to router with filters", () => {
47
- createResource(honoAdapter, "users", UsersHandlerWithFilters);
75
+ routeCollection(honoAdapter, "users", UsersHandlerWithFilters);
48
76
 
49
77
  expect(adapterSpy).toHaveBeenCalledWith([
50
78
  [
51
79
  "GET",
52
80
  "/users",
53
81
  "users",
82
+ "users",
54
83
  "index",
55
84
  UsersHandlerWithFilters.index,
56
85
  UsersHandlerWithFilters.before_filter,
@@ -60,6 +89,7 @@ describe("createResource", () => {
60
89
  "GET",
61
90
  "/users/new",
62
91
  "users",
92
+ "users",
63
93
  "create_form",
64
94
  UsersHandlerWithFilters.create_form,
65
95
  UsersHandlerWithFilters.before_filter,
@@ -69,6 +99,7 @@ describe("createResource", () => {
69
99
  "GET",
70
100
  "/users/:id",
71
101
  "users",
102
+ "users",
72
103
  "show",
73
104
  UsersHandlerWithFilters.show,
74
105
  UsersHandlerWithFilters.before_filter,
@@ -78,6 +109,7 @@ describe("createResource", () => {
78
109
  "GET",
79
110
  "/users/:id/edit",
80
111
  "users",
112
+ "users",
81
113
  "edit_form",
82
114
  UsersHandlerWithFilters.edit_form,
83
115
  UsersHandlerWithFilters.before_filter,
@@ -87,16 +119,18 @@ describe("createResource", () => {
87
119
  "POST",
88
120
  "/users",
89
121
  "users",
90
- "create",
122
+ "users",
123
+ "create_form",
91
124
  UsersHandlerWithFilters.create,
92
125
  UsersHandlerWithFilters.before_filter,
93
126
  UsersHandlerWithFilters.after_filter,
94
127
  ],
95
128
  [
96
- "PUT",
129
+ "POST",
97
130
  "/users/:id",
98
131
  "users",
99
- "update",
132
+ "users",
133
+ "edit_form",
100
134
  UsersHandlerWithFilters.update,
101
135
  UsersHandlerWithFilters.before_filter,
102
136
  UsersHandlerWithFilters.after_filter,
@@ -105,6 +139,7 @@ describe("createResource", () => {
105
139
  "DELETE",
106
140
  "/users/:id",
107
141
  "users",
142
+ "users",
108
143
  "destroy",
109
144
  UsersHandlerWithFilters.destroy,
110
145
  UsersHandlerWithFilters.before_filter,
@@ -0,0 +1,91 @@
1
+ import routeMember from "../routeMember";
2
+
3
+ const ProfileHandWithFilters = {
4
+ show: () => {},
5
+ edit_form: () => {},
6
+ update: () => {},
7
+ };
8
+
9
+ const ProfileHandWithFiltersWithFilters = {
10
+ before_filter: () => {},
11
+ after_filter: () => {},
12
+ show: () => {},
13
+ edit_form: () => {},
14
+ update: () => {},
15
+ };
16
+
17
+ const honoAdapter = {
18
+ routeMember: (_mapping) => {},
19
+ };
20
+
21
+ const adapterSpy = jest.spyOn(honoAdapter, "routeMember");
22
+
23
+ describe("routeMember", () => {
24
+ test("Valid handler mapping is passed to router", () => {
25
+ routeMember(honoAdapter, "profile", ProfileHandWithFilters);
26
+
27
+ expect(adapterSpy).toHaveBeenCalledWith([
28
+ [
29
+ "GET",
30
+ "/profile",
31
+ "profile",
32
+ "profile",
33
+ "show",
34
+ ProfileHandWithFilters.show,
35
+ ],
36
+ [
37
+ "GET",
38
+ "/profile/edit",
39
+ "profile",
40
+ "profile",
41
+ "edit_form",
42
+ ProfileHandWithFilters.edit_form,
43
+ ],
44
+ [
45
+ "POST",
46
+ "/profile",
47
+ "profile",
48
+ "profile",
49
+ "edit_form",
50
+ ProfileHandWithFilters.update,
51
+ ],
52
+ ]);
53
+ });
54
+
55
+ test("Valid handler mapping is passed to router with filters", () => {
56
+ routeMember(honoAdapter, "profile", ProfileHandWithFiltersWithFilters);
57
+
58
+ expect(adapterSpy).toHaveBeenCalledWith([
59
+ [
60
+ "GET",
61
+ "/profile",
62
+ "profile",
63
+ "profile",
64
+ "show",
65
+ ProfileHandWithFiltersWithFilters.show,
66
+ ProfileHandWithFiltersWithFilters.before_filter,
67
+ ProfileHandWithFiltersWithFilters.after_filter,
68
+ ],
69
+ [
70
+ "GET",
71
+ "/profile/edit",
72
+ "profile",
73
+ "profile",
74
+ "edit_form",
75
+ ProfileHandWithFiltersWithFilters.edit_form,
76
+ ProfileHandWithFiltersWithFilters.before_filter,
77
+ ProfileHandWithFiltersWithFilters.after_filter,
78
+ ],
79
+ [
80
+ "POST",
81
+ "/profile",
82
+ "profile",
83
+ "profile",
84
+ "edit_form",
85
+ ProfileHandWithFiltersWithFilters.update,
86
+ ProfileHandWithFiltersWithFilters.before_filter,
87
+ ProfileHandWithFiltersWithFilters.after_filter,
88
+ ],
89
+ ]);
90
+ });
91
+ });
@@ -1,4 +1,4 @@
1
- import createNestedResource from "../createNestedResource";
1
+ import routeNestedCollection from "../routeNestedCollection";
2
2
 
3
3
  const OrdersHandler = {
4
4
  index: () => {},
@@ -23,20 +23,21 @@ const OrdersHandlerWithFilters = {
23
23
  };
24
24
 
25
25
  const honoAdapter = {
26
- createNestedResource: (_mapping) => {},
26
+ routeNestedCollection: (_mapping) => {},
27
27
  };
28
28
 
29
- const adapterSpy = jest.spyOn(honoAdapter, "createNestedResource");
29
+ const adapterSpy = jest.spyOn(honoAdapter, "routeNestedCollection");
30
30
 
31
- describe("createNestedResource", () => {
31
+ describe("routeNestedCollection", () => {
32
32
  test("Valid handler mapping is passed to router", () => {
33
- createNestedResource(honoAdapter, "orders", "line_items", OrdersHandler);
33
+ routeNestedCollection(honoAdapter, "orders", "line_items", OrdersHandler);
34
34
 
35
35
  expect(adapterSpy).toHaveBeenCalledWith([
36
36
  [
37
37
  "GET",
38
38
  "/orders/:parent_id/line_items",
39
39
  "line_items",
40
+ "line_items",
40
41
  "index",
41
42
  OrdersHandler.index,
42
43
  ],
@@ -44,14 +45,23 @@ describe("createNestedResource", () => {
44
45
  "GET",
45
46
  "/orders/:parent_id/line_items/new",
46
47
  "line_items",
48
+ "line_items",
47
49
  "create_form",
48
50
  OrdersHandler.create_form,
49
51
  ],
50
- ["GET", "/line_items/:id", "line_items", "show", OrdersHandler.show],
52
+ [
53
+ "GET",
54
+ "/line_items/:id",
55
+ "line_items",
56
+ "line_items",
57
+ "show",
58
+ OrdersHandler.show,
59
+ ],
51
60
  [
52
61
  "GET",
53
62
  "/line_items/:id/edit",
54
63
  "line_items",
64
+ "line_items",
55
65
  "edit_form",
56
66
  OrdersHandler.edit_form,
57
67
  ],
@@ -59,14 +69,23 @@ describe("createNestedResource", () => {
59
69
  "POST",
60
70
  "/orders/:parent_id/line_items",
61
71
  "line_items",
62
- "create",
72
+ "line_items",
73
+ "create_form",
63
74
  OrdersHandler.create,
64
75
  ],
65
- ["PUT", "/line_items/:id", "line_items", "update", OrdersHandler.update],
76
+ [
77
+ "PUT",
78
+ "/line_items/:id",
79
+ "line_items",
80
+ "line_items",
81
+ "update",
82
+ OrdersHandler.update,
83
+ ],
66
84
  [
67
85
  "DELETE",
68
86
  "/line_items/:id",
69
87
  "line_items",
88
+ "line_items",
70
89
  "destroy",
71
90
  OrdersHandler.destroy,
72
91
  ],
@@ -74,7 +93,7 @@ describe("createNestedResource", () => {
74
93
  });
75
94
 
76
95
  test("Valid handler mapping is passed to router with filters", () => {
77
- createNestedResource(
96
+ routeNestedCollection(
78
97
  honoAdapter,
79
98
  "orders",
80
99
  "line_items",
@@ -86,6 +105,7 @@ describe("createNestedResource", () => {
86
105
  "GET",
87
106
  "/orders/:parent_id/line_items",
88
107
  "line_items",
108
+ "line_items",
89
109
  "index",
90
110
  OrdersHandlerWithFilters.index,
91
111
  OrdersHandlerWithFilters.before_filter,
@@ -95,6 +115,7 @@ describe("createNestedResource", () => {
95
115
  "GET",
96
116
  "/orders/:parent_id/line_items/new",
97
117
  "line_items",
118
+ "line_items",
98
119
  "create_form",
99
120
  OrdersHandlerWithFilters.create_form,
100
121
  OrdersHandlerWithFilters.before_filter,
@@ -104,6 +125,7 @@ describe("createNestedResource", () => {
104
125
  "GET",
105
126
  "/line_items/:id",
106
127
  "line_items",
128
+ "line_items",
107
129
  "show",
108
130
  OrdersHandlerWithFilters.show,
109
131
  OrdersHandlerWithFilters.before_filter,
@@ -113,6 +135,7 @@ describe("createNestedResource", () => {
113
135
  "GET",
114
136
  "/line_items/:id/edit",
115
137
  "line_items",
138
+ "line_items",
116
139
  "edit_form",
117
140
  OrdersHandlerWithFilters.edit_form,
118
141
  OrdersHandlerWithFilters.before_filter,
@@ -122,7 +145,8 @@ describe("createNestedResource", () => {
122
145
  "POST",
123
146
  "/orders/:parent_id/line_items",
124
147
  "line_items",
125
- "create",
148
+ "line_items",
149
+ "create_form",
126
150
  OrdersHandlerWithFilters.create,
127
151
  OrdersHandlerWithFilters.before_filter,
128
152
  OrdersHandlerWithFilters.after_filter,
@@ -131,6 +155,7 @@ describe("createNestedResource", () => {
131
155
  "PUT",
132
156
  "/line_items/:id",
133
157
  "line_items",
158
+ "line_items",
134
159
  "update",
135
160
  OrdersHandlerWithFilters.update,
136
161
  OrdersHandlerWithFilters.before_filter,
@@ -140,6 +165,7 @@ describe("createNestedResource", () => {
140
165
  "DELETE",
141
166
  "/line_items/:id",
142
167
  "line_items",
168
+ "line_items",
143
169
  "destroy",
144
170
  OrdersHandlerWithFilters.destroy,
145
171
  OrdersHandlerWithFilters.before_filter,
@@ -0,0 +1,96 @@
1
+ import routeNestedMember from "../routeNestedMember";
2
+
3
+ const ArtistHandWithFilters = {
4
+ show: () => {},
5
+ edit_form: () => {},
6
+ update: () => {},
7
+ };
8
+
9
+ const ArtistHandWithFiltersWithFilters = {
10
+ before_filter: () => {},
11
+ after_filter: () => {},
12
+ show: () => {},
13
+ edit_form: () => {},
14
+ update: () => {},
15
+ };
16
+
17
+ const honoAdapter = {
18
+ routeNestedMember: (_mapping) => {},
19
+ };
20
+
21
+ const adapterSpy = jest.spyOn(honoAdapter, "routeNestedMember");
22
+
23
+ describe("routeNestedMember", () => {
24
+ test("Valid handler mapping is passed to router", () => {
25
+ routeNestedMember(honoAdapter, "artist", "bio", ArtistHandWithFilters);
26
+
27
+ expect(adapterSpy).toHaveBeenCalledWith([
28
+ [
29
+ "GET",
30
+ "/artist/:parent_id/bio",
31
+ "bio",
32
+ "artist/bio",
33
+ "show",
34
+ ArtistHandWithFilters.show,
35
+ ],
36
+ [
37
+ "GET",
38
+ "/artist/:parent_id/bio/edit",
39
+ "bio",
40
+ "artist/bio",
41
+ "edit_form",
42
+ ArtistHandWithFilters.edit_form,
43
+ ],
44
+ [
45
+ "POST",
46
+ "/artist/:parent_id/bio",
47
+ "bio",
48
+ "artist/bio",
49
+ "edit_form",
50
+ ArtistHandWithFilters.update,
51
+ ],
52
+ ]);
53
+ });
54
+
55
+ test("Valid handler mapping is passed to router with filters", () => {
56
+ routeNestedMember(
57
+ honoAdapter,
58
+ "artist",
59
+ "bio",
60
+ ArtistHandWithFiltersWithFilters
61
+ );
62
+
63
+ expect(adapterSpy).toHaveBeenCalledWith([
64
+ [
65
+ "GET",
66
+ "/artist/:parent_id/bio",
67
+ "bio",
68
+ "artist/bio",
69
+ "show",
70
+ ArtistHandWithFiltersWithFilters.show,
71
+ ArtistHandWithFiltersWithFilters.before_filter,
72
+ ArtistHandWithFiltersWithFilters.after_filter,
73
+ ],
74
+ [
75
+ "GET",
76
+ "/artist/:parent_id/bio/edit",
77
+ "bio",
78
+ "artist/bio",
79
+ "edit_form",
80
+ ArtistHandWithFiltersWithFilters.edit_form,
81
+ ArtistHandWithFiltersWithFilters.before_filter,
82
+ ArtistHandWithFiltersWithFilters.after_filter,
83
+ ],
84
+ [
85
+ "POST",
86
+ "/artist/:parent_id/bio",
87
+ "bio",
88
+ "artist/bio",
89
+ "edit_form",
90
+ ArtistHandWithFiltersWithFilters.update,
91
+ ArtistHandWithFiltersWithFilters.before_filter,
92
+ ArtistHandWithFiltersWithFilters.after_filter,
93
+ ],
94
+ ]);
95
+ });
96
+ });