@raketa-cloud/admin 0.0.4 → 0.0.6
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.
- package/package.json +2 -2
- package/src/Adapter.js +62 -7
- package/src/HonoAdapter.js +191 -63
- package/src/RaketaContext.js +13 -0
- package/src/helpers/AuthHelper.js +44 -0
- package/src/helpers/FormBuilder.js +226 -0
- package/src/helpers/HTMLBuilder.js +38 -0
- package/src/helpers/Pagination.js +92 -0
- package/src/helpers/SortButton.js +102 -0
- package/src/helpers/form_for.js +6 -0
- package/src/helpers/pagination_helper.js +5 -0
- package/src/helpers/sort_button.js +5 -0
- package/src/index.js +6 -2
- package/src/{createResource.js → routeCollection.js} +13 -6
- package/src/routeMember.js +40 -0
- package/src/{createNestedResource.js → routeNestedCollection.js} +12 -5
- package/src/routeNestedMember.js +40 -0
- package/src/setGlobalConfig.js +5 -0
- package/src/setGlobalContext.js +5 -0
- package/src/setupAuthentication.js +99 -0
- package/src/styles/application.css +465 -3
- package/src/tests/Adapter.test.js +39 -0
- package/src/tests/HonoAdapter.test.js +1 -0
- package/src/tests/helpers/Pagination.test.js +65 -0
- package/src/tests/helpers/SortButton.test.js +85 -0
- package/src/tests/{createResource.test.js → routeCollection.test.js} +51 -16
- package/src/tests/routeMember.test.js +91 -0
- package/src/tests/{createNestedResource.test.js → routeNestedCollection.test.js} +36 -10
- package/src/tests/routeNestedMember.test.js +96 -0
- package/src/views/_auth/login.ejs +92 -0
- package/src/views/layouts/application.ejs +144 -19
- package/src/views/layouts/header.ejs +49 -0
- 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
|
|
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
|
-
|
|
26
|
+
routeCollection: (_mapping) => {},
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
const adapterSpy = jest.spyOn(honoAdapter, "
|
|
29
|
+
const adapterSpy = jest.spyOn(honoAdapter, "routeCollection");
|
|
30
30
|
|
|
31
|
-
describe("
|
|
31
|
+
describe("routeCollection", () => {
|
|
32
32
|
test("Valid handler mapping is passed to router", () => {
|
|
33
|
-
|
|
33
|
+
routeCollection(honoAdapter, "users", UsersHandler);
|
|
34
34
|
|
|
35
35
|
expect(adapterSpy).toHaveBeenCalledWith([
|
|
36
|
-
["GET", "/users", "users", "index", UsersHandler.index],
|
|
37
|
-
[
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
"
|
|
122
|
+
"users",
|
|
123
|
+
"create_form",
|
|
91
124
|
UsersHandlerWithFilters.create,
|
|
92
125
|
UsersHandlerWithFilters.before_filter,
|
|
93
126
|
UsersHandlerWithFilters.after_filter,
|
|
94
127
|
],
|
|
95
128
|
[
|
|
96
|
-
"
|
|
129
|
+
"POST",
|
|
97
130
|
"/users/:id",
|
|
98
131
|
"users",
|
|
99
|
-
"
|
|
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
|
|
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
|
-
|
|
26
|
+
routeNestedCollection: (_mapping) => {},
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
const adapterSpy = jest.spyOn(honoAdapter, "
|
|
29
|
+
const adapterSpy = jest.spyOn(honoAdapter, "routeNestedCollection");
|
|
30
30
|
|
|
31
|
-
describe("
|
|
31
|
+
describe("routeNestedCollection", () => {
|
|
32
32
|
test("Valid handler mapping is passed to router", () => {
|
|
33
|
-
|
|
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
|
-
[
|
|
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
|
-
"
|
|
72
|
+
"line_items",
|
|
73
|
+
"create_form",
|
|
63
74
|
OrdersHandler.create,
|
|
64
75
|
],
|
|
65
|
-
[
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
+
});
|