mobilizon/test/mobilizon/posts_test.exs
Thomas Citharel 7bb8568504
Add an unique index on posts URLs
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2021-06-22 16:51:21 +02:00

106 lines
3.4 KiB
Elixir

defmodule Mobilizon.PostsTest do
use Mobilizon.DataCase
import Mobilizon.Factory
alias Mobilizon.Actors.Actor
alias Mobilizon.Posts
alias Mobilizon.Posts.Post
describe "posts" do
@valid_attrs %{body: "some text", title: "some title"}
@update_attrs %{body: "some updated text", title: "some updated title"}
@invalid_attrs %{body: nil}
test "list_posts/0 returns all posts" do
group = insert(:group)
%Post{id: post_id} = insert(:post, attributed_to: group)
post_ids = Posts.get_posts_for_group(group).elements |> Enum.map(& &1.id)
assert post_ids == [post_id]
end
test "get_post!/1 returns the post with given id" do
%Post{id: post_id} = insert(:post)
post_fetched = Posts.get_post(post_id)
assert post_fetched.id == post_id
end
test "create_post/1 with valid data creates a post" do
%Actor{} = actor = insert(:actor)
%Actor{} = group = insert(:group)
post_data = Map.merge(@valid_attrs, %{author_id: actor.id, attributed_to_id: group.id})
case Posts.create_post(post_data) do
{:ok, %Post{} = post} ->
assert post.body == "some text"
assert post.author_id == actor.id
assert post.title == "some title"
assert post.slug == "some-title-" <> ShortUUID.encode!(post.id)
err ->
flunk("Failed to create a post #{inspect(err)}")
end
end
test "create_post/1 with an already existing URL returns error changeset" do
%Actor{} = actor = insert(:actor)
%Actor{} = group = insert(:group)
post_data =
Map.merge(@valid_attrs, %{
author_id: actor.id,
attributed_to_id: group.id,
url: "https://remote.tld/p/post"
})
{:ok, %Post{} = _post} = Posts.create_post(post_data)
assert {:error,
%Ecto.Changeset{
errors: [
url:
{"has already been taken",
[constraint: :unique, constraint_name: "posts_url_index"]}
]
}} = Posts.create_post(post_data)
end
test "create_post/1 with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{}} = Posts.create_post(@invalid_attrs)
end
test "update_post/2 with valid data updates the post" do
%Actor{} = actor = insert(:actor)
%Actor{} = group = insert(:group)
post_data = Map.merge(@valid_attrs, %{author_id: actor.id, attributed_to_id: group.id})
{:ok, %Post{} = post} = Posts.create_post(post_data)
case Posts.update_post(post, @update_attrs) do
{:ok, %Post{} = updated_post} ->
assert updated_post.body == @update_attrs.body
assert updated_post.title == @update_attrs.title
# Slug and URL don't change
assert updated_post.slug == post.slug
assert updated_post.url == post.url
err ->
flunk("Failed to update a post #{inspect(err)}")
end
end
test "update_post/2 with invalid data returns error changeset" do
%Post{} = post = insert(:post)
assert {:error, %Ecto.Changeset{}} = Posts.update_post(post, @invalid_attrs)
%Post{} = post_fetched = Posts.get_post(post.id)
assert post.body == post_fetched.body
end
test "delete_post/1 deletes the post" do
%Post{} = post = insert(:post)
assert {:ok, %Post{}} = Posts.delete_post(post)
assert is_nil(Posts.get_post(post.id))
end
end
end