Skip to content

Commit

Permalink
feat(hooks): add useStore hook
Browse files Browse the repository at this point in the history
  • Loading branch information
u3u committed Jul 8, 2019
1 parent 5420fee commit 109995a
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 17 deletions.
51 changes: 51 additions & 0 deletions src/__tests__/useStore.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { Store } from 'vuex';
import useStore from '../useStore';
import renderHook from '../util/renderHook';

declare module 'vue/types/vue' {
interface Vue {
store: Store<any>;
}
}

describe('useStore', () => {
it('should be defined', () => {
expect(useStore).toBeDefined();
});

it('should have store property', () => {
const { vm } = renderHook((context) => ({ store: useStore(context) }));
expect(vm).toHaveProperty('store');
});

it('should update store', () => {
const { vm } = renderHook((context) => ({ store: useStore(context) }));
expect(vm.store.state.count).toBe(0);
expect(vm.store.getters.plusOne).toBe(1);
expect(vm.store.state.test.count).toBe(0);
expect(vm.store.getters['test/minusOne']).toBe(-1);

vm.store.commit('increment');
vm.store.commit('test/decrement');

expect(vm.store.state.count).toBe(1);
expect(vm.store.getters.plusOne).toBe(2);
expect(vm.store.state.test.count).toBe(-1);
expect(vm.store.getters['test/minusOne']).toBe(-2);

vm.store.dispatch('incrementAsync', 0);
vm.store.dispatch('test/decrementAsync', 0);

expect(vm.store.state.count).toBe(1);
expect(vm.store.getters.plusOne).toBe(2);
expect(vm.store.state.test.count).toBe(-1);
expect(vm.store.getters['test/minusOne']).toBe(-2);

setTimeout(() => {
expect(vm.store.state.count).toBe(2);
expect(vm.store.getters.plusOne).toBe(3);
expect(vm.store.state.test.count).toBe(-2);
expect(vm.store.getters['test/minusOne']).toBe(-3);
}, 0);
});
});
4 changes: 4 additions & 0 deletions src/mocks/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import Router from './router';
import Store from './store';

export { Router, Store };
20 changes: 20 additions & 0 deletions src/mocks/router.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { VueConstructor } from 'vue';
import VueRouter from 'vue-router';

export default function register(localVue: VueConstructor) {
localVue.use(VueRouter);
return new VueRouter({
routes: [
{
path: '/',
name: 'index',
meta: { title: 'Vue Hooks' },
},
{
path: '*',
name: '404',
meta: { title: '404 - Not Found' },
},
],
});
}
61 changes: 61 additions & 0 deletions src/mocks/store.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { VueConstructor } from 'vue';
import Vuex, { Module } from 'vuex';

export interface CounterState {
count: number;
}

export default function register(localVue: VueConstructor) {
localVue.use(Vuex);
return new Vuex.Store<CounterState>({
state: {
count: 0,
},

actions: {
incrementAsync(context, delay = 1000) {
setTimeout(() => {
context.commit('increment');
}, delay);
},
},

mutations: {
increment(state) {
Object.assign(state, { count: state.count + 1 });
},
},

getters: {
plusOne: (state) => state.count + 1,
},

modules: {
test: {
namespaced: true,

state: {
count: 0,
},

actions: {
decrementAsync(context, delay = 1000) {
setTimeout(() => {
context.commit('decrement');
}, delay);
},
},

mutations: {
decrement(state) {
Object.assign(state, { count: state.count - 1 });
},
},

getters: {
minusOne: (state) => state.count - 1,
},
} as Module<CounterState, CounterState>,
},
});
}
8 changes: 8 additions & 0 deletions src/useStore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { computed } from 'vue-function-api';
import { Store } from 'vuex';
import withContext from './util/withContext';

export default withContext(function useStore<TState>(vue) {
const store = computed(() => vue.$store as Store<TState>);
return store;
});
21 changes: 4 additions & 17 deletions src/util/renderHook.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,14 @@
/* eslint import/no-extraneous-dependencies: off */
import { shallowMount, createLocalVue } from '@vue/test-utils';
import { plugin, createComponent } from 'vue-function-api';
import VueRouter from 'vue-router';
import { Router, Store } from '../mocks';

const localVue = createLocalVue();
const router = Router(localVue);
const store = Store(localVue);

localVue.use(VueRouter);
localVue.use(plugin);

const router = new VueRouter({
routes: [
{
path: '/',
name: 'index',
meta: { title: 'Vue Hooks' },
},
{
path: '*',
name: '404',
meta: { title: '404 - Not Found' },
},
],
});

export default function renderHook(hook: Function) {
const App = createComponent({
template: `
Expand All @@ -39,6 +25,7 @@ export default function renderHook(hook: Function) {
return shallowMount(App, {
localVue,
router,
store,
stubs: ['router-view'],
});
}

0 comments on commit 109995a

Please sign in to comment.