Skip to content

Commit d3aa447

Browse files
committed
(test): ensure transforms apply and do so in correct order
- yay back to 100% code coverage now! - there's a transform branch missing bc there's no test case where there's something in storage and at least one toStorage-only transform - but covering this else branch doesn't really matter - create some transform fixtures - abstract out a setItem function - should consider splitting the tests and fixtures into separate files soon, esp now that we have a few different test suites here
1 parent ae05316 commit d3aa447

File tree

2 files changed

+54
-3
lines changed

2 files changed

+54
-3
lines changed

test/fixtures.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { types } from 'mobx-state-tree'
22

3+
import { ITransform, ITransformArgs } from '../src/index'
4+
35
export const UserStoreF = types.model('UserStore', {
46
name: 'John Doe',
57
age: 32
@@ -13,3 +15,20 @@ export const persistedDataF = {
1315
name: 'Persisted Name',
1416
age: 35
1517
}
18+
19+
function changeName (name: string) {
20+
let changeNameTransform: ITransformArgs
21+
changeNameTransform = function (snapshot) {
22+
snapshot.name = name
23+
return snapshot
24+
}
25+
return changeNameTransform
26+
}
27+
28+
export function storeNameAsF (name: string): ITransform {
29+
return {toStorage: changeName(name)}
30+
}
31+
32+
export function retrieveNameAsF (name: string): ITransform {
33+
return {fromStorage: changeName(name)}
34+
}

test/index.spec.ts

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22
import { getSnapshot } from 'mobx-state-tree'
33

44
import { persist } from '../src/index'
5-
import { UserStoreF, persistedDataF } from './fixtures'
5+
import { UserStoreF, persistedDataF, storeNameAsF, retrieveNameAsF } from './fixtures'
66

77
function getItem(key: string) {
88
const item = window.localStorage.getItem(key)
99
return item ? JSON.parse(item) : null // can only parse strings
1010
}
1111

12+
function setItem(key: string, value: object) {
13+
return window.localStorage.setItem(key, JSON.stringify(value))
14+
}
15+
1216
describe('basic persist functionality', () => {
1317
beforeEach(() => window.localStorage.clear())
1418

@@ -28,15 +32,16 @@ describe('basic persist functionality', () => {
2832
})
2933

3034
it('should load persisted data', async () => {
31-
window.localStorage.setItem('user', JSON.stringify(persistedDataF))
35+
setItem('user', persistedDataF)
3236

3337
const user = UserStoreF.create()
3438
await persist('user', user)
39+
3540
expect(getSnapshot(user)).toStrictEqual(persistedDataF)
3641
})
3742
})
3843

39-
describe('persist options', () => {
44+
describe('basic persist options', () => {
4045
beforeEach(() => window.localStorage.clear())
4146

4247
it('shouldn\'t jsonify', async () => {
@@ -74,3 +79,30 @@ describe('persist options', () => {
7479
expect(getItem('user')).toStrictEqual(snapshot)
7580
})
7681
})
82+
83+
describe('transforms', () => {
84+
beforeEach(() => window.localStorage.clear())
85+
86+
it('should apply toStorage transforms in order', async () => {
87+
const user = UserStoreF.create()
88+
await persist('user', user, {
89+
transforms: [storeNameAsF('Jack'), storeNameAsF('Joe')]
90+
})
91+
92+
user.changeName('Not Joe') // fire action to trigger onSnapshot
93+
expect(getItem('user').name).toBe('Joe')
94+
})
95+
96+
it('should apply fromStorage transforms in reverse order', async () => {
97+
const persistedData = {...persistedDataF}
98+
persistedData.name = 'Not Joe'
99+
setItem('user', persistedData)
100+
101+
const user = UserStoreF.create()
102+
await persist('user', user, {
103+
transforms: [retrieveNameAsF('Joe'), retrieveNameAsF('Jack')]
104+
})
105+
106+
expect(getSnapshot(user).name).toBe('Joe')
107+
})
108+
})

0 commit comments

Comments
 (0)