Skip to content

Commit a6d72d8

Browse files
author
dean
committed
Make it easier to integrate with mobx
1 parent bf69faf commit a6d72d8

7 files changed

+7831
-14463
lines changed

.eslintrc.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
module.exports = {
2+
plugins: ['prettier'],
23
extends: [
3-
'@nuxtjs/eslint-config-typescript',
4+
'plugin:@typescript-eslint/recommended',
45
'prettier',
56
'prettier/standard',
67
'plugin:prettier/recommended',
78
],
8-
plugins: ['prettier'],
9-
rules: {},
9+
rules: {
10+
'@typescript-eslint/no-explicit-any': 'off',
11+
'@typescript-eslint/ban-types': 'off',
12+
'@typescript-eslint/explicit-module-boundary-types': 'off',
13+
'@typescript-eslint/ban-ts-comment': 'off',
14+
},
1015
}

__test__/strict-async-storage.spec.ts

+155-28
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
restoreSaved,
99
defLen,
1010
} from './helper';
11+
import { autorun, configure, makeObservable, action, observable } from 'mobx';
1112

1213
describe('strict-async-storage', () => {
1314
jest
@@ -20,29 +21,157 @@ describe('strict-async-storage', () => {
2021
.mockImplementation((name: string, value: string) => {
2122
setSaved(name, value);
2223
});
23-
oneSetTest('default sync', new StrictAsyncStorage(defaults));
24-
25-
oneSetTest(
26-
'cunstom async',
27-
new StrictAsyncStorage(defaults, {
28-
map: new Map(),
29-
driver: () => new AsyncDriver(),
30-
}),
31-
true
32-
);
24+
25+
runTest('sync driver', new StrictAsyncStorage(defaults));
26+
27+
runTest('async driver', new StrictAsyncStorage(defaults, new AsyncDriver()));
28+
29+
describe('mobx', () => {
30+
configure({
31+
enforceActions: 'always',
32+
computedRequiresReaction: true,
33+
reactionRequiresObservable: true,
34+
// observableRequiresReaction: true,
35+
// disableErrorBoundaries: true,
36+
});
37+
38+
let strictAsyncStorage: StrictAsyncStorage<
39+
{
40+
user: string;
41+
no: number;
42+
enable: boolean;
43+
data: {};
44+
},
45+
StorageName,
46+
AsyncDriver
47+
>;
48+
let view: jest.Mock;
49+
50+
beforeEach(async () => {
51+
restoreSaved();
52+
53+
strictAsyncStorage = makeObservable(
54+
new StrictAsyncStorage(defaults, new AsyncDriver()),
55+
{
56+
//@ts-expect-error
57+
_map: observable,
58+
_initialized: observable,
59+
_disposed: observable,
60+
setMap: action,
61+
batchMap: action,
62+
setInitialized: action,
63+
setDisposed: action,
64+
}
65+
);
66+
await strictAsyncStorage.initialize();
67+
68+
view = jest.fn(() => {
69+
try {
70+
return `user:${strictAsyncStorage.getItem(
71+
StorageName.user
72+
)},no:${strictAsyncStorage.getItem(
73+
StorageName.no
74+
)},enable:${strictAsyncStorage.getItem(
75+
StorageName.enable
76+
)},data:${strictAsyncStorage.getItem(StorageName.data)},`;
77+
} catch (error) {
78+
return error;
79+
}
80+
});
81+
82+
autorun(view);
83+
view.mockClear();
84+
});
85+
86+
it('test setItem', async () => {
87+
const user = 'test001';
88+
await strictAsyncStorage.setItem(StorageName.user, user);
89+
expect(view).toBeCalledTimes(1);
90+
expect(view).lastReturnedWith(
91+
`user:${user},no:${123},enable:${defaults[StorageName.enable]},data:${{
92+
name: 'John',
93+
age: 12,
94+
}},`
95+
);
96+
97+
await strictAsyncStorage.setItem(StorageName.user, undefined as any);
98+
expect(view).toBeCalledTimes(2);
99+
expect(view).lastReturnedWith(
100+
`user:${undefined},no:${123},enable:${
101+
defaults[StorageName.enable]
102+
},data:${{
103+
name: 'John',
104+
age: 12,
105+
}},`
106+
);
107+
108+
await strictAsyncStorage.setItem(StorageName.user, null as any);
109+
expect(view).toBeCalledTimes(3);
110+
expect(view).lastReturnedWith(
111+
`user:${defaults[StorageName.user]},no:${123},enable:${
112+
defaults[StorageName.enable]
113+
},data:${{
114+
name: 'John',
115+
age: 12,
116+
}},`
117+
);
118+
119+
await expect(
120+
strictAsyncStorage.setItem('other' as any, null as any)
121+
).rejects.toThrowError(RangeError);
122+
expect(view).toBeCalledTimes(3);
123+
});
124+
125+
it('test resetItem', async () => {
126+
await strictAsyncStorage.resetItem(StorageName.no);
127+
expect(view).toBeCalledTimes(1);
128+
expect(view).lastReturnedWith(
129+
`user:${'user001'},no:${defaults[StorageName.no]},enable:${
130+
defaults[StorageName.enable]
131+
},data:${{
132+
name: 'John',
133+
age: 12,
134+
}},`
135+
);
136+
137+
await expect(
138+
strictAsyncStorage.resetItem('other' as any)
139+
).rejects.toThrowError(RangeError);
140+
expect(view).toBeCalledTimes(1);
141+
});
142+
143+
it('test resetAll', async () => {
144+
await strictAsyncStorage.resetAll();
145+
expect(view).toBeCalledTimes(1);
146+
expect(view).lastReturnedWith(
147+
`user:${defaults[StorageName.user]},no:${
148+
defaults[StorageName.no]
149+
},enable:${defaults[StorageName.enable]},data:${
150+
defaults[StorageName.data]
151+
},`
152+
);
153+
});
154+
});
33155
});
34156

35-
function oneSetTest<TDriver extends DriverInterface = Storage>(
157+
function runTest<TDriver extends DriverInterface = Storage>(
36158
testName: string | number | Function | jest.FunctionLike,
37-
strictAsyncStorage: StrictAsyncStorage<typeof defaults, StorageName, TDriver>,
38-
handleDispose = false
159+
strictAsyncStorage: StrictAsyncStorage<typeof defaults, StorageName, TDriver>
39160
) {
40161
describe(testName, () => {
41162
restoreSaved();
42163

43-
it('test init', async () => {
44-
await strictAsyncStorage.init();
164+
it('test initialize', async () => {
165+
expect(strictAsyncStorage.initialized).toBeFalsy();
166+
await strictAsyncStorage.initialize();
167+
expect(strictAsyncStorage.initialized).toBeTruthy();
45168
expect(strictAsyncStorage.defaults).toEqual(defaults);
169+
170+
await expect(
171+
async () => await strictAsyncStorage.initialize()
172+
).rejects.toThrowError(
173+
'[strict-async-storage] Invalid operation. This has been initialized.'
174+
);
46175
});
47176

48177
it('test length', async () => {
@@ -116,20 +245,18 @@ function oneSetTest<TDriver extends DriverInterface = Storage>(
116245
});
117246

118247
it('test dispose', () => {
119-
if (handleDispose) {
120-
const handler = jest.fn(() => {
121-
expect(() =>
122-
strictAsyncStorage.getItem(StorageName.user)
123-
).not.toThrowError();
124-
});
125-
strictAsyncStorage.dispose(handler);
126-
expect(handler).toBeCalled();
127-
} else {
128-
strictAsyncStorage.dispose();
129-
}
130-
expect(strictAsyncStorage.length).toBe(0);
248+
expect(strictAsyncStorage.disposed).toBeFalsy();
249+
strictAsyncStorage.dispose();
250+
expect(strictAsyncStorage.disposed).toBeTruthy();
251+
expect(() => strictAsyncStorage.dispose()).toThrowError(
252+
'[strict-async-storage] Invalid operation. This has been disposed.'
253+
);
254+
255+
expect(() => strictAsyncStorage.length).toThrowError(
256+
'[strict-async-storage] Invalid operation. Not initialized yet, failed to initialize or has been disposed.'
257+
);
131258
expect(() => strictAsyncStorage.getItem(StorageName.user)).toThrowError(
132-
RangeError
259+
'[strict-async-storage] Invalid operation. Not initialized yet, failed to initialize or has been disposed.'
133260
);
134261
});
135262
});

0 commit comments

Comments
 (0)