@thepalaceproject/circulation-admin 1.42.2 → 1.43.0-post.10

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 (78) hide show
  1. package/.node-version +1 -1
  2. package/.nvmrc +1 -1
  3. package/CLAUDE.md +17 -8
  4. package/README.md +7 -7
  5. package/dist/circulation-admin.js +1 -1
  6. package/eslint.config.mjs +9 -1
  7. package/jest.config.js +56 -9
  8. package/package.json +10 -20
  9. package/tests/jest/actions.test.ts +962 -0
  10. package/tests/jest/components/AccountPage.test.tsx +41 -0
  11. package/tests/jest/components/AdvancedSearchBooleanFilter.test.tsx +231 -0
  12. package/tests/jest/components/AdvancedSearchFilter.test.tsx +142 -0
  13. package/tests/jest/components/AdvancedSearchFilterInput.test.tsx +212 -0
  14. package/tests/jest/components/AdvancedSearchFilterViewer.test.tsx +52 -0
  15. package/tests/jest/components/AdvancedSearchValueFilter.test.tsx +123 -0
  16. package/tests/jest/components/BookDetails.test.tsx +133 -0
  17. package/tests/jest/components/BookDetailsContainer.test.tsx +116 -0
  18. package/tests/jest/components/CatalogServices.test.tsx +63 -0
  19. package/tests/jest/components/CirculationEventsDownloadForm.test.tsx +41 -0
  20. package/tests/jest/components/ConfigPage.test.tsx +58 -0
  21. package/tests/jest/components/CustomListPage.test.tsx +57 -0
  22. package/tests/jest/components/CustomListSearch.test.tsx +275 -0
  23. package/tests/jest/components/CustomListsSidebar.test.tsx +251 -0
  24. package/tests/jest/components/DashboardPage.test.tsx +76 -0
  25. package/tests/jest/components/DebugAuthentication.test.tsx +1 -5
  26. package/tests/jest/components/DiagnosticsTabContainer.test.tsx +147 -0
  27. package/tests/jest/components/EditableConfigList.test.tsx +8 -2
  28. package/tests/jest/components/EntryPointsContainer.test.tsx +97 -0
  29. package/tests/jest/components/EntryPointsTabs.test.tsx +88 -0
  30. package/tests/jest/components/ErrorMessage.test.tsx +97 -0
  31. package/tests/jest/components/Footer.test.tsx +141 -0
  32. package/tests/jest/components/InventoryReportRequestModal.test.tsx +16 -42
  33. package/tests/jest/components/JsonField.test.tsx +20 -0
  34. package/tests/jest/components/LaneEditor.test.tsx +2 -6
  35. package/tests/jest/components/LanePage.test.tsx +68 -0
  36. package/tests/jest/components/LanguageField.test.tsx +40 -0
  37. package/tests/jest/components/LoadButton.test.tsx +49 -0
  38. package/tests/jest/components/ManagePatrons.test.tsx +73 -0
  39. package/tests/jest/components/ManagePatronsForm.test.tsx +180 -0
  40. package/tests/jest/components/ManagePatronsTabContainer.test.tsx +143 -0
  41. package/tests/jest/components/MetadataServices.test.tsx +59 -0
  42. package/tests/jest/components/PatronBlockingRulesEditor.test.tsx +3 -1
  43. package/tests/jest/components/PatronInfo.test.tsx +54 -0
  44. package/tests/jest/components/ProtocolFormField.test.tsx +36 -0
  45. package/tests/jest/components/SaveButton.test.tsx +47 -0
  46. package/tests/jest/components/SelfTestResult.test.tsx +164 -0
  47. package/tests/jest/components/SelfTestsCategory.test.tsx +200 -0
  48. package/tests/jest/components/ServiceWithRegistrationsEditForm.test.tsx +110 -0
  49. package/tests/jest/components/SetupPage.test.tsx +41 -0
  50. package/tests/jest/components/SingleStatListItem.test.tsx +62 -0
  51. package/tests/jest/components/Stats.test.tsx +4 -8
  52. package/tests/jest/components/TabContainer.test.tsx +68 -0
  53. package/tests/jest/components/Timestamp.test.tsx +74 -0
  54. package/tests/jest/components/TroubleshootingTabContainer.test.tsx +68 -0
  55. package/tests/jest/components/UpdatingLoader.test.tsx +36 -0
  56. package/tests/jest/components/WelcomePage.test.tsx +43 -0
  57. package/tests/jest/components/WithEditButton.test.tsx +55 -0
  58. package/tests/jest/components/WithRemoveButton.test.tsx +95 -0
  59. package/tests/jest/editorAdapter.test.ts +245 -0
  60. package/tests/jest/index.test.tsx +50 -0
  61. package/tests/jest/legacy-setup.ts +13 -0
  62. package/tests/jest/legacyJsdomEnvironment.js +49 -0
  63. package/tests/jest/models/Admin.test.ts +206 -0
  64. package/tests/jest/reducers/bookCoverPreview.test.ts +81 -0
  65. package/tests/jest/reducers/classifications.test.ts +161 -0
  66. package/tests/jest/reducers/collections.test.ts +96 -0
  67. package/tests/jest/reducers/complaints.test.ts +166 -0
  68. package/tests/jest/reducers/createFetchEditReducer.test.ts +220 -0
  69. package/tests/jest/reducers/createRegisterLibraryReducer.test.ts +51 -0
  70. package/tests/jest/reducers/customListDetails.test.ts +120 -0
  71. package/tests/jest/reducers/customListEditor.test.ts +2823 -0
  72. package/tests/jest/reducers/managePatrons.test.ts +71 -0
  73. package/tests/jest/testUtils/formDataShim.test.ts +135 -0
  74. package/tests/jest/testUtils/formDataShim.ts +112 -0
  75. package/tests/jest/utils/sharedFunctions.test.ts +121 -0
  76. package/tsconfig.json +3 -4
  77. package/testReporter.js +0 -29
  78. package/tests/jest/components/AdvancedSearchBuilder.test.tsx +0 -38
