33from contextlib import contextmanager
44
55import pytest
6+ from django .core .files .uploadedfile import SimpleUploadedFile
67from django .forms import ClearableFileInput
8+ from django .urls import reverse_lazy
79from selenium .common .exceptions import NoSuchElementException
810from selenium .webdriver .common .by import By
911from selenium .webdriver .support .expected_conditions import staleness_of
1012from selenium .webdriver .support .wait import WebDriverWait
1113
1214from s3file .storages import storage
13- from tests .testapp .forms import UploadForm
14-
15- try :
16- from django .urls import reverse
17- except ImportError :
18- # Django 1.8 support
19- from django .core .urlresolvers import reverse
15+ from tests .testapp .forms import FileForm
16+ from tests .testapp .models import FileModel
2017
2118
2219@contextmanager
@@ -27,15 +24,13 @@ def wait_for_page_load(driver, timeout=30):
2724
2825
2926class TestS3FileInput :
30- @property
31- def url (self ):
32- return reverse ("upload" )
27+ create_url = reverse_lazy ("example-create" )
3328
3429 def test_value_from_datadict (self , freeze_upload_folder , client , upload_file ):
3530 with open (upload_file ) as f :
3631 uploaded_file = storage .save (freeze_upload_folder / "test.jpg" , f )
3732 response = client .post (
38- reverse ( "upload" ) ,
33+ self . create_url ,
3934 {
4035 "file" : f"custom/location/{ uploaded_file } " ,
4136 "file-s3f-signature" : "FxQXie3wnVnCUFqGzFZ8DCFKAXFA3bnQ8tE96U11o80" ,
@@ -46,31 +41,31 @@ def test_value_from_datadict(self, freeze_upload_folder, client, upload_file):
4641 assert response .status_code == 201
4742
4843 def test_value_from_datadict_initial_data (self , filemodel ):
49- form = UploadForm (instance = filemodel )
44+ form = FileForm (instance = filemodel )
5045 assert filemodel .file .name in form .as_p (), form .as_p ()
5146 assert not form .is_valid ()
5247
5348 def test_file_does_not_exist_no_fallback (self , filemodel ):
54- form = UploadForm (
49+ form = FileForm (
5550 data = {"file" : "foo.bar" , "s3file" : "file" },
5651 instance = filemodel ,
5752 )
5853 assert form .is_valid ()
5954 assert form .cleaned_data ["file" ] == filemodel .file
6055
6156 def test_initial_no_file_uploaded (self , filemodel ):
62- form = UploadForm (data = {"file" : "" }, instance = filemodel )
57+ form = FileForm (data = {"file" : "" }, instance = filemodel )
6358 assert form .is_valid (), form .errors
6459 assert not form .has_changed ()
6560 assert form .cleaned_data ["file" ] == filemodel .file
6661
6762 def test_initial_fallback (self , filemodel ):
68- form = UploadForm (data = {"file" : "" }, instance = filemodel )
63+ form = FileForm (data = {"file" : "" }, instance = filemodel )
6964 assert form .is_valid ()
7065 assert form .cleaned_data ["file" ] == filemodel .file
7166
7267 def test_clear (self , filemodel ):
73- form = UploadForm (data = {"file-clear" : "1" }, instance = filemodel )
68+ form = FileForm (data = {"file-clear" : "1" }, instance = filemodel )
7469 assert form .is_valid ()
7570 assert not form .cleaned_data ["file" ]
7671
@@ -137,7 +132,7 @@ def test_accept(self):
137132
138133 @pytest .mark .selenium
139134 def test_no_js_error (self , driver , live_server ):
140- driver .get (live_server + self .url )
135+ driver .get (live_server + self .create_url )
141136
142137 with pytest .raises (NoSuchElementException ):
143138 error = driver .find_element (By .XPATH , "//body[@JSError]" )
@@ -147,7 +142,28 @@ def test_no_js_error(self, driver, live_server):
147142 def test_file_insert (
148143 self , request , driver , live_server , upload_file , freeze_upload_folder
149144 ):
150- driver .get (live_server + self .url )
145+ driver .get (live_server + self .create_url )
146+ file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
147+ file_input .send_keys (upload_file )
148+ assert file_input .get_attribute ("name" ) == "file"
149+ with wait_for_page_load (driver , timeout = 10 ):
150+ file_input .submit ()
151+ assert storage .exists ("tmp/s3file/%s.txt" % request .node .name )
152+
153+ with pytest .raises (NoSuchElementException ):
154+ error = driver .find_element (By .XPATH , "//body[@JSError]" )
155+ pytest .fail (error .get_attribute ("JSError" ))
156+
157+ @pytest .mark .selenium
158+ def test_file_update (
159+ self , request , driver , live_server , upload_file , freeze_upload_folder
160+ ):
161+ FileModel .objects .create (
162+ file = SimpleUploadedFile (
163+ f"{ request .node .name } .txt" , request .node .name .encode ()
164+ )
165+ )
166+ driver .get (live_server + reverse_lazy ("example-update" , kwargs = {"pk" : 1 }))
151167 file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
152168 file_input .send_keys (upload_file )
153169 assert file_input .get_attribute ("name" ) == "file"
@@ -163,7 +179,7 @@ def test_file_insert(
163179 def test_file_insert_submit_value (
164180 self , driver , live_server , upload_file , freeze_upload_folder
165181 ):
166- driver .get (live_server + self .url )
182+ driver .get (live_server + self .create_url )
167183 file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
168184 file_input .send_keys (upload_file )
169185 assert file_input .get_attribute ("name" ) == "file"
@@ -172,7 +188,7 @@ def test_file_insert_submit_value(
172188 save_button .click ()
173189 assert "save" in driver .page_source
174190
175- driver .get (live_server + self .url )
191+ driver .get (live_server + self .create_url )
176192 file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
177193 file_input .send_keys (upload_file )
178194 assert file_input .get_attribute ("name" ) == "file"
@@ -184,7 +200,7 @@ def test_file_insert_submit_value(
184200
185201 @pytest .mark .selenium
186202 def test_progress (self , driver , live_server , upload_file , freeze_upload_folder ):
187- driver .get (live_server + self .url )
203+ driver .get (live_server + self .create_url )
188204 file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
189205 file_input .send_keys (upload_file )
190206 assert file_input .get_attribute ("name" ) == "file"
@@ -193,7 +209,7 @@ def test_progress(self, driver, live_server, upload_file, freeze_upload_folder):
193209 save_button .click ()
194210 assert "save" in driver .page_source
195211
196- driver .get (live_server + self .url )
212+ driver .get (live_server + self .create_url )
197213 file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
198214 file_input .send_keys (upload_file )
199215 assert file_input .get_attribute ("name" ) == "file"
@@ -213,7 +229,7 @@ def test_multi_file(
213229 another_upload_file ,
214230 yet_another_upload_file ,
215231 ):
216- driver .get (live_server + reverse ("upload-multi" ))
232+ driver .get (live_server + reverse_lazy ("upload-multi" ))
217233 file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
218234 file_input .send_keys (
219235 " \n " .join (
0 commit comments