158 lines
4.8 KiB
JavaScript
158 lines
4.8 KiB
JavaScript
var tinytest = require('tinytest')
|
|
|
|
tinytest.hijackConsoleLog()
|
|
|
|
var { createStore } = require('../src/store-engine')
|
|
var { each } = require('../src/util')
|
|
var storages = require('../storages/all')
|
|
var allPluginTests = require('../plugins/all_tests')
|
|
|
|
module.exports = {
|
|
output:null,
|
|
outputError:null,
|
|
runTests: runTests,
|
|
failed:false
|
|
}
|
|
|
|
function runTests() {
|
|
setupEngineTests()
|
|
each(storages, function(storage) {
|
|
test.group(storage.name, function() {
|
|
if (!_checkEnabled(storage)) {
|
|
test.skip('disabled')
|
|
}
|
|
test('Storage tests', function() {
|
|
var store = createStore([storage])
|
|
runStorageTests(store)
|
|
})
|
|
each(allPluginTests, function(pluginTest, pluginName) {
|
|
var plugin = pluginTest.plugin
|
|
test.group('plugin: '+pluginName, function() {
|
|
var store = createStore([storage], [plugin])
|
|
pluginTest.setup(store)
|
|
})
|
|
})
|
|
})
|
|
})
|
|
|
|
require('./bugs/all')
|
|
|
|
tinytest.runTests({
|
|
failFast: false
|
|
})
|
|
}
|
|
|
|
function _checkEnabled(storage) {
|
|
if (!storage) {
|
|
print('Skip unsupported storage:', storage.name)
|
|
return false
|
|
}
|
|
var store = createStore([storage])
|
|
if (!store.enabled) {
|
|
print('Skip disabled storage:', storage.name)
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
function setupEngineTests(store) {
|
|
test('Addon super_fn args', function() {
|
|
function underlyingPlugin() {
|
|
return {
|
|
set: function(super_fn, key, val, customArg1, customArg2) {
|
|
assert(key == 'key'+'appended')
|
|
assert(val == 'val')
|
|
assert(customArg1 == 'overridden-customArg1')
|
|
assert(customArg2 == 'customArg2')
|
|
calls++
|
|
}
|
|
}
|
|
}
|
|
function overlyingPlugin() {
|
|
return {
|
|
set: function(super_fn, key, val) {
|
|
super_fn(key+'appended', val, 'overridden-customArg1')
|
|
calls++
|
|
}
|
|
}
|
|
}
|
|
|
|
var store = createStore(storages.memoryStorage, [underlyingPlugin, overlyingPlugin])
|
|
var calls = 0
|
|
store.set('key', 'val', 'customArg1', 'customArg2')
|
|
assert(calls == 2)
|
|
})
|
|
}
|
|
|
|
function runStorageTests(store) {
|
|
assert(store.enabled && store.enabled, "store should be enabled")
|
|
store.clearAll()
|
|
|
|
store.get('unsetValue') // see https://github.com/marcuswestin/store.js/issues/63
|
|
|
|
store.set('foo', 'bar')
|
|
assert(store.get('foo') == 'bar', "stored key 'foo' not equal to stored value 'bar'")
|
|
|
|
store.remove('foo')
|
|
assert(store.get('foo') === undefined, "removed key 'foo' not undefined")
|
|
|
|
assert(store.get('foo') === undefined, "key 'foo' exists when it shouldn't")
|
|
assert(store.set('foo','value') == 'value', "store#set returns the stored value")
|
|
assert(store.get('foo') !== undefined, "key 'foo' doesn't exist when it should")
|
|
|
|
store.set('foo', 'bar1')
|
|
store.set('foo', 'bar2')
|
|
assert(store.get('foo') == 'bar2', "key 'foo' is not equal to second value set 'bar2'")
|
|
|
|
store.set('foo', 'bar')
|
|
store.set('bar', 'foo')
|
|
store.remove('foo')
|
|
assert(store.get('foo') === undefined, "key 'foo' exists when it shouldn't")
|
|
assert(store.get('bar') == 'foo', "removing key 'foo' also removed key 'bar'")
|
|
|
|
store.set('foo', 'bar')
|
|
store.set('bar', 'foo')
|
|
store.clearAll()
|
|
assert(store.get('foo') === undefined && store.get('bar') === undefined, "keys foo and bar not cleared after store cleared")
|
|
|
|
assert(store.get('defaultVal', 123) == 123, "store.get should return default value")
|
|
|
|
store.set('foo', { name: 'marcus', arr: [1,2,3] })
|
|
assert(typeof store.get('foo') == 'object', "type of stored object 'foo' is not 'object'")
|
|
assert(store.get('foo') instanceof Object, "stored object 'foo' is not an instance of Object")
|
|
assert(store.get('foo').name == 'marcus', "property 'name' of stored object 'foo' is not 'marcus'")
|
|
assert(store.get('foo').arr instanceof Array, "Array property 'arr' of stored object 'foo' is not an instance of Array")
|
|
assert(store.get('foo').arr.length == 3, "The length of Array property 'arr' stored on object 'foo' is not 3")
|
|
|
|
store.remove('circularReference')
|
|
var circularOne = {}
|
|
var circularTwo = { one:circularOne }
|
|
circularOne.two = circularTwo
|
|
var threw = false
|
|
try { store.set('circularReference', circularOne) }
|
|
catch(e) { threw = true }
|
|
assert(threw, "storing object with circular reference did not throw")
|
|
assert(!store.get('circularReference'), "attempting to store object with circular reference which should have faile affected store state")
|
|
|
|
// If plain local storage was used before store.js, we should attempt to JSON.parse them into javascript values.
|
|
// Store values using vanilla localStorage, then read them out using store.js
|
|
var promoteValues = {
|
|
'int' : 42,
|
|
'bool' : true,
|
|
'float' : 3.141592653,
|
|
'string' : "Don't Panic",
|
|
'odd_string' : "{ZYX'} abc:;::)))"
|
|
}
|
|
for (var key in promoteValues) {
|
|
store.storage.write(key, promoteValues[key])
|
|
assert(store.get(key) == promoteValues[key], key+" was not correctly promoted to valid JSON")
|
|
store.remove(key)
|
|
}
|
|
store.clearAll()
|
|
var count = 0
|
|
store.each(function() {
|
|
count += 1
|
|
})
|
|
assert(count === 0)
|
|
}
|