Skip to content

Commit 0ca43a6

Browse files
committed
Add missing tests
1 parent 061c667 commit 0ca43a6

File tree

4 files changed

+140
-12
lines changed

4 files changed

+140
-12
lines changed

src/posit/connect/tags.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ def get(self, tag_id: str) -> Tag:
257257
The tag object.
258258
"""
259259
# TODO-barret-future: Replace with `self._ctx.client.tags.find(id=tag_id)`
260-
assert isinstance(tag_id, str), "Tag `id` must be a string"
261-
assert tag_id != "", "Tag `id` cannot be an empty string"
260+
if not isinstance(tag_id, str):
261+
raise TypeError("`tag_id` must be a string")
262+
if tag_id == "":
263+
raise ValueError("`tag_id` cannot be an empty string")
262264
path = f"{self._path}/{tag_id}"
263265
url = self._ctx.url + path
264266
response = self._ctx.session.get(url)
@@ -292,7 +294,8 @@ def _update_parent_kwargs(self, kwargs: dict) -> dict:
292294
parent: str = parent["id"]
293295

294296
if isinstance(parent, str):
295-
assert parent != "", "Tag `parent` cannot be an empty string"
297+
if parent == "":
298+
raise ValueError("Tag `parent` cannot be an empty string")
296299
ret_kwargs["parent_id"] = parent
297300
return ret_kwargs
298301

@@ -424,8 +427,10 @@ def _to_tag_ids(self, tags: tuple[str | Tag, ...]) -> list[str]:
424427
tag_ids: list[str] = []
425428
for i, tag in enumerate(tags):
426429
tag_id = tag["id"] if isinstance(tag, Tag) else tag
427-
assert isinstance(tag_id, str), f"Expected 'tags[{i}]' to be a string. Got: {tag_id}"
428-
assert len(tag_id) > 0, "Expected 'tags[{i}]' value to be non-empty"
430+
if not isinstance(tag_id, str):
431+
raise TypeError(f"Expected 'tags[{i}]' to be a string. Received: {tag_id}")
432+
if tag_id == "":
433+
raise ValueError(f"Expected 'tags[{i}]' to be non-empty. Received: {tag_id}")
429434

430435
tag_ids.append(tag_id)
431436

@@ -474,5 +479,6 @@ def delete(self, *tags: str | Tag) -> None:
474479

475480
url = self._ctx.url + self._path
476481
for tag_id in tag_ids:
477-
_ = self._ctx.session.delete(url, json={"tag_id": tag_id})
482+
tag_url = f"{url}/{tag_id}"
483+
self._ctx.session.delete(tag_url, json={"tag_id": tag_id})
478484
return
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"id": "34",
3+
"name": "Support",
4+
"parent_id": "3",
5+
"created_time": "2023-05-18T16:41:59Z",
6+
"updated_time": "2023-05-18T16:41:59Z"
7+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[
2+
{
3+
"id": "3",
4+
"name": "Internal Solutions",
5+
"parent_id": null,
6+
"created_time": "2019-10-08T19:44:49Z",
7+
"updated_time": "2019-10-08T19:44:49Z"
8+
},
9+
{
10+
"id": "5",
11+
"name": "Life Cycle",
12+
"parent_id": null,
13+
"created_time": "2019-10-08T19:45:21Z",
14+
"updated_time": "2019-10-08T19:45:21Z"
15+
}
16+
]

tests/posit/connect/test_tags.py

Lines changed: 105 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pytest
12
import responses
23
from responses import matchers
34

@@ -117,6 +118,14 @@ def test_create_tag(self):
117118
academy_tag_parent_id = client.tags.create(name="academy", parent=tag["id"])
118119
academy_tag_parent_tag = client.tags.create(name="academy", parent=tag)
119120

121+
with pytest.raises(TypeError):
122+
client.tags.create(
123+
name="academy",
124+
parent=123, # pyright: ignore[reportArgumentType]
125+
)
126+
with pytest.raises(ValueError):
127+
client.tags.create(name="academy", parent="")
128+
120129
# assert
121130
assert mock_create_tag.call_count == 2
122131

@@ -285,15 +294,105 @@ def test_destroy(self):
285294
class TestContentItemTags:
286295
@responses.activate
287296
def test_find(self):
288-
# TODO-barret
289-
raise NotImplementedError
297+
# behavior
298+
content_item_guid = "f2f37341-e21d-3d80-c698-a935ad614066"
299+
mock_get = responses.get(
300+
f"https://connect.example/__api__/v1/content/{content_item_guid}",
301+
json=load_mock_dict(f"v1/content/{content_item_guid}.json"),
302+
)
303+
mock_tags_get = responses.get(
304+
f"https://connect.example/__api__/v1/content/{content_item_guid}/tags",
305+
json=load_mock_list(f"v1/content/{content_item_guid}/tags.json"),
306+
)
307+
308+
# setup
309+
client = Client("https://connect.example", "12345")
310+
content_item = client.content.get(content_item_guid)
311+
312+
# invoke
313+
tags = content_item.tags.find()
314+
315+
# assert
316+
assert mock_get.call_count == 1
317+
assert mock_tags_get.call_count == 1
318+
assert len(tags) == 2
290319

291320
@responses.activate
292321
def test_add(self):
293-
# TODO-barret
294-
raise NotImplementedError
322+
# behavior
323+
content_item_guid = "f2f37341-e21d-3d80-c698-a935ad614066"
324+
tag_id = "33"
325+
mock_content_item_get = responses.get(
326+
f"https://connect.example/__api__/v1/content/{content_item_guid}",
327+
json=load_mock_dict(f"v1/content/{content_item_guid}.json"),
328+
)
329+
mock_tag_get = responses.get(
330+
f"https://connect.example/__api__/v1/tags/{tag_id}",
331+
json=load_mock_dict(f"v1/tags/{tag_id}.json"),
332+
)
333+
mock_tags_add = responses.post(
334+
f"https://connect.example/__api__/v1/content/{content_item_guid}/tags",
335+
json={}, # empty response
336+
)
337+
338+
# setup
339+
client = Client("https://connect.example", "12345")
340+
content_item = client.content.get(content_item_guid)
341+
342+
sub_tag = client.tags.get("33")
343+
344+
# invoke
345+
content_item.tags.add(sub_tag["id"])
346+
content_item.tags.add(sub_tag)
347+
348+
with pytest.raises(TypeError):
349+
content_item.tags.add(
350+
123, # pyright: ignore[reportArgumentType]
351+
)
352+
with pytest.raises(ValueError):
353+
content_item.tags.add("")
354+
355+
# assert
356+
assert mock_content_item_get.call_count == 1
357+
assert mock_tag_get.call_count == 1
358+
assert mock_tags_add.call_count == 2
295359

296360
@responses.activate
297361
def test_delete(self):
298-
# TODO-barret
299-
raise NotImplementedError
362+
# behavior
363+
content_item_guid = "f2f37341-e21d-3d80-c698-a935ad614066"
364+
tag_id = "33"
365+
mock_content_item_get = responses.get(
366+
f"https://connect.example/__api__/v1/content/{content_item_guid}",
367+
json=load_mock_dict(f"v1/content/{content_item_guid}.json"),
368+
)
369+
mock_tag_get = responses.get(
370+
f"https://connect.example/__api__/v1/tags/{tag_id}",
371+
json=load_mock_dict(f"v1/tags/{tag_id}.json"),
372+
)
373+
mock_tags_delete = responses.delete(
374+
f"https://connect.example/__api__/v1/content/{content_item_guid}/tags/{tag_id}",
375+
json={}, # empty response
376+
)
377+
378+
# setup
379+
client = Client("https://connect.example", "12345")
380+
content_item = client.content.get(content_item_guid)
381+
382+
sub_tag = client.tags.get("33")
383+
384+
# invoke
385+
content_item.tags.delete(sub_tag["id"])
386+
content_item.tags.delete(sub_tag)
387+
388+
with pytest.raises(TypeError):
389+
content_item.tags.delete(
390+
123, # pyright: ignore[reportArgumentType]
391+
)
392+
with pytest.raises(ValueError):
393+
content_item.tags.delete("")
394+
395+
# assert
396+
assert mock_content_item_get.call_count == 1
397+
assert mock_tag_get.call_count == 1
398+
assert mock_tags_delete.call_count == 2

0 commit comments

Comments
 (0)