Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add pytests #15

Merged
merged 21 commits into from
Apr 5, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add tests for batch_update_list method
  • Loading branch information
tr4nt0r committed Apr 5, 2024
commit 1c9dbf325a7e2dfe9dc6a008181f731693f8782e
279 changes: 270 additions & 9 deletions tests/test_bring.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import pytest

from bring_api.bring import Bring
from bring_api.const import BRING_SUPPORTED_LOCALES
from bring_api.const import BRING_SUPPORTED_LOCALES, DEFAULT_HEADERS
from bring_api.exceptions import (
BringAuthException,
BringEMailInvalidException,
Expand All @@ -32,6 +32,11 @@
load_dotenv()


def mocked_translate(bring: Bring, item_id: str, *args, **kwargs) -> str:
"""Mock __translate method."""
return item_id


class TestDoesUserExist:
"""Tests for does_user_exist method."""

Expand All @@ -47,6 +52,14 @@ async def test_unknown_user(self, mocked, bring):
with pytest.raises(BringUserUnknownException):
await bring.does_user_exist("EMAIL")

async def test_mail_value_error(self, mocked, bring, monkeypatch):
"""Test does_user_exist for unknown user."""
mocked.get("https://api.getbring.com/rest/bringusers?email=", status=200)
monkeypatch.setattr(bring, "mail", None)

with pytest.raises(ValueError, match="Argument mail missing."):
await bring.does_user_exist()

async def test_user_exist_with_parameter(self, mocked, bring):
"""Test does_user_exist for known user."""
mocked.get("https://api.getbring.com/rest/bringusers?email=EMAIL", status=200)
Expand Down Expand Up @@ -342,14 +355,7 @@ async def test_get_list(self, mocked, bring, monkeypatch):
payload=BRING_GET_LIST_RESPONSE,
)

def mocked_locale(*args, **kwargs) -> str:
return "de-CH"

monkeypatch.setattr(Bring, "_Bring__locale", mocked_locale)

def mocked_translate(bring: Bring, item_id: str, *args, **kwargs) -> str:
return item_id

monkeypatch.setattr(Bring, "_Bring__locale", lambda _, x: "de-DE")
monkeypatch.setattr(Bring, "_Bring__translate", mocked_translate)
monkeypatch.setattr(bring, "uuid", UUID)

Expand Down Expand Up @@ -953,3 +959,258 @@ def test_translate_exception(self, bring):
"""Test __translate BringTranslationException."""
with pytest.raises(BringTranslationException):
bring._Bring__translate("item_name", from_locale="de-DE")


class TestBatchUpdateList:
"""Tests for batch_update_list."""

