Passed
Push — main ( ae2428...ecbe39 )
by Andrii
02:07
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 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
function App({classnames, className}: ClassNames<true, "App__Item", typeof Component>) {
15
  return <Component {...{
16
    ...classNamingCtx({
17
      classnames, className
18
    })(
19
      true, {App__Item: true}
20
    ),
21
    classnames
22
  }}/>
23
}
24
25
//TODO No rename inheritance
26
function Component(props: ClassNames<true, {classnames: {class1: ClassValue, class2: ClassValue}}>) {
27
  const classes = classNamingCtx(props)
28
  return <>
29
    <div {...classes(true, {class1: true, class2: false})}/>
30
    <div {...classes({class2: true})}/>
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: true}
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: true}
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 `classnames` to DOM element - TBD TS error", () => {
86
    const Component = ({classnames}: ClassNames<"class1">) =>
87
      <div {
88
        //TODO //@ts-expect-error  Property 'classnames' does not exist
89
        ...classNamingCtx({classnames}, {withClassNames: true})({class1: true})
90
      }/>
91
92
    expectRender(
93
      <Component classnames={classnames}/>
94
    ).toSame(
95
      <div
96
        //@ts-expect-error  Property 'classnames' does not exist
97
        classnames=""
98
        className="hash1" />
99
    )
100
  })
101
})