mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-12-29 03:43:16 +08:00
172 lines
6.8 KiB
JavaScript
172 lines
6.8 KiB
JavaScript
/* eslint quote-props: 0 */
|
|
import MutableQueryResultSet from '../../src/flux/models/mutable-query-result-set';
|
|
import QueryRange from '../../src/flux/models/query-range';
|
|
|
|
describe('MutableQueryResultSet', function MutableQueryResultSetSpecs() {
|
|
describe('clipToRange', () => {
|
|
it('should do nothing if the clipping range is infinite', () => {
|
|
const set = new MutableQueryResultSet({ _ids: ['A', 'B', 'C', 'D', 'E'], _offset: 5 });
|
|
const beforeRange = set.range();
|
|
set.clipToRange(QueryRange.infinite());
|
|
const afterRange = set.range();
|
|
|
|
expect(beforeRange.isEqual(afterRange)).toBe(true);
|
|
});
|
|
|
|
it('should correctly trim the result set 5-10 to the clipping range 2-9', () => {
|
|
const set = new MutableQueryResultSet({ _ids: ['A', 'B', 'C', 'D', 'E'], _offset: 5 });
|
|
expect(set.range().isEqual(new QueryRange({ offset: 5, limit: 5 }))).toBe(true);
|
|
set.clipToRange(new QueryRange({ offset: 2, limit: 7 }));
|
|
expect(set.range().isEqual(new QueryRange({ offset: 5, limit: 4 }))).toBe(true);
|
|
expect(set.ids()).toEqual(['A', 'B', 'C', 'D']);
|
|
});
|
|
|
|
it('should correctly trim the result set 5-10 to the clipping range 5-10', () => {
|
|
const set = new MutableQueryResultSet({ _ids: ['A', 'B', 'C', 'D', 'E'], _offset: 5 });
|
|
set.clipToRange(new QueryRange({ start: 5, end: 10 }));
|
|
expect(set.range().isEqual(new QueryRange({ start: 5, end: 10 }))).toBe(true);
|
|
expect(set.ids()).toEqual(['A', 'B', 'C', 'D', 'E']);
|
|
});
|
|
|
|
it('should correctly trim the result set 5-10 to the clipping range 6', () => {
|
|
const set = new MutableQueryResultSet({ _ids: ['A', 'B', 'C', 'D', 'E'], _offset: 5 });
|
|
set.clipToRange(new QueryRange({ offset: 6, limit: 1 }));
|
|
expect(set.range().isEqual(new QueryRange({ offset: 6, limit: 1 }))).toBe(true);
|
|
expect(set.ids()).toEqual(['B']);
|
|
});
|
|
|
|
it('should correctly trim the result set 5-10 to the clipping range 100-200', () => {
|
|
const set = new MutableQueryResultSet({ _ids: ['A', 'B', 'C', 'D', 'E'], _offset: 5 });
|
|
set.clipToRange(new QueryRange({ start: 100, end: 200 }));
|
|
expect(set.range().isEqual(new QueryRange({ start: 100, end: 100 }))).toBe(true);
|
|
expect(set.ids()).toEqual([]);
|
|
});
|
|
|
|
it('should correctly trim the result set 5-10 to the clipping range 0-2', () => {
|
|
const set = new MutableQueryResultSet({ _ids: ['A', 'B', 'C', 'D', 'E'], _offset: 5 });
|
|
set.clipToRange(new QueryRange({ offset: 0, limit: 2 }));
|
|
expect(set.range().isEqual(new QueryRange({ offset: 5, limit: 0 }))).toBe(true);
|
|
expect(set.ids()).toEqual([]);
|
|
});
|
|
|
|
it('should trim the models cache to remove models no longer needed', () => {
|
|
const set = new MutableQueryResultSet({
|
|
_ids: ['A', 'B', 'C', 'D', 'E'],
|
|
_offset: 5,
|
|
_modelsHash: {
|
|
A: { id: 'A' },
|
|
B: { id: 'B' },
|
|
C: { id: 'C' },
|
|
D: { id: 'D' },
|
|
E: { id: 'E' },
|
|
},
|
|
});
|
|
|
|
set.clipToRange(new QueryRange({ start: 5, end: 8 }));
|
|
expect(set._modelsHash).toEqual({
|
|
A: { id: 'A' },
|
|
B: { id: 'B' },
|
|
C: { id: 'C' },
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('addIdsInRange', () => {
|
|
describe('when the set is currently empty', () =>
|
|
it('should set the result set to the provided one', () => {
|
|
this.set = new MutableQueryResultSet();
|
|
this.set.addIdsInRange(['B', 'C', 'D'], new QueryRange({ start: 1, end: 4 }));
|
|
expect(this.set.ids()).toEqual(['B', 'C', 'D']);
|
|
expect(this.set.range().isEqual(new QueryRange({ start: 1, end: 4 }))).toBe(true);
|
|
}));
|
|
|
|
describe('when the set has existing values', () => {
|
|
beforeEach(() => {
|
|
this.set = new MutableQueryResultSet({
|
|
_ids: ['A', 'B', 'C', 'D', 'E'],
|
|
_offset: 5,
|
|
_modelsHash: {
|
|
A: { id: 'A' },
|
|
B: { id: 'B' },
|
|
C: { id: 'C' },
|
|
D: { id: 'D' },
|
|
E: { id: 'E' },
|
|
},
|
|
});
|
|
});
|
|
|
|
it("should throw an exception if the range provided doesn't intersect (trailing)", () => {
|
|
expect(() => {
|
|
this.set.addIdsInRange(['G', 'H', 'I'], new QueryRange({ offset: 11, limit: 3 }));
|
|
}).toThrow();
|
|
|
|
expect(() => {
|
|
this.set.addIdsInRange(['F', 'G', 'H'], new QueryRange({ offset: 10, limit: 3 }));
|
|
}).not.toThrow();
|
|
});
|
|
|
|
it("should throw an exception if the range provided doesn't intersect (leading)", () => {
|
|
expect(() => {
|
|
this.set.addIdsInRange(['0', '1', '2'], new QueryRange({ offset: 1, limit: 3 }));
|
|
}).toThrow();
|
|
|
|
expect(() => {
|
|
this.set.addIdsInRange(['0', '1', '2'], new QueryRange({ offset: 2, limit: 3 }));
|
|
}).not.toThrow();
|
|
});
|
|
|
|
it('should work if the IDs array is shorter than the result range they represent (addition)', () => {
|
|
this.set.addIdsInRange(['F', 'G', 'H'], new QueryRange({ offset: 10, limit: 5 }));
|
|
expect(this.set.ids()).toEqual(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']);
|
|
});
|
|
|
|
it('should work if the IDs array is shorter than the result range they represent (replacement)', () => {
|
|
this.set.addIdsInRange(['A', 'B', 'C'], new QueryRange({ offset: 5, limit: 5 }));
|
|
expect(this.set.ids()).toEqual(['A', 'B', 'C']);
|
|
});
|
|
|
|
it('should correctly add ids (trailing) and update the offset', () => {
|
|
this.set.addIdsInRange(['F', 'G', 'H'], new QueryRange({ offset: 10, limit: 3 }));
|
|
expect(this.set.ids()).toEqual(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']);
|
|
expect(this.set.range().offset).toEqual(5);
|
|
});
|
|
|
|
it('should correctly add ids (leading) and update the offset', () => {
|
|
this.set.addIdsInRange(['0', '1', '2'], new QueryRange({ offset: 2, limit: 3 }));
|
|
expect(this.set.ids()).toEqual(['0', '1', '2', 'A', 'B', 'C', 'D', 'E']);
|
|
expect(this.set.range().offset).toEqual(2);
|
|
});
|
|
|
|
it('should correctly add ids (middle) and update the offset', () => {
|
|
this.set.addIdsInRange(
|
|
['B-new', 'C-new', 'D-new'],
|
|
new QueryRange({ offset: 6, limit: 3 })
|
|
);
|
|
expect(this.set.ids()).toEqual(['A', 'B-new', 'C-new', 'D-new', 'E']);
|
|
expect(this.set.range().offset).toEqual(5);
|
|
});
|
|
|
|
it('should correctly add ids (middle+trailing) and update the offset', () => {
|
|
this.set.addIdsInRange(
|
|
['D-new', 'E-new', 'F-new'],
|
|
new QueryRange({ offset: 8, limit: 3 })
|
|
);
|
|
expect(this.set.ids()).toEqual(['A', 'B', 'C', 'D-new', 'E-new', 'F-new']);
|
|
expect(this.set.range().offset).toEqual(5);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('updateModel', () => {
|
|
beforeEach(() => {
|
|
this.mockModel = id => {
|
|
return {
|
|
id: id,
|
|
constructor: {
|
|
attributes: [],
|
|
},
|
|
};
|
|
};
|
|
});
|
|
});
|
|
});
|