Skip to content

Commit 0987bf3

Browse files
committed
add a few methods (client.search, channel.send|delete_image|file)
1 parent d4d8f76 commit 0987bf3

File tree

4 files changed

+81
-16
lines changed

4 files changed

+81
-16
lines changed

stream_chat/channel.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,17 @@ def accept_invite(self, user_id):
218218
def reject_invite(self, user_id):
219219
raise NotImplementedError
220220

221-
def send_file(self):
222-
raise NotImplementedError
221+
def send_file(self, url, name, user, content_type=None):
222+
return self.client.send_file(f"{self.url}/file", url, name, user, content_type=content_type)
223223

224-
def send_image(self):
225-
raise NotImplementedError
224+
def send_image(self, url, name, user, content_type=None):
225+
return self.client.send_file(f"{self.url}/image", url, name, user, content_type=content_type)
226226

227-
def delete_file(self):
228-
raise NotImplementedError
227+
def delete_file(self, url):
228+
return self.client.delete(f"{self.url}/file", {"url": url})
229229

230-
def delete_image(self):
231-
raise NotImplementedError
230+
def delete_image(self, url):
231+
return self.client.delete(f"{self.url}/image", {"url": url})
232232

233233

234234
def add_user_id(payload, user_id):

stream_chat/client.py

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1+
from urllib.parse import urlparse
2+
import hmac
3+
import hashlib
14
import json
5+
import urllib
26

7+
import jwt
38
import requests
49
import six
510

611
from stream_chat.__pkg__ import __version__
712
from stream_chat.channel import Channel
8-
import jwt
9-
import hmac
10-
import hashlib
11-
1213
from stream_chat.exceptions import StreamAPIException
1314

1415

@@ -178,8 +179,8 @@ def update_message(self, message):
178179
raise ValueError("message must have an id")
179180
return self.post("messages/{}".format(message['id']), data={"message": message})
180181

181-
def delete_message(self, message_id):
182-
return self.delete("messages/{}".format(message_id))
182+
def delete_message(self, message_id, **options):
183+
return self.delete("messages/{}".format(message_id), options)
183184

184185
def query_users(self, filter_conditions, sort=None, **options):
185186
sort_fields = []
@@ -189,7 +190,7 @@ def query_users(self, filter_conditions, sort=None, **options):
189190
params.update({"filter_conditions": filter_conditions, "sort": sort_fields})
190191
return self.get("users", params={"payload": json.dumps(params)})
191192

192-
def query_channels(self, filter_conditions, sort, **options):
193+
def query_channels(self, filter_conditions, sort=None, **options):
193194
params = {"state": True, "watch": False, "presence": False}
194195
sort_fields = []
195196
if sort is not None:
@@ -281,4 +282,26 @@ def verify_webhook(self, request_body, x_signature):
281282
return signature == x_signature
282283

283284
def search(self, filter_conditions, query, **options):
284-
raise NotImplementedError
285+
params = options.copy()
286+
params.update({"filter_conditions": filter_conditions, "query": query})
287+
return self.get("search", params={"payload": json.dumps(params)})
288+
289+
def send_file(self, uri, url, name, user, content_type=None):
290+
headers = {}
291+
headers["Authorization"] = self.auth_token
292+
headers["stream-auth-type"] = "jwt"
293+
headers["X-Stream-Client"]: get_user_agent()
294+
parts = urlparse(url)
295+
if parts[0] == '':
296+
url = f"file://{url}"
297+
if content_type:
298+
file_tuple = (name, urllib.request.urlopen(url), content_type)
299+
else:
300+
file_tuple = (name, urllib.request.urlopen(url), content_type)
301+
response = requests.post(
302+
"{}/{}".format(self.base_url, uri),
303+
params=self.get_default_params(),
304+
data={"user": json.dumps(user)},
305+
files={"file": file_tuple},
306+
headers=headers)
307+
return self._parse_response(response)

stream_chat/tests/test_channel.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,15 @@ def test_get_reactions(self, channel, random_user):
120120
assert len(response["reactions"]) == 1
121121

122122
assert response["reactions"][0]["count"] == 42
123+
124+
def test_send_and_delete_file(self, channel, random_user):
125+
url = "https://getstream.io/blog/wp-content/themes/stream-theme-wordpress_2018-05-24_10-41/assets/images/stream_logo.png";
126+
resp = channel.send_file(url, "logo.png", random_user)
127+
assert "logo.png" in resp['file']
128+
resp = channel.delete_file(resp['file'])
129+
130+
def test_send_and_delete_image(self, channel, random_user):
131+
url = "https://getstream.io/blog/wp-content/themes/stream-theme-wordpress_2018-05-24_10-41/assets/images/stream_logo.png";
132+
resp = channel.send_image(url, "logo.png", random_user, content_type="image/png")
133+
assert "logo.png" in resp['file']
134+
# resp = channel.delete_image(resp['file'])

stream_chat/tests/test_client.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ def test_deactivate_user(self, client, random_user):
6363
assert "user" in response
6464
assert random_user["id"] == response["user"]["id"]
6565

66+
def test_reactivate_user(self, client, random_user):
67+
response = client.deactivate_user(random_user["id"])
68+
assert "user" in response
69+
assert random_user["id"] == response["user"]["id"]
70+
response = client.reactivate_user(random_user["id"])
71+
assert "user" in response
72+
assert random_user["id"] == response["user"]["id"]
73+
6674
def test_export_user(self, client, fellowship_of_the_ring):
6775
response = client.export_user("gandalf")
6876
assert "user" in response
@@ -104,6 +112,9 @@ def test_delete_message(self, client, channel, random_user):
104112
msg_id = str(uuid.uuid4())
105113
channel.send_message({"id": msg_id, "text": "helloworld"}, random_user["id"])
106114
client.delete_message(msg_id)
115+
msg_id = str(uuid.uuid4())
116+
channel.send_message({"id": msg_id, "text": "helloworld"}, random_user["id"])
117+
resp = client.delete_message(msg_id, hard=True)
107118

108119
def test_flag_message(self, client, channel, random_user, server_user):
109120
msg_id = str(uuid.uuid4())
@@ -140,3 +151,22 @@ def test_devices(self, client, random_user):
140151
client.add_device(str(uuid.uuid4()), "apn", random_user["id"])
141152
response = client.get_devices(random_user["id"])
142153
assert len(response["devices"]) == 1
154+
155+
def test_search(self, client, channel, random_user):
156+
query = "supercalifragilisticexpialidocious"
157+
channel.send_message({"text": f"How many syllables are there in {query}?"}, random_user['id'])
158+
channel.send_message({"text": "Does 'cious' count as one or two?"}, random_user['id'])
159+
response = client.search(
160+
{"type": "messaging"},
161+
query,
162+
**{"limit": 2, "offset": 0}
163+
)
164+
# searches all channels so make sure at least one is found
165+
assert len(response['results']) >= 1
166+
assert query in response['results'][0]['message']['text']
167+
response = client.search(
168+
{"type": "messaging"},
169+
"cious",
170+
**{"limit": 12, "offset": 0})
171+
for message in response['results']:
172+
assert query not in message['message']['text']

0 commit comments

Comments
 (0)