Skip to content
This repository has been archived by the owner on Dec 31, 2020. It is now read-only.

Commit

Permalink
add support of es6 and refactor tests
Browse files Browse the repository at this point in the history
  • Loading branch information
A-gambit committed Nov 11, 2016
1 parent e7055a8 commit db86c8a
Show file tree
Hide file tree
Showing 13 changed files with 1,465 additions and 1,712 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Expand Up @@ -8,4 +8,6 @@ custom.d.ts
index.js
index.d.ts
index.min.js
.vscode
.vscode
.idea
test/browser/test_bundle.js
2 changes: 1 addition & 1 deletion .travis.yml
@@ -1,5 +1,5 @@
language: node_js
script: npm run travis
script: npm run test:travis
after_success:
- cat ./coverage/lcov.info|./node_modules/coveralls/bin/coveralls.js
node_js:
Expand Down
11 changes: 7 additions & 4 deletions package.json
Expand Up @@ -9,11 +9,13 @@
"url": "https://github.com/mobxjs/mobx-react.git"
},
"scripts": {
"test:ts": "tsc -p test/ts",
"test:travis": "webpack && browserify -x react/addons -x react/lib/ReactContext -x react/lib/ExecutionEnvironment test/*.js -t [ babelify --presets [ es2015 ] ] | tape-run && npm run test:ts",
"test:build": "browserify -x react/addons -x react/lib/ReactContext -x react/lib/ExecutionEnvironment test/*.js -o ./test/browser/test_bundle.js -t [ babelify --presets [ es2015 react ] ]",
"test:console": "browserify -x react/addons -x react/lib/ReactContext -x react/lib/ExecutionEnvironment test/*.js -t [ babelify --presets [ es2015 ] ] | tape-run | tap-spec && npm run test:ts",
"test:browser": "browserify -x react/addons -x react/lib/ReactContext -x react/lib/ExecutionEnvironment test/*.js -t [ babelify --presets [ es2015 ] ] | tape-run --browser chrome --render='tap-spec'",
"build": "webpack && cp src/index.d.ts index.d.ts && cp src/index.d.ts native.d.ts && cp src/index.d.ts custom.d.ts",
"prepublish": "npm run build",
"test": "webpack && browserify -x react/addons -x react/lib/ReactContext -x react/lib/ExecutionEnvironment test/*.js | tape-run | tap-spec && tsc -p test/ts",
"travis": "webpack && browserify -x react/addons -x react/lib/ReactContext -x react/lib/ExecutionEnvironment test/*.js | tape-run && tsc -p test/ts",
"debug": "webpack && browserify -x react/addons -x react/lib/ReactContext -x react/lib/ExecutionEnvironment test/*.js | tape-run --browser chrome | tap-spec"
"prepublish": "npm run build"
},
"author": "Michel Weststrate",
"license": "MIT",
Expand All @@ -30,6 +32,7 @@
"babel-loader": "^6.2.4",
"babel-plugin-transform-class-properties": "^6.11.5",
"babel-preset-es2015": "^6.9.0",
"babelify": "^7.3.0",
"browserify": "^13.1.0",
"empty-module": "0.0.2",
"enzyme": "^2.3.0",
Expand Down
11 changes: 11 additions & 0 deletions test/browser/index.html
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>Tape</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<script src="./test_bundle.js"></script>
</body>
</html>
333 changes: 140 additions & 193 deletions test/context.js
@@ -1,199 +1,146 @@
var React = require('react');
var enzyme = require('enzyme');
var mount = enzyme.mount;
var mobx = require('mobx');
var observer = require('../').observer;
var inject = require('../').inject;
var Provider = require('../').Provider;
var test = require('tape');
var e = React.createElement;
import { createClass, createElement } from 'react'
import { mount } from 'enzyme'
import test from 'tape'
import mobx from 'mobx'
import { observer, inject, Provider } from '../'

