mix format
[akkoma] / test / mix / tasks / pleroma / database_test.exs
index 7f5cd91a9c89da36b6812cf914bd27dbdf377e08..9edb2c115b18be950e69d60add3f3c08b9a12459 100644 (file)
@@ -354,7 +354,7 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
       assert length(Repo.all(Object)) == 1
     end
 
-    test "We don't have unexpected tables which can contain objects that are referenced by activities" do
+    test "We don't have unexpected tables which may contain objects that are referenced by activities" do
       # We can delete orphaned activities. For that we look for the objects they reference in the 'objects', 'activities', and 'users' table.
       # If someone adds another table with objects (idk, maybe with separate relations, or collections or w/e), then we need to make sure we 
       # add logic for that in the 'prune_objects' task so that we don't wrongly delete their corresponding activities.
@@ -416,7 +416,6 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
     end
 
     test "it prunes orphaned activities with the --prune-orphaned-activities" do
-      # Add a remote activity which references an Object
       %Object{} |> Map.merge(%{data: %{"id" => "object_for_activity"}}) |> Repo.insert()
 
       %Activity{}
@@ -426,7 +425,6 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
       })
       |> Repo.insert()
 
-      # Add a remote activity which references an activity
       %Activity{}
       |> Map.merge(%{
         local: false,
@@ -437,7 +435,6 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
       })
       |> Repo.insert()
 
-      # Add a remote activity which references an Actor
       %User{} |> Map.merge(%{ap_id: "actor"}) |> Repo.insert()
 
       %Activity{}
@@ -447,7 +444,6 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
       })
       |> Repo.insert()
 
-      # Add a remote activity without existing referenced object, activity or actor
       %Activity{}
       |> Map.merge(%{
         local: false,
@@ -458,7 +454,6 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
       })
       |> Repo.insert()
 
-      # Add a local activity without existing referenced object, activity or actor
       %Activity{}
       |> Map.merge(%{
         local: true,
@@ -466,8 +461,6 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
       })
       |> Repo.insert()
 
-      # The remote activities without existing reference, and only the remote activities without existing reference, are deleted
-      # if, and only if, we provide the --prune-orphaned-activities option
       assert length(Repo.all(Activity)) == 5
       Mix.Tasks.Pleroma.Database.run(["prune_objects"])
       assert length(Repo.all(Activity)) == 5
@@ -481,6 +474,65 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
 
       assert length(activities) == 4
     end
+
+    test "it prunes orphaned activities with the --prune-orphaned-activities when the objects are referenced from an array" do
+      %Object{} |> Map.merge(%{data: %{"id" => "existing_object"}}) |> Repo.insert()
+      %User{} |> Map.merge(%{ap_id: "existing_actor"}) |> Repo.insert()
+
+      %Activity{}
+      |> Map.merge(%{
+        local: false,
+        data: %{
+          "id" => "remote_activity_existing_object",
+          "object" => ["non_ existing_object", "existing_object"]
+        }
+      })
+      |> Repo.insert()
+
+      %Activity{}
+      |> Map.merge(%{
+        local: false,
+        data: %{
+          "id" => "remote_activity_existing_actor",
+          "object" => ["non_ existing_object", "existing_actor"]
+        }
+      })
+      |> Repo.insert()
+
+      %Activity{}
+      |> Map.merge(%{
+        local: false,
+        data: %{
+          "id" => "remote_activity_existing_activity",
+          "object" => ["non_ existing_object", "remote_activity_existing_actor"]
+        }
+      })
+      |> Repo.insert()
+
+      %Activity{}
+      |> Map.merge(%{
+        local: false,
+        data: %{
+          "id" => "remote_activity_without_existing_referenced_object",
+          "object" => ["owo", "whats_this"]
+        }
+      })
+      |> Repo.insert()
+
+      assert length(Repo.all(Activity)) == 4
+      Mix.Tasks.Pleroma.Database.run(["prune_objects"])
+      assert length(Repo.all(Activity)) == 4
+      Mix.Tasks.Pleroma.Database.run(["prune_objects", "--prune-orphaned-activities"])
+      activities = Repo.all(Activity)
+      assert length(activities) == 3
+
+      assert "remote_activity_without_existing_referenced_object" not in Enum.map(
+               activities,
+               fn a -> a.data["id"] end
+             )
+
+      assert length(activities) == 3
+    end
   end
 
   describe "running update_users_following_followers_counts" do