Passed
Push — main ( ea1a67...5c568c )
by Andrii
02:15
created

ctx.spec.tsx ➔ Component   A

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

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