2022-09-09 20:20:38 +02:00
|
|
|
import chai from 'chai'
|
|
|
|
import { Design, Store } from '../src/index.mjs'
|
2022-08-25 11:47:54 +02:00
|
|
|
|
|
|
|
const expect = chai.expect
|
2018-08-12 13:32:53 +02:00
|
|
|
|
2022-09-07 16:16:33 +02:00
|
|
|
const store = new Store()
|
2018-08-12 13:32:53 +02:00
|
|
|
|
2022-08-27 09:27:07 +02:00
|
|
|
describe('Store', () => {
|
2022-09-09 20:20:38 +02:00
|
|
|
it('Should set/get a top-level store value', () => {
|
|
|
|
store.set('foo', 'bar')
|
|
|
|
expect(store.get('foo')).to.equal('bar')
|
|
|
|
})
|
2018-08-12 13:32:53 +02:00
|
|
|
|
2022-09-09 20:20:38 +02:00
|
|
|
it('Should set/get a nested store value', () => {
|
|
|
|
store.set('some.nested.key.foo', 'bar')
|
|
|
|
expect(store.get('some.nested.key').foo).to.equal('bar')
|
|
|
|
})
|
2018-08-12 13:32:53 +02:00
|
|
|
|
2022-09-09 20:20:38 +02:00
|
|
|
it('Should set a store value only if unset', () => {
|
|
|
|
store.setIfUnset('dew.few', 'baz')
|
|
|
|
store.setIfUnset('dew.few', 'schmoo')
|
|
|
|
expect(store.get('dew').few).to.equal('baz')
|
|
|
|
})
|
2022-09-07 16:16:33 +02:00
|
|
|
|
2022-09-09 20:20:38 +02:00
|
|
|
it('Should push to an array value in the store', () => {
|
|
|
|
store.set('dew.few', ['baz', 'bar'])
|
2022-09-07 16:16:33 +02:00
|
|
|
// store.push is variadic
|
2022-09-09 20:20:38 +02:00
|
|
|
store.push('dew.few', 'boz', 'bor')
|
|
|
|
expect(store.get('dew').few.length).to.equal(4)
|
|
|
|
})
|
2022-09-07 16:16:33 +02:00
|
|
|
|
2022-09-09 20:20:38 +02:00
|
|
|
it('Should emit a warning when retrieving a invalid key', () => {
|
2022-09-07 16:55:44 +02:00
|
|
|
const store = new Store()
|
2022-08-27 09:27:07 +02:00
|
|
|
store.get('nope')
|
2022-09-07 16:55:44 +02:00
|
|
|
expect(store.get('logs.warning').length).to.equal(1)
|
2022-09-09 20:20:38 +02:00
|
|
|
expect(store.get('logs.warning')[0]).to.equal(
|
|
|
|
'Store.get(key) on key `nope`, which is undefined'
|
|
|
|
)
|
|
|
|
})
|
2022-09-07 16:16:33 +02:00
|
|
|
|
2022-09-09 20:20:38 +02:00
|
|
|
it('Should add methods to the store from a plugin', () => {
|
2022-09-07 16:16:33 +02:00
|
|
|
const plugin = {
|
|
|
|
name: 'test',
|
|
|
|
version: 1,
|
|
|
|
store: [
|
2022-09-09 20:20:38 +02:00
|
|
|
[
|
|
|
|
'test.example.warning',
|
|
|
|
function (store, msg) {
|
|
|
|
store.set('test.message.warning', msg)
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'test.example.info',
|
|
|
|
function (store, msg) {
|
|
|
|
store.set('test.message.info', msg)
|
|
|
|
},
|
|
|
|
],
|
|
|
|
],
|
2022-09-07 16:16:33 +02:00
|
|
|
}
|
|
|
|
const part = {
|
|
|
|
name: 'example.part',
|
2022-09-10 19:13:43 +02:00
|
|
|
draft: ({ store, part }) => {
|
2022-09-07 16:16:33 +02:00
|
|
|
store.test.example.warning('hello warning')
|
|
|
|
store.test.example.info('hello info')
|
2022-09-14 16:56:42 +02:00
|
|
|
|
|
|
|
return part
|
2022-09-09 20:20:38 +02:00
|
|
|
},
|
2022-09-07 16:16:33 +02:00
|
|
|
}
|
2022-09-09 20:20:38 +02:00
|
|
|
const Test = new Design({ plugins: [plugin], parts: [part] })
|
2022-09-07 16:16:33 +02:00
|
|
|
const pattern = new Test()
|
|
|
|
pattern.draft()
|
2022-09-17 10:28:01 +02:00
|
|
|
expect(pattern.stores[0].get('test.message.warning')).to.equal('hello warning')
|
|
|
|
expect(pattern.stores[0].get('test.message.info')).to.equal('hello info')
|
2022-09-09 20:20:38 +02:00
|
|
|
})
|
2022-09-07 19:52:50 +02:00
|
|
|
|
2022-09-09 20:20:38 +02:00
|
|
|
it('Should make top-level plugin methods available via shorthand', () => {
|
2022-09-07 19:52:50 +02:00
|
|
|
const plugin = {
|
|
|
|
name: 'test',
|
|
|
|
version: 1,
|
|
|
|
store: [
|
2022-09-09 20:20:38 +02:00
|
|
|
[
|
|
|
|
'methodA',
|
|
|
|
function (store, name, msg) {
|
|
|
|
store.set(['test', name, 'a'], msg)
|
|
|
|
},
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'methodB',
|
|
|
|
function (store, name, msg) {
|
|
|
|
store.set(['test', name, 'b'], msg)
|
|
|
|
},
|
|
|
|
],
|
|
|
|
],
|
2022-09-07 19:52:50 +02:00
|
|
|
}
|
|
|
|
const part = {
|
|
|
|
name: 'example_part',
|
2022-09-10 19:13:43 +02:00
|
|
|
draft: ({ methodA, methodB, part }) => {
|
2022-09-07 19:52:50 +02:00
|
|
|
methodA('hello A')
|
|
|
|
methodB('hello B')
|
2022-09-10 19:13:43 +02:00
|
|
|
return part
|
2022-09-09 20:20:38 +02:00
|
|
|
},
|
2022-09-07 19:52:50 +02:00
|
|
|
}
|
2022-09-09 20:20:38 +02:00
|
|
|
const Test = new Design({ plugins: [plugin], parts: [part] })
|
2022-09-07 19:52:50 +02:00
|
|
|
const pattern = new Test()
|
|
|
|
pattern.draft()
|
2022-09-17 10:28:01 +02:00
|
|
|
expect(pattern.stores[0].get('test.example_part.a')).to.equal('hello A')
|
|
|
|
expect(pattern.stores[0].get('test.example_part.b')).to.equal('hello B')
|
2022-09-09 20:20:38 +02:00
|
|
|
})
|
2022-09-19 23:35:52 +02:00
|
|
|
|
|
|
|
it('Should log a warning when trying to extend a protected method via the constructor', () => {
|
|
|
|
const store = new Store([['get', () => false]])
|
|
|
|
expect(store.logs.warning.length).to.equal(1)
|
|
|
|
expect(store.logs.warning[0]).to.equal('You cannot overwrite store.get()')
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should log a warning when trying to extend a protected method via the extend', () => {
|
|
|
|
const store = new Store()
|
|
|
|
store.extend([['get', () => false]])
|
|
|
|
expect(store.logs.warning.length).to.equal(1)
|
|
|
|
expect(store.logs.warning[0]).to.equal('You cannot overwrite store.get()')
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should extend the store with a new method via the constructor', () => {
|
|
|
|
const store = new Store([['test', () => true]])
|
|
|
|
expect(store.test()).to.equal(true)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should log a warning when pushing to a non-array key', () => {
|
|
|
|
const store = new Store()
|
|
|
|
store.push('test',1)
|
|
|
|
expect(store.logs.warning.length).to.equal(1)
|
|
|
|
expect(store.logs.warning[0]).to.equal('Store.push(value) on key `test`, but key does not hold an array')
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should log a warning when setting an undefined value with set()', () => {
|
|
|
|
const store = new Store()
|
|
|
|
store.set('test')
|
|
|
|
expect(store.logs.warning.length).to.equal(1)
|
|
|
|
expect(store.logs.warning[0]).to.equal('Store.set(value) on key `test`, but value is undefined')
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should log a warning when setting an undefined value with setIfUnset()', () => {
|
|
|
|
const store = new Store()
|
|
|
|
store.setIfUnset('test')
|
|
|
|
expect(store.logs.warning.length).to.equal(1)
|
|
|
|
expect(store.logs.warning[0]).to.equal('Store.setIfUnset(value) on key `test`, but value is undefined')
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should unset a value', () => {
|
|
|
|
const store = new Store()
|
|
|
|
store.set('test', 1980)
|
|
|
|
expect(store.get('test')).to.equal(1980)
|
|
|
|
store.unset('test')
|
|
|
|
expect(typeof store.get('test')).to.equal('undefined')
|
|
|
|
})
|
|
|
|
|
2022-09-09 20:20:38 +02:00
|
|
|
})
|