query-state
Version:
Application state in query string
143 lines (106 loc) • 3.38 kB
JavaScript
var makeQueryState = require('../');
var test = require('tap').test;
test('it can set app state', function(t) {
var queryState = makeQueryState();
queryState.set('foo', 'bar');
var fooValue = queryState.get('foo')
t.equals(fooValue, 'bar', 'foo value is set correctly');
queryState.set('another', '42');
var anotherValue = queryState.get('another')
t.equals(anotherValue, '42', 'another value is set correctly');
var appState = queryState.get();
t.deepEquals(appState, {
foo: 'bar',
another: '42'
}, 'the entire state is correct')
t.end();
});
test('it monitors events', function(t) {
var queryState = makeQueryState();
queryState.onChange(function(newState) {
t.deepEquals(newState, {
foo: 'bar'
}, 'query state changed');
t.end();
});
queryState.set('foo', 'bar');
});
test('it can unsubscribe from events', function(t) {
var queryState = makeQueryState();
queryState.onChange(fail);
queryState.offChange(fail);
queryState.set('foo', 'bar');
// end test a little later
setTimeout(function() { t.end(); }, 30);
function fail() { t.fail('this should never be called'); }
});
test('it can pass the context', function(t) {
var queryState = makeQueryState();
var ctx = {};
queryState.onChange(checkContext, ctx);
queryState.set('foo', 'bar');
function checkContext() {
t.ok(ctx === this, 'context is set correctly');
t.end();
}
});
test('it can dispose', function(t) {
var queryState = makeQueryState();
queryState.onChange(fail);
queryState.dispose();
queryState.set('foo', 'bar');
// end test a little later
setTimeout(function() { t.end(); }, 30);
function fail() { t.fail('this should never be called'); }
});
test('it can init default state', function(t) {
var defaults = {
foo: 'bar'
};
var queryState = makeQueryState(defaults);
var initializedState = queryState.get();
t.equals(Object.keys(initializedState).length, 1, 'state has just one key');
t.equals(initializedState.foo, defaults.foo, 'and it is the same as defaults');
t.end();
});
test('it can set properties if they are empty', function(t) {
var original = {
foo: 'bar'
};
var queryState = makeQueryState(original);
var moreProperties = {
foo: 'baz',
answer: 42
};
queryState.setIfEmpty(moreProperties);
var appState = queryState.get()
t.equals(appState.foo, 'bar', 'foo was not updated as it is not empty')
t.equals(appState.answer, 42, 'answer was added')
t.end();
});
test('it can chain calls', function(t) {
var qs = makeQueryState();
qs.set('name', 'Haddaway').set('song', 'What is love?');
t.equals(qs.get('name'), 'Haddaway', 'name is set');
t.equals(qs.get('song'), 'What is love?', 'song is set');
t.end();
});
test('it updates query when change fires', function(t) {
var qs = makeQueryState();
var history = qs.getHistoryObject();
history.set({
foo: 42
});
qs.onChange(function() {
t.equals(qs.get('foo'), 42, 'query state is updated from history');
t.end();
});
})
test('it can create singleton', function(t) {
var qsA = makeQueryState.instance({age: 42});
var qsB = makeQueryState.instance({age: 100, height: 180});
t.ok(qsA === qsB, 'they are the same')
t.equals(qsA.get('age'), 42, 'age is set to 42');
t.equals(qsA.get('height'), 180, 'height is 180');
t.end();
});