Add some basic changesets.
authorRoger Braun <roger@rogerbraun.net>
Tue, 9 May 2017 16:11:51 +0000 (18:11 +0200)
committerRoger Braun <roger@rogerbraun.net>
Tue, 9 May 2017 16:11:51 +0000 (18:11 +0200)
lib/pleroma/object.ex
lib/pleroma/user.ex
test/object_test.exs
test/user_test.exs

index 949ccb0f66e172a6b4bece0983e55ef20fa52b8d..715a35591815394f5bfd25b1856b3252f9c98cce 100644 (file)
@@ -1,7 +1,7 @@
 defmodule Pleroma.Object do
   use Ecto.Schema
   alias Pleroma.{Repo, Object}
-  import Ecto.Query
+  import Ecto.{Query, Changeset}
 
   schema "objects" do
     field :data, :map
@@ -9,6 +9,13 @@ defmodule Pleroma.Object do
     timestamps()
   end
 
+  def change(struct, params \\ %{}) do
+    changeset = struct
+    |> cast(params, [:data])
+    |> validate_required([:data])
+    |> unique_constraint(:ap_id, name: :objects_unique_apid_index)
+  end
+
   def get_by_ap_id(ap_id) do
     Repo.one(from object in Object,
       where: fragment("? @> ?", object.data, ^%{id: ap_id}))
index 4510be77052129bdf32950d2903fe6847f9171e2..9b2433674d87aa52939ed0d7d70989d6aaeec50d 100644 (file)
@@ -61,6 +61,17 @@ defmodule Pleroma.User do
     }
   end
 
+  @email_regex ~r/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
+  def remote_user_creation(params) do
+    changeset = %User{}
+    |> cast(params, [:bio, :name, :ap_id, :nickname, :info])
+    |> validate_required([:bio, :name, :ap_id, :nickname])
+    |> unique_constraint(:nickname)
+    |> validate_format(:nickname, @email_regex)
+    |> validate_length(:bio, max: 1000)
+    |> validate_length(:name, max: 100)
+  end
+
   def register_changeset(struct, params \\ %{}) do
     changeset = struct
     |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation])
@@ -69,6 +80,9 @@ defmodule Pleroma.User do
     |> unique_constraint(:email)
     |> unique_constraint(:nickname)
     |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
+    |> validate_format(:email, @email_regex)
+    |> validate_length(:bio, max: 1000)
+    |> validate_length(:name, max: 100)
 
     if changeset.valid? do
       hashed = Pbkdf2.hashpwsalt(changeset.changes[:password])
index 3ffddbbc59989baa95d18588dfcaefab13f527df..ae9515c2638d7e0a286e2f82e372392143d0c9ad 100644 (file)
@@ -1,11 +1,22 @@
 defmodule Pleroma.ObjectTest do
   use Pleroma.DataCase
   import Pleroma.Factory
+  alias Pleroma.{Repo, Object}
 
   test "returns an object by it's AP id" do
     object = insert(:note)
-    found_object = Pleroma.Object.get_by_ap_id(object.data["id"])
+    found_object = Object.get_by_ap_id(object.data["id"])
 
     assert object == found_object
   end
+
+  describe "generic changeset" do
+    test "it ensures uniqueness of the id" do
+      object = insert(:note)
+      cs = Object.change(%Object{}, %{data: %{id: object.data["id"]}})
+      assert cs.valid?
+
+      {:error, result} = Repo.insert(cs)
+    end
+  end
 end
index e6de4a5cd731076d05c4fbff17f9c6c6050b44f5..bfa79db28f10613267a907c62572d8f6727fc055 100644 (file)
@@ -139,5 +139,46 @@ defmodule Pleroma.UserTest do
     user = insert(:user)
     assert User.ap_followers(user) == Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, user.nickname) <> "/followers"
   end
+
+  describe "remote user creation changeset" do
+    @valid_remote %{
+      bio: "hello",
+      name: "Someone",
+      nickname: "a@b.de",
+      ap_id: "http...",
+      info: %{ some: "info" }
+    }
+
+    test "it confirms validity" do
+      cs = User.remote_user_creation(@valid_remote)
+      assert cs.valid?
+    end
+
+    test "it enforces the fqn format for nicknames" do
+      cs = User.remote_user_creation(%{@valid_remote | nickname: "bla"})
+      refute cs.valid?
+    end
+
+    test "it has required fields" do
+      [:bio, :name, :nickname, :ap_id]
+      |> Enum.each(fn (field) ->
+        cs = User.remote_user_creation(Map.delete(@valid_remote, field))
+        refute cs.valid?
+      end)
+    end
+
+    test "it restricts some sizes" do
+      [bio: 1000, name: 100]
+      |> Enum.each(fn ({field, size}) ->
+        string = String.pad_leading(".", size)
+        cs = User.remote_user_creation(Map.put(@valid_remote, field, string))
+        assert cs.valid?
+
+        string = String.pad_leading(".", size + 1)
+        cs = User.remote_user_creation(Map.put(@valid_remote, field, string))
+        refute cs.valid?
+      end)
+    end
+  end
 end