test('observer based context', t => {
test('using observer to inject throws warning', t => {
// This test is here because it is the first test file being run, and mobx-react warns only once
const w = console.warn
const warns = []
console.warn = msg => warns.push(msg)

observer(["test"], React.createClass({
render: () => null
}))

t.equal(warns.length, 1)
t.equal(warns[0], 'Mobx observer: Using observer to inject stores is deprecated since 4.0. Use `@inject("store1", "store2") @observer ComponentClass` or `inject("store1", "store2")(observer(componentClass))` instead of `@observer(["store1", "store2"]) ComponentClass`')

console.warn = w
t.end()
})

test('basic context', t => {
var C = observer(["foo"], React.createClass({
render: function() {
return e("div", {}, "context:" + this.props.foo);
}
}));

var B = React.createClass({
render: function() {
return e(C, {});
}
});

var A = React.createClass({
render: function() {
return e(Provider, { foo: "bar" }, e(B, {}))
}
})

const wrapper = mount(e(A));
t.equal(wrapper.find("div").text(), "context:bar");
t.end();
})

test('props override context', t => {
var C = observer(["foo"], React.createClass({
render: function() {
return e("div", {}, "context:" + this.props.foo);
}
}));

var B = React.createClass({
render: function() {
return e(C, { foo: 42 });
}
});

var A = React.createClass({
render: function() {
return e(Provider, { foo: "bar" }, e(B, {}))
}
})

const wrapper = mount(e(A));
t.equal(wrapper.find("div").text(), "context:42");
t.end();
})


test('overriding stores is supported', t => {
var C = observer(["foo", "bar"], React.createClass({
render: function() {
return e("div", {}, "context:" + this.props.foo + this.props.bar);
}
}));

var B = React.createClass({
render: function() {
return e(C, {});
}
});

var A = React.createClass({
render: function() {
return e(Provider, { foo: "bar", bar: 1337 },
e("div", {},
e("span", {},
e(B, {})
),
e("section", {},
e(Provider, { foo: 42}, e(B, {}))
)
)
);
}
})

const wrapper = mount(e(A));
t.equal(wrapper.find("span").text(), "context:bar1337");
t.equal(wrapper.find("section").text(), "context:421337");
t.end();
})

test('store should be available', t => {
var C = observer(["foo"], React.createClass({
render: function() {
return e("div", {}, "context:" + this.props.foo);
}
}));

var B = React.createClass({
render: function() {
return e(C, {});
}
});

var A = React.createClass({
render: function() {
return e(Provider, { baz: 42 }, e(B, {}));
}
})

t.throws(() => mount(e(A)), /Store 'foo' is not available! Make sure it is provided by some Provider/);
t.end();
})

test('store is not required if prop is available', t => {
var C = observer(["foo"], React.createClass({
render: function() {
return e("div", {}, "context:" + this.props.foo);
}
}));

var B = React.createClass({
render: function() {
return e(C, { foo: "bar" });
}
});

const wrapper = mount(e(B));
t.equal(wrapper.find("div").text(), "context:bar");
t.end();
})

test('warning is printed when changing stores', t => {
var msg;
var baseWarn = console.warn;
console.warn = (m) => msg = m;

var a = mobx.observable(3);

var C = observer(["foo"], React.createClass({
render: function() {
return e("div", {}, "context:" + this.props.foo);
}
}));

var B = observer(React.createClass({
render: function() {
return e(C, {});
}
}));

var A = observer(React.createClass({
render: function() {
return e("section", {},
e("span", {}, a.get()),
e(Provider, { foo: a.get() }, e(B, {}))
);
}
}))

const wrapper = mount(e(A));
t.equal(wrapper.find("span").text(), "3");
t.equal(wrapper.find("div").text(), "context:3");

a.set(42);

t.equal(wrapper.find("span").text(), "42");
t.equal(wrapper.find("div").text(), "context:3");

t.equal(msg, "MobX Provider: Provided store \'foo\' has changed. Please avoid replacing stores as the change might not propagate to all children");

console.warn = baseWarn;
t.end();
})
test('using observer to inject throws warning', t => {
const w = console.warn
const warns = []
console.warn = msg => warns.push(msg)

observer(['test'], createClass({
render: () => null
}))

t.equal(warns.length, 1)
t.equal(warns[0], 'Mobx observer: Using observer to inject stores is deprecated since 4.0. Use `@inject("store1", "store2") @observer ComponentClass` or `inject("store1", "store2")(observer(componentClass))` instead of `@observer(["store1", "store2"]) ComponentClass`')

console.warn = w
t.end()
})
})

