Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions src/addons/presenter.js
Original file line number Diff line number Diff line change
Expand Up @@ -210,12 +210,8 @@ export default class Presenter extends Component {
console.warn(`No presenter implements intent “${ intent }”.`)
}

/**
* Presenters require a render method. This will throw an error unless
* implemented by a subclass.
*/
render () {
throw new Error('Presenter must implement a render method.')
return this.props.children ? React.Children.only(this.props.children) : null
}

}
Expand Down
20 changes: 2 additions & 18 deletions src/addons/provider.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import Microcosm from '../microcosm'
import React, { Component, Children } from 'react'
import Presenter from './presenter'

/**
* Sets up the required context for a React component tree
Expand All @@ -15,21 +14,6 @@ import React, { Component, Children } from 'react'
* </Provider>
* ), document.getElementById('repo'))
*/
export default class Provider extends Component {
getChildContext() {
return { repo: this.props.repo }
}
export default class Provider extends Presenter {

render() {
return Children.only(this.props.children)
}
}

Provider.propTypes = {
repo : React.PropTypes.instanceOf(Microcosm).isRequired,
children : React.PropTypes.element.isRequired
}

Provider.childContextTypes = {
repo : React.PropTypes.instanceOf(Microcosm).isRequired
}
19 changes: 4 additions & 15 deletions test/addons/presenter.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ const View = React.createClass({
}
})

test('requires an implementation of a render method', t => {
t.throws(() => mount(<Presenter />), /implement a render method/)
test('the default render implementation passes children', t => {
let wrapper = mount(<Presenter><p>Test</p></Presenter>)

t.is(wrapper.text(), 'Test')
})

test('receives intent events', t => {
Expand Down Expand Up @@ -208,10 +210,6 @@ test('does not update the view model when umounted', t => {
t.pass()
return {}
}

render() {
return <View />
}
}

let repo = new Microcosm({ pure: false })
Expand All @@ -227,9 +225,6 @@ test('calling setState in setup does not raise a warning', t => {
setup() {
this.setState({ foo: 'bar' })
}
render() {
return <View />
}
}

console.record()
Expand All @@ -246,9 +241,6 @@ test('warns when setState in setup does not raise a warning', t => {
viewModel() {
return this.repo.state
}
render() {
return <p>Test</p>
}
}

console.record()
Expand All @@ -265,9 +257,6 @@ test('allows functions to return from viewModel', t => {
viewModel() {
return state => state
}
render() {
return <p>Test</p>
}
}

const el = mount(<MyPresenter repo={new Microcosm()} />)
Expand Down
15 changes: 15 additions & 0 deletions test/addons/provider.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import test from 'ava'
import Provider from '../../src/addons/provider'
import Connect from '../../src/addons/connect'
import Microcosm from '../../src/microcosm'
import React from 'react'
import {mount} from 'enzyme'

test('injects an repo from context into the wrapped component', t => {
const repo = new Microcosm()
const Child = () => (<p>Test</p>)
const Parent = Connect()(Child)

const component = mount(<Provider repo={repo}><Parent /></Provider>)
t.is(component.find(Child).prop('repo'), repo)
})