Skip to content

Commit 8f9005d

Browse files
committed
Add tests for sheetsObserver
1 parent d1e7818 commit 8f9005d

4 files changed

Lines changed: 69 additions & 17 deletions

File tree

.flowconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@
77

88
[options]
99
all=true
10+
suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe

src/createStyled.js

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import asap from 'asap'
2-
31
import styled from './styled'
2+
import sheetsObserver from './utils/sheetsObserver'
43

54
import type {
65
BaseStylesType,
@@ -11,30 +10,20 @@ import type {
1110
TagNameOrStyledElementType
1211
} from './types'
1312

14-
const dynamicSheets = []
15-
let sheetsToUpdate = {}
16-
17-
asap(() => {
18-
const sheetNames = Object.keys(sheetsToUpdate)
19-
if (sheetNames.length) {
20-
sheetsToUpdate = {}
21-
sheetNames.forEach(sheetName =>
22-
dynamicSheets[Number(sheetName)].attach().link())
23-
}
24-
})
13+
sheetsObserver.listen()
2514

2615
const createStyled = (jss: Function) => (
2716
baseStyles: BaseStylesType = {}
2817
): StyledType => {
2918
let staticSheet
3019
let dynamicSheet
31-
let dynamicSheetName
20+
let dynamicSheetId
3221

3322
const addRule = (name: string, style: ComponentStyleType, data: Object) => {
3423
if (data) {
3524
dynamicSheet.detach().addRule(name, style)
3625
dynamicSheet.update(name, data)
37-
sheetsToUpdate[dynamicSheetName] = true
26+
sheetsObserver.update(dynamicSheetId)
3827
}
3928
else {
4029
staticSheet.addRule(name, style)
@@ -51,8 +40,7 @@ const createStyled = (jss: Function) => (
5140
link: true,
5241
meta: 'DynamicComponentSheet',
5342
}).attach()
54-
dynamicSheets.push(dynamicSheet)
55-
dynamicSheetName = dynamicSheets.length - 1
43+
dynamicSheetId = sheetsObserver.add(dynamicSheet)
5644
}
5745

5846
return {staticSheet, dynamicSheet}

src/tests/sheetsObserver.spec.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import sheetsObserver, {observe, dynamicSheets} from '../utils/sheetsObserver'
2+
3+
const Mocks = {
4+
// $FlowFixMe: get/set are not supported yet by flow
5+
get sheetMock() {
6+
const mock = {
7+
attach: jest.fn(),
8+
link: jest.fn(),
9+
}
10+
mock.attach.mockReturnValue(mock)
11+
mock.link.mockReturnValue(mock)
12+
return mock
13+
}
14+
}
15+
16+
it('should add sheet and return sheetId', () => {
17+
const {sheetMock} = Mocks
18+
const sheetId = sheetsObserver.add(sheetMock)
19+
20+
expect(dynamicSheets).toEqual([sheetMock])
21+
expect(sheetId).toEqual(0)
22+
})
23+
24+
it('should reattach updated sheet by observe call', () => {
25+
const {sheetMock} = Mocks
26+
const sheetId = sheetsObserver.add(sheetMock)
27+
sheetsObserver.update(sheetId)
28+
29+
observe()
30+
31+
expect(sheetMock.attach).toHaveBeenCalled()
32+
expect(sheetMock.link).toHaveBeenCalled()
33+
})

src/utils/sheetsObserver.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import asap from 'asap'
2+
3+
import type {
4+
JssDynamicSheet
5+
} from '../types'
6+
7+
export const dynamicSheets = []
8+
let sheetsToUpdate = {}
9+
10+
export const observe = () => {
11+
const sheetIds = Object.keys(sheetsToUpdate)
12+
if (sheetIds.length) {
13+
sheetsToUpdate = {}
14+
sheetIds.forEach(sheetId =>
15+
dynamicSheets[Number(sheetId)].attach().link())
16+
}
17+
}
18+
19+
export default {
20+
listen() {
21+
asap(observe)
22+
},
23+
add(sheet: JssDynamicSheet) {
24+
dynamicSheets.push(sheet)
25+
return dynamicSheets.length - 1
26+
},
27+
update(sheetId: number) {
28+
sheetsToUpdate[sheetId] = true
29+
}
30+
}

0 commit comments

Comments
 (0)