Просмотр исходного кода

Added selector to get CRUD list items

Fela Maslen 7 лет назад
Родитель
Сommit
43069cf783
5 измененных файлов с 74 добавлено и 0 удалено
  1. 5 0
      package-lock.json
  2. 1 0
      package.json
  3. 14 0
      src/selectors/crud.js
  4. 53 0
      test/selectors/crud.spec.js
  5. 1 0
      webpack.config.js

+ 5 - 0
package-lock.json

@@ -9701,6 +9701,11 @@
         }
       }
     },
+    "reselect": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz",
+      "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA=="
+    },
     "resolve": {
       "version": "1.9.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",

+ 1 - 0
package.json

@@ -86,6 +86,7 @@
     "redux": "^4.0.1",
     "redux-saga": "^0.16.2",
     "request-promise": "^4.2.2",
+    "reselect": "^4.0.0",
     "soap": "^0.25.0",
     "winston": "^3.1.0"
   }

+ 14 - 0
src/selectors/crud.js

@@ -0,0 +1,14 @@
+import { createSelector } from 'reselect';
+
+const routeExists = (state, route) => route in state.crud;
+
+function getRouteDocs(state, route) {
+    if (state.crud[route]) {
+        return state.crud[route].items;
+    }
+
+    return [];
+}
+
+export const getDocs = createSelector([routeExists, getRouteDocs], (exists, docs) => docs);
+

+ 53 - 0
test/selectors/crud.spec.js

@@ -0,0 +1,53 @@
+import { expect } from 'chai';
+
+import {
+    getDocs
+} from 'selectors/crud';
+
+describe('CRUD selectors', () => {
+    describe('getDocs', () => {
+        const route = 'employees';
+
+        it('should return the list of docs', () => {
+            const state = {
+                crud: {
+                    [route]: {
+                        items: [
+                            {
+                                id: '<actualId>',
+                                name: 'John Doe',
+                                email: 'john.doe@mubaloo.com'
+                            }
+                        ]
+                    }
+                }
+            };
+
+            const result = getDocs(state, route);
+
+            expect(result).to.deep.equal(state.crud[route].items);
+        });
+
+        it('should return an empty array by default', () => {
+            const state = {
+                crud: {}
+            };
+
+            const result = getDocs(state, route);
+
+            expect(result).to.deep.equal([]);
+        });
+
+        it('should memoise default results', () => {
+            const state = {
+                crud: {}
+            };
+
+            const resultA = getDocs(state, route);
+            const resultB = getDocs(state, route);
+
+            expect(resultA).to.equal(resultB);
+        });
+    });
+});
+

+ 1 - 0
webpack.config.js

@@ -158,6 +158,7 @@ module.exports = {
             containers: path.resolve(__dirname, 'src/containers'),
             reducers: path.resolve(__dirname, 'src/reducers'),
             sagas: path.resolve(__dirname, 'src/sagas'),
+            selectors: path.resolve(__dirname, 'src/selectors'),
             sprite: path.resolve(__dirname, 'src/images/sprite/sprite.scss')
         }
     },