7bb8568504
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
106 lines
3.4 KiB
Elixir
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
|