@@ -66,6 +66,24 @@ test("attributes", () => {
6666 expect ( render ( < input disabled checked = { false } value = "name" /> ) ) . toBe ( '<input disabled value="name">' ) ;
6767} ) ;
6868
69+ test ( "element middleware" , ( ) => {
70+ expect (
71+ render ( < a href = "/docs" > Docs</ a > , {
72+ element : [
73+ ( { tag, props } ) => ( tag === "a" ? { ...props , target : "_blank" } : undefined ) ,
74+ ( { tag, props } ) => {
75+ if ( tag === "a" ) props [ "rel" ] = "noreferrer" ;
76+ } ,
77+ ] ,
78+ } ) ,
79+ ) . toBe ( '<a href="/docs" target="_blank" rel="noreferrer">Docs</a>' ) ;
80+ expect (
81+ render ( < p > Hi</ p > , {
82+ element : [ [ ( { props } ) => ( { ...props , class : "message" } ) ] ] ,
83+ } ) ,
84+ ) . toBe ( '<p class="message">Hi</p>' ) ;
85+ } ) ;
86+
6987test ( "style" , ( ) => {
7088 expect (
7189 render (
@@ -79,6 +97,18 @@ test("style", () => {
7997 /> ,
8098 ) ,
8199 ) . toBe ( '<div style="margin-top:10px;opacity:0.5;--gap:2;background-color:red;"></div>' ) ;
100+ expect ( render ( < div style = { 'color: red; --label: "a&b";' } /> ) ) . toBe (
101+ '<div style="color: red; --label: "a&b";"></div>' ,
102+ ) ;
103+ } ) ;
104+
105+ test ( "children arrays and null" , ( ) => {
106+ function Box ( { children } : PropsWithChildren ) {
107+ return < div > { children } </ div > ;
108+ }
109+
110+ expect ( render ( < Box > { [ < span > one</ span > , null , "two" ] } </ Box > ) ) . toBe ( "<div><span>one</span>two</div>" ) ;
111+ expect ( render ( jsx ( "div" , { children : null } ) ) ) . toBe ( "<div></div>" ) ;
82112} ) ;
83113
84114test ( "head hoisting" , ( ) => {
@@ -138,6 +168,26 @@ test("async", async () => {
138168 </ div > ,
139169 ) ,
140170 ) . resolves . toBe ( '<div title="a&b"><strong>Async</strong>x<y</div>' ) ;
171+ await expect (
172+ renderAsync ( < div title = { Promise . resolve ( null ) } data-id = { Promise . resolve ( undefined ) } /> ) ,
173+ ) . resolves . toBe ( "<div></div>" ) ;
174+ await expect (
175+ renderAsync ( jsx ( "img" , { src : "/image.png" } ) , {
176+ element : async ( { tag, props } ) =>
177+ tag === "img" ? { ...props , alt : Promise . resolve ( "A&B" ) } : undefined ,
178+ } ) ,
179+ ) . resolves . toBe ( '<img src="/image.png" alt="A&B">' ) ;
180+ await expect (
181+ renderAsync ( < img src = "/photo.jpg" alt = "Mountain lake" /> , {
182+ element : async ( { tag, props } ) => {
183+ if ( tag !== "img" ) return ;
184+
185+ await Promise . resolve ( ) ;
186+ props [ "width" ] = 1200 ;
187+ props [ "height" ] = 800 ;
188+ } ,
189+ } ) ,
190+ ) . resolves . toBe ( '<img src="/photo.jpg" alt="Mountain lake" width="1200" height="800">' ) ;
141191} ) ;
142192
143193test ( "async head" , async ( ) => {
@@ -166,6 +216,7 @@ test("sync rejects async", () => {
166216
167217 expect ( ( ) => render ( < Message /> ) ) . toThrow ( "renderAsync" ) ;
168218 expect ( ( ) => render ( < div > { Promise . resolve ( "Async" ) } </ div > ) ) . toThrow ( "renderAsync" ) ;
219+ expect ( ( ) => render ( < div /> , { element : async ( ) => { } } ) ) . toThrow ( "renderAsync" ) ;
169220} ) ;
170221
171222test ( "function attrs" , ( ) => {
0 commit comments