362 lines
10 KiB
Elixir
362 lines
10 KiB
Elixir
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
|
|
$author: ActivityAuthor
|
|
$page: Int
|
|
$limit: Int
|
|
) {
|
|
group(preferredUsername: $preferredUsername) {
|
|
id
|
|
preferredUsername
|
|
domain
|
|
name
|
|
activity(type: $type, author: $author, 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, snoozed: 0, failure: 0, discard: 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 filtered by type", %{
|
|
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)
|
|
post = insert(:post, author: actor, attributed_to: group)
|
|
EventActivity.insert_activity(event, subject: "event_created")
|
|
PostActivity.insert_activity(post, subject: "post_created")
|
|
|
|
assert %{success: 2, snoozed: 0, failure: 0, discard: 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, type: "POST"}
|
|
)
|
|
|
|
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(post.id)
|
|
assert activity["subject"] == "post_created"
|
|
|
|
assert Enum.find(activity["subjectParams"], &(&1["key"] == "post_title"))["value"] ==
|
|
post.title
|
|
|
|
assert Enum.find(activity["subjectParams"], &(&1["key"] == "post_slug"))["value"] ==
|
|
post.slug
|
|
end
|
|
|
|
test "group_activity/3 list group activities filtered by author", %{
|
|
conn: conn,
|
|
group: %Actor{preferred_username: preferred_username, id: group_id} = group
|
|
} do
|
|
user = insert(:user)
|
|
insert(:settings, user_id: user.id, user: 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)
|
|
post = insert(:post, attributed_to: group)
|
|
EventActivity.insert_activity(event, subject: "event_created")
|
|
PostActivity.insert_activity(post, subject: "post_created")
|
|
|
|
assert %{success: 2, snoozed: 0, failure: 0, discard: 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, author: "BY"}
|
|
)
|
|
|
|
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(post.id)
|
|
assert activity["subject"] == "post_created"
|
|
|
|
assert Enum.find(activity["subjectParams"], &(&1["key"] == "post_title"))["value"] ==
|
|
post.title
|
|
|
|
assert Enum.find(activity["subjectParams"], &(&1["key"] == "post_slug"))["value"] ==
|
|
post.slug
|
|
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, snoozed: 0, failure: 0, discard: 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
|