-
-
Notifications
You must be signed in to change notification settings - Fork 99
Expand file tree
/
Copy pathcontext.js
More file actions
91 lines (77 loc) · 2.28 KB
/
context.js
File metadata and controls
91 lines (77 loc) · 2.28 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
import { render } from '../src/jsx';
import { h, createContext, Component } from 'preact';
import chai, { expect } from 'chai';
import sinonChai from 'sinon-chai';
chai.use(sinonChai);
// tag to remove leading whitespace from tagged template literal
function dedent([str]) {
return str
.split('\n' + str.match(/^\n*(\s+)/)[1])
.join('\n')
.replace(/(^\n+|\n+\s*$)/g, '');
}
describe('context', () => {
let renderJsx = (jsx, opts) => render(jsx, null, opts).replace(/ {2}/g, '\t');
it('should support class component as consumer', () => {
const Ctx = createContext();
class ClassConsumer extends Component {
render() {
const value = this.context;
return <section>value is: {value}</section>;
}
}
ClassConsumer.contextType = Ctx;
let rendered = renderJsx(
<Ctx.Provider value="correct">
<ClassConsumer />
</Ctx.Provider>
);
expect(rendered).to.equal(dedent`
<section>value is: correct</section>
`);
});
it('should support createContext', () => {
const { Provider, Consumer } = createContext();
let rendered = renderJsx(
<Provider value="correct">
<Consumer>{(value) => <section>value is: {value}</section>}</Consumer>
</Provider>
);
expect(rendered).to.equal(dedent`
<section>value is: correct</section>
`);
});
it('should support nested Providers', () => {
const { Provider, Consumer } = createContext();
let rendered = renderJsx(
<Provider value="wrong">
<Provider value="correct">
<Consumer>{(value) => <section>value is: {value}</section>}</Consumer>
</Provider>
</Provider>
);
expect(rendered).to.equal(dedent`
<section>value is: correct</section>
`);
});
it('should support falsy context value', () => {
const { Provider, Consumer } = createContext();
let rendered = renderJsx(
<Provider value={null}>
<Consumer>{(value) => <section>value is: {value}</section>}</Consumer>
</Provider>
);
expect(rendered).to.equal(dedent`
<section>value is: </section>
`);
});
it('should support default context value with absent provider', () => {
const { Consumer } = createContext('correct');
let rendered = renderJsx(
<Consumer>{(value) => <section>value is: {value}</section>}</Consumer>
);
expect(rendered).to.equal(dedent`
<section>value is: correct</section>
`);
});
});