From 587e5807558cb2d39674db33bac09022b1f62c8a Mon Sep 17 00:00:00 2001 From: Thomas Sileo Date: Sat, 16 Jun 2018 18:54:17 +0200 Subject: [PATCH] Tweak the test suite --- little_boxes/__version__.py | 4 +-- little_boxes/activitypub.py | 4 --- little_boxes/backend.py | 60 ++++++++++++++++++------------------- little_boxes/urlutils.py | 2 +- little_boxes/webfinger.py | 5 ++-- tests/test_little_boxes.py | 38 +++++++++++++++++++++++ 6 files changed, 73 insertions(+), 40 deletions(-) diff --git a/little_boxes/__version__.py b/little_boxes/__version__.py index 0deec50..75510b3 100644 --- a/little_boxes/__version__.py +++ b/little_boxes/__version__.py @@ -1,3 +1,3 @@ -VERSION = (0, 1, 0) +VERSION = (0, 1, 0) # pragma: no cover -__version__ = ".".join(map(str, VERSION)) +__version__ = ".".join(map(str, VERSION)) # pragma: no cover diff --git a/little_boxes/activitypub.py b/little_boxes/activitypub.py index e158cfa..2908044 100644 --- a/little_boxes/activitypub.py +++ b/little_boxes/activitypub.py @@ -973,10 +973,6 @@ class Note(BaseActivity): OBJECT_REQURIED = False def _init(self, **kwargs): - print(self._data) - # Remove the `actor` field as `attributedTo` is used for `Note` instead - if "actor" in self._data: - del (self._data["actor"]) if "sensitive" not in kwargs: self._data["sensitive"] = False diff --git a/little_boxes/backend.py b/little_boxes/backend.py index 627b134..7b17460 100644 --- a/little_boxes/backend.py +++ b/little_boxes/backend.py @@ -1,7 +1,5 @@ import abc import typing -from typing import Any -from typing import Dict import requests @@ -15,110 +13,110 @@ class Backend(abc.ABC): def user_agent(self) -> str: return f"Little Boxes {__version__} (+http://github.com/tsileo/little-boxes)" - def fetch_json(self, url: str) -> Dict[str, Any]: + def fetch_json(self, url: str, **kwargs): resp = requests.get( - url, headers={"User-Agent": self.user_agent(), "Accept": "application/json"} + url, + headers={"User-Agent": self.user_agent(), "Accept": "application/json"}, + **kwargs, ) - resp.raise_for_status() - - return resp.json() + return resp @abc.abstractmethod def base_url(self) -> str: - pass + pass # pragma: no cover @abc.abstractmethod def fetch_iri(self, iri: str) -> "ap.ObjectType": - pass + pass # pragma: no cover @abc.abstractmethod def activity_url(self, obj_id: str) -> str: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_create(self, as_actor: "ap.Person", activity: "ap.Create") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_delete(self, as_actor: "ap.Person", activity: "ap.Delete") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def inbox_create(self, as_actor: "ap.Person", activity: "ap.Create") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def inbox_delete(self, as_actor: "ap.Person", activity: "ap.Delete") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_is_blocked(self, as_actor: "ap.Person", actor_id: str) -> bool: - pass + pass # pragma: no cover @abc.abstractmethod def inbox_new(self, as_actor: "ap.Person", activity: "ap.BaseActivity") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_new(self, as_actor: "ap.Person", activity: "ap.BaseActivity") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def new_follower(self, as_actor: "ap.Person", follow: "ap.Follow") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def new_following(self, as_actor: "ap.Person", follow: "ap.Follow") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def undo_new_follower(self, as_actor: "ap.Person", follow: "ap.Follow") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def undo_new_following(self, as_actor: "ap.Person", follow: "ap.Follow") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def inbox_update(self, as_actor: "ap.Person", activity: "ap.Update") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_update(self, as_actor: "ap.Person", activity: "ap.Update") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def inbox_like(self, as_actor: "ap.Person", activity: "ap.Like") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def inbox_undo_like(self, as_actor: "ap.Person", activity: "ap.Like") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_like(self, as_actor: "ap.Person", activity: "ap.Like") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_undo_like(self, as_actor: "ap.Person", activity: "ap.Like") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def inbox_announce(self, as_actor: "ap.Person", activity: "ap.Announce") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def inbox_undo_announce( self, as_actor: "ap.Person", activity: "ap.Announce" ) -> None: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_announce(self, as_actor: "ap.Person", activity: "ap.Announce") -> None: - pass + pass # pragma: no cover @abc.abstractmethod def outbox_undo_announce( self, as_actor: "ap.Person", activity: "ap.Announce" ) -> None: - pass + pass # pragma: no cover diff --git a/little_boxes/urlutils.py b/little_boxes/urlutils.py index 1907c2c..3729e01 100644 --- a/little_boxes/urlutils.py +++ b/little_boxes/urlutils.py @@ -21,7 +21,7 @@ def is_url_valid(url: str) -> bool: # XXX in debug mode, we want to allow requests to localhost to test the federation with local instances debug_mode = strtobool(os.getenv("MICROBLOGPUB_DEBUG", "false")) - if debug_mode: + if debug_mode: # pragma: no cover return True if parsed.hostname in ["localhost"]: diff --git a/little_boxes/webfinger.py b/little_boxes/webfinger.py index ea91f05..cf6f71a 100644 --- a/little_boxes/webfinger.py +++ b/little_boxes/webfinger.py @@ -6,6 +6,7 @@ from urllib.parse import urlparse import requests +from .activitypub import get_backend from .urlutils import check_url logger = logging.getLogger(__name__) @@ -35,8 +36,8 @@ def webfinger(resource: str) -> Optional[Dict[str, Any]]: for i, proto in enumerate(protos): try: url = f"{proto}://{host}/.well-known/webfinger" - # FIXME(tsileo): BACKEND.do_req so we can set a UserAgent - resp = requests.get(url, {"resource": resource}) + # FIXME(tsileo): BACKEND.fetch_json so we can set a UserAgent + resp = get_backend().fetch_json(url, params={"resource": resource}) except requests.ConnectionError: # If we tried https first and the domain is "http only" if i == 0: diff --git a/tests/test_little_boxes.py b/tests/test_little_boxes.py index 2dc5237..651916a 100644 --- a/tests/test_little_boxes.py +++ b/tests/test_little_boxes.py @@ -495,6 +495,44 @@ def test_little_boxes_follow_and_new_create_note_and_delete(): ) +def test_little_boxes_follow_and_new_create_note_and_update(): + back, create = test_little_boxes_follow_and_new_create_note() + + me = back.get_user("tom") + other = back.get_user("tom2") + + outbox = ap.Outbox(other) + + update = ap.Update( + actor=other.id, + object={ + "content": "Hello2", + "id": create.get_object().id, + "type": "Note", + "attributedTo": other.id, + }, + ) + outbox.post(update) + + back.assert_called_methods( + other, + ( + "an Delete activity is published", + "outbox_new", + lambda as_actor: _assert_eq(as_actor.id, other.id), + lambda activity: _assert_eq(activity.id, update.id), + ), + ( + '"outbox_update" hook is called', + "outbox_update", + lambda as_actor: _assert_eq(as_actor.id, other.id), + lambda _update: _assert_eq(_update.id, update.id), + ), + ) + + back.assert_called_methods(me) + + def test_little_boxes_follow_and_new_create_note_and_like(): back, create = test_little_boxes_follow_and_new_create_note()