3
3
from contextlib import contextmanager
4
4
5
5
import pytest
6
+ from django .core .files .uploadedfile import SimpleUploadedFile
6
7
from django .forms import ClearableFileInput
8
+ from django .urls import reverse_lazy
7
9
from selenium .common .exceptions import NoSuchElementException
8
10
from selenium .webdriver .common .by import By
9
11
from selenium .webdriver .support .expected_conditions import staleness_of
10
12
from selenium .webdriver .support .wait import WebDriverWait
11
13
12
14
from 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
20
17
21
18
22
19
@contextmanager
@@ -27,15 +24,13 @@ def wait_for_page_load(driver, timeout=30):
27
24
28
25
29
26
class TestS3FileInput :
30
- @property
31
- def url (self ):
32
- return reverse ("upload" )
27
+ create_url = reverse_lazy ("example-create" )
33
28
34
29
def test_value_from_datadict (self , freeze_upload_folder , client , upload_file ):
35
30
with open (upload_file ) as f :
36
31
uploaded_file = storage .save (freeze_upload_folder / "test.jpg" , f )
37
32
response = client .post (
38
- reverse ( "upload" ) ,
33
+ self . create_url ,
39
34
{
40
35
"file" : f"custom/location/{ uploaded_file } " ,
41
36
"file-s3f-signature" : "FxQXie3wnVnCUFqGzFZ8DCFKAXFA3bnQ8tE96U11o80" ,
@@ -46,31 +41,31 @@ def test_value_from_datadict(self, freeze_upload_folder, client, upload_file):
46
41
assert response .status_code == 201
47
42
48
43
def test_value_from_datadict_initial_data (self , filemodel ):
49
- form = UploadForm (instance = filemodel )
44
+ form = FileForm (instance = filemodel )
50
45
assert filemodel .file .name in form .as_p (), form .as_p ()
51
46
assert not form .is_valid ()
52
47
53
48
def test_file_does_not_exist_no_fallback (self , filemodel ):
54
- form = UploadForm (
49
+ form = FileForm (
55
50
data = {"file" : "foo.bar" , "s3file" : "file" },
56
51
instance = filemodel ,
57
52
)
58
53
assert form .is_valid ()
59
54
assert form .cleaned_data ["file" ] == filemodel .file
60
55
61
56
def test_initial_no_file_uploaded (self , filemodel ):
62
- form = UploadForm (data = {"file" : "" }, instance = filemodel )
57
+ form = FileForm (data = {"file" : "" }, instance = filemodel )
63
58
assert form .is_valid (), form .errors
64
59
assert not form .has_changed ()
65
60
assert form .cleaned_data ["file" ] == filemodel .file
66
61
67
62
def test_initial_fallback (self , filemodel ):
68
- form = UploadForm (data = {"file" : "" }, instance = filemodel )
63
+ form = FileForm (data = {"file" : "" }, instance = filemodel )
69
64
assert form .is_valid ()
70
65
assert form .cleaned_data ["file" ] == filemodel .file
71
66
72
67
def test_clear (self , filemodel ):
73
- form = UploadForm (data = {"file-clear" : "1" }, instance = filemodel )
68
+ form = FileForm (data = {"file-clear" : "1" }, instance = filemodel )
74
69
assert form .is_valid ()
75
70
assert not form .cleaned_data ["file" ]
76
71
@@ -137,7 +132,7 @@ def test_accept(self):
137
132
138
133
@pytest .mark .selenium
139
134
def test_no_js_error (self , driver , live_server ):
140
- driver .get (live_server + self .url )
135
+ driver .get (live_server + self .create_url )
141
136
142
137
with pytest .raises (NoSuchElementException ):
143
138
error = driver .find_element (By .XPATH , "//body[@JSError]" )
@@ -147,7 +142,28 @@ def test_no_js_error(self, driver, live_server):
147
142
def test_file_insert (
148
143
self , request , driver , live_server , upload_file , freeze_upload_folder
149
144
):
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 }))
151
167
file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
152
168
file_input .send_keys (upload_file )
153
169
assert file_input .get_attribute ("name" ) == "file"
@@ -163,7 +179,7 @@ def test_file_insert(
163
179
def test_file_insert_submit_value (
164
180
self , driver , live_server , upload_file , freeze_upload_folder
165
181
):
166
- driver .get (live_server + self .url )
182
+ driver .get (live_server + self .create_url )
167
183
file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
168
184
file_input .send_keys (upload_file )
169
185
assert file_input .get_attribute ("name" ) == "file"
@@ -172,7 +188,7 @@ def test_file_insert_submit_value(
172
188
save_button .click ()
173
189
assert "save" in driver .page_source
174
190
175
- driver .get (live_server + self .url )
191
+ driver .get (live_server + self .create_url )
176
192
file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
177
193
file_input .send_keys (upload_file )
178
194
assert file_input .get_attribute ("name" ) == "file"
@@ -184,7 +200,7 @@ def test_file_insert_submit_value(
184
200
185
201
@pytest .mark .selenium
186
202
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 )
188
204
file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
189
205
file_input .send_keys (upload_file )
190
206
assert file_input .get_attribute ("name" ) == "file"
@@ -193,7 +209,7 @@ def test_progress(self, driver, live_server, upload_file, freeze_upload_folder):
193
209
save_button .click ()
194
210
assert "save" in driver .page_source
195
211
196
- driver .get (live_server + self .url )
212
+ driver .get (live_server + self .create_url )
197
213
file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
198
214
file_input .send_keys (upload_file )
199
215
assert file_input .get_attribute ("name" ) == "file"
@@ -213,7 +229,7 @@ def test_multi_file(
213
229
another_upload_file ,
214
230
yet_another_upload_file ,
215
231
):
216
- driver .get (live_server + reverse ("upload-multi" ))
232
+ driver .get (live_server + reverse_lazy ("upload-multi" ))
217
233
file_input = driver .find_element (By .XPATH , "//input[@name='file']" )
218
234
file_input .send_keys (
219
235
" \n " .join (
0 commit comments