@@ -72,6 +72,54 @@ def test_str(self, settings):
7272 assert str (js ) == '<script src="/static/path" type="module"></script>'
7373
7474
75+ class TestInputToS3FileRewriter :
76+ def test_transforms_file_input (self ):
77+ parser = forms .InputToS3FileRewriter ()
78+ parser .feed ('<input type="file" name="test">' )
79+ assert parser .get_html () == '<s3-file name="test">'
80+
81+ def test_preserves_non_file_input (self ):
82+ parser = forms .InputToS3FileRewriter ()
83+ parser .feed ('<input type="text" name="test">' )
84+ assert parser .get_html () == '<input type="text" name="test">'
85+
86+ def test_handles_attribute_ordering (self ):
87+ parser = forms .InputToS3FileRewriter ()
88+ parser .feed ('<input name="test" type="file" class="foo">' )
89+ result = parser .get_html ()
90+ assert result .startswith ('<s3-file' )
91+ assert 'name="test"' in result
92+ assert 'class="foo"' in result
93+ assert 'type="file"' not in result
94+
95+ def test_handles_multiple_attributes (self ):
96+ parser = forms .InputToS3FileRewriter ()
97+ parser .feed ('<input type="file" name="test" accept="image/*" required multiple>' )
98+ result = parser .get_html ()
99+ assert result .startswith ('<s3-file' )
100+ assert 'name="test"' in result
101+ assert 'accept="image/*"' in result
102+ assert 'required' in result
103+ assert 'multiple' in result
104+
105+ def test_escapes_html_entities (self ):
106+ parser = forms .InputToS3FileRewriter ()
107+ parser .feed ('<input type="file" name="test" data-value="test&value">' )
108+ result = parser .get_html ()
109+ assert 'data-value="test&value"' in result
110+
111+ def test_handles_self_closing_tag (self ):
112+ parser = forms .InputToS3FileRewriter ()
113+ parser .feed ('<input type="file" name="test" />' )
114+ assert parser .get_html () == '<s3-file name="test">'
115+
116+ def test_preserves_surrounding_elements (self ):
117+ parser = forms .InputToS3FileRewriter ()
118+ parser .feed ('<p><input type="file" name="test"></p>' )
119+ result = parser .get_html ()
120+ assert result == '<p><s3-file name="test"></p>'
121+
122+
75123@contextmanager
76124def wait_for_page_load (driver , timeout = 30 ):
77125 old_page = driver .find_element (By .TAG_NAME , "html" )
@@ -186,6 +234,21 @@ def test_render_wraps_in_s3_file_element(self, freeze_upload_folder):
186234 # Check that the output is the s3-file custom element
187235 assert html .startswith ("<s3-file" )
188236
237+ def test_render_preserves_attributes (self , freeze_upload_folder ):
238+ widget = ClearableFileInput (attrs = {"class" : "test-class" , "accept" : "image/*" })
239+ html = widget .render (name = "file" , value = None )
240+ assert html .startswith ("<s3-file" )
241+ assert 'name="file"' in html
242+ assert 'class="test-class"' in html
243+ assert 'accept="image/*"' in html
244+ assert 'type="file"' not in html
245+
246+ def test_render_excludes_type_attribute (self , freeze_upload_folder ):
247+ widget = ClearableFileInput ()
248+ html = widget .render (name = "file" , value = None )
249+ assert 'type="file"' not in html
250+ assert html .startswith ("<s3-file" )
251+
189252 @pytest .mark .selenium
190253 def test_no_js_error (self , driver , live_server ):
191254 driver .get (live_server + self .create_url )
0 commit comments