Skip to content

Commit 83dd5dd

Browse files
committed
Add tests of get and post
1 parent 6dd0671 commit 83dd5dd

3 files changed

Lines changed: 421 additions & 1 deletion

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,6 @@ database.sqlite3
108108
file_uploads
109109
.vscode
110110
src
111-
uploads
111+
file_uploads
112112
temp
113113
requirements.dev

tests/ui/uploads/test_get.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import pytest
2+
from lbrc_flask.pytest.asserts import assert__refresh_response, assert__input_text, assert__input, assert__input_with_options
3+
from lbrc_flask.pytest.testers import RequiresLoginTester, RequiresRoleTester, ModalContentAsserter, FlaskViewLoggedInTester
4+
from lbrc_flask.forms.dynamic import FieldType
5+
from tests.ui.uploads import UploadViewTester
6+
7+
8+
class TitleAsserter:
9+
def __init__(self, study):
10+
self.study = study
11+
12+
def assert_all(self, resp):
13+
assert resp.soup.find("h2", string=f"Upload data to study {self.study.name}") is not None
14+
15+
assert__input_text(resp.soup, "study_number")
16+
17+
18+
class UploadGetViewTester(UploadViewTester):
19+
SIZE_LIMIT = 80
20+
21+
@property
22+
def request_method(self):
23+
return self.get
24+
25+
@property
26+
def endpoint(self):
27+
return 'ui.upload_data'
28+
29+
@pytest.fixture(autouse=True)
30+
def set_original(self, client, faker):
31+
self.collaborator = faker.user().get_in_db()
32+
self.owner = faker.user().get_in_db()
33+
self.study = faker.study().get_in_db(owner=self.owner, collaborator=self.collaborator, size_limit=self.SIZE_LIMIT)
34+
35+
self.parameters['study_id'] = self.study.id
36+
37+
38+
class TestUploadGetRequiresLogin(UploadGetViewTester, RequiresLoginTester):
39+
...
40+
41+
42+
class TestUploadGetRequiresCollaborator(UploadGetViewTester, RequiresRoleTester):
43+
@property
44+
def user_with_required_role(self):
45+
return self.collaborator
46+
47+
@property
48+
def user_without_required_role(self):
49+
return self.owner
50+
51+
52+
class TestUploadFormGet(UploadGetViewTester, FlaskViewLoggedInTester):
53+
@pytest.fixture(autouse=True)
54+
def set_original(self, client, faker, login_fixture):
55+
self.study = faker.study().get_in_db(collaborator=self.loggedin_user, size_limit=self.SIZE_LIMIT)
56+
57+
self.parameters['study_id'] = self.study.id
58+
59+
def assert_response(self, resp):
60+
asserters = [
61+
ModalContentAsserter(has_save_button=True, has_cancel_button=True),
62+
TitleAsserter(self.study),
63+
]
64+
65+
for a in asserters:
66+
a.assert_all(resp)
67+
68+
def test__get__valid(self):
69+
upload = self.faker.upload().get_in_db(study=self.study)
70+
upload_file = self.faker.upload_file().get_in_db(upload=upload, size=self.SIZE_LIMIT - 1)
71+
resp = self.get()
72+
self.assert_response(resp)
73+
74+
def test__get__space_exceeded(self):
75+
upload = self.faker.upload().get_in_db(study=self.study)
76+
upload_file = self.faker.upload_file().get_in_db(upload=upload, size=self.SIZE_LIMIT + 1)
77+
resp = self.get()
78+
assert__refresh_response(resp)
79+
80+
81+
@pytest.mark.parametrize(
82+
"field_type_name",
83+
FieldType.all_non_choices_field_types(),
84+
)
85+
def test__uget__form_dynamic_input(self, field_type_name):
86+
field = self.faker.field().get_in_db(
87+
field_type=FieldType._get_field_type(field_type_name),
88+
field_group=self.study.field_group,
89+
order=1,
90+
)
91+
92+
resp = self.get()
93+
assert__input(resp.soup, field_type_name, field.field_name)
94+
95+
96+
@pytest.mark.parametrize(
97+
"field_type_name",
98+
FieldType.all_choices_field_types(),
99+
)
100+
def test__get__form_dynamic_input_with_choices(self, field_type_name):
101+
options = {
102+
"xy": "xy",
103+
"z": "z",
104+
}
105+
106+
field = self.faker.field().get_in_db(
107+
field_type=FieldType._get_field_type(field_type_name),
108+
field_group=self.study.field_group,
109+
order=1,
110+
choices="|".join(options.keys()),
111+
)
112+
113+
resp = self.get()
114+
assert__input_with_options(resp.soup, field_type_name, field.field_name, options=options)
115+
116+
def test__get__multiple_fields(self):
117+
field1 = self.faker.field().get_in_db(
118+
field_type=FieldType.get_textarea(),
119+
field_group=self.study.field_group,
120+
order=1,
121+
)
122+
field2 = self.faker.field().get_in_db(
123+
field_type=FieldType.get_string(),
124+
field_group=self.study.field_group,
125+
order=2,
126+
)
127+
128+
resp = self.get()
129+
assert__input(resp.soup, field1.field_type.name, field1.field_name)
130+
assert__input(resp.soup, field2.field_type.name, field2.field_name)

0 commit comments

Comments
 (0)