-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathfunctional.spec.jsx
More file actions
113 lines (91 loc) · 2.41 KB
/
functional.spec.jsx
File metadata and controls
113 lines (91 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import 'react-dom'
import React from 'react'
import {mount} from 'enzyme'
import {
getCss,
removeWhitespace
} from './utils'
import CreateApp from './App'
let Styled
let styled
const mockNameGenerators = () => {
let styledCounter = 0
jest.mock('../utils/generateTagName')
jest.mock('jss/lib/utils/generateClassName')
const generateTagName = require('../utils/generateTagName').default
const generateClassName = require('jss/lib/utils/generateClassName').default
// $FlowIgnore
generateTagName.mockImplementation((tagName: string) => `${tagName}-${++styledCounter}`)
generateClassName.mockImplementation(rule => `${rule.name}-id`)
}
const assertSheet = (sheet) => {
expect(sheet.toString()).toMatchSnapshot()
expect(getCss(sheet)).toBe(removeWhitespace(sheet.toString()))
}
describe('functional tests', () => {
beforeEach(() => {
mockNameGenerators()
Styled = require('../').Styled
styled = Styled()
})
afterEach(() => {
styled.mountSheet().detach()
})
it('should update props and unmount', () => {
const App = CreateApp(styled)
const wrapper = mount(<App />)
const sheet = styled.mountSheet()
assertSheet(sheet)
wrapper.setProps({margin: 20})
assertSheet(sheet)
wrapper.unmount()
})
it('should update nested props', () => {
styled = Styled({
button: {
fontSize: 12,
},
})
const Div = styled('div')({
padding: 15,
'&:hover': {
'& $button': {
color: ({primary}) => (primary ? 'red' : 'green'),
},
},
})
const Button = styled('button')({
composes: '$button',
})
const App = (props: {primary?: boolean}) => (
<div>
<Div primary={props.primary}>
<Button>Button</Button>
</Div>
<Div primary={!props.primary}>
<Button>Button</Button>
</Div>
</div>
)
const wrapper = mount(<App />)
const sheet = styled.mountSheet()
assertSheet(sheet)
wrapper.setProps({primary: true})
assertSheet(sheet)
wrapper.unmount()
})
it('should use props on remount', () => {
const Button = styled('button')({
color: props => (props.primary ? 'red' : 'black')
})
const wrapper = mount(<Button />)
const sheet = styled.mountSheet()
assertSheet(sheet)
wrapper
.unmount()
.mount()
.setProps({primary: true})
assertSheet(sheet)
wrapper.unmount()
})
})