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); }