@pytest.mark.parametrize(
("item", "operation"),
[
(BringItem(itemId="item0", spec="spec", uuid=""), BringItemOperation.ADD),
(
BringItem(itemId="item1", spec="spec", uuid="uuid"),
BringItemOperation.COMPLETE,
),
(
BringItem(itemId="item2", spec="spec", uuid="uuid"),
BringItemOperation.REMOVE,
),
(
BringItem(
itemId="item3",
spec="spec",
uuid="uuid",
operation=BringItemOperation.ADD,
),
None,
),
(
BringItem(
itemId="item4",
spec="spec",
uuid="uuid",
operation=BringItemOperation.COMPLETE,
),
None,
),
(
BringItem(
itemId="item5",
spec="spec",
uuid="uuid",
operation=BringItemOperation.REMOVE,
),
None,
),
(
BringItem(
itemId="item6",
spec="spec",
uuid="uuid",
operation="TO_PURCHASE",
),
None,
),
(
BringItem(
itemId="item7",
spec="spec",
uuid="uuid",
operation="TO_RECENTLY",
),
None,
),
(
BringItem(
itemId="item8",
spec="spec",
uuid="uuid",
operation="REMOVE",
),
None,
),
(
BringItem(
itemId="item9",
spec="spec",
uuid="uuid",
),
None,
),
(
BringItem(
itemId="item10",
spec="spec",
uuid="uuid",
operation=BringItemOperation.COMPLETE,
),
BringItemOperation.ADD,
),
(
BringItem(
itemId="item11",
spec="spec",
uuid="uuid",
operation=BringItemOperation.REMOVE,
),
BringItemOperation.ADD,
),
(
BringItem(itemId="item12", spec="", uuid=""),
BringItemOperation.ADD,
),
(
BringItem(itemId="item13", spec="", uuid="uuid"),
BringItemOperation.ADD,
),
(
BringItem(itemId="item14", spec="spec", uuid=""),
BringItemOperation.ADD,
),
(
BringItem(itemId="item15", spec="spec", uuid="uuid"),
BringItemOperation.ADD,
),
(
{"itemId": "item16", "spec": "spec", "uuid": "uuid"},
BringItemOperation.ADD,
),
],
)
async def test_batch_update_list_single_item(
self, bring, mocked, monkeypatch, item, operation
):
"""Test batch_update_list."""
expected = {
"changes": [
{
"accuracy": "0.0",
"altitude": "0.0",
"latitude": "0.0",
"longitude": "0.0",
"itemId": item["itemId"],
"spec": item["spec"],
"uuid": item["uuid"],
"operation": str(
item.get("operation", operation or BringItemOperation.ADD)
),
}
],
"sender": "",
}
mocked.put(
url := f"https://api.getbring.com/rest/v2/bringlists/{UUID}/items",
status=200,
)
monkeypatch.setattr(Bring, "_Bring__locale", lambda _, x: "de-DE")
monkeypatch.setattr(Bring, "_Bring__translate", mocked_translate)

if operation:
r = await bring.batch_update_list(UUID, item, operation)
else:
r = await bring.batch_update_list(UUID, item)
assert r.status == 200
mocked.assert_called_with(
url,
method="PUT",
headers=DEFAULT_HEADERS,
data=None,
json=expected,
)

async def test_batch_update_list_multiple_items(self, bring, mocked, monkeypatch):
"""Test batch_update_list."""
test_items = [
BringItem(
itemId="item1",
spec="spec1",
uuid="uuid1",
operation=BringItemOperation.ADD,
),
BringItem(
itemId="item2",
spec="spec2",
uuid="uuid2",
operation=BringItemOperation.COMPLETE,
),
BringItem(
itemId="item3",
spec="spec3",
uuid="uuid3",
operation=BringItemOperation.REMOVE,
),
]

expected = {
"changes": [
{
"accuracy": "0.0",
"altitude": "0.0",
"latitude": "0.0",
"longitude": "0.0",
"itemId": "item1",
"spec": "spec1",
"uuid": "uuid1",
"operation": "TO_PURCHASE",
},
{
"accuracy": "0.0",
"altitude": "0.0",
"latitude": "0.0",
"longitude": "0.0",
"itemId": "item2",
"spec": "spec2",
"uuid": "uuid2",
"operation": "TO_RECENTLY",
},
{
"accuracy": "0.0",
"altitude": "0.0",
"latitude": "0.0",
"longitude": "0.0",
"itemId": "item3",
"spec": "spec3",
"uuid": "uuid3",
"operation": "REMOVE",
},
],
"sender": "",
}
mocked.put(
url := f"https://api.getbring.com/rest/v2/bringlists/{UUID}/items",
status=200,
)
monkeypatch.setattr(Bring, "_Bring__locale", lambda _, x: "de-DE")
monkeypatch.setattr(Bring, "_Bring__translate", mocked_translate)

r = await bring.batch_update_list(UUID, test_items)

assert r.status == 200
mocked.assert_called_with(
url,
method="PUT",
headers=DEFAULT_HEADERS,
data=None,
json=expected,
)

@pytest.mark.parametrize(
"exception",
[
asyncio.TimeoutError,
aiohttp.ClientError,
],
)
async def test_request_exception(self, mocked, bring, exception):
"""Test request exceptions."""

mocked.put(
f"https://api.getbring.com/rest/v2/bringlists/{UUID}/items",
exception=exception,
)

with pytest.raises(BringRequestException):
await bring.batch_update_list(
UUID, BringItem(itemId="item_name", spec="spec", uuid=UUID)
)