Introduce the group activity section
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
260
test/graphql/resolvers/activity_test.exs
Normal file
260
test/graphql/resolvers/activity_test.exs
Normal file
@@ -0,0 +1,260 @@
|
||||
defmodule Mobilizon.GraphQL.Resolvers.ActivityTest do
|
||||
use Mobilizon.Web.ConnCase
|
||||
|
||||
import Mobilizon.Factory
|
||||
|
||||
alias Mobilizon.{Activities, Posts}
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Service.Activity.Event, as: EventActivity
|
||||
alias Mobilizon.Service.Activity.Post, as: PostActivity
|
||||
|
||||
alias Mobilizon.GraphQL.AbsintheHelpers
|
||||
|
||||
setup %{conn: conn} do
|
||||
group = insert(:group)
|
||||
{:ok, conn: conn, group: group}
|
||||
end
|
||||
|
||||
describe "Resolver: List activities for group" do
|
||||
@group_activities_query """
|
||||
query GroupTimeline(
|
||||
$preferredUsername: String!
|
||||
$type: ActivityType
|
||||
$page: Int
|
||||
$limit: Int
|
||||
) {
|
||||
group(preferredUsername: $preferredUsername) {
|
||||
id
|
||||
preferredUsername
|
||||
domain
|
||||
name
|
||||
activity(type: $type, page: $page, limit: $limit) {
|
||||
total
|
||||
elements {
|
||||
id
|
||||
insertedAt
|
||||
subject
|
||||
subjectParams {
|
||||
key
|
||||
value
|
||||
}
|
||||
type
|
||||
author {
|
||||
id
|
||||
preferredUsername
|
||||
name
|
||||
domain
|
||||
avatar {
|
||||
id
|
||||
url
|
||||
}
|
||||
}
|
||||
group {
|
||||
id
|
||||
preferredUsername
|
||||
}
|
||||
object {
|
||||
... on Event {
|
||||
id
|
||||
title
|
||||
}
|
||||
... on Post {
|
||||
id
|
||||
title
|
||||
}
|
||||
... on Member {
|
||||
id
|
||||
actor {
|
||||
id
|
||||
name
|
||||
preferredUsername
|
||||
domain
|
||||
avatar {
|
||||
id
|
||||
url
|
||||
}
|
||||
}
|
||||
}
|
||||
... on Resource {
|
||||
id
|
||||
title
|
||||
path
|
||||
type
|
||||
}
|
||||
... on Discussion {
|
||||
id
|
||||
title
|
||||
slug
|
||||
}
|
||||
... on Group {
|
||||
id
|
||||
preferredUsername
|
||||
domain
|
||||
name
|
||||
summary
|
||||
visibility
|
||||
openness
|
||||
physicalAddress {
|
||||
id
|
||||
}
|
||||
banner {
|
||||
id
|
||||
}
|
||||
avatar {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
test "without being logged-in", %{
|
||||
conn: conn,
|
||||
group: %Actor{preferred_username: preferred_username}
|
||||
} do
|
||||
res =
|
||||
conn
|
||||
|> AbsintheHelpers.graphql_query(
|
||||
query: @group_activities_query,
|
||||
variables: %{preferredUsername: preferred_username}
|
||||
)
|
||||
|
||||
assert hd(res["errors"])["message"] == "unauthenticated"
|
||||
end
|
||||
|
||||
test "without being a member", %{
|
||||
conn: conn,
|
||||
group: %Actor{preferred_username: preferred_username}
|
||||
} do
|
||||
user = insert(:user)
|
||||
insert(:actor, user: user)
|
||||
|
||||
res =
|
||||
conn
|
||||
|> auth_conn(user)
|
||||
|> AbsintheHelpers.graphql_query(
|
||||
query: @group_activities_query,
|
||||
variables: %{preferredUsername: preferred_username}
|
||||
)
|
||||
|
||||
assert hd(res["errors"])["message"] == "unauthorized"
|
||||
end
|
||||
|
||||
test "without being a validated member", %{
|
||||
conn: conn,
|
||||
group: %Actor{preferred_username: preferred_username} = group
|
||||
} do
|
||||
user = insert(:user)
|
||||
actor = insert(:actor, user: user)
|
||||
insert(:member, parent: group, actor: actor, role: :not_approved)
|
||||
|
||||
res =
|
||||
conn
|
||||
|> auth_conn(user)
|
||||
|> AbsintheHelpers.graphql_query(
|
||||
query: @group_activities_query,
|
||||
variables: %{preferredUsername: preferred_username}
|
||||
)
|
||||
|
||||
assert hd(res["errors"])["message"] == "unauthorized"
|
||||
end
|
||||
|
||||
test "group_activity/3 list group activities", %{
|
||||
conn: conn,
|
||||
group: %Actor{preferred_username: preferred_username, id: group_id} = group
|
||||
} do
|
||||
user = insert(:user)
|
||||
actor = insert(:actor, user: user)
|
||||
|
||||
insert(:member,
|
||||
parent: group,
|
||||
actor: actor,
|
||||
role: :member,
|
||||
member_since: DateTime.truncate(DateTime.utc_now(), :second)
|
||||
)
|
||||
|
||||
event = insert(:event, attributed_to: group, organizer_actor: actor)
|
||||
EventActivity.insert_activity(event, subject: "event_created")
|
||||
assert %{success: 1, failure: 0} == Oban.drain_queue(queue: :activity)
|
||||
assert Activities.list_activities() |> length() == 1
|
||||
|
||||
[%Activity{author_id: author_id, group_id: activity_group_id}] =
|
||||
Activities.list_activities()
|
||||
|
||||
assert author_id == actor.id
|
||||
assert activity_group_id == group_id
|
||||
|
||||
res =
|
||||
conn
|
||||
|> auth_conn(user)
|
||||
|> AbsintheHelpers.graphql_query(
|
||||
query: @group_activities_query,
|
||||
variables: %{preferredUsername: preferred_username}
|
||||
)
|
||||
|
||||
assert res["errors"] == nil
|
||||
assert res["data"]["group"]["id"] == to_string(group_id)
|
||||
assert res["data"]["group"]["activity"]["total"] == 1
|
||||
activity = hd(res["data"]["group"]["activity"]["elements"])
|
||||
assert activity["object"]["id"] == to_string(event.id)
|
||||
assert activity["subject"] == "event_created"
|
||||
|
||||
assert Enum.find(activity["subjectParams"], &(&1["key"] == "event_title"))["value"] ==
|
||||
event.title
|
||||
|
||||
assert Enum.find(activity["subjectParams"], &(&1["key"] == "event_uuid"))["value"] ==
|
||||
event.uuid
|
||||
end
|
||||
|
||||
test "group_activity/3 list group activities from deleted object", %{
|
||||
conn: conn,
|
||||
group: %Actor{preferred_username: preferred_username, id: group_id} = group
|
||||
} do
|
||||
user = insert(:user)
|
||||
actor = insert(:actor, user: user)
|
||||
|
||||
insert(:member,
|
||||
parent: group,
|
||||
actor: actor,
|
||||
role: :member,
|
||||
member_since: DateTime.truncate(DateTime.utc_now(), :second)
|
||||
)
|
||||
|
||||
post = insert(:post, attributed_to: group, author: actor)
|
||||
PostActivity.insert_activity(post, subject: "post_created")
|
||||
Process.sleep(1000)
|
||||
Posts.delete_post(post)
|
||||
PostActivity.insert_activity(post, subject: "post_deleted")
|
||||
assert %{success: 2, failure: 0} == Oban.drain_queue(queue: :activity)
|
||||
assert Activities.list_activities() |> length() == 2
|
||||
|
||||
res =
|
||||
conn
|
||||
|> auth_conn(user)
|
||||
|> AbsintheHelpers.graphql_query(
|
||||
query: @group_activities_query,
|
||||
variables: %{preferredUsername: preferred_username}
|
||||
)
|
||||
|
||||
assert res["errors"] == nil
|
||||
assert res["data"]["group"]["id"] == to_string(group_id)
|
||||
assert res["data"]["group"]["activity"]["total"] == 2
|
||||
[delete_activity, create_activity] = res["data"]["group"]["activity"]["elements"]
|
||||
assert create_activity["object"] == nil
|
||||
assert create_activity["subject"] == "post_created"
|
||||
|
||||
assert Enum.find(create_activity["subjectParams"], &(&1["key"] == "post_title"))["value"] ==
|
||||
post.title
|
||||
|
||||
assert Enum.find(create_activity["subjectParams"], &(&1["key"] == "post_slug"))["value"] ==
|
||||
post.slug
|
||||
|
||||
assert delete_activity["object"] == nil
|
||||
assert delete_activity["subject"] == "post_deleted"
|
||||
end
|
||||
end
|
||||
end
|
||||
91
test/mobilizon/activities_test.exs
Normal file
91
test/mobilizon/activities_test.exs
Normal file
@@ -0,0 +1,91 @@
|
||||
defmodule Mobilizon.ActivitiesTest do
|
||||
use Mobilizon.DataCase
|
||||
|
||||
alias Mobilizon.Activities
|
||||
import Mobilizon.Factory
|
||||
|
||||
describe "activities" do
|
||||
alias Mobilizon.Activities.Activity
|
||||
|
||||
@valid_attrs %{
|
||||
message: "some message",
|
||||
message_params: %{},
|
||||
type: "event",
|
||||
object_id: "some object_id",
|
||||
subject: "event_created",
|
||||
subject_params: %{}
|
||||
}
|
||||
|
||||
@invalid_attrs %{
|
||||
message: nil,
|
||||
object_id: nil,
|
||||
subject: nil
|
||||
}
|
||||
|
||||
setup do
|
||||
actor = insert(:actor)
|
||||
group = insert(:group)
|
||||
{:ok, actor: actor, group: group}
|
||||
end
|
||||
|
||||
def activity_fixture(attrs \\ %{}) do
|
||||
{:ok, activity} =
|
||||
attrs
|
||||
|> Enum.into(@valid_attrs)
|
||||
|> Activities.create_activity()
|
||||
|
||||
activity
|
||||
end
|
||||
|
||||
test "list_activities/0 returns all activities", %{actor: actor, group: group} do
|
||||
activity =
|
||||
activity_fixture(%{
|
||||
group_id: group.id,
|
||||
author_id: actor.id,
|
||||
inserted_at: DateTime.utc_now()
|
||||
})
|
||||
|
||||
assert Activities.list_activities() == [activity]
|
||||
end
|
||||
|
||||
test "get_activity!/1 returns the activity with given id", %{actor: actor, group: group} do
|
||||
activity =
|
||||
activity_fixture(%{
|
||||
author_id: actor.id,
|
||||
group_id: group.id,
|
||||
inserted_at: DateTime.utc_now()
|
||||
})
|
||||
|
||||
assert Activities.get_activity!(activity.id) == activity
|
||||
end
|
||||
|
||||
test "create_activity/1 with valid data creates a activity", %{actor: actor, group: group} do
|
||||
assert {:ok, %Activity{} = activity} =
|
||||
Activities.create_activity(
|
||||
@valid_attrs
|
||||
|> Map.put(:group_id, group.id)
|
||||
|> Map.put(:author_id, actor.id)
|
||||
|> Map.put(:inserted_at, DateTime.utc_now())
|
||||
)
|
||||
|
||||
assert activity.message == "some message"
|
||||
assert activity.message_params == %{}
|
||||
assert activity.object_id == "some object_id"
|
||||
assert activity.subject == :event_created
|
||||
assert activity.subject_params == %{}
|
||||
end
|
||||
|
||||
test "create_activity/1 with invalid data returns error changeset", %{
|
||||
actor: actor,
|
||||
group: group
|
||||
} do
|
||||
assert {:error, %Ecto.Changeset{}} =
|
||||
Activities.create_activity(
|
||||
@invalid_attrs
|
||||
|> Map.put(:author_id, actor.id)
|
||||
|> Map.put(:group_id, group.id)
|
||||
|> Map.put(:inserted_at, DateTime.utc_now())
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -409,4 +409,20 @@ defmodule Mobilizon.Factory do
|
||||
url: Routes.page_url(Endpoint, :discussion, group.preferred_username, slug)
|
||||
}
|
||||
end
|
||||
|
||||
def mobilizon_activity_factory do
|
||||
group = build(:group)
|
||||
actor = build(:actor)
|
||||
event = build(:event, organizer_actor: actor, attributed_to: group)
|
||||
|
||||
%Mobilizon.Activities.Activity{
|
||||
type: :event,
|
||||
subject: :event_created,
|
||||
subject_params: %{event: event},
|
||||
author: actor,
|
||||
group: group,
|
||||
object_type: :event,
|
||||
object_id: to_string(event.id)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user