Passed
Push — main ( a3dd18...4c1518 )
by Andrii
02:15
created

ctx.spec.tsx ➔ App   A

Complexity

Conditions 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
dl 0
loc 9
rs 10
c 0
b 0
f 0
cc 1
1
import React from "react"
2
import { classNamesCheck, classNamingCtx } from "."
3
import expectToRender from "../expect-to-render"
4
import { ClassNames } from "./defs"
5
6
const {classNames}: ClassNames<typeof App> = {
7
  classNames: {
8
    "App__Item": "hash",
9
    class1: "hash1",
10
    class2: "hash2"
11
  }
12
}
13
14
function Component(props: ClassNames<true, "class1"|"class2">) {
15
  const classes = classNamingCtx(props)
16
  return <>
17
    <div {...classes(true, {class1: true, class2: false})}/>
18
    <div {...classes("class2")}/>
19
  </>
20
}
21
22
function App({classNames, className}: ClassNames<true, "App__Item", typeof Component>) {
23
  return <Component {...{
24
    ...classNamingCtx({
25
      classNames, className
26
    })(
27
      true, "App__Item"
28
    ),
29
    classNames
30
  }}/>
31
}
32
33
describe(classNamingCtx.name, () => {
34
  it("not module", () => expectToRender(
35
    <App className="MyApp" classNames={classNamesCheck()} />,
36
    [
37
      '<div class="MyApp App__Item class1"></div>',
38
      '<div class="class2"></div>'
39
    ]
40
  ))
41
42
  it("css module", () => expectToRender(
43
    <App className="MyApp" classNames={classNames} />,
44
    [
45
      '<div class="MyApp hash hash1"></div>',
46
      '<div class="hash2"></div>'
47
    ]
48
  ))
49
50
  it("propagate classNames by option", () => {
51
    const App = ({classNames, className}: ClassNames<true, "App__Item", typeof Component>) =>
52
      <Component {
53
        ...classNamingCtx(
54
          {classNames, className},
55
          {withClassNames: true}
56
        )(
57
          true, "App__Item"
58
      )}/>
59
    
60
    expectToRender(
61
      <App className="MyApp" classNames={classNames}/>,
62
      [
63
        '<div class="MyApp hash hash1"></div>',
64
        '<div class="hash2"></div>'
65
        ]
66
    )
67
  })  
68
69
  it("not propagate classNames", () => {
70
    const App = ({classNames, className}: ClassNames<true, "App__Item", typeof Component>) =>
71
      //@ts-expect-error Types of property 'classNames' are incompatible Type 'undefined' is not assignable 
72
      <Component {
73
        ...classNamingCtx({
74
          classNames, className
75
        })(
76
          true, "App__Item"
77
      )}/>
78
    
79
    expectToRender(
80
      <App className="MyApp" classNames={classNames}/>,
81
      [
82
        '<div class="MyApp hash class1"></div>',
83
        '<div class="class2"></div>'  
84
      ]
85
    )
86
  })
87
88
  it("propagate wrongly to leaf element", () => {
89
    const Component = ({classNames}: ClassNames<"class1">) =>
90
      <div {
91
        ...classNamingCtx({classNames}, {withClassNames: true})("class1")
92
      }/>
93
94
    expectToRender(
95
      <Component classNames={classNames}/>,
96
      '<div class="hash1" classNames=""></div>'
97
    )
98
  })
99
})