Ensure filters have a filter_id
authorLee Starnes <lee@canned-death.us>
Fri, 12 Oct 2018 05:19:43 +0000 (00:19 -0500)
committerWilliam Pitcock <nenolod@dereferenced.org>
Thu, 1 Nov 2018 09:17:02 +0000 (09:17 +0000)
lib/pleroma/filter.ex
test/filter_test.exs
test/web/mastodon_api/mastodon_api_controller_test.exs

index fe904df3aae085fd8cd053acdb76c766fd41c107..25ed38f34927c7bdee2d91176e317a7bf4d7bd74 100644 (file)
@@ -36,6 +36,34 @@ defmodule Pleroma.Filter do
     Repo.all(query)
   end
 
+  def create(%Pleroma.Filter{user_id: user_id, filter_id: nil} = filter) do
+    # If filter_id wasn't given, use the max filter_id for this user plus 1.
+    # XXX This could result in a race condition if a user tries to add two 
+    # different filters for their account from two different clients at the 
+    # same time, but that should be unlikely. 
+
+    max_id_query =
+      from(
+        f in Pleroma.Filter,
+        where: f.user_id == ^user_id,
+        select: max(f.filter_id)
+      )
+
+    filter_id =
+      case Repo.one(max_id_query) do
+        # Start allocating from 1
+        nil ->
+          1
+
+        max_id ->
+          max_id + 1
+      end
+
+    filter
+    |> Map.put(:filter_id, filter_id)
+    |> Repo.insert()
+  end
+
   def create(%Pleroma.Filter{} = filter) do
     Repo.insert(filter)
   end
index d81c92f08966afad27d93064049963a82fd293a8..509c153175adf95897f184824e5e99ec647cdcbc 100644 (file)
@@ -5,19 +5,88 @@ defmodule Pleroma.FilterTest do
   import Pleroma.Factory
   import Ecto.Query
 
-  test "creating a filter" do
-    user = insert(:user)
+  describe "creating filters" do
+    test "creating one filter" do
+      user = insert(:user)
 
-    query = %Pleroma.Filter{
-      user_id: user.id,
-      filter_id: 42,
-      phrase: "knights",
-      context: ["home"]
-    }
+      query = %Pleroma.Filter{
+        user_id: user.id,
+        filter_id: 42,
+        phrase: "knights",
+        context: ["home"]
+      }
+
+      {:ok, %Pleroma.Filter{} = filter} = Pleroma.Filter.create(query)
+      result = Pleroma.Filter.get(filter.filter_id, user)
+      assert query.phrase == result.phrase
+    end
+
+    test "creating one filter without a pre-defined filter_id" do
+      user = insert(:user)
+
+      query = %Pleroma.Filter{
+        user_id: user.id,
+        phrase: "knights",
+        context: ["home"]
+      }
+
+      {:ok, %Pleroma.Filter{} = filter} = Pleroma.Filter.create(query)
+      # Should start at 1
+      assert filter.filter_id == 1
+    end
+
+    test "creating additional filters uses previous highest filter_id + 1" do
+      user = insert(:user)
+
+      query_one = %Pleroma.Filter{
+        user_id: user.id,
+        filter_id: 42,
+        phrase: "knights",
+        context: ["home"]
+      }
+
+      {:ok, %Pleroma.Filter{} = filter_one} = Pleroma.Filter.create(query_one)
+
+      query_two = %Pleroma.Filter{
+        user_id: user.id,
+        # No filter_id
+        phrase: "who",
+        context: ["home"]
+      }
+
+      {:ok, %Pleroma.Filter{} = filter_two} = Pleroma.Filter.create(query_two)
+      assert filter_two.filter_id == filter_one.filter_id + 1
+    end
+
+    test "filter_id is unique per user" do
+      user_one = insert(:user)
+      user_two = insert(:user)
+
+      query_one = %Pleroma.Filter{
+        user_id: user_one.id,
+        phrase: "knights",
+        context: ["home"]
+      }
+
+      {:ok, %Pleroma.Filter{} = filter_one} = Pleroma.Filter.create(query_one)
+
+      query_two = %Pleroma.Filter{
+        user_id: user_two.id,
+        phrase: "who",
+        context: ["home"]
+      }
+
+      {:ok, %Pleroma.Filter{} = filter_two} = Pleroma.Filter.create(query_two)
+
+      assert filter_one.filter_id == 1
+      assert filter_two.filter_id == 1
+
+      result_one = Pleroma.Filter.get(filter_one.filter_id, user_one)
+      assert result_one.phrase == filter_one.phrase
 
-    {:ok, %Pleroma.Filter{} = filter} = Pleroma.Filter.create(query)
-    result = Pleroma.Filter.get(filter.filter_id, user)
-    assert query.phrase == result.phrase
+      result_two = Pleroma.Filter.get(filter_two.filter_id, user_two)
+      assert result_two.phrase == filter_two.phrase
+    end
   end
 
   test "deleting a filter" do
index e9deae64d9d89bc65aabd3dd390ac78654d0d377..42a43f129f2e2d33bcd12db3b443f289ad589d82 100644 (file)
@@ -280,6 +280,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
       assert response = json_response(conn, 200)
       assert response["phrase"] == filter.phrase
       assert response["context"] == filter.context
+      assert response["id"] != nil
+      assert response["id"] != ""
     end
 
     test "fetching a list of filters", %{conn: conn} do