infect-frontend
Version:
infect fronend
126 lines (104 loc) • 3.13 kB
JavaScript
import test from 'tape';
import Store from './store';
import { observe } from 'mobx';
test('stores on init', (t) => {
const values = [{ id: 1 }, { id: 2 }];
const store = new Store(values);
t.equal(store.get().size, 2);
t.end();
});
test('returns values', (t) => {
const store = new Store([{ id: 1 }, { id: 2 }]);
t.equal(store.get().size, 2);
t.equal(store.getAsArray().length, 2);
t.end();
});
test('throws if id is missing', (t) => {
t.throws(() => new Store([{ id: 1 }, { a: 2 }]), /"a":2/);
t.end();
});
test('adds items', (t) => {
const store = new Store([{ id: 1 }, { id: 2 }]);
store.add({ id: 3 });
t.equals(store.get().size, 3);
t.end();
});
test('does not overwrite items', (t) => {
const store = new Store([{ id: 1 }, { id: 2 }]);
t.throws(() => store.add({ id: 2 }));
t.doesNotThrow(() => store.add({ id: 2 }, true));
t.equals(store.get().size, 2);
t.end();
});
test('hasWithId works as expected', (t) => {
const store = new Store([{ id: 1 }, { id: 2 }], (item) => item.id);
t.equals(store.hasWithId({ id: 1, otherProp: 4 }), true);
t.equals(store.hasWithId({ id: 4, otherProp: 1 }), false);
t.end();
});
test('calculates correct item id', (t) => {
const store = new Store([], (item) => item.ide);
t.equals(store._getItemId({ ide: 1 }), 1);
const noItemStore = new Store([]);
t.equals(noItemStore._getItemId({ id: 1 }), 1);
t.end();
});
test('uses idGeneratorFunction if provided', (t) => {
const store = new Store([], (item) => item.idA + '/' + item.idB);
t.doesNotThrow(() => store.add({ idA: 3, idB: 3 }));
// Duplicate entry
t.throws(() => store.add({ idA: 3, idB: 3 }));
store.add({ idA: 3, idB: 4 });
t.equals(store.getById('3/3') !== undefined, true);
t.equals(store.getAsArray().length, 2);
t.end();
});
test('clears items', (t) => {
const store = new Store();
store.add({id: 1, value: 'test1'});
store.add({id: 2, value: 'test2'});
store.clear();
t.equals(store.get().size, 0);
t.end();
});
test('removes item', (t) => {
const store = new Store([{ id: 1 }, { id: 3 }]);
store.remove({ id: 1, value: 7});
t.equals(store.getAsArray().length, 1);
t.equals(store.getById(1), undefined);
t.end();
});
test('returns default status', (t) => {
const store = new Store();
t.equals(store.status.identifier, 'initialized');
t.end();
});
test('prevents setting of invalid states', (t) => {
const store = new Store();
t.throws(() => store.setFetchPromise(null), /Promise/);
t.end();
});
test('setting fetchPromise updates status and promise', (t) => {
const store = new Store();
t.equals(store.status.identifier, 'initialized');
store.setFetchPromise(new Promise((resolve) => {
setTimeout(resolve, 50);
}));
t.equals(store.status.identifier, 'loading');
observe(store.status, (status) => {
t.equals(status.newValue, 'ready');
t.end();
});
});
test('sets status to error on errors', (t) => {
const store = new Store();
store.setFetchPromise(new Promise((resolve, reject) => {
setTimeout(() => {
reject();
}, 50);
}));
observe(store.status, (status) => {
t.equals(store.status.identifier, 'error');
t.end();
});
});