Skip to content

Commit

Permalink
fixed AppAuth bug, when url contained spaces(OCS calls) (#10)
Browse files Browse the repository at this point in the history
* fixed AppAuth bug, when url contained spaces(OCS calls) + tests
  • Loading branch information
bigcat88 authored Jul 1, 2023
1 parent d917af6 commit 2c88185
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 22 deletions.
2 changes: 1 addition & 1 deletion nc_py_api/_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ def ocs(
elif json is not None:
headers.update({"Content-Type": "application/json"})
data_bytes = dumps(json).encode("utf-8")
return self._ocs(method, f"{path}?{urlencode(params, True)}", headers, data=data_bytes, **kwargs)
return self._ocs(method, f"{quote(path)}?{urlencode(params, True)}", headers, data=data_bytes, **kwargs)

def _ocs(self, method: str, path_params: str, headers: dict, data: Optional[bytes], **kwargs):
self.init_adapter()
Expand Down
28 changes: 9 additions & 19 deletions nc_py_api/users_statuses.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,9 @@ def get_list(self, limit: Optional[int] = None, offset: Optional[int] = None) ->
data = kwargs_to_dict(["limit", "offset"], limit=limit, offset=offset)
return self._session.ocs(method="GET", path=f"{ENDPOINT}/statuses", params=data)

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

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

def get_backup_status(self, user_id: str): # -> Optional[UserStatus]: to-do: test it, currently it is untested
def get_backup_status(self, user_id: str = "") -> Optional[UserStatus]:
require_capabilities("user_status", self._session.capabilities)
if not user_id:
user_id = self._session.user
user_id = user_id if user_id else self._session.user
if not user_id:
raise ValueError("user_id can not be empty.")
try:
return self._session.ocs(method="GET", path=f"{ENDPOINT}/user_status/_{user_id}")
except NextcloudException as e:
if e.status_code == 404:
return None
raise e from None
return self.get(f"_{user_id}")

def restore_backup_status(self, message_id: str) -> None: # to-do: test it, currently it is untested
require_capabilities("user_status>", self._session.capabilities)
def restore_backup_status(self, message_id: str) -> Optional[CurrentUserStatus]:
require_capabilities("user_status", self._session.capabilities)
require_capabilities("restore", self._session.capabilities["user_status"])
self._session.ocs(method="DELETE", path=f"{ENDPOINT}/user_status/revert/{message_id}")
result = self._session.ocs(method="DELETE", path=f"{ENDPOINT}/user_status/revert/{message_id}")
return result if result else None
32 changes: 30 additions & 2 deletions tests/users_statuses_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@

from time import time


from gfixture import NC_TO_TEST
from gfixture import NC_TO_TEST, NC_VERSION


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


@pytest.mark.parametrize("nc", NC_TO_TEST)
def test_get_status_non_existent_user(nc):
assert nc.users_statuses.get("no such user") is None


@pytest.mark.parametrize("nc", NC_TO_TEST)
def test_get_predefined(nc):
r = nc.users_statuses.get_predefined()
Expand Down Expand Up @@ -105,3 +109,27 @@ def test_set_predefined(nc, clear_at):
assert r["messageId"] == i["id"]
assert r["messageIsPredefined"]
assert r["clearAt"] == clear_at


@pytest.mark.parametrize("nc", NC_TO_TEST)
@pytest.mark.skipif(NC_VERSION["major"] < 27, reason="Run only on NC27+")
def test_get_back_status_from_from_empty_user(nc):
orig_user = nc._session.user
nc._session.user = ""
try:
with pytest.raises(ValueError):
nc.users_statuses.get_backup_status("")
finally:
nc._session.user = orig_user


@pytest.mark.parametrize("nc", NC_TO_TEST)
@pytest.mark.skipif(NC_VERSION["major"] < 27, reason="Run only on NC27+")
def test_get_back_status_from_from_non_exist_user(nc):
assert nc.users_statuses.get_backup_status("mёm_m-m.l") is None


@pytest.mark.parametrize("nc", NC_TO_TEST)
@pytest.mark.skipif(NC_VERSION["major"] < 27, reason="Run only on NC27+")
def test_restore_from_non_existing_back_status(nc):
assert nc.users_statuses.restore_backup_status("no such backup status") is None

0 comments on commit 2c88185

Please sign in to comment.