Skip to content

Commit d917af6

Browse files
authored
more tests & polishing (#9)
* polished users,groups,apps Signed-off-by: Alexander Piskun <bigcat88@icloud.com>
1 parent 91ba5d7 commit d917af6

File tree

9 files changed

+139
-55
lines changed

9 files changed

+139
-55
lines changed

nc_py_api/apps.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,24 @@ def enable(self, app_name: str) -> None:
2323
raise ValueError("`app_name` parameter can not be empty")
2424
self._session.ocs(method="POST", path=f"{ENDPOINT}/{app_name}")
2525

26-
def list(self, enabled: Optional[bool] = None) -> list[str]:
26+
def get_list(self, enabled: Optional[bool] = None) -> list[str]:
2727
params = None
2828
if enabled is not None:
2929
params = {"filter": "enabled" if enabled else "disabled"}
3030
result = self._session.ocs(method="GET", path=ENDPOINT, params=params)
31-
if not isinstance(result, dict):
32-
raise ValueError("invalid type of data returned")
3331
return list(result["apps"].values()) if isinstance(result["apps"], dict) else result["apps"]
3432

3533
def is_installed(self, app_name: str) -> bool:
3634
if not app_name:
3735
raise ValueError("`app_name` parameter can not be empty")
38-
return app_name in self.list()
36+
return app_name in self.get_list()
3937

4038
def is_enabled(self, app_name: str) -> bool:
4139
if not app_name:
4240
raise ValueError("`app_name` parameter can not be empty")
43-
return app_name in self.list(enabled=True)
41+
return app_name in self.get_list(enabled=True)
4442

4543
def is_disabled(self, app_name: str) -> bool:
4644
if not app_name:
4745
raise ValueError("`app_name` parameter can not be empty")
48-
return app_name in self.list(enabled=False)
46+
return app_name in self.get_list(enabled=False)

nc_py_api/users.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,55 +15,58 @@ class UserAPI:
1515
def __init__(self, session: NcSessionBasic):
1616
self._session = session
1717

18-
def list(self, mask: Optional[str] = "", limit: Optional[int] = None, offset: Optional[int] = None) -> dict:
18+
def get_list(
19+
self, mask: Optional[str] = "", limit: Optional[int] = None, offset: Optional[int] = None
20+
) -> list[str]:
1921
data = kwargs_to_dict(["search", "limit", "offset"], search=mask, limit=limit, offset=offset)
2022
response_data = self._session.ocs(method="GET", path=ENDPOINT, params=data)
2123
return response_data["users"] if response_data else {}
2224

23-
def get(self, user_id: str = "") -> dict:
25+
def get_details(self, user_id: str = "") -> dict:
2426
if not user_id:
2527
user_id = self._session.user
2628
if not user_id:
2729
raise ValueError("user_id can not be empty.")
2830
return self._session.ocs(method="GET", path=f"{ENDPOINT}/{user_id}")
2931

30-
def create(self, user_id: str, **kwargs) -> dict:
32+
def create(self, user_id: str, **kwargs) -> None:
3133
password = kwargs.get("password", None)
3234
email = kwargs.get("email", None)
33-
if password is None and email is None:
35+
if not password and not email:
3436
raise ValueError("Either password or email must be set")
3537
data = {"userid": user_id}
3638
for k in ("password", "displayname", "email", "groups", "subadmin", "quota", "language"):
3739
if k in kwargs:
3840
data[k] = kwargs[k]
39-
return self._session.ocs(method="POST", path=ENDPOINT, params=data)
41+
self._session.ocs(method="POST", path=ENDPOINT, params=data)
4042

41-
def delete(self, user_id: str) -> dict:
42-
return self._session.ocs(method="DELETE", path=f"{ENDPOINT}/{user_id}")
43+
def delete(self, user_id: str) -> None:
44+
self._session.ocs(method="DELETE", path=f"{ENDPOINT}/{user_id}")
4345

44-
def enable(self, user_id: str) -> dict:
45-
return self._session.ocs(method="PUT", path=f"{ENDPOINT}/{user_id}/enable")
46+
def enable(self, user_id: str) -> None:
47+
self._session.ocs(method="PUT", path=f"{ENDPOINT}/{user_id}/enable")
4648

47-
def disable(self, user_id: str) -> dict:
48-
return self._session.ocs(method="PUT", path=f"{ENDPOINT}/{user_id}/disable")
49+
def disable(self, user_id: str) -> None:
50+
self._session.ocs(method="PUT", path=f"{ENDPOINT}/{user_id}/disable")
4951

50-
def resend_welcome_email(self) -> dict:
51-
return self._session.ocs(method="POST", path=f"{ENDPOINT}/user/welcome")
52+
def resend_welcome_email(self) -> None:
53+
self._session.ocs(method="POST", path=f"{ENDPOINT}/admin/welcome")
5254

53-
def editable_fields(self) -> dict:
55+
def editable_fields(self) -> list[str]:
5456
return self._session.ocs(method="GET", path=f"{ENDPOINT_BASE}/user/fields")
5557

56-
def edit(self, user_id: str, **kwargs) -> dict:
57-
return self._session.ocs(method="PUT", path=f"{ENDPOINT}/{user_id}", params={**kwargs})
58+
def edit(self, user_id: str, **kwargs) -> None:
59+
for k, v in kwargs.items():
60+
self._session.ocs(method="PUT", path=f"{ENDPOINT}/{user_id}", params={"key": k, "value": v})
5861

59-
def add_to_group(self, user_id: str, group_id: str) -> dict:
60-
return self._session.ocs(method="POST", path=f"{ENDPOINT}/{user_id}/groups", params={"groupid": group_id})
62+
def add_to_group(self, user_id: str, group_id: str) -> None:
63+
self._session.ocs(method="POST", path=f"{ENDPOINT}/{user_id}/groups", params={"groupid": group_id})
6164

62-
def remove_from_group(self, user_id: str, group_id: str) -> dict:
63-
return self._session.ocs(method="DELETE", path=f"{ENDPOINT}/{user_id}/groups", params={"groupid": group_id})
65+
def remove_from_group(self, user_id: str, group_id: str) -> None:
66+
self._session.ocs(method="DELETE", path=f"{ENDPOINT}/{user_id}/groups", params={"groupid": group_id})
6467

65-
def promote_to_subadmin(self, user_id: str, group_id: str) -> dict:
66-
return self._session.ocs(method="POST", path=f"{ENDPOINT}/{user_id}/subadmins", params={"groupid": group_id})
68+
def promote_to_subadmin(self, user_id: str, group_id: str) -> None:
69+
self._session.ocs(method="POST", path=f"{ENDPOINT}/{user_id}/subadmins", params={"groupid": group_id})
6770

68-
def demote_from_subadmin(self, user_id: str, group_id: str) -> dict:
69-
return self._session.ocs(method="DELETE", path=f"{ENDPOINT}/{user_id}/subadmins", params={"groupid": group_id})
71+
def demote_from_subadmin(self, user_id: str, group_id: str) -> None:
72+
self._session.ocs(method="DELETE", path=f"{ENDPOINT}/{user_id}/subadmins", params={"groupid": group_id})

nc_py_api/users_groups.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ class UsersGroupsAPI:
2323
def __init__(self, session: NcSessionBasic):
2424
self._session = session
2525

26-
def get(self, mask: Optional[str] = None, limit: Optional[int] = None, offset: Optional[int] = None) -> list[str]:
26+
def get_list(
27+
self, mask: Optional[str] = None, limit: Optional[int] = None, offset: Optional[int] = None
28+
) -> list[str]:
2729
data = kwargs_to_dict(["search", "limit", "offset"], search=mask, limit=limit, offset=offset)
2830
response_data = self._session.ocs(method="GET", path=ENDPOINT, params=data)
2931
return response_data["groups"] if response_data else []

nc_py_api/users_statuses.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def __init__(self, session: NcSessionBasic):
4040
def available(self) -> bool:
4141
return not check_capabilities("user_status", self._session.capabilities)
4242

43-
def get_all(self, limit: Optional[int] = None, offset: Optional[int] = None) -> list[UserStatus]:
43+
def get_list(self, limit: Optional[int] = None, offset: Optional[int] = None) -> list[UserStatus]:
4444
require_capabilities("user_status", self._session.capabilities)
4545
data = kwargs_to_dict(["limit", "offset"], limit=limit, offset=offset)
4646
return self._session.ocs(method="GET", path=f"{ENDPOINT}/statuses", params=data)

tests/apps_test.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99

1010
@pytest.mark.parametrize("nc", NC_TO_TEST)
1111
def test_list_apps_types(nc):
12-
assert isinstance(nc.apps.list(), list)
13-
assert isinstance(nc.apps.list(enabled=True), list)
14-
assert isinstance(nc.apps.list(enabled=False), list)
12+
assert isinstance(nc.apps.get_list(), list)
13+
assert isinstance(nc.apps.get_list(enabled=True), list)
14+
assert isinstance(nc.apps.get_list(enabled=False), list)
1515

1616

1717
@pytest.mark.parametrize("nc", NC_TO_TEST)
1818
def test_list_apps(nc):
19-
apps = nc.apps.list()
19+
apps = nc.apps.get_list()
2020
assert apps
2121
assert APP_NAME in apps
2222

@@ -33,3 +33,17 @@ def test_enable_disable_app(nc):
3333
nc.apps.enable(APP_NAME)
3434
assert nc.apps.is_enabled(APP_NAME)
3535
assert nc.apps.is_installed(APP_NAME)
36+
37+
38+
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
39+
def test_invalid_param(nc):
40+
with pytest.raises(ValueError):
41+
nc.apps.is_enabled("")
42+
with pytest.raises(ValueError):
43+
nc.apps.is_installed("")
44+
with pytest.raises(ValueError):
45+
nc.apps.is_disabled("")
46+
with pytest.raises(ValueError):
47+
nc.apps.enable("")
48+
with pytest.raises(ValueError):
49+
nc.apps.disable("")

tests/groups_test.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,37 +27,37 @@ def test_create_delete_group(nc, params):
2727

2828
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
2929
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
30-
def test_get_group(nc):
30+
def test_group_get_list(nc):
3131
for i in (TEST_GROUP_NAME, TEST_GROUP_NAME2):
3232
try:
3333
nc.users_groups.create(i)
3434
except NextcloudException:
3535
pass
36-
groups = nc.users_groups.get()
36+
groups = nc.users_groups.get_list()
3737
assert isinstance(groups, list)
3838
assert len(groups) >= 2
3939
assert TEST_GROUP_NAME in groups
4040
assert TEST_GROUP_NAME2 in groups
41-
groups = nc.users_groups.get(mask=TEST_GROUP_NAME)
41+
groups = nc.users_groups.get_list(mask=TEST_GROUP_NAME)
4242
assert len(groups) == 1
43-
groups = nc.users_groups.get(limit=1)
43+
groups = nc.users_groups.get_list(limit=1)
4444
assert len(groups) == 1
45-
assert groups[0] != nc.users_groups.get(limit=1, offset=1)[0]
45+
assert groups[0] != nc.users_groups.get_list(limit=1, offset=1)[0]
4646
nc.users_groups.delete(TEST_GROUP_NAME)
4747
nc.users_groups.delete(TEST_GROUP_NAME2)
4848

4949

5050
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
5151
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
5252
def test_get_non_existing_group(nc):
53-
groups = nc.users_groups.get(mask="Such group should not be present")
53+
groups = nc.users_groups.get_list(mask="Such group should not be present")
5454
assert isinstance(groups, list)
5555
assert not groups
5656

5757

5858
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
5959
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
60-
def test_get_group_details(nc):
60+
def test_group_get_details(nc):
6161
try:
6262
nc.users_groups.delete(TEST_GROUP_NAME)
6363
except NextcloudException:

tests/misc_test.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,12 @@ def test_check_error(code):
1010
check_error(code)
1111
else:
1212
check_error(code)
13+
14+
15+
def test_nc_exception_to_str():
16+
reason = "this is a reason"
17+
info = "some info"
18+
try:
19+
raise NextcloudException(status_code=666, reason=reason, info=info)
20+
except NextcloudException as e:
21+
assert str(e) == f"[666] {reason} <{info}>"

tests/users_statuses_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ def test_get_predefined(nc):
5252

5353

5454
@pytest.mark.parametrize("nc", NC_TO_TEST)
55-
def test_get_all(nc):
56-
r_all = nc.users_statuses.get_all()
55+
def test_get_list(nc):
56+
r_all = nc.users_statuses.get_list()
5757
assert r_all
5858
assert isinstance(r_all, list)
5959
r_current = nc.users_statuses.get_current()

tests/users_test.py

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,31 @@
1010

1111

1212
@pytest.mark.parametrize("nc", NC_TO_TEST)
13-
def test_get_user(nc):
14-
admin = nc.users.get("admin")
13+
def test_get_user_details(nc):
14+
admin = nc.users.get_details("admin")
1515
assert admin
16+
current_user = nc.users.get_details()
17+
assert current_user
18+
admin.pop("quota", None) # `quota` is a little bit different
19+
current_user.pop("quota", None)
20+
assert admin == current_user
21+
22+
23+
@pytest.mark.parametrize("nc", NC_TO_TEST)
24+
def test_get_current_user_wo_user(nc):
25+
orig_user = nc._session.user
26+
try:
27+
nc._session.user = ""
28+
with pytest.raises(ValueError):
29+
nc.users.get_details()
30+
finally:
31+
nc._session.user = orig_user
1632

1733

1834
@pytest.mark.parametrize("nc", NC_TO_TEST)
1935
def test_get_user_404(nc):
2036
with pytest.raises(NextcloudException):
21-
nc.users.get("non existing user")
37+
nc.users.get_details("non existing user")
2238

2339

2440
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
@@ -33,6 +49,21 @@ def test_create_user(nc):
3349
nc.users.create(TEST_USER_NAME, password=TEST_USER_PASSWORD)
3450

3551

52+
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
53+
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
54+
def test_create_user_no_name_mail(nc):
55+
try:
56+
nc.users.delete(TEST_USER_NAME)
57+
except NextcloudException:
58+
pass
59+
with pytest.raises(ValueError):
60+
nc.users.create(TEST_USER_NAME)
61+
with pytest.raises(ValueError):
62+
nc.users.create(TEST_USER_NAME, password="")
63+
with pytest.raises(ValueError):
64+
nc.users.create(TEST_USER_NAME, email="")
65+
66+
3667
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
3768
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
3869
def test_delete_user(nc):
@@ -47,17 +78,18 @@ def test_delete_user(nc):
4778

4879
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
4980
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
50-
def test_list_users(nc):
81+
def test_users_get_list(nc):
5182
try:
5283
nc.users.create(TEST_USER_NAME, password=TEST_USER_PASSWORD)
5384
except NextcloudException:
5485
pass
55-
users = nc.users.list()
86+
users = nc.users.get_list()
87+
assert isinstance(users, list)
5688
assert "admin" in users
57-
users = nc.users.list(limit=1)
89+
users = nc.users.get_list(limit=1)
5890
assert len(users) == 1
59-
assert users[0] != nc.users.list(limit=1, offset=1)[0]
60-
users = nc.users.list(mask="test_cover_")
91+
assert users[0] != nc.users.get_list(limit=1, offset=1)[0]
92+
users = nc.users.get_list(mask="test_cover_")
6193
assert len(users) == 1
6294
nc.users.delete(TEST_USER_NAME)
6395

@@ -70,9 +102,35 @@ def test_enable_disable_user(nc):
70102
except NextcloudException:
71103
pass
72104
nc.users.disable(TEST_USER_NAME)
73-
user = nc.users.get(TEST_USER_NAME)
105+
user = nc.users.get_details(TEST_USER_NAME)
74106
assert not user["enabled"]
75107
nc.users.enable(TEST_USER_NAME)
76-
user = nc.users.get(TEST_USER_NAME)
108+
user = nc.users.get_details(TEST_USER_NAME)
77109
assert user["enabled"]
78110
nc.users.delete(TEST_USER_NAME)
111+
112+
113+
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
114+
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
115+
def test_user_editable_fields(nc):
116+
editable_fields = nc.users.editable_fields()
117+
assert isinstance(editable_fields, list)
118+
assert editable_fields
119+
120+
121+
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
122+
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
123+
def test_edit_user(nc):
124+
nc.users.edit(nc.user, address="Le Pame")
125+
current_user = nc.users.get_details()
126+
assert current_user["address"] == "Le Pame"
127+
nc.users.edit(nc.user, address="", email="admin@gmx.net")
128+
current_user = nc.users.get_details()
129+
assert current_user["address"] == ""
130+
assert current_user["email"] == "admin@gmx.net"
131+
132+
133+
@pytest.mark.skipif(not isinstance(NC_TO_TEST[:1][0], Nextcloud), reason="Not available for NextcloudApp.")
134+
@pytest.mark.parametrize("nc", NC_TO_TEST[:1])
135+
def test_resend_user_email(nc):
136+
nc.users.resend_welcome_email()

0 commit comments

Comments
 (0)