test('basic context', t => {
const C = observer(['foo'], createClass({
render() {
return createElement('div', {}, 'context:' + this.props.foo);
}
}));
const B = createClass({
render:() => createElement(C, {})
});
const A = createClass({
render: () => createElement(Provider, { foo: 'bar' }, createElement(B, {}))
});
const wrapper = mount(createElement(A));
t.equal(wrapper.find('div').text(), 'context:bar');
t.end();
});

test('props override context', t => {
const C = observer(['foo'], createClass({
render() {
return createElement('div', {}, 'context:' + this.props.foo);
}
}));
const B = createClass({
render: () => createElement(C, { foo: 42 })
});
const A = createClass({
render: () => createElement(Provider, { foo: 'bar' }, createElement(B, {}))
});
const wrapper = mount(createElement(A));
t.equal(wrapper.find('div').text(), 'context:42');
t.end();
});

test('overriding stores is supported', t => {
const C = observer(['foo', 'bar'], createClass({
render() {
return createElement('div', {}, 'context:' + this.props.foo + this.props.bar);
}
}));
const B = createClass({
render: () => createElement(C, {})
});
const A = createClass({
render: () => createElement(Provider, { foo: 'bar', bar: 1337 },
createElement('div', {},
createElement('span', {},
createElement(B, {})
),
createElement('section', {},
createElement(Provider, { foo: 42}, createElement(B, {}))
)
)
)
});
const wrapper = mount(createElement(A));
t.equal(wrapper.find('span').text(), 'context:bar1337');
t.equal(wrapper.find('section').text(), 'context:421337');
t.end();
});

test('store should be available', t => {
const C = observer(['foo'], createClass({
render() {
return createElement('div', {}, 'context:' + this.props.foo);
}
}));
const B = createClass({
render: () => createElement(C, {})
});
const A = createClass({
render: () => createElement(Provider, { baz: 42 }, createElement(B, {}))
});
t.throws(() => mount(createElement(A)), /Store 'foo' is not available! Make sure it is provided by some Provider/);
t.end();
});

test('store is not required if prop is available', t => {
const C = observer(['foo'], createClass({
render() {
return createElement('div', {}, 'context:' + this.props.foo)
}
}));
const B = createClass({
render: () => createElement(C, { foo: 'bar' })
});
const wrapper = mount(createElement(B));
t.equal(wrapper.find('div').text(), 'context:bar');
t.end();
});

test('warning is printed when changing stores', t => {
let msg = null;
const baseWarn = console.warn;
console.warn = m => msg = m;
const a = mobx.observable(3);
const C = observer(['foo'], createClass({
render() {
return createElement('div', {}, 'context:' + this.props.foo);
}
}));
const B = observer(createClass({
render: () => createElement(C, {})
}));
const A = observer(createClass({
render: () => createElement('section', {},
createElement('span', {}, a.get()),
createElement(Provider, { foo: a.get() }, createElement(B, {}))
)
}));
const wrapper = mount(createElement(A));
t.equal(wrapper.find('span').text(), '3');
t.equal(wrapper.find('div').text(), 'context:3');
a.set(42);
t.equal(wrapper.find('span').text(), '42');
t.equal(wrapper.find('div').text(), 'context:3');
t.equal(msg, 'MobX Provider: Provided store \'foo\' has changed. Please avoid replacing stores as the change might not propagate to all children');
console.warn = baseWarn;
t.end();
});

t.end();
});

0 comments on commit db86c8a

Please sign in to comment.