@@ -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
+ });
@@ -0,0 +1,96 @@
1
+ import collections from "../../../src/reducers/collections";
2
+ import ActionCreator from "../../../src/actions";
3
+
4
+ describe("collections reducer", () => {
5
+ const initState = {
6
+ data: null,
7
+ isFetching: false,
8
+ isEditing: false,
9
+ fetchError: null,
10
+ formError: null,
11
+ responseBody: null,
12
+ isLoaded: false,
13
+ successMessage: null,
14
+ };
15
+
16
+ it("returns initial state for unrecognized action", () => {
17
+ expect(collections(undefined, {})).toStrictEqual(initState);
18
+ });
19
+
20
+ it("handles COLLECTIONS_REQUEST", () => {
21
+ const action = {
22
+ type: `${ActionCreator.COLLECTIONS}_REQUEST`,
23
+ url: "test url",
24
+ };
25
+
26
+ // start with empty state
27
+ const newState = Object.assign({}, initState, {
28
+ isFetching: true,
29
+ });
30
+ expect(collections(initState, action)).toStrictEqual(newState);
31
+ });
32
+
33
+ it("handles EDIT_COLLECTION_REQUEST", () => {
34
+ const action = { type: `${ActionCreator.EDIT_COLLECTION}_REQUEST` };
35
+ const newState = Object.assign({}, initState, {
36
+ fetchError: null,
37
+ isFetching: false,
38
+ isEditing: true,
39
+ });
40
+ expect(collections(initState, action)).toStrictEqual(newState);
41
+ });
42
+
43
+ it("handles GET_SELF_TESTS_LOAD", () => {
44
+ const emptySelfTestData = {
45
+ duration: null,
46
+ start: "",
47
+ end: "",
48
+ results: [],
49
+ };
50
+ const selfTestData = {
51
+ duration: 0.12,
52
+ start: "start",
53
+ end: "end",
54
+ results: [],
55
+ };
56
+ const action = {
57
+ type: `${ActionCreator.GET_SELF_TESTS}_LOAD`,
58
+ data: {
59
+ self_test_results: {
60
+ id: 1,
61
+ self_test_results: selfTestData,
62
+ protocol: "",
63
+ },
64
+ },
65
+ };
66
+ const oldState = {
67
+ url: "test url",
68
+ data: {
69
+ collections: [
70
+ { id: 1, self_test_results: emptySelfTestData, protocol: "" },
71
+ { id: 2, protocol: "" },
72
+ ],
73
+ protocols: [],
74
+ },
75
+ isFetching: true,
76
+ fetchError: null,
77
+ editError: null,
78
+ isLoaded: true,
79
+ isEditing: false,
80
+ };
81
+
82
+ const newState = Object.assign({}, oldState, {
83
+ data: {
84
+ collections: [
85
+ { id: 1, self_test_results: selfTestData, protocol: "" },
86
+ { id: 2, protocol: "" },
87
+ ],
88
+ protocols: [],
89
+ },
90
+ isFetching: false,
91
+ isLoaded: true,
92
+ });
93
+
94
+ expect(collections(oldState, action)).toStrictEqual(newState);
95
+ });
96
+ });