@thepalaceproject/circulation-admin 1.43.0-post.3 → 1.43.0-post.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.
@@ -0,0 +1,245 @@
1
+ import adapter from "../../src/editorAdapter";
2
+ import {
3
+ OPDSEntry,
4
+ Contributor,
5
+ Series,
6
+ Category,
7
+ Summary,
8
+ } from "opds-feed-parser";
9
+
10
+ describe("editorAdapter", () => {
11
+ it("adapts valid OPDS entry", () => {
12
+ const entry = new OPDSEntry({
13
+ id: "id",
14
+ updated: "updated",
15
+ title: "title",
16
+ authors: [new Contributor({ name: "name", uri: "uri", role: "role" })],
17
+ subtitle: "subtitle",
18
+ contributors: [
19
+ new Contributor({ name: "name2", uri: "uri2", role: "role2" }),
20
+ ],
21
+ series: new Series({ name: "series", position: 2 }),
22
+ categories: [
23
+ new Category({ term: "term", scheme: "scheme", label: "label" }),
24
+ new Category({
25
+ term: "13-16",
26
+ scheme: "http://schema.org/typicalAgeRange",
27
+ label: "age",
28
+ }),
29
+ new Category({
30
+ term: "ya",
31
+ scheme: "http://schema.org/audience",
32
+ label: "ya",
33
+ }),
34
+ new Category({
35
+ term: "fiction",
36
+ scheme: "http://librarysimplified.org/terms/fiction/",
37
+ label: "Fiction",
38
+ }),
39
+ ],
40
+ identifiers: [],
41
+ links: [
42
+ {
43
+ href: "hide",
44
+ rel: "http://librarysimplified.org/terms/rel/hide",
45
+ type: "type",
46
+ title: "title",
47
+ role: "role",
48
+ },
49
+ {
50
+ href: "restore",
51
+ rel: "http://librarysimplified.org/terms/rel/restore",
52
+ type: "type",
53
+ title: "title",
54
+ role: "role",
55
+ },
56
+ {
57
+ href: "refresh",
58
+ rel: "http://librarysimplified.org/terms/rel/refresh",
59
+ type: "type",
60
+ title: "title",
61
+ role: "role",
62
+ },
63
+ {
64
+ href: "edit",
65
+ rel: "edit",
66
+ type: "type",
67
+ title: "title",
68
+ role: "role",
69
+ },
70
+ {
71
+ href: "issues",
72
+ rel: "issues",
73
+ type: "type",
74
+ title: "title",
75
+ role: "role",
76
+ },
77
+ {
78
+ href: "change-cover",
79
+ rel: "http://librarysimplified.org/terms/rel/change_cover",
80
+ type: "type",
81
+ title: "title",
82
+ role: "role",
83
+ },
84
+ {
85
+ href: "cover",
86
+ rel: "http://opds-spec.org/image",
87
+ type: "image/png",
88
+ title: "title",
89
+ role: "role",
90
+ },
91
+ ],
92
+ issued: "issued",
93
+ language: "language",
94
+ rights: "rights",
95
+ publisher: "publisher",
96
+ published: "published",
97
+ summary: new Summary({ content: "content", link: "link" }),
98
+ unparsed: {
99
+ "schema:alternativeHeadline": [{ _: "subtitle" }],
100
+ $: {
101
+ "schema:additionalType": { value: "medium" },
102
+ },
103
+ "bib:publisherImprint": [{ _: "imprint" }],
104
+ "schema:Rating": [
105
+ {
106
+ $: {
107
+ "schema:ratingValue": { value: "0.3" },
108
+ "schema:additionalType": {
109
+ value: "http://librarysimplified.org/terms/rel/quality",
110
+ },
111
+ },
112
+ },
113
+ {
114
+ $: {
115
+ "schema:ratingValue": { value: "4" },
116
+ "schema:additionalType": {
117
+ value: "http://schema.org/ratingValue",
118
+ },
119
+ },
120
+ },
121
+ ],
122
+ },
123
+ });
124
+
125
+ const adapted = adapter(entry);
126
+ expect(adapted.title).toBe("title");
127
+ expect(adapted.authors).toStrictEqual([
128
+ { name: "name", uri: "uri", role: "aut" },
129
+ ]);
130
+ // The adapter flattens `Contributor` instances into plain objects, so assert
131
+ // the shape it produces rather than comparing against `entry.contributors`.
132
+ expect(adapted.contributors).toStrictEqual([
133
+ { name: "name2", uri: "uri2", role: "role2" },
134
+ ]);
135
+ expect(adapted.subtitle).toBe("subtitle");
136
+ expect(adapted.summary).toBe("content");
137
+ expect(adapted.audience).toBe("ya");
138
+ expect(adapted.targetAgeRange).toStrictEqual(["13", "16"]);
139
+ expect(adapted.fiction).toBe(true);
140
+ expect(adapted.categories).toStrictEqual(["label", "age", "ya", "Fiction"]);
141
+ expect(adapted.hideLink).toStrictEqual(entry.links[0]);
142
+ expect(adapted.restoreLink).toStrictEqual(entry.links[1]);
143
+ expect(adapted.refreshLink).toStrictEqual(entry.links[2]);
144
+ expect(adapted.editLink).toStrictEqual(entry.links[3]);
145
+ expect(adapted.issuesLink).toStrictEqual(entry.links[4]);
146
+ expect(adapted.changeCoverLink).toStrictEqual(entry.links[5]);
147
+ expect(adapted.coverUrl).toBe(entry.links[6].href);
148
+ expect(adapted.series).toBe("series");
149
+ expect(adapted.seriesPosition).toBe(2);
150
+ expect(adapted.medium).toBe("medium");
151
+ expect(adapted.language).toBe("language");
152
+ expect(adapted.publisher).toBe("publisher");
153
+ expect(adapted.imprint).toBe("imprint");
154
+ expect(adapted.issued).toBe("issued");
155
+ expect(adapted.rating).toBe("4");
156
+ });
157
+
158
+ it("adapts visibility status from categories", () => {
159
+ const entry = new OPDSEntry({
160
+ id: "id",
161
+ updated: "updated",
162
+ title: "title",
163
+ subtitle: "subtitle",
164
+ authors: [],
165
+ contributors: [],
166
+ series: new Series({ name: "series", position: 2 }),
167
+ categories: [
168
+ new Category({ term: "term", scheme: "scheme", label: "label" }),
169
+ new Category({
170
+ term: "manually-suppressed",
171
+ scheme: "http://palaceproject.io/terms/visibility-status",
172
+ label: "Manually Suppressed",
173
+ }),
174
+ ],
175
+ identifiers: [],
176
+ links: [],
177
+ issued: "issued",
178
+ language: "language",
179
+ rights: "rights",
180
+ publisher: "publisher",
181
+ published: "published",
182
+ summary: new Summary({ content: "content", link: "link" }),
183
+ unparsed: {},
184
+ });
185
+
186
+ const adapted = adapter(entry);
187
+ expect(adapted.visibilityStatus).toBe("manually-suppressed");
188
+ });
189
+
190
+ it("adapts policy-filtered visibility status", () => {
191
+ const entry = new OPDSEntry({
192
+ id: "id",
193
+ updated: "updated",
194
+ title: "title",
195
+ subtitle: "subtitle",
196
+ authors: [],
197
+ contributors: [],
198
+ series: new Series({ name: "series", position: 2 }),
199
+ categories: [
200
+ new Category({
201
+ term: "policy-filtered",
202
+ scheme: "http://palaceproject.io/terms/visibility-status",
203
+ label: "Policy Filtered",
204
+ }),
205
+ ],
206
+ identifiers: [],
207
+ links: [],
208
+ issued: "issued",
209
+ language: "language",
210
+ rights: "rights",
211
+ publisher: "publisher",
212
+ published: "published",
213
+ summary: new Summary({ content: "content", link: "link" }),
214
+ unparsed: {},
215
+ });
216
+
217
+ const adapted = adapter(entry);
218
+ expect(adapted.visibilityStatus).toBe("policy-filtered");
219
+ });
220
+
221
+ it("doesn't crash when expected data is missing", () => {
222
+ const entry = new OPDSEntry({
223
+ id: "id",
224
+ updated: "updated",
225
+ title: "title",
226
+ subtitle: "subtitle",
227
+ authors: [],
228
+ contributors: [],
229
+ series: new Series({ name: "series", position: 2 }),
230
+ categories: [],
231
+ identifiers: [],
232
+ links: [],
233
+ issued: "issued",
234
+ language: "language",
235
+ rights: "rights",
236
+ publisher: "publisher",
237
+ published: "published",
238
+ summary: new Summary({ content: "content", link: "link" }),
239
+ unparsed: {},
240
+ });
241
+
242
+ const adapted = adapter(entry);
243
+ expect(adapted.title).toBe("title");
244
+ });
245
+ });
@@ -0,0 +1,206 @@
1
+ import Admin from "../../../src/models/Admin";
2
+
3
+ describe("Admin", () => {
4
+ const systemAdmin = new Admin([{ role: "system" }]);
5
+ const sitewideLibraryManager = new Admin([{ role: "manager-all" }]);
6
+ const sitewideLibrarian = new Admin([{ role: "librarian-all" }]);
7
+ const libraryManagerA = new Admin([{ role: "manager", library: "a" }]);
8
+ const librarianA = new Admin([{ role: "librarian", library: "a" }]);
9
+ const libraryManagerB = new Admin([{ role: "manager", library: "b" }]);
10
+ const librarianB = new Admin([{ role: "librarian", library: "b" }]);
11
+ const libraryManagerASitewideLibrarian = new Admin([
12
+ { role: "librarian-all" },
13
+ { role: "manager", library: "a" },
14
+ ]);
15
+ const libraryManagerALibrarianB = new Admin([
16
+ { role: "manager", library: "a" },
17
+ { role: "librarian", library: "b" },
18
+ ]);
19
+
20
+ it("stores email", () => {
21
+ expect(new Admin([], "email").email).toBe("email");
22
+ expect(new Admin([]).email).toBeFalsy();
23
+ });
24
+
25
+ it("identifies system admins", () => {
26
+ expect(systemAdmin.isSystemAdmin()).toBeTruthy();
27
+ expect(sitewideLibraryManager.isSystemAdmin()).toBeFalsy();
28
+ expect(sitewideLibrarian.isSystemAdmin()).toBeFalsy();
29
+ expect(libraryManagerA.isSystemAdmin()).toBeFalsy();
30
+ expect(librarianA.isSystemAdmin()).toBeFalsy();
31
+ expect(libraryManagerB.isSystemAdmin()).toBeFalsy();
32
+ expect(librarianB.isSystemAdmin()).toBeFalsy();
33
+ expect(libraryManagerASitewideLibrarian.isSystemAdmin()).toBeFalsy();
34
+ expect(libraryManagerALibrarianB.isSystemAdmin()).toBeFalsy();
35
+ });
36
+
37
+ it("identifies sitewide library managers", () => {
38
+ expect(systemAdmin.isSitewideLibraryManager()).toBeTruthy();
39
+ expect(sitewideLibraryManager.isSitewideLibraryManager()).toBeTruthy();
40
+ expect(sitewideLibrarian.isSitewideLibraryManager()).toBeFalsy();
41
+ expect(libraryManagerA.isSitewideLibraryManager()).toBeFalsy();
42
+ expect(librarianA.isSitewideLibraryManager()).toBeFalsy();
43
+ expect(libraryManagerB.isSitewideLibraryManager()).toBeFalsy();
44
+ expect(librarianB.isSitewideLibraryManager()).toBeFalsy();
45
+ expect(
46
+ libraryManagerASitewideLibrarian.isSitewideLibraryManager()
47
+ ).toBeFalsy();
48
+ expect(libraryManagerALibrarianB.isSitewideLibraryManager()).toBeFalsy();
49
+ });
50
+
51
+ it("identifies sitewide librarians", () => {
52
+ expect(systemAdmin.isSitewideLibrarian()).toBeTruthy();
53
+ expect(sitewideLibraryManager.isSitewideLibrarian()).toBeTruthy();
54
+ expect(sitewideLibrarian.isSitewideLibrarian()).toBeTruthy();
55
+ expect(libraryManagerA.isSitewideLibrarian()).toBeFalsy();
56
+ expect(librarianA.isSitewideLibrarian()).toBeFalsy();
57
+ expect(libraryManagerB.isSitewideLibrarian()).toBeFalsy();
58
+ expect(librarianB.isSitewideLibrarian()).toBeFalsy();
59
+ expect(libraryManagerASitewideLibrarian.isSitewideLibrarian()).toBeTruthy();
60
+ expect(libraryManagerALibrarianB.isSitewideLibrarian()).toBeFalsy();
61
+ });
62
+
63
+ it("identifies library managers", () => {
64
+ expect(systemAdmin.isLibraryManager("a")).toBeTruthy();
65
+ expect(sitewideLibraryManager.isLibraryManager("a")).toBeTruthy();
66
+ expect(sitewideLibrarian.isLibraryManager("a")).toBeFalsy();
67
+ expect(libraryManagerA.isLibraryManager("a")).toBeTruthy();
68
+ expect(librarianA.isLibraryManager("a")).toBeFalsy();
69
+ expect(libraryManagerB.isLibraryManager("a")).toBeFalsy();
70
+ expect(librarianB.isLibraryManager("a")).toBeFalsy();
71
+ expect(libraryManagerASitewideLibrarian.isLibraryManager("a")).toBeTruthy();
72
+ expect(libraryManagerALibrarianB.isLibraryManager("a")).toBeTruthy();
73
+
74
+ expect(systemAdmin.isLibraryManager("b")).toBeTruthy();
75
+ expect(sitewideLibraryManager.isLibraryManager("b")).toBeTruthy();
76
+ expect(sitewideLibrarian.isLibraryManager("b")).toBeFalsy();
77
+ expect(libraryManagerA.isLibraryManager("b")).toBeFalsy();
78
+ expect(librarianA.isLibraryManager("b")).toBeFalsy();
79
+ expect(libraryManagerB.isLibraryManager("b")).toBeTruthy();
80
+ expect(librarianB.isLibraryManager("b")).toBeFalsy();
81
+ expect(libraryManagerASitewideLibrarian.isLibraryManager("b")).toBeFalsy();
82
+ expect(libraryManagerALibrarianB.isLibraryManager("b")).toBeFalsy();
83
+ });
84
+
85
+ it("identifies librarians", () => {
86
+ expect(systemAdmin.isLibrarian("a")).toBeTruthy();
87
+ expect(sitewideLibraryManager.isLibrarian("a")).toBeTruthy();
88
+ expect(sitewideLibrarian.isLibrarian("a")).toBeTruthy();
89
+ expect(libraryManagerA.isLibrarian("a")).toBeTruthy();
90
+ expect(librarianA.isLibrarian("a")).toBeTruthy();
91
+ expect(libraryManagerB.isLibrarian("a")).toBeFalsy();
92
+ expect(librarianB.isLibrarian("a")).toBeFalsy();
93
+ expect(libraryManagerASitewideLibrarian.isLibrarian("a")).toBeTruthy();
94
+ expect(libraryManagerALibrarianB.isLibrarian("a")).toBeTruthy();
95
+
96
+ expect(systemAdmin.isLibrarian("b")).toBeTruthy();
97
+ expect(sitewideLibraryManager.isLibrarian("b")).toBeTruthy();
98
+ expect(sitewideLibrarian.isLibrarian("b")).toBeTruthy();
99
+ expect(libraryManagerA.isLibrarian("b")).toBeFalsy();
100
+ expect(librarianA.isLibrarian("b")).toBeFalsy();
101
+ expect(libraryManagerB.isLibrarian("b")).toBeTruthy();
102
+ expect(librarianB.isLibrarian("b")).toBeTruthy();
103
+ expect(libraryManagerASitewideLibrarian.isLibrarian("b")).toBeTruthy();
104
+ expect(libraryManagerALibrarianB.isLibrarian("b")).toBeTruthy();
105
+ });
106
+
107
+ it("identifies all library managers", () => {
108
+ expect(systemAdmin.isLibraryManagerOfSomeLibrary()).toBeTruthy();
109
+ expect(sitewideLibraryManager.isLibraryManagerOfSomeLibrary()).toBeTruthy();
110
+ expect(sitewideLibrarian.isLibraryManagerOfSomeLibrary()).toBeFalsy();
111
+ expect(libraryManagerA.isLibraryManagerOfSomeLibrary()).toBeTruthy();
112
+ expect(librarianA.isLibraryManagerOfSomeLibrary()).toBeFalsy();
113
+ expect(libraryManagerB.isLibraryManagerOfSomeLibrary()).toBeTruthy();
114
+ expect(librarianB.isLibraryManagerOfSomeLibrary()).toBeFalsy();
115
+ expect(
116
+ libraryManagerASitewideLibrarian.isLibraryManagerOfSomeLibrary()
117
+ ).toBeTruthy();
118
+ expect(
119
+ libraryManagerALibrarianB.isLibraryManagerOfSomeLibrary()
120
+ ).toBeTruthy();
121
+ });
122
+
123
+ it("checks for specific roles", () => {
124
+ expect(systemAdmin.hasRole("system")).toBeTruthy();
125
+ expect(systemAdmin.hasRole("manager-all")).toBeTruthy();
126
+ expect(systemAdmin.hasRole("librarian-all")).toBeTruthy();
127
+ expect(systemAdmin.hasRole("manager", "a")).toBeTruthy();
128
+ expect(systemAdmin.hasRole("librarian", "a")).toBeTruthy();
129
+ expect(systemAdmin.hasRole("manager", "b")).toBeTruthy();
130
+ expect(systemAdmin.hasRole("librarian", "b")).toBeTruthy();
131
+
132
+ expect(sitewideLibraryManager.hasRole("system")).toBeFalsy();
133
+ expect(sitewideLibraryManager.hasRole("manager-all")).toBeTruthy();
134
+ expect(sitewideLibraryManager.hasRole("librarian-all")).toBeTruthy();
135
+ expect(sitewideLibraryManager.hasRole("manager", "a")).toBeTruthy();
136
+ expect(sitewideLibraryManager.hasRole("librarian", "a")).toBeTruthy();
137
+ expect(sitewideLibraryManager.hasRole("manager", "b")).toBeTruthy();
138
+ expect(sitewideLibraryManager.hasRole("librarian", "b")).toBeTruthy();
139
+
140
+ expect(sitewideLibrarian.hasRole("system")).toBeFalsy();
141
+ expect(sitewideLibrarian.hasRole("manager-all")).toBeFalsy();
142
+ expect(sitewideLibrarian.hasRole("librarian-all")).toBeTruthy();
143
+ expect(sitewideLibrarian.hasRole("manager", "a")).toBeFalsy();
144
+ expect(sitewideLibrarian.hasRole("librarian", "a")).toBeTruthy();
145
+ expect(sitewideLibrarian.hasRole("manager", "b")).toBeFalsy();
146
+ expect(sitewideLibrarian.hasRole("librarian", "b")).toBeTruthy();
147
+
148
+ expect(libraryManagerA.hasRole("system")).toBeFalsy();
149
+ expect(libraryManagerA.hasRole("manager-all")).toBeFalsy();
150
+ expect(libraryManagerA.hasRole("librarian-all")).toBeFalsy();
151
+ expect(libraryManagerA.hasRole("manager", "a")).toBeTruthy();
152
+ expect(libraryManagerA.hasRole("librarian", "a")).toBeTruthy();
153
+ expect(libraryManagerA.hasRole("manager", "b")).toBeFalsy();
154
+ expect(libraryManagerA.hasRole("librarian", "b")).toBeFalsy();
155
+
156
+ expect(librarianA.hasRole("system")).toBeFalsy();
157
+ expect(librarianA.hasRole("manager-all")).toBeFalsy();
158
+ expect(librarianA.hasRole("librarian-all")).toBeFalsy();
159
+ expect(librarianA.hasRole("manager", "a")).toBeFalsy();
160
+ expect(librarianA.hasRole("librarian", "a")).toBeTruthy();
161
+ expect(librarianA.hasRole("manager", "b")).toBeFalsy();
162
+ expect(librarianA.hasRole("librarian", "b")).toBeFalsy();
163
+
164
+ expect(libraryManagerB.hasRole("system")).toBeFalsy();
165
+ expect(libraryManagerB.hasRole("manager-all")).toBeFalsy();
166
+ expect(libraryManagerB.hasRole("librarian-all")).toBeFalsy();
167
+ expect(libraryManagerB.hasRole("manager", "a")).toBeFalsy();
168
+ expect(libraryManagerB.hasRole("librarian", "a")).toBeFalsy();
169
+ expect(libraryManagerB.hasRole("manager", "b")).toBeTruthy();
170
+ expect(libraryManagerB.hasRole("librarian", "b")).toBeTruthy();
171
+
172
+ expect(librarianB.hasRole("system")).toBeFalsy();
173
+ expect(librarianB.hasRole("manager-all")).toBeFalsy();
174
+ expect(librarianB.hasRole("librarian-all")).toBeFalsy();
175
+ expect(librarianB.hasRole("manager", "a")).toBeFalsy();
176
+ expect(librarianB.hasRole("librarian", "a")).toBeFalsy();
177
+ expect(librarianB.hasRole("manager", "b")).toBeFalsy();
178
+ expect(librarianB.hasRole("librarian", "b")).toBeTruthy();
179
+
180
+ expect(libraryManagerASitewideLibrarian.hasRole("system")).toBeFalsy();
181
+ expect(libraryManagerASitewideLibrarian.hasRole("manager-all")).toBeFalsy();
182
+ expect(
183
+ libraryManagerASitewideLibrarian.hasRole("librarian-all")
184
+ ).toBeTruthy();
185
+ expect(
186
+ libraryManagerASitewideLibrarian.hasRole("manager", "a")
187
+ ).toBeTruthy();
188
+ expect(
189
+ libraryManagerASitewideLibrarian.hasRole("librarian", "a")
190
+ ).toBeTruthy();
191
+ expect(
192
+ libraryManagerASitewideLibrarian.hasRole("manager", "b")
193
+ ).toBeFalsy();
194
+ expect(
195
+ libraryManagerASitewideLibrarian.hasRole("librarian", "b")
196
+ ).toBeTruthy();
197
+
198
+ expect(libraryManagerALibrarianB.hasRole("system")).toBeFalsy();
199
+ expect(libraryManagerALibrarianB.hasRole("manager-all")).toBeFalsy();
200
+ expect(libraryManagerALibrarianB.hasRole("librarian-all")).toBeFalsy();
201
+ expect(libraryManagerALibrarianB.hasRole("manager", "a")).toBeTruthy();
202
+ expect(libraryManagerALibrarianB.hasRole("librarian", "a")).toBeTruthy();
203
+ expect(libraryManagerALibrarianB.hasRole("manager", "b")).toBeFalsy();
204
+ expect(libraryManagerALibrarianB.hasRole("librarian", "b")).toBeTruthy();
205
+ });
206
+ });
@@ -0,0 +1,81 @@
1
+ import reducer, {
2
+ BookCoverPreviewState,
3
+ } from "../../../src/reducers/bookCoverPreview";
4
+ import ActionCreator from "../../../src/actions";
5
+
6
+ describe("book cover preview reducer", () => {
7
+ const preview = "image data";
8
+
9
+ const initState: BookCoverPreviewState = {
10
+ data: null,
11
+ isFetching: false,
12
+ fetchError: null,
13
+ };
14
+
15
+ const errorState: BookCoverPreviewState = {
16
+ data: null,
17
+ isFetching: false,
18
+ fetchError: { status: 401, response: "test error", url: "test url" },
19
+ };
20
+
21
+ const loadedState = Object.assign({}, initState, {
22
+ data: preview,
23
+ });
24
+
25
+ it("returns initial state for unrecognized action", () => {
26
+ expect(reducer(undefined, {})).toStrictEqual(initState);
27
+ });
28
+
29
+ it("handles PREVIEW_BOOK_COVER_REQUEST", () => {
30
+ const action = {
31
+ type: `${ActionCreator.PREVIEW_BOOK_COVER}_${ActionCreator.REQUEST}`,
32
+ url: "test url",
33
+ };
34
+
35
+ // start with empty state
36
+ let newState = Object.assign({}, initState, {
37
+ isFetching: true,
38
+ });
39
+ expect(reducer(initState, action)).toStrictEqual(newState);
40
+
41
+ // start with error state
42
+ newState = Object.assign({}, errorState, {
43
+ isFetching: true,
44
+ fetchError: null,
45
+ });
46
+ expect(reducer(errorState, action)).toStrictEqual(newState);
47
+ });
48
+
49
+ it("handles PREVIEW_BOOK_COVER_FAILURE", () => {
50
+ const action = {
51
+ type: `${ActionCreator.PREVIEW_BOOK_COVER}_${ActionCreator.FAILURE}`,
52
+ error: "test error",
53
+ };
54
+ const oldState = Object.assign({}, initState, { isFetching: true });
55
+ const newState = Object.assign({}, oldState, {
56
+ fetchError: "test error",
57
+ isFetching: false,
58
+ });
59
+ expect(reducer(oldState, action)).toStrictEqual(newState);
60
+ });
61
+
62
+ it("handles PREVIEW_BOOK_COVER_LOAD", () => {
63
+ const action = {
64
+ type: `${ActionCreator.PREVIEW_BOOK_COVER}_${ActionCreator.LOAD}`,
65
+ data: preview,
66
+ };
67
+ const newState = Object.assign({}, initState, {
68
+ data: preview,
69
+ isFetching: false,
70
+ });
71
+ expect(reducer(initState, action)).toStrictEqual(newState);
72
+ });
73
+
74
+ it("handles PREVIEW_BOOK_COVER_CLEAR", () => {
75
+ const action = {
76
+ type: `${ActionCreator.PREVIEW_BOOK_COVER}_${ActionCreator.CLEAR}`,
77
+ };
78
+ expect(reducer(loadedState, action)).toStrictEqual(initState);
79
+ expect(reducer(errorState, action)).toStrictEqual(initState);
80
+ });
81
+ });
@@ -0,0 +1,161 @@
1
+ import reducer, {
2
+ ClassificationsState,
3
+ } from "../../../src/reducers/classifications";
4
+ import ActionCreator from "../../../src/actions";
5
+
6
+ describe("classifications reducer", () => {
7
+ const genreData = {
8
+ Fiction: {},
9
+ Nonfiction: {},
10
+ };
11
+
12
+ const classificationsData = [
13
+ {
14
+ type: "type",
15
+ name: "name",
16
+ source: "source",
17
+ weight: "weight",
18
+ },
19
+ ];
20
+
21
+ const initState: ClassificationsState = {
22
+ genreTree: null,
23
+ classifications: null,
24
+ isFetchingGenreTree: false,
25
+ isEditingClassifications: false,
26
+ isFetchingClassifications: false,
27
+ fetchError: null,
28
+ };
29
+
30
+ const errorState: ClassificationsState = {
31
+ genreTree: null,
32
+ classifications: null,
33
+ isFetchingGenreTree: false,
34
+ isEditingClassifications: false,
35
+ isFetchingClassifications: false,
36
+ fetchError: { status: 401, response: "test error", url: "test url" },
37
+ };
38
+
39
+ it("returns initial state for unrecognized action", () => {
40
+ expect(reducer(undefined, {})).toStrictEqual(initState);
41
+ });
42
+
43
+ it("handles GENRE_TREE_REQUEST", () => {
44
+ const action = { type: ActionCreator.GENRE_TREE_REQUEST, url: "test url" };
45
+
46
+ // start with empty state
47
+ let newState = Object.assign({}, initState, {
48
+ isFetchingGenreTree: true,
49
+ });
50
+ expect(reducer(initState, action)).toStrictEqual(newState);
51
+
52
+ // start with error state
53
+ newState = Object.assign({}, errorState, {
54
+ isFetchingGenreTree: true,
55
+ fetchError: null,
56
+ });
57
+ expect(reducer(errorState, action)).toStrictEqual(newState);
58
+ });
59
+
60
+ it("handles GENRE_TREE_FAILURE", () => {
61
+ const action = {
62
+ type: ActionCreator.GENRE_TREE_FAILURE,
63
+ error: "test error",
64
+ };
65
+ const oldState = Object.assign({}, initState, { isFetching: true });
66
+ const newState = Object.assign({}, oldState, {
67
+ fetchError: "test error",
68
+ isFetchingGenreTree: false,
69
+ });
70
+ expect(reducer(oldState, action)).toStrictEqual(newState);
71
+ });
72
+
73
+ it("handles GENRE_TREE_LOAD", () => {
74
+ const action = { type: ActionCreator.GENRE_TREE_LOAD, data: genreData };
75
+ const newState = Object.assign({}, initState, {
76
+ genreTree: genreData,
77
+ isFetchingGenreTree: false,
78
+ });
79
+ expect(reducer(initState, action)).toStrictEqual(newState);
80
+ });
81
+
82
+ it("handles EDIT_CLASSIFICATIONS_REQUEST", () => {
83
+ const action = {
84
+ type: ActionCreator.EDIT_CLASSIFICATIONS_REQUEST,
85
+ url: "test url",
86
+ };
87
+
88
+ // start with empty state
89
+ let newState = Object.assign({}, initState, {
90
+ isEditingClassifications: true,
91
+ });
92
+ expect(reducer(initState, action)).toStrictEqual(newState);
93
+
94
+ // start with error state
95
+ newState = Object.assign({}, errorState, {
96
+ isEditingClassifications: true,
97
+ fetchError: null,
98
+ });
99
+ expect(reducer(errorState, action)).toStrictEqual(newState);
100
+ });
101
+
102
+ it("handles EDIT_CLASSIFICATIONS_FAILURE", () => {
103
+ const action = {
104
+ type: ActionCreator.EDIT_CLASSIFICATIONS_FAILURE,
105
+ error: "test error",
106
+ };
107
+ const oldState = Object.assign({}, initState, {
108
+ isEditingClassifications: true,
109
+ });
110
+ const newState = Object.assign({}, oldState, {
111
+ fetchError: "test error",
112
+ isEditingClassifications: false,
113
+ });
114
+ expect(reducer(oldState, action)).toStrictEqual(newState);
115
+ });
116
+
117
+ it("handles CLASSIFICATIONS_REQUEST", () => {
118
+ const action = {
119
+ type: ActionCreator.CLASSIFICATIONS_REQUEST,
120
+ url: "test url",
121
+ };
122
+
123
+ // start with empty state
124
+ let newState = Object.assign({}, initState, {
125
+ isFetchingClassifications: true,
126
+ });
127
+ expect(reducer(initState, action)).toStrictEqual(newState);
128
+
129
+ // start with error state
130
+ newState = Object.assign({}, errorState, {
131
+ isFetchingClassifications: true,
132
+ fetchError: null,
133
+ });
134
+ expect(reducer(errorState, action)).toStrictEqual(newState);
135
+ });
136
+
137
+ it("handles CLASSIFICATIONS_FAILURE", () => {
138
+ const action = {
139
+ type: ActionCreator.CLASSIFICATIONS_FAILURE,
140
+ error: "test error",
141
+ };
142
+ const oldState = Object.assign({}, initState, { isFetching: true });
143
+ const newState = Object.assign({}, oldState, {
144
+ fetchError: "test error",
145
+ isFetchingClassifications: false,
146
+ });
147
+ expect(reducer(oldState, action)).toStrictEqual(newState);
148
+ });
149
+
150
+ it("handles CLASSIFICATIONS_LOAD", () => {
151
+ const action = {
152
+ type: ActionCreator.CLASSIFICATIONS_LOAD,
153
+ data: { classifications: classificationsData },
154
+ };
155
+ const newState = Object.assign({}, initState, {
156
+ classifications: classificationsData,
157
+ isFetchingClassifications: false,
158
+ });
159
+ expect(reducer(initState, action)).toStrictEqual(newState);
160
+ });
161
+ });