// @flow import { fill } from 'lodash'; import {EntitiesManager as EM} from '../../src/index'; import configureEntitiesManager from '../utils/configureEntitiesManager'; import configureStore from '../utils/configureStore'; import deleteCollection from '../utils/deleteCollection'; const em = configureEntitiesManager({ parent: { createdAt: EM.createdAt(), childrenCount: EM.count('child', [['value', '<=', 3]]), childrenSum: EM.sum('child', 'value', [['value', '>=', 4]]) }, child: { parentIds: EM.parentIds('parent'), createdAt: EM.createdAt(), updatedAt: EM.updatedAt(), value: EM.required() } }); const store = configureStore({}, { entities: em.getEntitiesReducer() }); describe('update multiple parents)', () => { const parentsNum = 2; const childrenNum = 3; let parents = []; let children = []; describe('adding parents', () => { it('should resolve with id(s)', () => { const addingParentPromises = []; for (let i = 0; i < parentsNum; i += 1) { addingParentPromises.push(store.dispatch(em.entity('parent').addItem({ }))); } return Promise.all(addingParentPromises) .then((results) => { parents = em.entity('parent').getAllItemList()(store.getState()); expect(results).toEqual(fill(Array(parentsNum), jasmine.any(String))); expect(parents).toEqual(fill(Array(parentsNum), { id: jasmine.any(String), createdAt: jasmine.any(Number), childrenCount: 0, childrenSum: 0 })); }); }, 15000); }); describe('adding children', () => { it('should reolve with id(s)', () => { const addingChildPromises = []; addingChildPromises.push(store.dispatch(em.entity('child').addItem({ // parentIds: [], value: 3 }))); addingChildPromises.push(store.dispatch(em.entity('child').addItem({ // parentIds: [], value: 4 }))); addingChildPromises.push(store.dispatch(em.entity('child').addItem({ // parentIds: [], value: 5 }))); return Promise.all(addingChildPromises) .then((results) => { children = em.entity('child').getAllItemList()(store.getState()); expect(results).toEqual(fill(Array(childrenNum), jasmine.any(String))); console.log('children:', children); expect(children).toEqual(fill(Array(childrenNum), { id: jasmine.any(String), parentIds: {}, createdAt: jasmine.any(Number), updatedAt: jasmine.any(Number), value: jasmine.any(Number) })); }); }, 15000); }); describe('changing relations (adding parentIds)', () => { it('should change parents', () => { const updateChildPromises = []; children.forEach((child) => { updateChildPromises.push( store.dispatch(em.entity('child').updateItem( child.id, { parentIds: { [parents[0].id]: true, [parents[1].id]: true } } )) ); }); return Promise.all(updateChildPromises).then((results) => { expect(results).toEqual(fill(Array(3), 'DONE')); children = em.entity('child').getAllItemList()(store.getState()); parents = em.entity('parent').getAllItemList()(store.getState()); expect(children).toEqual(fill(Array(childrenNum), { id: jasmine.any(String), parentIds: { [parents[0].id]: true, [parents[1].id]: true }, createdAt: jasmine.any(Number), updatedAt: jasmine.any(Number), value: jasmine.any(Number) })); expect(parents).toEqual(fill(Array(parentsNum), { id: jasmine.any(String), createdAt: jasmine.any(Number), childrenCount: 1, childrenSum: 9 })); }); }, 150000); }); describe('changing relations (remove parentIds)', () => { it('should change parents', () => { const updateChildPromises = []; children.forEach((child) => { updateChildPromises.push( store.dispatch(em.entity('child').updateItem( child.id, { parentIds: {[parents[0].id]: true} } )) ); }); return Promise.all(updateChildPromises).then((results) => { expect(results).toEqual(fill(Array(3), 'DONE')); children = em.entity('child').getAllItemList()(store.getState()); parents = em.entity('parent').getAllItemList()(store.getState()); expect(children).toEqual(fill(Array(childrenNum), { id: jasmine.any(String), parentIds: { [parents[0].id]: true }, createdAt: jasmine.any(Number), updatedAt: jasmine.any(Number), value: jasmine.any(Number) })); expect(parents).toEqual([ { id: jasmine.any(String), createdAt: jasmine.any(Number), childrenCount: 1, childrenSum: 9 }, { id: jasmine.any(String), createdAt: jasmine.any(Number), childrenCount: 0, childrenSum: 0 } ]); }); }, 150000); }); afterAll(() => Promise.all([ deleteCollection('parent'), deleteCollection('child') ]).then((results) => { console.log('deleted results:', results); }), 1000000); });