total rebase
[anni] / test / pleroma / web / mastodon_api / controllers / scheduled_activity_controller_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do
6   use Pleroma.Web.ConnCase, async: true
7
8   alias Pleroma.Repo
9   alias Pleroma.ScheduledActivity
10   alias Pleroma.UnstubbedConfigMock, as: ConfigMock
11
12   import Ecto.Query
13   import Mox
14   import Pleroma.Factory
15
16   setup do
17     ConfigMock
18     |> stub(:get, fn
19       [ScheduledActivity, :enabled] -> true
20       path -> Pleroma.Test.StaticConfig.get(path)
21     end)
22
23     :ok
24   end
25
26   test "shows scheduled activities" do
27     %{user: user, conn: conn} = oauth_access(["read:statuses"])
28
29     scheduled_activity_id1 = insert(:scheduled_activity, user: user).id |> to_string()
30     scheduled_activity_id2 = insert(:scheduled_activity, user: user).id |> to_string()
31     scheduled_activity_id3 = insert(:scheduled_activity, user: user).id |> to_string()
32     scheduled_activity_id4 = insert(:scheduled_activity, user: user).id |> to_string()
33
34     # min_id
35     conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&min_id=#{scheduled_activity_id1}")
36
37     result = json_response_and_validate_schema(conn_res, 200)
38     assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result
39
40     # since_id
41     conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&since_id=#{scheduled_activity_id1}")
42
43     result = json_response_and_validate_schema(conn_res, 200)
44     assert [%{"id" => ^scheduled_activity_id4}, %{"id" => ^scheduled_activity_id3}] = result
45
46     # max_id
47     conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&max_id=#{scheduled_activity_id4}")
48
49     result = json_response_and_validate_schema(conn_res, 200)
50     assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result
51   end
52
53   test "shows a scheduled activity" do
54     %{user: user, conn: conn} = oauth_access(["read:statuses"])
55     scheduled_activity = insert(:scheduled_activity, user: user)
56
57     res_conn = get(conn, "/api/v1/scheduled_statuses/#{scheduled_activity.id}")
58
59     assert %{"id" => scheduled_activity_id} = json_response_and_validate_schema(res_conn, 200)
60     assert scheduled_activity_id == scheduled_activity.id |> to_string()
61
62     res_conn = get(conn, "/api/v1/scheduled_statuses/404")
63
64     assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404)
65   end
66
67   test "updates a scheduled activity" do
68     %{user: user, conn: conn} = oauth_access(["write:statuses"])
69
70     scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 60)
71
72     {:ok, scheduled_activity} =
73       ScheduledActivity.create(
74         user,
75         %{
76           scheduled_at: scheduled_at,
77           params: build(:note).data
78         }
79       )
80
81     job = Repo.one(from(j in Oban.Job, where: j.queue == "scheduled_activities"))
82
83     assert job.args == %{"activity_id" => scheduled_activity.id}
84     assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(scheduled_at)
85
86     new_scheduled_at =
87       NaiveDateTime.utc_now()
88       |> Timex.shift(minutes: 120)
89       |> Timex.format!("%Y-%m-%dT%H:%M:%S.%fZ", :strftime)
90
91     res_conn =
92       conn
93       |> put_req_header("content-type", "application/json")
94       |> put("/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{
95         scheduled_at: new_scheduled_at
96       })
97
98     assert %{"scheduled_at" => expected_scheduled_at} =
99              json_response_and_validate_schema(res_conn, 200)
100
101     assert expected_scheduled_at == Pleroma.Web.CommonAPI.Utils.to_masto_date(new_scheduled_at)
102     job = refresh_record(job)
103
104     assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(new_scheduled_at)
105
106     res_conn =
107       conn
108       |> put_req_header("content-type", "application/json")
109       |> put("/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at})
110
111     assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404)
112   end
113
114   test "deletes a scheduled activity" do
115     %{user: user, conn: conn} = oauth_access(["write:statuses"])
116     scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 60)
117
118     {:ok, scheduled_activity} =
119       ScheduledActivity.create(
120         user,
121         %{
122           scheduled_at: scheduled_at,
123           params: build(:note).data
124         }
125       )
126
127     job = Repo.one(from(j in Oban.Job, where: j.queue == "scheduled_activities"))
128
129     assert job.args == %{"activity_id" => scheduled_activity.id}
130
131     res_conn =
132       conn
133       |> assign(:user, user)
134       |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}")
135
136     assert %{} = json_response_and_validate_schema(res_conn, 200)
137     refute Repo.get(ScheduledActivity, scheduled_activity.id)
138     refute Repo.get(Oban.Job, job.id)
139
140     res_conn =
141       conn
142       |> assign(:user, user)
143       |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}")
144
145     assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404)
146   end
147 end