From 48df30dbd8ba8701aa8f3137303914d396b9aaca Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Mon, 2 Apr 2018 22:12:28 +0200
Subject: [PATCH] We now persist system accounts to database

---
 api/funkwhale_api/federation/actors.py | 18 ++++++++++--------
 api/tests/federation/test_actors.py    |  9 +++++++++
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/api/funkwhale_api/federation/actors.py b/api/funkwhale_api/federation/actors.py
index 69033f5ca..a4e24912b 100644
--- a/api/funkwhale_api/federation/actors.py
+++ b/api/funkwhale_api/federation/actors.py
@@ -49,15 +49,17 @@ class SystemActor(object):
     additional_attributes = {}
 
     def get_actor_instance(self):
-        a = models.Actor(
-            **self.get_instance_argument(
-                self.id,
-                name=self.name,
-                summary=self.summary,
-                **self.additional_attributes
-            )
+        args = self.get_instance_argument(
+            self.id,
+            name=self.name,
+            summary=self.summary,
+            **self.additional_attributes
+        )
+        url = args.pop('url')
+        a, created = models.Actor.objects.get_or_create(
+            url=url,
+            defaults=args,
         )
-        a.pk = self.id
         return a
 
     def get_instance_argument(self, id, name, summary, **kwargs):
diff --git a/api/tests/federation/test_actors.py b/api/tests/federation/test_actors.py
index b3b0f8df0..127b3c15e 100644
--- a/api/tests/federation/test_actors.py
+++ b/api/tests/federation/test_actors.py
@@ -6,6 +6,7 @@ from django.utils import timezone
 from rest_framework import exceptions
 
 from funkwhale_api.federation import actors
+from funkwhale_api.federation import models
 from funkwhale_api.federation import serializers
 from funkwhale_api.federation import utils
 
@@ -188,3 +189,11 @@ def test_test_post_outbox_handles_create_note(
         to=[actor.url],
         on_behalf_of=actors.SYSTEM_ACTORS['test'].get_actor_instance()
     )
+
+
+def test_getting_actor_instance_persists_in_db(db):
+    test = actors.SYSTEM_ACTORS['test'].get_actor_instance()
+    from_db = models.Actor.objects.get(url=test.url)
+
+    for f in test._meta.fields:
+        assert getattr(from_db, f.name) == getattr(test, f.name)
-- 
GitLab