baseless/test/pleroma/web/pleroma_api/controllers/event_controller_test.exs
2025-01-24 09:36:38 -08:00

394 lines
11 KiB
Elixir

# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.PleromaAPI.EventControllerTest do
use Pleroma.Web.ConnCase
use Oban.Testing, repo: Pleroma.Repo
alias Pleroma.Object
alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Web.CommonAPI
import Pleroma.Factory
describe "POST /api/v1/pleroma/events" do
setup do
user = insert(:user)
%{user: user, conn: conn} = oauth_access(["write"], user: user)
[user: user, conn: conn]
end
test "creates an event", %{conn: conn} do
conn =
conn
|> put_req_header("content-type", "application/json")
|> post("/api/v1/pleroma/events", %{
"name" => "Event name",
"start_time" => "2023-01-01T01:00:00.000Z",
"end_time" => "2023-01-01T04:00:00.000Z",
"join_mode" => "free"
})
assert %{
"pleroma" => %{
"event" => %{
"name" => "Event name",
"join_mode" => "free"
}
}
} = json_response_and_validate_schema(conn, 200)
end
test "can't create event that ends before its start", %{conn: conn} do
conn =
conn
|> put_req_header("content-type", "application/json")
|> post("/api/v1/pleroma/events", %{
"name" => "Event name",
"start_time" => "2023-01-01T04:00:00.000Z",
"end_time" => "2022-12-31T04:00:00.000Z",
"join_mode" => "free"
})
assert json_response_and_validate_schema(conn, 422) == %{
"error" => "Event can't end before its start"
}
end
test "assigns location from location id", %{conn: conn} do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
conn =
conn
|> put_req_header("content-type", "application/json")
|> post("/api/v1/pleroma/events", %{
"name" => "Event name",
"start_time" => "2023-01-01T01:00:00.000Z",
"end_time" => "2023-01-01T04:00:00.000Z",
"join_mode" => "free",
"location_id" => "3726208425"
})
assert %{
"pleroma" => %{
"event" => %{
"location" => %{
"name" => "Benis",
"longitude" => 45.7285348,
"latitude" => 38.212263,
"street" => " ",
"locality" => "بخش مرکزی",
"region" => "East Azerbaijan Province",
"country" => "Iran"
}
}
}
} = json_response_and_validate_schema(conn, 200)
end
end
test "GET /api/v1/pleroma/events/:id/participations" do
%{conn: conn} = oauth_access(["read"])
user_one = insert(:user)
user_two = insert(:user)
user_three = insert(:user)
{:ok, activity} =
CommonAPI.event(user_one, %{
name: "test event",
status: "",
join_mode: "free",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
CommonAPI.join(user_two, activity.id)
CommonAPI.join(user_three, activity.id)
conn =
conn
|> get("/api/v1/pleroma/events/#{activity.id}/participations")
assert response = json_response_and_validate_schema(conn, 200)
assert length(response) == 3
end
describe "GET /api/v1/pleroma/events/:id/participation_requests" do
setup do
user = insert(:user)
%{user: user, conn: conn} = oauth_access(["read"], user: user)
[user: user, conn: conn]
end
test "show participation requests", %{conn: conn, user: user} do
other_user = insert(:user)
{:ok, activity} =
CommonAPI.event(user, %{
name: "test event",
status: "",
join_mode: "restricted",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
CommonAPI.join(other_user, activity.id, %{
participation_message: "I'm interested in this event"
})
conn =
conn
|> get("/api/v1/pleroma/events/#{activity.id}/participation_requests")
assert [
%{
"participation_message" => "I'm interested in this event"
}
] = response = json_response_and_validate_schema(conn, 200)
assert length(response) == 1
end
test "don't display requests if not an author", %{conn: conn} do
other_user = insert(:user)
{:ok, activity} =
CommonAPI.event(other_user, %{
name: "test event",
status: "",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
conn =
conn
|> get("/api/v1/pleroma/events/#{activity.id}/participation_requests")
assert %{"error" => "Can't get participation requests"} =
json_response_and_validate_schema(conn, 403)
end
end
describe "POST /api/v1/pleroma/events/:id/join" do
setup do
user = insert(:user)
%{user: user, conn: conn} = oauth_access(["write"], user: user)
[user: user, conn: conn]
end
test "joins an event", %{conn: conn} do
other_user = insert(:user)
{:ok, activity} =
CommonAPI.event(other_user, %{
name: "test event",
status: "",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
conn =
conn
|> post("/api/v1/pleroma/events/#{activity.id}/join")
assert json_response_and_validate_schema(conn, 200)
assert %{
data: %{
"participation_count" => 2
}
} = Object.get_by_ap_id(activity.data["object"])
end
test "can't join your own event", %{conn: conn, user: user} do
{:ok, activity} =
CommonAPI.event(user, %{
name: "test event",
status: "",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
conn =
conn
|> post("/api/v1/pleroma/events/#{activity.id}/join")
assert json_response_and_validate_schema(conn, :bad_request) == %{
"error" => "Can't join your own event"
}
end
end
describe "POST /api/v1/pleroma/events/:id/leave" do
setup do
user = insert(:user)
%{user: user, conn: conn} = oauth_access(["write"], user: user)
[user: user, conn: conn]
end
test "leaves an event", %{conn: conn, user: user} do
other_user = insert(:user)
{:ok, activity} =
CommonAPI.event(other_user, %{
name: "test event",
status: "",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
CommonAPI.join(user, activity.id)
conn =
conn
|> post("/api/v1/pleroma/events/#{activity.id}/leave")
assert json_response_and_validate_schema(conn, 200)
assert %{
data: %{
"participation_count" => 1
}
} = Object.get_by_ap_id(activity.data["object"])
end
test "can't leave event you are not participating in", %{conn: conn} do
other_user = insert(:user)
{:ok, activity} =
CommonAPI.event(other_user, %{
name: "test event",
status: "",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
conn =
conn
|> post("/api/v1/pleroma/events/#{activity.id}/leave")
assert json_response_and_validate_schema(conn, :bad_request) == %{
"error" => "Not participating in the event"
}
end
end
describe "POST /api/v1/pleroma/events/:id/participation_requests/:participant_id/authorize" do
setup do
user = insert(:user)
%{user: user, conn: conn} = oauth_access(["write"], user: user)
[user: user, conn: conn]
end
test "accepts a participation request", %{user: user, conn: conn} do
%{ap_id: ap_id} = other_user = insert(:user)
{:ok, activity} =
CommonAPI.event(user, %{
name: "test event",
status: "",
join_mode: "restricted",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
CommonAPI.join(other_user, activity.id)
conn =
conn
|> post(
"/api/v1/pleroma/events/#{activity.id}/participation_requests/#{other_user.id}/authorize"
)
assert json_response_and_validate_schema(conn, 200)
assert %{
data: %{
"participations" => [^ap_id, _],
"participation_count" => 2
}
} = Object.get_by_ap_id(activity.data["object"])
assert %{data: %{"state" => "accept"}} =
Utils.get_existing_join(other_user.ap_id, activity.data["object"])
end
test "it refuses to accept a request when event is not by the user", %{conn: conn} do
[second_user, third_user] = insert_pair(:user)
{:ok, activity} =
CommonAPI.event(second_user, %{
name: "test event",
status: "",
join_mode: "restricted",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
CommonAPI.join(third_user, activity.id)
conn =
conn
|> post(
"/api/v1/pleroma/events/#{activity.id}/participation_requests/#{third_user.id}/authorize"
)
assert json_response_and_validate_schema(conn, :forbidden)
end
end
test "POST /api/v1/pleroma/events/:id/participation_requests/:participant_id/reject" do
[user, other_user] = insert_pair(:user)
%{user: user, conn: conn} = oauth_access(["write"], user: user)
{:ok, activity} =
CommonAPI.event(user, %{
name: "test event",
status: "",
join_mode: "restricted",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
CommonAPI.join(other_user, activity.id)
conn =
conn
|> post(
"/api/v1/pleroma/events/#{activity.id}/participation_requests/#{other_user.id}/reject"
)
assert json_response_and_validate_schema(conn, 200)
assert %{data: %{"state" => "reject"}} =
Utils.get_existing_join(other_user.ap_id, activity.data["object"])
end
test "GET /api/v1/pleroma/events/:id/ics" do
%{conn: conn} = oauth_access(["read"])
user = insert(:user)
{:ok, activity} =
CommonAPI.event(user, %{
name: "test event",
status: "",
join_mode: "free",
start_time: DateTime.from_iso8601("2023-01-01T01:00:00.000Z") |> elem(1)
})
conn =
conn
|> get("/api/v1/pleroma/events/#{activity.id}/ics")
assert conn.status == 200
assert conn.resp_body == """
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
VERSION:2.0
PRODID:-//Elixir ICalendar//Elixir ICalendar//EN
BEGIN:VEVENT
DESCRIPTION:
DTSTART:20230101T010000Z
ORGANIZER:#{Pleroma.HTML.strip_tags(user.name || user.nickname)}
SUMMARY:test event
UID:#{activity.object.id}
URL:#{activity.object.data["id"]}
END:VEVENT
END:VCALENDAR
"""
end
end