From 6fbf8fa44cf2d9c4ccf2bfebce72786669031f36 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Sun, 1 Apr 2018 10:17:06 +0200
Subject: [PATCH] Actor factory and fixture

---
 api/funkwhale_api/federation/factories.py | 32 +++++++++++++++--------
 api/tests/federation/conftest.py          | 10 +++++++
 api/tests/federation/test_views.py        | 26 +++++++++---------
 3 files changed, 44 insertions(+), 24 deletions(-)
 create mode 100644 api/tests/federation/conftest.py

diff --git a/api/funkwhale_api/federation/factories.py b/api/funkwhale_api/federation/factories.py
index e290eee634..d34242fc8e 100644
--- a/api/funkwhale_api/federation/factories.py
+++ b/api/funkwhale_api/federation/factories.py
@@ -5,6 +5,7 @@ import requests_http_signature
 from funkwhale_api.factories import registry
 
 from . import keys
+from . import models
 
 
 registry.register(keys.get_key_pair, name='federation.KeyPair')
@@ -48,14 +49,23 @@ class SignedRequestFactory(factory.Factory):
         self.headers.update(default_headers)
 
 
-# @registry.register
-# class ActorFactory(factory.DjangoModelFactory):
-#     url = factory.Faker('url')
-#     inbox_url = factory.Faker('url')
-#     outbox_url = factory.Faker('url')
-#     public_key = factory.LazyFunction(lambda: keys.get_key_pair()[1])
-#     preferred_username = factory.Faker('username')
-#     summary = factory.Faker('paragraph')
-#
-#     class Meta:
-#         model = models.Actor
+@registry.register
+class ActorFactory(factory.DjangoModelFactory):
+    url = factory.Faker('url')
+    inbox_url = factory.Faker('url')
+    outbox_url = factory.Faker('url')
+    public_key = None
+    private_key = None
+    preferred_username = factory.Faker('user_name')
+    summary = factory.Faker('paragraph')
+
+    class Meta:
+        model = models.Actor
+
+    @classmethod
+    def _generate(cls, create, attrs):
+        has_public = attrs.get('public_key') is None
+        has_private = attrs.get('private_key') is None
+        if not has_public and not has_private:
+            attrs['private_key'], attrs['public'] = keys.get_key_pair()
+        return super()._generate(create, attrs)
diff --git a/api/tests/federation/conftest.py b/api/tests/federation/conftest.py
new file mode 100644
index 0000000000..c5831914be
--- /dev/null
+++ b/api/tests/federation/conftest.py
@@ -0,0 +1,10 @@
+import pytest
+
+
+@pytest.fixture
+def authenticated_actor(nodb_factories, mocker):
+    actor = nodb_factories['federation.Actor']()
+    mocker.patch(
+        'funkwhale_api.federation.authentication.SignatureAuthentication.authenticate_actor',
+        return_value=actor)
+    yield actor
diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py
index 96cf8ff7fb..5ec53279a7 100644
--- a/api/tests/federation/test_views.py
+++ b/api/tests/federation/test_views.py
@@ -21,19 +21,19 @@ def test_instance_actors(system_actor, db, settings, api_client):
     assert response.data == serializer.data
 
 
-# @pytest.mark.parametrize('route', [
-#     'instance-outbox',
-#     'instance-inbox',
-#     'instance-actor',
-#     'well-known-webfinger',
-# ])
-# def test_instance_inbox_405_if_federation_disabled(
-#         db, settings, api_client, route):
-#     settings.FEDERATION_ENABLED = False
-#     url = reverse('federation:{}'.format(route))
-#     response = api_client.get(url)
-#
-#     assert response.status_code == 405
+@pytest.mark.parametrize('route,kwargs', [
+    ('instance-actors-outbox', {'actor': 'library'}),
+    ('instance-actors-inbox', {'actor': 'library'}),
+    ('instance-actors-detail', {'actor': 'library'}),
+    ('well-known-webfinger', {}),
+])
+def test_instance_inbox_405_if_federation_disabled(
+        authenticated_actor, db, settings, api_client, route, kwargs):
+    settings.FEDERATION_ENABLED = False
+    url = reverse('federation:{}'.format(route), kwargs=kwargs)
+    response = api_client.get(url)
+
+    assert response.status_code == 405
 
 
 def test_wellknown_webfinger_validates_resource(
-- 
GitLab