Skip to content

Commit 2c88185

Browse files
authored
fixed AppAuth bug, when url contained spaces(OCS calls) (#10)
* fixed AppAuth bug, when url contained spaces(OCS calls) + tests
1 parent d917af6 commit 2c88185

File tree

3 files changed

+40
-22
lines changed

3 files changed

+40
-22
lines changed

nc_py_api/_session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def ocs(
119119
elif json is not None:
120120
headers.update({"Content-Type": "application/json"})
121121
data_bytes = dumps(json).encode("utf-8")
122-
return self._ocs(method, f"{path}?{urlencode(params, True)}", headers, data=data_bytes, **kwargs)
122+
return self._ocs(method, f"{quote(path)}?{urlencode(params, True)}", headers, data=data_bytes, **kwargs)
123123

124124
def _ocs(self, method: str, path_params: str, headers: dict, data: Optional[bytes], **kwargs):
125125
self.init_adapter()

nc_py_api/users_statuses.py

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,9 @@ def get_list(self, limit: Optional[int] = None, offset: Optional[int] = None) ->
4545
data = kwargs_to_dict(["limit", "offset"], limit=limit, offset=offset)
4646
return self._session.ocs(method="GET", path=f"{ENDPOINT}/statuses", params=data)
4747

48-
def get_current(self) -> Optional[CurrentUserStatus]:
48+
def get_current(self) -> CurrentUserStatus:
4949
require_capabilities("user_status", self._session.capabilities)
50-
try:
51-
return self._session.ocs(method="GET", path=f"{ENDPOINT}/user_status")
52-
except NextcloudException as e:
53-
if e.status_code == 404:
54-
return None
55-
raise e from None
50+
return self._session.ocs(method="GET", path=f"{ENDPOINT}/user_status")
5651

5752
def get(self, user_id: str) -> Optional[UserStatus]:
5853
require_capabilities("user_status", self._session.capabilities)
@@ -95,20 +90,15 @@ def set(self, message: Optional[str] = None, clear_at: int = 0, status_icon: str
9590
params["statusIcon"] = status_icon
9691
self._session.ocs(method="PUT", path=f"{ENDPOINT}/user_status/message/custom", params=params)
9792

98-
def get_backup_status(self, user_id: str): # -> Optional[UserStatus]: to-do: test it, currently it is untested
93+
def get_backup_status(self, user_id: str = "") -> Optional[UserStatus]:
9994
require_capabilities("user_status", self._session.capabilities)
100-
if not user_id:
101-
user_id = self._session.user
95+
user_id = user_id if user_id else self._session.user
10296
if not user_id:
10397
raise ValueError("user_id can not be empty.")
104-
try:
105-
return self._session.ocs(method="GET", path=f"{ENDPOINT}/user_status/_{user_id}")
106-
except NextcloudException as e:
107-
if e.status_code == 404:
108-
return None
109-
raise e from None
98+
return self.get(f"_{user_id}")
11099

111-
def restore_backup_status(self, message_id: str) -> None: # to-do: test it, currently it is untested
112-
require_capabilities("user_status>", self._session.capabilities)
100+
def restore_backup_status(self, message_id: str) -> Optional[CurrentUserStatus]:
101+
require_capabilities("user_status", self._session.capabilities)
113102
require_capabilities("restore", self._session.capabilities["user_status"])
114-
self._session.ocs(method="DELETE", path=f"{ENDPOINT}/user_status/revert/{message_id}")
103+
result = self._session.ocs(method="DELETE", path=f"{ENDPOINT}/user_status/revert/{message_id}")
104+
return result if result else None

tests/users_statuses_test.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
from time import time
44

5-
6-
from gfixture import NC_TO_TEST
5+
from gfixture import NC_TO_TEST, NC_VERSION
76

87

98
@pytest.mark.parametrize("nc", NC_TO_TEST)
@@ -36,6 +35,11 @@ def test_get_status(nc, message):
3635
assert not r1["messageIsPredefined"]
3736

3837

38+
@pytest.mark.parametrize("nc", NC_TO_TEST)
39+
def test_get_status_non_existent_user(nc):
40+
assert nc.users_statuses.get("no such user") is None
41+
42+
3943
@pytest.mark.parametrize("nc", NC_TO_TEST)
4044
def test_get_predefined(nc):
4145
r = nc.users_statuses.get_predefined()
@@ -105,3 +109,27 @@ def test_set_predefined(nc, clear_at):
105109
assert r["messageId"] == i["id"]
106110
assert r["messageIsPredefined"]
107111
assert r["clearAt"] == clear_at
112+
113+
114+
@pytest.mark.parametrize("nc", NC_TO_TEST)
115+
@pytest.mark.skipif(NC_VERSION["major"] < 27, reason="Run only on NC27+")
116+
def test_get_back_status_from_from_empty_user(nc):
117+
orig_user = nc._session.user
118+
nc._session.user = ""
119+
try:
120+
with pytest.raises(ValueError):
121+
nc.users_statuses.get_backup_status("")
122+
finally:
123+
nc._session.user = orig_user
124+
125+
126+
@pytest.mark.parametrize("nc", NC_TO_TEST)
127+
@pytest.mark.skipif(NC_VERSION["major"] < 27, reason="Run only on NC27+")
128+
def test_get_back_status_from_from_non_exist_user(nc):
129+
assert nc.users_statuses.get_backup_status("mёm_m-m.l") is None
130+
131+
132+
@pytest.mark.parametrize("nc", NC_TO_TEST)
133+
@pytest.mark.skipif(NC_VERSION["major"] < 27, reason="Run only on NC27+")
134+
def test_restore_from_non_existing_back_status(nc):
135+
assert nc.users_statuses.restore_backup_status("no such backup status") is None

0 commit comments

Comments
 (0)