25 changed files with 927 additions and 646 deletions
@ -0,0 +1,54 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Plugs.RemoteIp do |
|||
@moduledoc """ |
|||
This is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration. |
|||
""" |
|||
|
|||
@behaviour Plug |
|||
|
|||
@headers ~w[ |
|||
forwarded |
|||
x-forwarded-for |
|||
x-client-ip |
|||
x-real-ip |
|||
] |
|||
|
|||
# https://en.wikipedia.org/wiki/Localhost |
|||
# https://en.wikipedia.org/wiki/Private_network |
|||
@reserved ~w[ |
|||
127.0.0.0/8 |
|||
::1/128 |
|||
fc00::/7 |
|||
10.0.0.0/8 |
|||
172.16.0.0/12 |
|||
192.168.0.0/16 |
|||
] |
|||
|
|||
def init(_), do: nil |
|||
|
|||
def call(conn, _) do |
|||
config = Pleroma.Config.get(__MODULE__, []) |
|||
|
|||
if Keyword.get(config, :enabled, false) do |
|||
RemoteIp.call(conn, remote_ip_opts(config)) |
|||
else |
|||
conn |
|||
end |
|||
end |
|||
|
|||
defp remote_ip_opts(config) do |
|||
headers = config |> Keyword.get(:headers, @headers) |> MapSet.new() |
|||
reserved = Keyword.get(config, :reserved, @reserved) |
|||
|
|||
proxies = |
|||
config |
|||
|> Keyword.get(:proxies, []) |
|||
|> Enum.concat(reserved) |
|||
|> Enum.map(&InetCidr.parse/1) |
|||
|
|||
{headers, proxies} |
|||
end |
|||
end |
@ -0,0 +1,26 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Web.MastodonAPI.DomainBlockController do |
|||
use Pleroma.Web, :controller |
|||
|
|||
alias Pleroma.User |
|||
|
|||
@doc "GET /api/v1/domain_blocks" |
|||
def index(%{assigns: %{user: %{info: info}}} = conn, _) do |
|||
json(conn, Map.get(info, :domain_blocks, [])) |
|||
end |
|||
|
|||
@doc "POST /api/v1/domain_blocks" |
|||
def create(%{assigns: %{user: blocker}} = conn, %{"domain" => domain}) do |
|||
User.block_domain(blocker, domain) |
|||
json(conn, %{}) |
|||
end |
|||
|
|||
@doc "DELETE /api/v1/domain_blocks" |
|||
def delete(%{assigns: %{user: blocker}} = conn, %{"domain" => domain}) do |
|||
User.unblock_domain(blocker, domain) |
|||
json(conn, %{}) |
|||
end |
|||
end |
@ -0,0 +1,72 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Web.MastodonAPI.FilterController do |
|||
use Pleroma.Web, :controller |
|||
|
|||
alias Pleroma.Filter |
|||
|
|||
@doc "GET /api/v1/filters" |
|||
def index(%{assigns: %{user: user}} = conn, _) do |
|||
filters = Filter.get_filters(user) |
|||
|
|||
render(conn, "filters.json", filters: filters) |
|||
end |
|||
|
|||
@doc "POST /api/v1/filters" |
|||
def create( |
|||
%{assigns: %{user: user}} = conn, |
|||
%{"phrase" => phrase, "context" => context} = params |
|||
) do |
|||
query = %Filter{ |
|||
user_id: user.id, |
|||
phrase: phrase, |
|||
context: context, |
|||
hide: Map.get(params, "irreversible", false), |
|||
whole_word: Map.get(params, "boolean", true) |
|||
# expires_at |
|||
} |
|||
|
|||
{:ok, response} = Filter.create(query) |
|||
|
|||
render(conn, "filter.json", filter: response) |
|||
end |
|||
|
|||
@doc "GET /api/v1/filters/:id" |
|||
def show(%{assigns: %{user: user}} = conn, %{"id" => filter_id}) do |
|||
filter = Filter.get(filter_id, user) |
|||
|
|||
render(conn, "filter.json", filter: filter) |
|||
end |
|||
|
|||
@doc "PUT /api/v1/filters/:id" |
|||
def update( |
|||
%{assigns: %{user: user}} = conn, |
|||
%{"phrase" => phrase, "context" => context, "id" => filter_id} = params |
|||
) do |
|||
query = %Filter{ |
|||
user_id: user.id, |
|||
filter_id: filter_id, |
|||
phrase: phrase, |
|||
context: context, |
|||
hide: Map.get(params, "irreversible", nil), |
|||
whole_word: Map.get(params, "boolean", true) |
|||
# expires_at |
|||
} |
|||
|
|||
{:ok, response} = Filter.update(query) |
|||
render(conn, "filter.json", filter: response) |
|||
end |
|||
|
|||
@doc "DELETE /api/v1/filters/:id" |
|||
def delete(%{assigns: %{user: user}} = conn, %{"id" => filter_id}) do |
|||
query = %Filter{ |
|||
user_id: user.id, |
|||
filter_id: filter_id |
|||
} |
|||
|
|||
{:ok, _} = Filter.delete(query) |
|||
json(conn, %{}) |
|||
end |
|||
end |
@ -0,0 +1,49 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Web.MastodonAPI.FollowRequestController do |
|||
use Pleroma.Web, :controller |
|||
|
|||
alias Pleroma.User |
|||
alias Pleroma.Web.CommonAPI |
|||
|
|||
plug(:put_view, Pleroma.Web.MastodonAPI.AccountView) |
|||
plug(:assign_follower when action != :index) |
|||
|
|||
action_fallback(:errors) |
|||
|
|||
@doc "GET /api/v1/follow_requests" |
|||
def index(%{assigns: %{user: followed}} = conn, _params) do |
|||
follow_requests = User.get_follow_requests(followed) |
|||
|
|||
render(conn, "accounts.json", for: followed, users: follow_requests, as: :user) |
|||
end |
|||
|
|||
@doc "POST /api/v1/follow_requests/:id/authorize" |
|||
def authorize(%{assigns: %{user: followed, follower: follower}} = conn, _params) do |
|||
with {:ok, follower} <- CommonAPI.accept_follow_request(follower, followed) do |
|||
render(conn, "relationship.json", user: followed, target: follower) |
|||
end |
|||
end |
|||
|
|||
@doc "POST /api/v1/follow_requests/:id/reject" |
|||
def reject(%{assigns: %{user: followed, follower: follower}} = conn, _params) do |
|||
with {:ok, follower} <- CommonAPI.reject_follow_request(follower, followed) do |
|||
render(conn, "relationship.json", user: followed, target: follower) |
|||
end |
|||
end |
|||
|
|||
defp assign_follower(%{params: %{"id" => id}} = conn, _) do |
|||
case User.get_cached_by_id(id) do |
|||
%User{} = follower -> assign(conn, :follower, follower) |
|||
nil -> Pleroma.Web.MastodonAPI.FallbackController.call(conn, {:error, :not_found}) |> halt() |
|||
end |
|||
end |
|||
|
|||
defp errors(conn, {:error, message}) do |
|||
conn |
|||
|> put_status(:forbidden) |
|||
|> json(%{error: message}) |
|||
end |
|||
end |
@ -0,0 +1,51 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Web.MastodonAPI.ScheduledActivityController do |
|||
use Pleroma.Web, :controller |
|||
|
|||
import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] |
|||
|
|||
alias Pleroma.ScheduledActivity |
|||
alias Pleroma.Web.MastodonAPI.MastodonAPI |
|||
|
|||
plug(:assign_scheduled_activity when action != :index) |
|||
|
|||
action_fallback(Pleroma.Web.MastodonAPI.FallbackController) |
|||
|
|||
@doc "GET /api/v1/scheduled_statuses" |
|||
def index(%{assigns: %{user: user}} = conn, params) do |
|||
with scheduled_activities <- MastodonAPI.get_scheduled_activities(user, params) do |
|||
conn |
|||
|> add_link_headers(scheduled_activities) |
|||
|> render("index.json", scheduled_activities: scheduled_activities) |
|||
end |
|||
end |
|||
|
|||
@doc "GET /api/v1/scheduled_statuses/:id" |
|||
def show(%{assigns: %{scheduled_activity: scheduled_activity}} = conn, _params) do |
|||
render(conn, "show.json", scheduled_activity: scheduled_activity) |
|||
end |
|||
|
|||
@doc "PUT /api/v1/scheduled_statuses/:id" |
|||
def update(%{assigns: %{scheduled_activity: scheduled_activity}} = conn, params) do |
|||
with {:ok, scheduled_activity} <- ScheduledActivity.update(scheduled_activity, params) do |
|||
render(conn, "show.json", scheduled_activity: scheduled_activity) |
|||
end |
|||
end |
|||
|
|||
@doc "DELETE /api/v1/scheduled_statuses/:id" |
|||
def delete(%{assigns: %{scheduled_activity: scheduled_activity}} = conn, _params) do |
|||
with {:ok, scheduled_activity} <- ScheduledActivity.delete(scheduled_activity) do |
|||
render(conn, "show.json", scheduled_activity: scheduled_activity) |
|||
end |
|||
end |
|||
|
|||
defp assign_scheduled_activity(%{assigns: %{user: user}, params: %{"id" => id}} = conn, _) do |
|||
case ScheduledActivity.get(user, id) do |
|||
%ScheduledActivity{} = activity -> assign(conn, :scheduled_activity, activity) |
|||
nil -> Pleroma.Web.MastodonAPI.FallbackController.call(conn, {:error, :not_found}) |> halt() |
|||
end |
|||
end |
|||
end |
@ -0,0 +1,72 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Plugs.RemoteIpTest do |
|||
use ExUnit.Case, async: true |
|||
use Plug.Test |
|||
|
|||
alias Pleroma.Plugs.RemoteIp |
|||
|
|||
test "disabled" do |
|||
Pleroma.Config.put(RemoteIp, enabled: false) |
|||
|
|||
%{remote_ip: remote_ip} = conn(:get, "/") |
|||
|
|||
conn = |
|||
conn(:get, "/") |
|||
|> put_req_header("x-forwarded-for", "1.1.1.1") |
|||
|> RemoteIp.call(nil) |
|||
|
|||
assert conn.remote_ip == remote_ip |
|||
end |
|||
|
|||
test "enabled" do |
|||
Pleroma.Config.put(RemoteIp, enabled: true) |
|||
|
|||
conn = |
|||
conn(:get, "/") |
|||
|> put_req_header("x-forwarded-for", "1.1.1.1") |
|||
|> RemoteIp.call(nil) |
|||
|
|||
assert conn.remote_ip == {1, 1, 1, 1} |
|||
end |
|||
|
|||
test "custom headers" do |
|||
Pleroma.Config.put(RemoteIp, enabled: true, headers: ["cf-connecting-ip"]) |
|||
|
|||
conn = |
|||
conn(:get, "/") |
|||
|> put_req_header("x-forwarded-for", "1.1.1.1") |
|||
|> RemoteIp.call(nil) |
|||
|
|||
refute conn.remote_ip == {1, 1, 1, 1} |
|||
|
|||
conn = |
|||
conn(:get, "/") |
|||
|> put_req_header("cf-connecting-ip", "1.1.1.1") |
|||
|> RemoteIp.call(nil) |
|||
|
|||
assert conn.remote_ip == {1, 1, 1, 1} |
|||
end |
|||
|
|||
test "custom proxies" do |
|||
Pleroma.Config.put(RemoteIp, enabled: true) |
|||
|
|||
conn = |
|||
conn(:get, "/") |
|||
|> put_req_header("x-forwarded-for", "173.245.48.1, 1.1.1.1, 173.245.48.2") |
|||
|> RemoteIp.call(nil) |
|||
|
|||
refute conn.remote_ip == {1, 1, 1, 1} |
|||
|
|||
Pleroma.Config.put([RemoteIp, :proxies], ["173.245.48.0/20"]) |
|||
|
|||
conn = |
|||
conn(:get, "/") |
|||
|> put_req_header("x-forwarded-for", "173.245.48.1, 1.1.1.1, 173.245.48.2") |
|||
|> RemoteIp.call(nil) |
|||
|
|||
assert conn.remote_ip == {1, 1, 1, 1} |
|||
end |
|||
end |
@ -0,0 +1,51 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Web.MastodonAPI.DomainBlockControllerTest do |
|||
use Pleroma.Web.ConnCase, async: true |
|||
|
|||
alias Pleroma.User |
|||
|
|||
import Pleroma.Factory |
|||
|
|||
test "blocking / unblocking a domain", %{conn: conn} do |
|||
user = insert(:user) |
|||
other_user = insert(:user, %{ap_id: "https://dogwhistle.zone/@pundit"}) |
|||
|
|||
conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> post("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) |
|||
|
|||
assert %{} = json_response(conn, 200) |
|||
user = User.get_cached_by_ap_id(user.ap_id) |
|||
assert User.blocks?(user, other_user) |
|||
|
|||
conn = |
|||
build_conn() |
|||
|> assign(:user, user) |
|||
|> delete("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) |
|||
|
|||
assert %{} = json_response(conn, 200) |
|||
user = User.get_cached_by_ap_id(user.ap_id) |
|||
refute User.blocks?(user, other_user) |
|||
end |
|||
|
|||
test "getting a list of domain blocks", %{conn: conn} do |
|||
user = insert(:user) |
|||
|
|||
{:ok, user} = User.block_domain(user, "bad.site") |
|||
{:ok, user} = User.block_domain(user, "even.worse.site") |
|||
|
|||
conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> get("/api/v1/domain_blocks") |
|||
|
|||
domain_blocks = json_response(conn, 200) |
|||
|
|||
assert "bad.site" in domain_blocks |
|||
assert "even.worse.site" in domain_blocks |
|||
end |
|||
end |
@ -0,0 +1,137 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Web.MastodonAPI.FilterControllerTest do |
|||
use Pleroma.Web.ConnCase, async: true |
|||
|
|||
alias Pleroma.Web.MastodonAPI.FilterView |
|||
|
|||
import Pleroma.Factory |
|||
|
|||
test "creating a filter", %{conn: conn} do |
|||
user = insert(:user) |
|||
|
|||
filter = %Pleroma.Filter{ |
|||
phrase: "knights", |
|||
context: ["home"] |
|||
} |
|||
|
|||
conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> post("/api/v1/filters", %{"phrase" => filter.phrase, context: filter.context}) |
|||
|
|||
assert response = json_response(conn, 200) |
|||
assert response["phrase"] == filter.phrase |
|||
assert response["context"] == filter.context |
|||
assert response["irreversible"] == false |
|||
assert response["id"] != nil |
|||
assert response["id"] != "" |
|||
end |
|||
|
|||
test "fetching a list of filters", %{conn: conn} do |
|||
user = insert(:user) |
|||
|
|||
query_one = %Pleroma.Filter{ |
|||
user_id: user.id, |
|||
filter_id: 1, |
|||
phrase: "knights", |
|||
context: ["home"] |
|||
} |
|||
|
|||
query_two = %Pleroma.Filter{ |
|||
user_id: user.id, |
|||
filter_id: 2, |
|||
phrase: "who", |
|||
context: ["home"] |
|||
} |
|||
|
|||
{:ok, filter_one} = Pleroma.Filter.create(query_one) |
|||
{:ok, filter_two} = Pleroma.Filter.create(query_two) |
|||
|
|||
response = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> get("/api/v1/filters") |
|||
|> json_response(200) |
|||
|
|||
assert response == |
|||
render_json( |
|||
FilterView, |
|||
"filters.json", |
|||
filters: [filter_two, filter_one] |
|||
) |
|||
end |
|||
|
|||
test "get a filter", %{conn: conn} do |
|||
user = insert(:user) |
|||
|
|||
query = %Pleroma.Filter{ |
|||
user_id: user.id, |
|||
filter_id: 2, |
|||
phrase: "knight", |
|||
context: ["home"] |
|||
} |
|||
|
|||
{:ok, filter} = Pleroma.Filter.create(query) |
|||
|
|||
conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> get("/api/v1/filters/#{filter.filter_id}") |
|||
|
|||
assert _response = json_response(conn, 200) |
|||
end |
|||
|
|||
test "update a filter", %{conn: conn} do |
|||
user = insert(:user) |
|||
|
|||
query = %Pleroma.Filter{ |
|||
user_id: user.id, |
|||
filter_id: 2, |
|||
phrase: "knight", |
|||
context: ["home"] |
|||
} |
|||
|
|||
{:ok, _filter} = Pleroma.Filter.create(query) |
|||
|
|||
new = %Pleroma.Filter{ |
|||
phrase: "nii", |
|||
context: ["home"] |
|||
} |
|||
|
|||
conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> put("/api/v1/filters/#{query.filter_id}", %{ |
|||
phrase: new.phrase, |
|||
context: new.context |
|||
}) |
|||
|
|||
assert response = json_response(conn, 200) |
|||
assert response["phrase"] == new.phrase |
|||
assert response["context"] == new.context |
|||
end |
|||
|
|||
test "delete a filter", %{conn: conn} do |
|||
user = insert(:user) |
|||
|
|||
query = %Pleroma.Filter{ |
|||
user_id: user.id, |
|||
filter_id: 2, |
|||
phrase: "knight", |
|||
context: ["home"] |
|||
} |
|||
|
|||
{:ok, filter} = Pleroma.Filter.create(query) |
|||
|
|||
conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> delete("/api/v1/filters/#{filter.filter_id}") |
|||
|
|||
assert response = json_response(conn, 200) |
|||
assert response == %{} |
|||
end |
|||
end |
@ -0,0 +1,81 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do |
|||
use Pleroma.Web.ConnCase |
|||
|
|||
alias Pleroma.User |
|||
alias Pleroma.Web.ActivityPub.ActivityPub |
|||
|
|||
import Pleroma.Factory |
|||
|
|||
describe "locked accounts" do |
|||
test "/api/v1/follow_requests works" do |
|||
user = insert(:user, %{info: %User.Info{locked: true}}) |
|||
other_user = insert(:user) |
|||
|
|||
{:ok, _activity} = ActivityPub.follow(other_user, user) |
|||
|
|||
user = User.get_cached_by_id(user.id) |
|||
other_user = User.get_cached_by_id(other_user.id) |
|||
|
|||
assert User.following?(other_user, user) == false |
|||
|
|||
conn = |
|||
build_conn() |
|||
|> assign(:user, user) |
|||
|> get("/api/v1/follow_requests") |
|||
|
|||
assert [relationship] = json_response(conn, 200) |
|||
assert to_string(other_user.id) == relationship["id"] |
|||
end |
|||
|
|||
test "/api/v1/follow_requests/:id/authorize works" do |
|||
user = insert(:user, %{info: %User.Info{locked: true}}) |
|||
other_user = insert(:user) |
|||
|
|||
{:ok, _activity} = ActivityPub.follow(other_user, user) |
|||
|
|||
user = User.get_cached_by_id(user.id) |
|||
other_user = User.get_cached_by_id(other_user.id) |
|||
|
|||
assert User.following?(other_user, user) == false |
|||
|
|||
conn = |
|||
build_conn() |
|||
|> assign(:user, user) |
|||
|> post("/api/v1/follow_requests/#{other_user.id}/authorize") |
|||
|
|||
assert relationship = json_response(conn, 200) |
|||
assert to_string(other_user.id) == relationship["id"] |
|||
|
|||
user = User.get_cached_by_id(user.id) |
|||
other_user = User.get_cached_by_id(other_user.id) |
|||
|
|||
assert User.following?(other_user, user) == true |
|||
end |
|||
|
|||
test "/api/v1/follow_requests/:id/reject works" do |
|||
user = insert(:user, %{info: %User.Info{locked: true}}) |
|||
other_user = insert(:user) |
|||
|
|||
{:ok, _activity} = ActivityPub.follow(other_user, user) |
|||
|
|||
user = User.get_cached_by_id(user.id) |
|||
|
|||
conn = |
|||
build_conn() |
|||
|> assign(:user, user) |
|||
|> post("/api/v1/follow_requests/#{other_user.id}/reject") |
|||
|
|||
assert relationship = json_response(conn, 200) |
|||
assert to_string(other_user.id) == relationship["id"] |
|||
|
|||
user = User.get_cached_by_id(user.id) |
|||
other_user = User.get_cached_by_id(other_user.id) |
|||
|
|||
assert User.following?(other_user, user) == false |
|||
end |
|||
end |
|||
end |
@ -0,0 +1,113 @@ |
|||
# Pleroma: A lightweight social networking server |
|||
# Copyright ยฉ 2017-2019 Pleroma Authors <https://pleroma.social/> |
|||
# SPDX-License-Identifier: AGPL-3.0-only |
|||
|
|||
defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do |
|||
use Pleroma.Web.ConnCase, async: true |
|||
|
|||
alias Pleroma.Repo |
|||
alias Pleroma.ScheduledActivity |
|||
|
|||
import Pleroma.Factory |
|||
|
|||
test "shows scheduled activities", %{conn: conn} do |
|||
user = insert(:user) |
|||
scheduled_activity_id1 = insert(:scheduled_activity, user: user).id |> to_string() |
|||
scheduled_activity_id2 = insert(:scheduled_activity, user: user).id |> to_string() |
|||
scheduled_activity_id3 = insert(:scheduled_activity, user: user).id |> to_string() |
|||
scheduled_activity_id4 = insert(:scheduled_activity, user: user).id |> to_string() |
|||
|
|||
conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|
|||
# min_id |
|||
conn_res = |
|||
conn |
|||
|> get("/api/v1/scheduled_statuses?limit=2&min_id=#{scheduled_activity_id1}") |
|||
|
|||
result = json_response(conn_res, 200) |
|||
assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result |
|||
|
|||
# since_id |
|||
conn_res = |
|||
conn |
|||
|> get("/api/v1/scheduled_statuses?limit=2&since_id=#{scheduled_activity_id1}") |
|||
|
|||
result = json_response(conn_res, 200) |
|||
assert [%{"id" => ^scheduled_activity_id4}, %{"id" => ^scheduled_activity_id3}] = result |
|||
|
|||
# max_id |
|||
conn_res = |
|||
conn |
|||
|> get("/api/v1/scheduled_statuses?limit=2&max_id=#{scheduled_activity_id4}") |
|||
|
|||
result = json_response(conn_res, 200) |
|||
assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result |
|||
end |
|||
|
|||
test "shows a scheduled activity", %{conn: conn} do |
|||
user = insert(:user) |
|||
scheduled_activity = insert(:scheduled_activity, user: user) |
|||
|
|||
res_conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> get("/api/v1/scheduled_statuses/#{scheduled_activity.id}") |
|||
|
|||
assert %{"id" => scheduled_activity_id} = json_response(res_conn, 200) |
|||
assert scheduled_activity_id == scheduled_activity.id |> to_string() |
|||
|
|||
res_conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> get("/api/v1/scheduled_statuses/404") |
|||
|
|||
assert %{"error" => "Record not found"} = json_response(res_conn, 404) |
|||
end |
|||
|
|||
test "updates a scheduled activity", %{conn: conn} do |
|||
user = insert(:user) |
|||
scheduled_activity = insert(:scheduled_activity, user: user) |
|||
|
|||
new_scheduled_at = |
|||
NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond) |
|||
|
|||
res_conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> put("/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{ |
|||
scheduled_at: new_scheduled_at |
|||
}) |
|||
|
|||
assert %{"scheduled_at" => expected_scheduled_at} = json_response(res_conn, 200) |
|||
assert expected_scheduled_at == Pleroma.Web.CommonAPI.Utils.to_masto_date(new_scheduled_at) |
|||
|
|||
res_conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> put("/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at}) |
|||
|
|||
assert %{"error" => "Record not found"} = json_response(res_conn, 404) |
|||
end |
|||
|
|||
test "deletes a scheduled activity", %{conn: conn} do |
|||
user = insert(:user) |
|||
scheduled_activity = insert(:scheduled_activity, user: user) |
|||
|
|||
res_conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}") |
|||
|
|||
assert %{} = json_response(res_conn, 200) |
|||
assert nil == Repo.get(ScheduledActivity, scheduled_activity.id) |
|||
|
|||
res_conn = |
|||
conn |
|||
|> assign(:user, user) |
|||
|> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}") |
|||
|
|||
assert %{"error" => "Record not found"} = json_response(res_conn, 404) |
|||
end |
|||
end |