diff --git a/examples/blog/components/layout.js b/examples/blog/components/layout.js
index d4beeee..7471313 100644
--- a/examples/blog/components/layout.js
+++ b/examples/blog/components/layout.js
@@ -40,7 +40,7 @@ class Layout extends Component {
{auth}
Admin
- GitHub
+ GitHub
diff --git a/package.json b/package.json
index de1918b..c607f04 100644
--- a/package.json
+++ b/package.json
@@ -50,10 +50,12 @@
"babel-register": "^6.18.0",
"coveralls": "^2.11.15",
"css-loader": "^0.26.1",
+ "enzyme": "^2.7.1",
"file-loader": "^0.10.0",
"flow-bin": "^0.38.0",
"nyc": "^10.0.0",
"react": "^15.4.2",
+ "react-addons-test-utils": "^15.4.2",
"react-dom": "^15.4.2",
"react-redux": "^5.0.1",
"redux": "^3.6.0",
@@ -64,6 +66,7 @@
"semantic-ui-css": "^2.2.4",
"semantic-ui-react": "^0.64.3",
"style-loader": "^0.13.1",
+ "testdouble": "^1.11.1",
"url-loader": "^0.5.7",
"webpack": "^2.1.0-beta.27",
"webpack-dev-server": "^2.1.0-beta.12"
diff --git a/src/react/__tests__/link.js b/src/react/__tests__/link.js
new file mode 100644
index 0000000..49f3dd1
--- /dev/null
+++ b/src/react/__tests__/link.js
@@ -0,0 +1,50 @@
+import test from 'ava';
+import React from 'react';
+import { shallow } from 'enzyme';
+import td from 'testdouble';
+import { Link } from '../link';
+
+test('basic', t => {
+ const wrapper = shallow(Hoge);
+ t.true(wrapper.matchesElement(Hoge));
+});
+
+test('href', t => {
+ const wrapper = shallow(Foo);
+ t.true(wrapper.matchesElement(Foo));
+});
+
+test('external', t => {
+ const wrapper = shallow(Example);
+ t.true(wrapper.matchesElement(Example));
+});
+
+test('class', t => {
+ const wrapper = shallow(Users);
+ t.true(wrapper.matchesElement(Users));
+});
+
+test('click', t => {
+ const ev = td.object(['preventDefault']);
+ const dispatch = td.function('dispatch');
+ const handler = td.function('handler');
+ const wrapper = shallow(Link);
+ wrapper.find('a').simulate('click', ev);
+
+ td.verify(ev.preventDefault(), { times: 1 });
+ td.verify(handler(ev), { times: 1 });
+ td.verify(dispatch(td.matchers.isA(Object)), { times: 1 });
+});
+
+test('click + external', t => {
+ const handler = td.function('handler');
+ const wrapper = shallow( {}}>External);
+ wrapper.find('a').simulate('click', { preventDefault: () => {} });
+
+ td.verify(handler(), { times: 0 });
+});
+
+test('either "to" or "href"', t => {
+ const err = t.throws(() => shallow(Either));
+ t.is(err.message, " component requires either 'to' or 'href' props.");
+});
diff --git a/src/react/link.js b/src/react/link.js
index 51451c0..3dcbf2f 100644
--- a/src/react/link.js
+++ b/src/react/link.js
@@ -21,7 +21,7 @@ function getHref(props, withOffset = false) {
return href;
}
-class Link extends Component {
+export class Link extends Component {
handleClick(e) {
e.preventDefault();
@@ -39,7 +39,9 @@ class Link extends Component {
const href = getHref(this.props, true);
const props = { href, target, className };
- if (!external) {
+ if (external) {
+ props.target = '_blank';
+ } else {
props.onClick = this.handleClick.bind(this);
}