123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- import React from "react"
- import { render } from "enzyme"
- import System from "core/system"
- describe("wrapComponents", () => {
- describe("should wrap a component and provide a reference to the original", () => {
- it("with stateless components", function(){
- // Given
- const system = new System({
- plugins: [
- {
- components: {
- wow: ({ name }) => <div>{name} component</div>
- }
- },
- {
- wrapComponents: {
- wow: (OriginalComponent) => (props) => {
- return <container>
- <OriginalComponent {...props}></OriginalComponent>
- <OriginalComponent name="Wrapped"></OriginalComponent>
- </container>
- }
- }
- }
- ]
- })
- // When
- let Component = system.getSystem().getComponents("wow")
- const wrapper = render(<Component name="Normal" />)
- const container = wrapper.children().first()
- expect(container[0].name).toEqual("container")
- const children = container.children()
- expect(children.length).toEqual(2)
- expect(children.eq(0).text()).toEqual("Normal component")
- expect(children.eq(1).text()).toEqual("Wrapped component")
- })
- it("with React classes", function(){
- class MyComponent extends React.Component {
- render() {
- return <div>{this.props.name} component</div>
- }
- }
- // Given
- const system = new System({
- plugins: [
- {
- components: {
- wow: MyComponent
- }
- },
- {
- wrapComponents: {
- wow: (OriginalComponent) => {
- return class WrapperComponent extends React.Component {
- render() {
- return <container>
- <OriginalComponent {...this.props}></OriginalComponent>
- <OriginalComponent name="Wrapped"></OriginalComponent>
- </container>
- }
- }
- }
- }
- }
- ]
- })
- // When
- let Component = system.getSystem().getComponents("wow")
- const wrapper = render(<Component name="Normal" />)
- const container = wrapper.children().first()
- expect(container[0].name).toEqual("container")
- const children = container.children()
- expect(children.length).toEqual(2)
- expect(children.eq(0).text()).toEqual("Normal component")
- expect(children.eq(1).text()).toEqual("Wrapped component")
- })
- })
- it("should provide a reference to the system to the wrapper", function(){
- // Given
- const mySystem = new System({
- plugins: [
- {
- // Make a selector
- statePlugins: {
- doge: {
- selectors: {
- wow: () => () => {
- return "WOW much data"
- }
- }
- }
- }
- },
- {
- // Create a component
- components: {
- wow: () => <div>Original component</div>
- }
- },
- {
- // Wrap the component and use the system
- wrapComponents: {
- wow: (OriginalComponent, system) => (props) => {
- return <container>
- <OriginalComponent {...props}></OriginalComponent>
- <div>{system.dogeSelectors.wow()}</div>
- </container>
- }
- }
- }
- ]
- })
- // Then
- let Component = mySystem.getSystem().getComponents("wow")
- const wrapper = render(<Component name="Normal" />)
- const container = wrapper.children().first()
- expect(container[0].name).toEqual("container")
- const children = container.children()
- expect(children.length).toEqual(2)
- expect(children.eq(0).text()).toEqual("Original component")
- expect(children.eq(1).text()).toEqual("WOW much data")
- })
- it("should wrap correctly when registering more plugins", function(){
- // Given
- const mySystem = new System({
- plugins: [
- () => {
- return {
- statePlugins: {
- doge: {
- selectors: {
- wow: () => () => {
- return "WOW much data"
- }
- }
- }
- },
- components: {
- wow: () => <div>Original component</div>
- }
- }
- }
- ]
- })
- mySystem.register([
- function() {
- return {
- // Wrap the component and use the system
- wrapComponents: {
- wow: (OriginalComponent, system) => (props) => {
- return <container>
- <OriginalComponent {...props}></OriginalComponent>
- <div>{system.dogeSelectors.wow()}</div>
- </container>
- }
- }
- }
- }
- ])
- // Then
- let Component = mySystem.getSystem().getComponents("wow")
- const wrapper = render(<Component name="Normal" />)
- const container = wrapper.children().first()
- expect(container[0].name).toEqual("container")
- const children = container.children()
- expect(children.length).toEqual(2)
- expect(children.eq(0).text()).toEqual("Original component")
- expect(children.eq(1).text()).toEqual("WOW much data")
- })
- it("should wrap correctly when building a system twice", function(){
- // Given
- const pluginOne = {
- statePlugins: {
- doge: {
- selectors: {
- wow: () => () => {
- return "WOW much data"
- }
- }
- }
- },
- components: {
- wow: () => <div>Original component</div>
- }
- }
- const pluginTwo = {
- // Wrap the component and use the system
- wrapComponents: {
- wow: (OriginalComponent, system) => (props) => {
- return <container>
- <OriginalComponent {...props}></OriginalComponent>
- <div>{system.dogeSelectors.wow()}</div>
- </container>
- }
- }
- }
- const bothPlugins = () => [pluginOne, pluginTwo]
- new System({
- plugins: bothPlugins
- })
- const secondSystem = new System({
- plugins: bothPlugins
- })
- // Then
- let Component = secondSystem.getSystem().getComponents("wow")
- const wrapper = render(<Component name="Normal" />)
- const container = wrapper.children().first()
- expect(container[0].name).toEqual("container")
- const children = container.children()
- expect(children.length).toEqual(2)
- expect(children.eq(0).text()).toEqual("Original component")
- expect(children.eq(1).text()).toEqual("WOW much data")
- })
- })
|