From a4e9fc2787609e6986784b1a5632766a1854b5af Mon Sep 17 00:00:00 2001
From: ThiefOfTime <jan-marius.lenk@cs.tu-dortmund.de>
Date: Sun, 11 Oct 2020 14:00:00 +0000
Subject: [PATCH] Added support for changing the alias to the wrapper module

Needed for briar-gtk#14

Closes #6
---
 briar_wrapper/models/contacts.py            | 25 +++++++++++++++------
 tests/briar_wrapper/models/test_contacts.py | 15 +++++++++++++
 2 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/briar_wrapper/models/contacts.py b/briar_wrapper/models/contacts.py
index 152df59..63005d5 100644
--- a/briar_wrapper/models/contacts.py
+++ b/briar_wrapper/models/contacts.py
@@ -6,6 +6,7 @@ Wrapper around Briar API's _/contacts/_ resource
 """
 
 from operator import itemgetter
+from typing import Callable, List
 from urllib.parse import urljoin
 
 from requests import delete as _delete
@@ -23,7 +24,7 @@ class Contacts(Model):
 
     _connections_callback = None
 
-    def add_pending(self, link, alias):
+    def add_pending(self, link: str, alias: str) -> None:
         # pylint: disable=line-too-long
         """
 
@@ -36,7 +37,17 @@ class Contacts(Model):
         url = urljoin(BASE_HTTP_URL, self._API_ENDPOINT + "add/pending/")
         _post(url, headers=self._headers, json={"link": link, "alias": alias})
 
-    def delete(self, contact_id):
+    def set_alias(self, contact_id: int, alias: str) -> None:
+        """
+        Sets the alias of a given user
+
+        [Upstream documentation](https://code.briarproject.org/briar/briar/-/blob/main/briar-headless/README.md#changing-alias-of-a-contact)
+
+        """
+        url = urljoin(BASE_HTTP_URL, self._API_ENDPOINT + str(contact_id) + alias)
+        _post(url, headers=self._headers, json={"alias": alias})
+
+    def delete(self, contact_id: int) -> None:
         # pylint: disable=line-too-long
         """
 
@@ -49,7 +60,7 @@ class Contacts(Model):
         url = urljoin(BASE_HTTP_URL, self._API_ENDPOINT + str(contact_id))
         _delete(url, headers=self._headers)
 
-    def get(self):
+    def get(self) -> list:
         # pylint: disable=line-too-long
         """
         Returns sorted list containing all contacts
@@ -65,7 +76,7 @@ class Contacts(Model):
         contacts = Contacts._sort_contact_list(contacts)
         return contacts
 
-    def get_link(self):
+    def get_link(self) -> str:
         # pylint: disable=line-too-long
         """
         Returns _briar://_ link
@@ -78,7 +89,7 @@ class Contacts(Model):
         request = _get(url, headers=self._headers).json()
         return request['link']
 
-    def watch_connections(self, callback):
+    def watch_connections(self, callback: Callable) -> List[int]:
         # pylint: disable=line-too-long
         """
         Calls `callback` whenever a contact's connection status changes
@@ -96,7 +107,7 @@ class Contacts(Model):
             signal_ids.append(signal_id)
         return signal_ids
 
-    def handle_connections_callback(self, message):
+    def handle_connections_callback(self, message: str) -> None:
         contact_id = message["data"]["contactId"]
         if message["name"] == "ContactConnectedEvent":
             self._connections_callback(contact_id, True)
@@ -106,7 +117,7 @@ class Contacts(Model):
             raise Exception(f"Wrong event in callback: {message['name']}")
 
     @staticmethod
-    def _sort_contact_list(contacts):
+    def _sort_contact_list(contacts: list) -> list:
         contacts.sort(key=itemgetter("lastChatActivity"),
                       reverse=True)
         return contacts
diff --git a/tests/briar_wrapper/models/test_contacts.py b/tests/briar_wrapper/models/test_contacts.py
index 885f46c..0794513 100644
--- a/tests/briar_wrapper/models/test_contacts.py
+++ b/tests/briar_wrapper/models/test_contacts.py
@@ -50,6 +50,21 @@ def match_request_add_pending(request):
     return {"alias": TEST_ALIAS, "link": TEST_LINK} == request.json()
 
 
+@requests_mock.Mocker(kw="requests_mock")
+def test_set_alias(api, request_headers, requests_mock):
+    contacts = Contacts(api)
+    contact_id = 137
+    requests_mock.register_uri("POST",
+                               BASE_HTTP_URL + f"/{contact_id}/alias",
+                               request_headers=request_headers,
+                               additional_matcher=match_request_add_pending)
+    contacts.add_pending(contact_id, TEST_ALIAS)
+
+
+def match_request_set_alias(request):
+    return {"alias": TEST_ALIAS} == request.json()
+
+
 @requests_mock.Mocker(kw="requests_mock")
 def test_delete(api, request_headers, requests_mock):
     contacts = Contacts(api)
-- 
GitLab