You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

140 lines
3.9 KiB

  1. import React from "react"
  2. import expect from "expect"
  3. import { render } from "enzyme"
  4. import System from "core/system"
  5. describe("wrapComponents", () => {
  6. describe("should wrap a component and provide a reference to the original", () => {
  7. it("with stateless components", function(){
  8. // Given
  9. const system = new System({
  10. plugins: [
  11. {
  12. components: {
  13. wow: ({ name }) => <div>{name} component</div>
  14. }
  15. },
  16. {
  17. wrapComponents: {
  18. wow: (OriginalComponent) => (props) => {
  19. return <container>
  20. <OriginalComponent {...props}></OriginalComponent>
  21. <OriginalComponent name="Wrapped"></OriginalComponent>
  22. </container>
  23. }
  24. }
  25. }
  26. ]
  27. })
  28. // When
  29. var Component = system.getSystem().getComponents("wow")
  30. const wrapper = render(<Component name="Normal" />)
  31. const container = wrapper.children().first()
  32. expect(container[0].name).toEqual("container")
  33. const children = container.children()
  34. expect(children.length).toEqual(2)
  35. expect(children.eq(0).text()).toEqual("Normal component")
  36. expect(children.eq(1).text()).toEqual("Wrapped component")
  37. })
  38. it("with React classes", function(){
  39. class MyComponent extends React.Component {
  40. render() {
  41. return <div>{this.props.name} component</div>
  42. }
  43. }
  44. // Given
  45. const system = new System({
  46. plugins: [
  47. {
  48. components: {
  49. wow: MyComponent
  50. }
  51. },
  52. {
  53. wrapComponents: {
  54. wow: (OriginalComponent) => {
  55. return class WrapperComponent extends React.Component {
  56. render() {
  57. return <container>
  58. <OriginalComponent {...this.props}></OriginalComponent>
  59. <OriginalComponent name="Wrapped"></OriginalComponent>
  60. </container>
  61. }
  62. }
  63. }
  64. }
  65. }
  66. ]
  67. })
  68. // When
  69. var Component = system.getSystem().getComponents("wow")
  70. const wrapper = render(<Component name="Normal" />)
  71. const container = wrapper.children().first()
  72. expect(container[0].name).toEqual("container")
  73. const children = container.children()
  74. expect(children.length).toEqual(2)
  75. expect(children.eq(0).text()).toEqual("Normal component")
  76. expect(children.eq(1).text()).toEqual("Wrapped component")
  77. })
  78. })
  79. it("should provide a reference to the system to the wrapper", function(){
  80. // Given
  81. const mySystem = new System({
  82. plugins: [
  83. {
  84. // Make a selector
  85. statePlugins: {
  86. doge: {
  87. selectors: {
  88. wow: () => () => {
  89. return "WOW much data"
  90. }
  91. }
  92. }
  93. }
  94. },
  95. {
  96. // Create a component
  97. components: {
  98. wow: () => <div>Original component</div>
  99. }
  100. },
  101. {
  102. // Wrap the component and use the system
  103. wrapComponents: {
  104. wow: (OriginalComponent, system) => (props) => {
  105. return <container>
  106. <OriginalComponent {...props}></OriginalComponent>
  107. <div>{system.dogeSelectors.wow()}</div>
  108. </container>
  109. }
  110. }
  111. }
  112. ]
  113. })
  114. // Then
  115. var Component = mySystem.getSystem().getComponents("wow")
  116. const wrapper = render(<Component name="Normal" />)
  117. const container = wrapper.children().first()
  118. expect(container[0].name).toEqual("container")
  119. const children = container.children()
  120. expect(children.length).toEqual(2)
  121. expect(children.eq(0).text()).toEqual("Original component")
  122. expect(children.eq(1).text()).toEqual("WOW much data")
  123. })
  124. })