Introduce the group activity section

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2021-02-24 19:06:48 +01:00
parent d0567f783d
commit 3fe64a4389
70 changed files with 3224 additions and 70 deletions

View 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

View 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

View File

@@ -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