@@ -8,36 +8,172 @@ describe('html()', () => {
88 it ( 'creates a Response with HTML content-type header' , async ( ) => {
99 let response = html ( '<h1>Hello</h1>' )
1010 assert . equal ( response . headers . get ( 'Content-Type' ) , 'text/html; charset=UTF-8' )
11- assert . equal ( await response . text ( ) , '<h1>Hello</h1>' )
11+ assert . equal ( await response . text ( ) , '<!DOCTYPE html>< h1>Hello</h1>' )
1212 } )
1313
1414 it ( 'preserves custom headers and status from init' , async ( ) => {
1515 let response = html ( '<h1>Hello</h1>' , { headers : { 'X-Custom' : 'a' } , status : 201 } )
1616 assert . equal ( response . headers . get ( 'Content-Type' ) , 'text/html; charset=UTF-8' )
1717 assert . equal ( response . headers . get ( 'X-Custom' ) , 'a' )
1818 assert . equal ( response . status , 201 )
19+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><h1>Hello</h1>' )
1920 } )
2021
2122 it ( 'allows overriding Content-Type header' , async ( ) => {
2223 let response = html ( '<h1>Hello</h1>' , { headers : { 'Content-Type' : 'text/plain' } } )
2324 assert . equal ( response . headers . get ( 'Content-Type' ) , 'text/plain' )
2425 } )
2526
26- it ( 'handles ReadableStream body without modification' , async ( ) => {
27- let stream = new ReadableStream ( {
28- start ( controller ) {
29- controller . enqueue ( new TextEncoder ( ) . encode ( '<h1>Stream</h1>' ) )
30- controller . close ( )
31- } ,
32- } )
33- let response = html ( stream )
34- assert . equal ( response . headers . get ( 'Content-Type' ) , 'text/html; charset=UTF-8' )
35- assert . equal ( await response . text ( ) , '<h1>Stream</h1>' )
36- } )
37-
3827 it ( 'accepts SafeHtml from escape tag without re-escaping' , async ( ) => {
3928 let snippet = safeHtml `<strong>${ 'Hi' } </strong>`
4029 let response = html ( snippet )
41- assert . equal ( await response . text ( ) , '<strong>Hi</strong>' )
30+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><strong>Hi</strong>' )
31+ } )
32+
33+ describe ( 'DOCTYPE prepending' , ( ) => {
34+ describe ( 'string body' , ( ) => {
35+ it ( 'prepends DOCTYPE to string body' , async ( ) => {
36+ let response = html ( '<html><body>Hello</body></html>' )
37+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
38+ } )
39+
40+ it ( 'does not prepend DOCTYPE if already present' , async ( ) => {
41+ let response = html ( '<!DOCTYPE html><html><body>Hello</body></html>' )
42+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
43+ } )
44+
45+ it ( 'handles DOCTYPE with leading whitespace' , async ( ) => {
46+ let response = html ( ' <!DOCTYPE html><html><body>Hello</body></html>' )
47+ assert . equal ( await response . text ( ) , ' <!DOCTYPE html><html><body>Hello</body></html>' )
48+ } )
49+
50+ it ( 'handles DOCTYPE case-insensitively' , async ( ) => {
51+ let response = html ( '<!doctype html><html><body>Hello</body></html>' )
52+ assert . equal ( await response . text ( ) , '<!doctype html><html><body>Hello</body></html>' )
53+ } )
54+ } )
55+
56+ describe ( 'SafeHtml body' , ( ) => {
57+ it ( 'prepends DOCTYPE to SafeHtml body' , async ( ) => {
58+ let snippet = safeHtml `<html><body>Hello</body></html>`
59+ let response = html ( snippet )
60+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
61+ } )
62+
63+ it ( 'does not prepend DOCTYPE if already present in SafeHtml' , async ( ) => {
64+ let snippet = safeHtml `<!DOCTYPE html><html><body>Hello</body></html>`
65+ let response = html ( snippet )
66+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
67+ } )
68+ } )
69+
70+ describe ( 'Blob body' , ( ) => {
71+ it ( 'prepends DOCTYPE to Blob body' , async ( ) => {
72+ let blob = new Blob ( [ '<html><body>Hello</body></html>' ] , { type : 'text/html' } )
73+ let response = html ( blob )
74+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
75+ } )
76+
77+ it ( 'does not prepend DOCTYPE if already present in Blob' , async ( ) => {
78+ let blob = new Blob ( [ '<!DOCTYPE html><html><body>Hello</body></html>' ] , {
79+ type : 'text/html' ,
80+ } )
81+ let response = html ( blob )
82+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
83+ } )
84+ } )
85+
86+ describe ( 'ArrayBuffer body' , ( ) => {
87+ it ( 'prepends DOCTYPE to ArrayBuffer body' , async ( ) => {
88+ let buffer = new TextEncoder ( ) . encode ( '<html><body>Hello</body></html>' )
89+ let response = html ( buffer . buffer )
90+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
91+ } )
92+
93+ it ( 'does not prepend DOCTYPE if already present in ArrayBuffer' , async ( ) => {
94+ let buffer = new TextEncoder ( ) . encode ( '<!DOCTYPE html><html><body>Hello</body></html>' )
95+ let response = html ( buffer . buffer )
96+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
97+ } )
98+ } )
99+
100+ describe ( 'Uint8Array body' , ( ) => {
101+ it ( 'prepends DOCTYPE to Uint8Array body' , async ( ) => {
102+ let buffer = new TextEncoder ( ) . encode ( '<html><body>Hello</body></html>' )
103+ let response = html ( buffer )
104+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
105+ } )
106+
107+ it ( 'does not prepend DOCTYPE if already present in Uint8Array' , async ( ) => {
108+ let buffer = new TextEncoder ( ) . encode ( '<!DOCTYPE html><html><body>Hello</body></html>' )
109+ let response = html ( buffer )
110+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
111+ } )
112+ } )
113+
114+ describe ( 'DataView body' , ( ) => {
115+ it ( 'prepends DOCTYPE to DataView body' , async ( ) => {
116+ let buffer = new TextEncoder ( ) . encode ( '<html><body>Hello</body></html>' )
117+ let dataView = new DataView ( buffer . buffer )
118+ let response = html ( dataView )
119+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
120+ } )
121+
122+ it ( 'does not prepend DOCTYPE if already present in DataView' , async ( ) => {
123+ let buffer = new TextEncoder ( ) . encode ( '<!DOCTYPE html><html><body>Hello</body></html>' )
124+ let dataView = new DataView ( buffer . buffer )
125+ let response = html ( dataView )
126+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
127+ } )
128+ } )
129+
130+ describe ( 'ReadableStream body' , ( ) => {
131+ it ( 'prepends DOCTYPE to ReadableStream body' , async ( ) => {
132+ let stream = new ReadableStream ( {
133+ start ( controller ) {
134+ controller . enqueue ( new TextEncoder ( ) . encode ( '<html><body>Hello</body></html>' ) )
135+ controller . close ( )
136+ } ,
137+ } )
138+ let response = html ( stream )
139+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
140+ } )
141+
142+ it ( 'does not prepend DOCTYPE if already present in ReadableStream' , async ( ) => {
143+ let stream = new ReadableStream ( {
144+ start ( controller ) {
145+ controller . enqueue (
146+ new TextEncoder ( ) . encode ( '<!DOCTYPE html><html><body>Hello</body></html>' ) ,
147+ )
148+ controller . close ( )
149+ } ,
150+ } )
151+ let response = html ( stream )
152+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
153+ } )
154+
155+ it ( 'handles empty ReadableStream' , async ( ) => {
156+ let stream = new ReadableStream ( {
157+ start ( controller ) {
158+ controller . close ( )
159+ } ,
160+ } )
161+ let response = html ( stream )
162+ assert . equal ( await response . text ( ) , '<!DOCTYPE html>' )
163+ } )
164+
165+ it ( 'handles multi-chunk ReadableStream' , async ( ) => {
166+ let stream = new ReadableStream ( {
167+ start ( controller ) {
168+ controller . enqueue ( new TextEncoder ( ) . encode ( '<html>' ) )
169+ controller . enqueue ( new TextEncoder ( ) . encode ( '<body>' ) )
170+ controller . enqueue ( new TextEncoder ( ) . encode ( 'Hello</body></html>' ) )
171+ controller . close ( )
172+ } ,
173+ } )
174+ let response = html ( stream )
175+ assert . equal ( await response . text ( ) , '<!DOCTYPE html><html><body>Hello</body></html>' )
176+ } )
177+ } )
42178 } )
43179} )
0 commit comments