123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- import {createStore} from 'reflux';
- import StreamManager from 'sentry/utils/streamManager';
- describe('StreamManager', function () {
- let store;
- beforeEach(function () {
- store = createStore({
- add() {},
- getAllItems() {},
- remove() {},
- });
- });
- it('allows options configuration', function () {
- const options = {limit: 2};
- const mgr = new StreamManager(store, options);
- expect(mgr.limit).toEqual(options.limit);
- });
- describe('push()', function () {
- it('allows passing no items', function () {
- const mgr = new StreamManager(store);
- expect(() => mgr.push()).not.toThrow();
- expect(() => mgr.push([])).not.toThrow();
- expect(mgr.idList).toHaveLength(0);
- });
- it('adds items', function () {
- const storeAdd = jest.spyOn(store, 'add');
- const mgr = new StreamManager(store);
- const items = [{id: 1}];
- mgr.push(items);
- expect(mgr.idList).toHaveLength(1);
- expect(storeAdd).toHaveBeenCalledWith(items);
- });
- it('allows adding a single item', function () {
- const storeAdd = jest.spyOn(store, 'add');
- const mgr = new StreamManager(store);
- const item = {id: 1};
- mgr.push(item);
- expect(mgr.idList).toHaveLength(1);
- expect(storeAdd).toHaveBeenCalledWith([item]);
- });
- it('trims after adding', function () {
- const mgr = new StreamManager(store, {limit: 1});
- const storeRemove = jest.spyOn(store, 'remove');
- const mgrTrim = jest.spyOn(mgr, 'trim');
- mgr.push([{id: 1}, {id: 2}]);
- expect(mgr.idList).toHaveLength(1);
- expect(storeRemove).toHaveBeenCalledWith([2]);
- expect(mgrTrim).toHaveBeenCalled();
- });
- it('preserves NEW order of duplicates', function () {
- const mgr = new StreamManager(store);
- mgr.push([{id: 1}, {id: 3}]);
- mgr.push([{id: 1}, {id: 2}]); // New order of "1" if after "3"
- expect(mgr.idList).toEqual([3, 1, 2]);
- });
- });
- describe('trim()', function () {
- it('removes trailing items in excess of the limit', function () {
- const storeRemove = jest.spyOn(store, 'remove');
- const mgr = new StreamManager(store, {limit: 1});
- mgr.idList = [1, 2, 3];
- mgr.trim();
- expect(mgr.idList).toEqual([1]);
- expect(mgr.idList).toHaveLength(1);
- expect(storeRemove).toHaveBeenCalledWith([2, 3]);
- });
- it('does nothing with fewer items than limit', function () {
- const storeRemove = jest.spyOn(store, 'remove');
- const mgr = new StreamManager(store, {limit: 10});
- mgr.idList = [1, 2, 3];
- mgr.trim();
- expect(mgr.idList).toEqual([1, 2, 3]);
- expect(mgr.idList).toHaveLength(3);
- expect(storeRemove).not.toHaveBeenCalled();
- });
- });
- describe('getAllItems()', function () {
- it('retrives ordered items from store', function () {
- const storeGetAllItems = jest
- .spyOn(store, 'getAllItems')
- .mockImplementation(() => [{id: 1}, {id: 2}]);
- const mgr = new StreamManager(store);
- mgr.push({id: 2});
- mgr.push({id: 1});
- const items = mgr.getAllItems();
- expect(items).toEqual([{id: 2}, {id: 1}]);
- expect(storeGetAllItems).toHaveBeenCalled();
- });
- it('does not mutate store', function () {
- const storeItems = [{id: 1}, {id: 2}];
- jest.spyOn(store, 'getAllItems').mockImplementation(() => storeItems);
- const mgr = new StreamManager(store);
- mgr.push([{id: 2}, {id: 1}]);
- mgr.getAllItems();
- expect(store.getAllItems()).toEqual([{id: 1}, {id: 2}]);
- });
- });
- describe('unshift()', function () {
- it('adds items to the start of the list', function () {
- const storeAdd = jest.spyOn(store, 'add');
- const mgr = new StreamManager(store);
- mgr.unshift([{id: 2}]);
- mgr.unshift([{id: 1}]);
- expect(mgr.idList).toEqual([1, 2]);
- expect(storeAdd.mock.calls[0][0]).toEqual([{id: 2}]);
- expect(storeAdd.mock.calls[1][0]).toEqual([{id: 1}]);
- });
- it('moves duplicates to the start of the list', function () {
- const mgr = new StreamManager(store);
- mgr.unshift([{id: 2}, {id: 1}]);
- mgr.unshift([{id: 1}]);
- expect(mgr.idList).toEqual([1, 2]);
- });
- it('moves a duplicate array to the start of the list and preserves order', function () {
- const mgr = new StreamManager(store);
- mgr.unshift([{id: 3}, {id: 2}, {id: 1}]);
- mgr.unshift([{id: 2}, {id: 1}]);
- expect(mgr.idList).toEqual([2, 1, 3]);
- });
- it('allows adding a single item', function () {
- const mgr = new StreamManager(store);
- mgr.unshift({id: 1});
- expect(mgr.idList).toEqual([1]);
- });
- });
- });
|