aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/activity/ir/topics_test.exs141
-rw-r--r--test/activity_test.exs51
-rw-r--r--test/conversation_test.exs2
-rw-r--r--test/daemons/activity_expiration_daemon_test.exs (renamed from test/activity_expiration_worker_test.exs)2
-rw-r--r--test/daemons/digest_email_daemon_test.exs (renamed from test/web/digest_email_worker_test.exs)10
-rw-r--r--test/daemons/scheduled_activity_daemon_test.exs (renamed from test/scheduled_activity_worker_test.exs)4
-rw-r--r--test/fixtures/tesla_mock/misskey_poll_no_end_date.json1
-rw-r--r--test/fixtures/tesla_mock/sjw.json1
-rw-r--r--test/integration/mastodon_websocket_test.exs45
-rw-r--r--test/notification_test.exs103
-rw-r--r--test/object_test.exs3
-rw-r--r--test/plugs/cache_test.exs186
-rw-r--r--test/support/conn_case.ex4
-rw-r--r--test/support/data_case.ex4
-rw-r--r--test/support/http_request_mock.ex12
-rw-r--r--test/support/oban_helpers.ex42
-rw-r--r--test/tasks/digest_test.exs3
-rw-r--r--test/user_test.exs164
-rw-r--r--test/web/activity_pub/activity_pub_controller_test.exs196
-rw-r--r--test/web/activity_pub/activity_pub_test.exs8
-rw-r--r--test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs6
-rw-r--r--test/web/activity_pub/publisher_test.exs94
-rw-r--r--test/web/activity_pub/relay_test.exs17
-rw-r--r--test/web/activity_pub/transmogrifier_test.exs6
-rw-r--r--test/web/admin_api/admin_api_controller_test.exs16
-rw-r--r--test/web/admin_api/config_test.exs24
-rw-r--r--test/web/federator_test.exs102
-rw-r--r--test/web/instances/instance_test.exs3
-rw-r--r--test/web/mastodon_api/mastodon_api_controller_test.exs180
-rw-r--r--test/web/mastodon_api/mastodon_api_test.exs7
-rw-r--r--test/web/mastodon_api/views/status_view_test.exs8
-rw-r--r--test/web/retry_queue_test.exs48
-rw-r--r--test/web/salmon/salmon_test.exs2
-rw-r--r--test/web/streamer/ping_test.exs36
-rw-r--r--test/web/streamer/state_test.exs54
-rw-r--r--test/web/streamer/streamer_test.exs (renamed from test/web/streamer_test.exs)105
-rw-r--r--test/web/twitter_api/representers/object_representer_test.exs60
-rw-r--r--test/web/twitter_api/twitter_api_controller_test.exs2150
-rw-r--r--test/web/twitter_api/twitter_api_test.exs307
-rw-r--r--test/web/twitter_api/util_controller_test.exs163
-rw-r--r--test/web/twitter_api/views/activity_view_test.exs384
-rw-r--r--test/web/twitter_api/views/notification_view_test.exs112
-rw-r--r--test/web/twitter_api/views/user_view_test.exs323
-rw-r--r--test/web/web_finger/web_finger_controller_test.exs13
-rw-r--r--test/web/websub/websub_test.exs4
45 files changed, 1491 insertions, 3715 deletions
diff --git a/test/activity/ir/topics_test.exs b/test/activity/ir/topics_test.exs
new file mode 100644
index 000000000..e75f83586
--- /dev/null
+++ b/test/activity/ir/topics_test.exs
@@ -0,0 +1,141 @@
+defmodule Pleroma.Activity.Ir.TopicsTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Activity
+ alias Pleroma.Activity.Ir.Topics
+ alias Pleroma.Object
+
+ require Pleroma.Constants
+
+ describe "poll answer" do
+ test "produce no topics" do
+ activity = %Activity{object: %Object{data: %{"type" => "Answer"}}}
+
+ assert [] == Topics.get_activity_topics(activity)
+ end
+ end
+
+ describe "non poll answer" do
+ test "always add user and list topics" do
+ activity = %Activity{object: %Object{data: %{"type" => "FooBar"}}}
+ topics = Topics.get_activity_topics(activity)
+
+ assert Enum.member?(topics, "user")
+ assert Enum.member?(topics, "list")
+ end
+ end
+
+ describe "public visibility" do
+ setup do
+ activity = %Activity{
+ object: %Object{data: %{"type" => "Note"}},
+ data: %{"to" => [Pleroma.Constants.as_public()]}
+ }
+
+ {:ok, activity: activity}
+ end
+
+ test "produces public topic", %{activity: activity} do
+ topics = Topics.get_activity_topics(activity)
+
+ assert Enum.member?(topics, "public")
+ end
+
+ test "local action produces public:local topic", %{activity: activity} do
+ activity = %{activity | local: true}
+ topics = Topics.get_activity_topics(activity)
+
+ assert Enum.member?(topics, "public:local")
+ end
+
+ test "non-local action does not produce public:local topic", %{activity: activity} do
+ activity = %{activity | local: false}
+ topics = Topics.get_activity_topics(activity)
+
+ refute Enum.member?(topics, "public:local")
+ end
+ end
+
+ describe "public visibility create events" do
+ setup do
+ activity = %Activity{
+ object: %Object{data: %{"type" => "Create", "attachment" => []}},
+ data: %{"to" => [Pleroma.Constants.as_public()]}
+ }
+
+ {:ok, activity: activity}
+ end
+
+ test "with no attachments doesn't produce public:media topics", %{activity: activity} do
+ topics = Topics.get_activity_topics(activity)
+
+ refute Enum.member?(topics, "public:media")
+ refute Enum.member?(topics, "public:local:media")
+ end
+
+ test "converts tags to hash tags", %{activity: %{object: %{data: data} = object} = activity} do
+ tagged_data = Map.put(data, "tag", ["foo", "bar"])
+ activity = %{activity | object: %{object | data: tagged_data}}
+
+ topics = Topics.get_activity_topics(activity)
+
+ assert Enum.member?(topics, "hashtag:foo")
+ assert Enum.member?(topics, "hashtag:bar")
+ end
+
+ test "only converts strinngs to hash tags", %{
+ activity: %{object: %{data: data} = object} = activity
+ } do
+ tagged_data = Map.put(data, "tag", [2])
+ activity = %{activity | object: %{object | data: tagged_data}}
+
+ topics = Topics.get_activity_topics(activity)
+
+ refute Enum.member?(topics, "hashtag:2")
+ end
+ end
+
+ describe "public visibility create events with attachments" do
+ setup do
+ activity = %Activity{
+ object: %Object{data: %{"type" => "Create", "attachment" => ["foo"]}},
+ data: %{"to" => [Pleroma.Constants.as_public()]}
+ }
+
+ {:ok, activity: activity}
+ end
+
+ test "produce public:media topics", %{activity: activity} do
+ topics = Topics.get_activity_topics(activity)
+
+ assert Enum.member?(topics, "public:media")
+ end
+
+ test "local produces public:local:media topics", %{activity: activity} do
+ topics = Topics.get_activity_topics(activity)
+
+ assert Enum.member?(topics, "public:local:media")
+ end
+
+ test "non-local doesn't produce public:local:media topics", %{activity: activity} do
+ activity = %{activity | local: false}
+
+ topics = Topics.get_activity_topics(activity)
+
+ refute Enum.member?(topics, "public:local:media")
+ end
+ end
+
+ describe "non-public visibility" do
+ test "produces direct topic" do
+ activity = %Activity{object: %Object{data: %{"type" => "Note"}}, data: %{"to" => []}}
+ topics = Topics.get_activity_topics(activity)
+
+ assert Enum.member?(topics, "direct")
+ refute Enum.member?(topics, "public")
+ refute Enum.member?(topics, "public:local")
+ refute Enum.member?(topics, "public:media")
+ refute Enum.member?(topics, "public:local:media")
+ end
+ end
+end
diff --git a/test/activity_test.exs b/test/activity_test.exs
index 785c4b3cf..6512d84ac 100644
--- a/test/activity_test.exs
+++ b/test/activity_test.exs
@@ -7,6 +7,7 @@ defmodule Pleroma.ActivityTest do
alias Pleroma.Activity
alias Pleroma.Bookmark
alias Pleroma.Object
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.ThreadMute
import Pleroma.Factory
@@ -125,7 +126,8 @@ defmodule Pleroma.ActivityTest do
}
{:ok, local_activity} = Pleroma.Web.CommonAPI.post(user, %{"status" => "find me!"})
- {:ok, remote_activity} = Pleroma.Web.Federator.incoming_ap_doc(params)
+ {:ok, job} = Pleroma.Web.Federator.incoming_ap_doc(params)
+ {:ok, remote_activity} = ObanHelpers.perform(job)
%{local_activity: local_activity, remote_activity: remote_activity, user: user}
end
@@ -173,4 +175,51 @@ defmodule Pleroma.ActivityTest do
|> where([a], a.activity_id == ^activity.id)
|> Repo.one!()
end
+
+ test "all_by_ids_with_object/1" do
+ %{id: id1} = insert(:note_activity)
+ %{id: id2} = insert(:note_activity)
+
+ activities =
+ [id1, id2]
+ |> Activity.all_by_ids_with_object()
+ |> Enum.sort(&(&1.id < &2.id))
+
+ assert [%{id: ^id1, object: %Object{}}, %{id: ^id2, object: %Object{}}] = activities
+ end
+
+ test "get_by_id_with_object/1" do
+ %{id: id} = insert(:note_activity)
+
+ assert %Activity{id: ^id, object: %Object{}} = Activity.get_by_id_with_object(id)
+ end
+
+ test "get_by_ap_id_with_object/1" do
+ %{data: %{"id" => ap_id}} = insert(:note_activity)
+
+ assert %Activity{data: %{"id" => ^ap_id}, object: %Object{}} =
+ Activity.get_by_ap_id_with_object(ap_id)
+ end
+
+ test "get_by_id/1" do
+ %{id: id} = insert(:note_activity)
+
+ assert %Activity{id: ^id} = Activity.get_by_id(id)
+ end
+
+ test "all_by_actor_and_id/2" do
+ user = insert(:user)
+
+ {:ok, %{id: id1}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"})
+ {:ok, %{id: id2}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofefe"})
+
+ assert [] == Activity.all_by_actor_and_id(user, [])
+
+ activities =
+ user.ap_id
+ |> Activity.all_by_actor_and_id([id1, id2])
+ |> Enum.sort(&(&1.id < &2.id))
+
+ assert [%Activity{id: ^id1}, %Activity{id: ^id2}] = activities
+ end
end
diff --git a/test/conversation_test.exs b/test/conversation_test.exs
index 4e36494f8..693427d80 100644
--- a/test/conversation_test.exs
+++ b/test/conversation_test.exs
@@ -22,6 +22,8 @@ defmodule Pleroma.ConversationTest do
{:ok, _activity} =
CommonAPI.post(user, %{"visibility" => "direct", "status" => "hey @#{other_user.nickname}"})
+ Pleroma.Tests.ObanHelpers.perform_all()
+
Repo.delete_all(Conversation)
Repo.delete_all(Conversation.Participation)
diff --git a/test/activity_expiration_worker_test.exs b/test/daemons/activity_expiration_daemon_test.exs
index 939d912f1..31f4a70a6 100644
--- a/test/activity_expiration_worker_test.exs
+++ b/test/daemons/activity_expiration_daemon_test.exs
@@ -10,7 +10,7 @@ defmodule Pleroma.ActivityExpirationWorkerTest do
test "deletes an activity" do
activity = insert(:note_activity)
expiration = insert(:expiration_in_the_past, %{activity_id: activity.id})
- Pleroma.ActivityExpirationWorker.perform(:execute, expiration.id)
+ Pleroma.Daemons.ActivityExpirationDaemon.perform(:execute, expiration.id)
refute Repo.get(Activity, activity.id)
end
diff --git a/test/web/digest_email_worker_test.exs b/test/daemons/digest_email_daemon_test.exs
index 15002330f..3168f3b9a 100644
--- a/test/web/digest_email_worker_test.exs
+++ b/test/daemons/digest_email_daemon_test.exs
@@ -2,11 +2,12 @@
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.DigestEmailWorkerTest do
+defmodule Pleroma.DigestEmailDaemonTest do
use Pleroma.DataCase
import Pleroma.Factory
- alias Pleroma.DigestEmailWorker
+ alias Pleroma.Daemons.DigestEmailDaemon
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.CommonAPI
@@ -22,7 +23,10 @@ defmodule Pleroma.DigestEmailWorkerTest do
User.switch_email_notifications(user2, "digest", true)
CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}!"})
- DigestEmailWorker.perform()
+ DigestEmailDaemon.perform()
+ ObanHelpers.perform_all()
+ # Performing job(s) enqueued at previous step
+ ObanHelpers.perform_all()
assert_received {:email, email}
assert email.to == [{user2.name, user2.email}]
diff --git a/test/scheduled_activity_worker_test.exs b/test/daemons/scheduled_activity_daemon_test.exs
index e3ad1244e..32820b2b7 100644
--- a/test/scheduled_activity_worker_test.exs
+++ b/test/daemons/scheduled_activity_daemon_test.exs
@@ -2,7 +2,7 @@
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.ScheduledActivityWorkerTest do
+defmodule Pleroma.ScheduledActivityDaemonTest do
use Pleroma.DataCase
alias Pleroma.ScheduledActivity
import Pleroma.Factory
@@ -10,7 +10,7 @@ defmodule Pleroma.ScheduledActivityWorkerTest do
test "creates a status from the scheduled activity" do
user = insert(:user)
scheduled_activity = insert(:scheduled_activity, user: user, params: %{status: "hi"})
- Pleroma.ScheduledActivityWorker.perform(:execute, scheduled_activity.id)
+ Pleroma.Daemons.ScheduledActivityDaemon.perform(:execute, scheduled_activity.id)
refute Repo.get(ScheduledActivity, scheduled_activity.id)
activity = Repo.all(Pleroma.Activity) |> Enum.find(&(&1.actor == user.ap_id))
diff --git a/test/fixtures/tesla_mock/misskey_poll_no_end_date.json b/test/fixtures/tesla_mock/misskey_poll_no_end_date.json
new file mode 100644
index 000000000..0e08de4de
--- /dev/null
+++ b/test/fixtures/tesla_mock/misskey_poll_no_end_date.json
@@ -0,0 +1 @@
+{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"Hashtag":"as:Hashtag"}],"id":"https://skippers-bin.com/notes/7x9tmrp97i","type":"Question","attributedTo":"https://skippers-bin.com/users/7v1w1r8ce6","summary":null,"content":"<p><a href=\"https://marchgenso.me/users/march\" class=\"mention\">@march@marchgenso.me</a><span> How are your notifications now?<br></span><a href=\"https://skippers-bin.com/notes/7x9tmrp97i\"><span>リモートで結果を表示</span></a></p>","_misskey_content":"@march@marchgenso.me How are your notifications now?\n[リモートで結果を表示](https://skippers-bin.com/notes/7x9tmrp97i)","published":"2019-09-05T05:35:32.541Z","to":["https://www.w3.org/ns/activitystreams#Public"],"cc":["https://skippers-bin.com/users/7v1w1r8ce6/followers","https://marchgenso.me/users/march"],"inReplyTo":null,"attachment":[],"sensitive":false,"tag":[{"type":"Mention","href":"https://marchgenso.me/users/march","name":"@march@marchgenso.me"}],"_misskey_fallback_content":"<p><a href=\"https://marchgenso.me/users/march\" class=\"mention\">@march@marchgenso.me</a><span> How are your notifications now?<br></span><a href=\"https://skippers-bin.com/notes/7x9tmrp97i\"><span>リモートで結果を表示</span></a><span><br>----------------------------------------<br>0: Working<br>1: Broken af<br>----------------------------------------<br>番号を返信して投票</span></p>","endTime":null,"oneOf":[{"type":"Note","name":"Working","replies":{"type":"Collection","totalItems":0}},{"type":"Note","name":"Broken af","replies":{"type":"Collection","totalItems":1}}]} \ No newline at end of file
diff --git a/test/fixtures/tesla_mock/sjw.json b/test/fixtures/tesla_mock/sjw.json
new file mode 100644
index 000000000..ff64478d3
--- /dev/null
+++ b/test/fixtures/tesla_mock/sjw.json
@@ -0,0 +1 @@
+{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"Hashtag":"as:Hashtag"}],"type":"Person","id":"https://skippers-bin.com/users/7v1w1r8ce6","inbox":"https://skippers-bin.com/users/7v1w1r8ce6/inbox","outbox":"https://skippers-bin.com/users/7v1w1r8ce6/outbox","followers":"https://skippers-bin.com/users/7v1w1r8ce6/followers","following":"https://skippers-bin.com/users/7v1w1r8ce6/following","featured":"https://skippers-bin.com/users/7v1w1r8ce6/collections/featured","sharedInbox":"https://skippers-bin.com/inbox","endpoints":{"sharedInbox":"https://skippers-bin.com/inbox"},"url":"https://skippers-bin.com/@sjw","preferredUsername":"sjw","name":"It's ya boi sjw :verified:","summary":"<p><span>Admin of skippers-bin.com and neckbeard.xyz<br>For the most part I'm just a normal user. I mostly post animu, lewds, may-mays, and shitposts.<br><br>Not an alt of </span><a href=\"https://skippers-bin.com/@sjw@neckbeard.xyz\" class=\"mention\">@sjw@neckbeard.xyz</a><span> but another main.<br><br>Email/XMPP: neckbeard@rape.lol<br>PGP: d016 b622 75ba bcbc 5b3a fced a7d9 4824 0eb3 9c4e</span></p>","icon":{"type":"Image","url":"https://skippers-bin.com/files/webpublic-21b17f5b-3a83-4f50-8d4f-eda92066aa26","sensitive":false},"image":{"type":"Image","url":"https://skippers-bin.com/files/webpublic-1cd7f961-421e-4c31-aa03-74fb82584308","sensitive":false},"tag":[{"id":"https://skippers-bin.com/emojis/verified","type":"Emoji","name":":verified:","updated":"2019-07-12T02:16:12.088Z","icon":{"type":"Image","mediaType":"image/png","url":"https://skippers-bin.com/files/webpublic-dd10b435-6dad-4602-938b-f69ec0a19f2c"}}],"manuallyApprovesFollowers":false,"publicKey":{"id":"https://skippers-bin.com/users/7v1w1r8ce6/publickey","type":"Key","owner":"https://skippers-bin.com/users/7v1w1r8ce6","publicKeyPem":"-----BEGIN RSA PUBLIC KEY-----\nMIICCgKCAgEAvmp71/A6Oxe1UW/44HK0juAJhrjv9gYhaoslaS9K1FB+BHfIjaE9\n9+W2SKRLnVNYNFSN4JJrSGhX5RUjAsf4tcdRDVcmHl7tp2sgOAZeZz5geULm2sJQ\nwElnGk34jT/xCfX+w/O+7DuX31sU7ZK0B2P7ulNGDQXhrzVO0RMx7HhNcsFcusno\n3kmPyyPT1l+PbM2UNWms599/3yicKtuOzMgzxNeXvuHYtAO19txyPiOeYckQOMmT\nwEVIxypgCgNQ0MNtPLPKQTwOgVbvnN7MN+h3esKeKDcPcGQySkbkjZPaVnA6xCQf\nj58c19wqdCfAS4Effo5/bxVmhLpe0l9HYpV7IMasv2LhFntmSmAxBQzhdz0oTYb1\naNqiyfZdClnzutOiKcrFppADo4rZH9Z1WlPHapahrKbF0GRPN8DjSUsoBxfY9wZs\ntlL056hT4o+EFHYrRGo7KP6X/6aQ9sSsmpE08aVpVuXdwuaoaDlW1KrJ0oOk4lZw\nUNXvjEaN3c+VQAw2CNvkAqLuwrjnw7MdcxEGodEXb6s8VvoSOaiDqT7cexSaZe0R\nliCe/3dqFXpX1UrgRiryI4yc1BrEJIGTanchmP2aUJ2R2pccFsREp23C3vMN3M5b\nHw7fvKbUQHyf6lhRoLCOSCz1xaPutaMJmpwLuJo4wPCHGg9QFBYsqxcCAwEAAQ==\n-----END RSA PUBLIC KEY-----\n"},"isCat":true}
diff --git a/test/integration/mastodon_websocket_test.exs b/test/integration/mastodon_websocket_test.exs
index 3975cdcd6..c04262808 100644
--- a/test/integration/mastodon_websocket_test.exs
+++ b/test/integration/mastodon_websocket_test.exs
@@ -5,12 +5,12 @@
defmodule Pleroma.Integration.MastodonWebsocketTest do
use Pleroma.DataCase
+ import ExUnit.CaptureLog
import Pleroma.Factory
alias Pleroma.Integration.WebsocketClient
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.OAuth
- alias Pleroma.Web.Streamer
@path Pleroma.Web.Endpoint.url()
|> URI.parse()
@@ -18,16 +18,6 @@ defmodule Pleroma.Integration.MastodonWebsocketTest do
|> Map.put(:path, "/api/v1/streaming")
|> URI.to_string()
- setup do
- GenServer.start(Streamer, %{}, name: Streamer)
-
- on_exit(fn ->
- if pid = Process.whereis(Streamer) do
- Process.exit(pid, :kill)
- end
- end)
- end
-
def start_socket(qs \\ nil, headers \\ []) do
path =
case qs do
@@ -39,21 +29,27 @@ defmodule Pleroma.Integration.MastodonWebsocketTest do
end
test "refuses invalid requests" do
- assert {:error, {400, _}} = start_socket()
- assert {:error, {404, _}} = start_socket("?stream=ncjdk")
+ capture_log(fn ->
+ assert {:error, {400, _}} = start_socket()
+ assert {:error, {404, _}} = start_socket("?stream=ncjdk")
+ end)
end
test "requires authentication and a valid token for protected streams" do
- assert {:error, {403, _}} = start_socket("?stream=user&access_token=aaaaaaaaaaaa")
- assert {:error, {403, _}} = start_socket("?stream=user")
+ capture_log(fn ->
+ assert {:error, {403, _}} = start_socket("?stream=user&access_token=aaaaaaaaaaaa")
+ assert {:error, {403, _}} = start_socket("?stream=user")
+ end)
end
+ @tag needs_streamer: true
test "allows public streams without authentication" do
assert {:ok, _} = start_socket("?stream=public")
assert {:ok, _} = start_socket("?stream=public:local")
assert {:ok, _} = start_socket("?stream=hashtag&tag=lain")
end
+ @tag needs_streamer: true
test "receives well formatted events" do
user = insert(:user)
{:ok, _} = start_socket("?stream=public")
@@ -98,21 +94,32 @@ defmodule Pleroma.Integration.MastodonWebsocketTest do
assert {:ok, _} = start_socket("?stream=user&access_token=#{state.token.token}")
end
+ @tag needs_streamer: true
test "accepts the 'user' stream", %{token: token} = _state do
assert {:ok, _} = start_socket("?stream=user&access_token=#{token.token}")
- assert {:error, {403, "Forbidden"}} = start_socket("?stream=user")
+
+ assert capture_log(fn ->
+ assert {:error, {403, "Forbidden"}} = start_socket("?stream=user")
+ end) =~ ":badarg"
end
+ @tag needs_streamer: true
test "accepts the 'user:notification' stream", %{token: token} = _state do
assert {:ok, _} = start_socket("?stream=user:notification&access_token=#{token.token}")
- assert {:error, {403, "Forbidden"}} = start_socket("?stream=user:notification")
+
+ assert capture_log(fn ->
+ assert {:error, {403, "Forbidden"}} = start_socket("?stream=user:notification")
+ end) =~ ":badarg"
end
+ @tag needs_streamer: true
test "accepts valid token on Sec-WebSocket-Protocol header", %{token: token} do
assert {:ok, _} = start_socket("?stream=user", [{"Sec-WebSocket-Protocol", token.token}])
- assert {:error, {403, "Forbidden"}} =
- start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}])
+ assert capture_log(fn ->
+ assert {:error, {403, "Forbidden"}} =
+ start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}])
+ end) =~ ":badarg"
end
end
end
diff --git a/test/notification_test.exs b/test/notification_test.exs
index 80ea2a085..3d2f9a8fc 100644
--- a/test/notification_test.exs
+++ b/test/notification_test.exs
@@ -8,11 +8,11 @@ defmodule Pleroma.NotificationTest do
import Pleroma.Factory
alias Pleroma.Notification
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.ActivityPub.Transmogrifier
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.Streamer
- alias Pleroma.Web.TwitterAPI.TwitterAPI
describe "create_notifications" do
test "notifies someone when they are directly addressed" do
@@ -21,7 +21,7 @@ defmodule Pleroma.NotificationTest do
third_user = insert(:user)
{:ok, activity} =
- TwitterAPI.create_status(user, %{
+ CommonAPI.post(user, %{
"status" => "hey @#{other_user.nickname} and @#{third_user.nickname}"
})
@@ -39,7 +39,7 @@ defmodule Pleroma.NotificationTest do
User.subscribe(subscriber, user)
- {:ok, status} = TwitterAPI.create_status(user, %{"status" => "Akariiiin"})
+ {:ok, status} = CommonAPI.post(user, %{"status" => "Akariiiin"})
{:ok, [notification]} = Notification.create_notifications(status)
assert notification.user_id == subscriber.id
@@ -69,16 +69,7 @@ defmodule Pleroma.NotificationTest do
end
describe "create_notification" do
- setup do
- GenServer.start(Streamer, %{}, name: Streamer)
-
- on_exit(fn ->
- if pid = Process.whereis(Streamer) do
- Process.exit(pid, :kill)
- end
- end)
- end
-
+ @tag needs_streamer: true
test "it creates a notification for user and send to the 'user' and the 'user:notification' stream" do
user = insert(:user)
task = Task.async(fn -> assert_receive {:text, _}, 4_000 end)
@@ -184,47 +175,20 @@ defmodule Pleroma.NotificationTest do
test "it doesn't create a notification for follow-unfollow-follow chains" do
user = insert(:user)
followed_user = insert(:user)
- {:ok, _, _, activity} = TwitterAPI.follow(user, %{"user_id" => followed_user.id})
+ {:ok, _, _, activity} = CommonAPI.follow(user, followed_user)
Notification.create_notification(activity, followed_user)
- TwitterAPI.unfollow(user, %{"user_id" => followed_user.id})
- {:ok, _, _, activity_dupe} = TwitterAPI.follow(user, %{"user_id" => followed_user.id})
+ CommonAPI.unfollow(user, followed_user)
+ {:ok, _, _, activity_dupe} = CommonAPI.follow(user, followed_user)
refute Notification.create_notification(activity_dupe, followed_user)
end
- test "it doesn't create a notification for like-unlike-like chains" do
- user = insert(:user)
- liked_user = insert(:user)
- {:ok, status} = TwitterAPI.create_status(liked_user, %{"status" => "Yui is best yuru"})
- {:ok, fav_status} = TwitterAPI.fav(user, status.id)
- Notification.create_notification(fav_status, liked_user)
- TwitterAPI.unfav(user, status.id)
- {:ok, dupe} = TwitterAPI.fav(user, status.id)
- refute Notification.create_notification(dupe, liked_user)
- end
-
- test "it doesn't create a notification for repeat-unrepeat-repeat chains" do
- user = insert(:user)
- retweeted_user = insert(:user)
-
- {:ok, status} =
- TwitterAPI.create_status(retweeted_user, %{
- "status" => "Send dupe notifications to the shadow realm"
- })
-
- {:ok, retweeted_activity} = TwitterAPI.repeat(user, status.id)
- Notification.create_notification(retweeted_activity, retweeted_user)
- TwitterAPI.unrepeat(user, status.id)
- {:ok, dupe} = TwitterAPI.repeat(user, status.id)
- refute Notification.create_notification(dupe, retweeted_user)
- end
-
test "it doesn't create duplicate notifications for follow+subscribed users" do
user = insert(:user)
subscriber = insert(:user)
- {:ok, _, _, _} = TwitterAPI.follow(subscriber, %{"user_id" => user.id})
+ {:ok, _, _, _} = CommonAPI.follow(subscriber, user)
User.subscribe(subscriber, user)
- {:ok, status} = TwitterAPI.create_status(user, %{"status" => "Akariiiin"})
+ {:ok, status} = CommonAPI.post(user, %{"status" => "Akariiiin"})
{:ok, [_notif]} = Notification.create_notifications(status)
end
@@ -234,8 +198,7 @@ defmodule Pleroma.NotificationTest do
User.subscribe(subscriber, user)
- {:ok, status} =
- TwitterAPI.create_status(user, %{"status" => "inwisible", "visibility" => "direct"})
+ {:ok, status} = CommonAPI.post(user, %{"status" => "inwisible", "visibility" => "direct"})
assert {:ok, []} == Notification.create_notifications(status)
end
@@ -246,8 +209,7 @@ defmodule Pleroma.NotificationTest do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(user, %{"status" => "hey @#{other_user.nickname}"})
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}"})
{:ok, [notification]} = Notification.create_notifications(activity)
{:ok, notification} = Notification.get(other_user, notification.id)
@@ -259,8 +221,7 @@ defmodule Pleroma.NotificationTest do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(user, %{"status" => "hey @#{other_user.nickname}"})
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}"})
{:ok, [notification]} = Notification.create_notifications(activity)
{:error, _notification} = Notification.get(user, notification.id)
@@ -272,8 +233,7 @@ defmodule Pleroma.NotificationTest do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(user, %{"status" => "hey @#{other_user.nickname}"})
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}"})
{:ok, [notification]} = Notification.create_notifications(activity)
{:ok, notification} = Notification.dismiss(other_user, notification.id)
@@ -285,8 +245,7 @@ defmodule Pleroma.NotificationTest do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(user, %{"status" => "hey @#{other_user.nickname}"})
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}"})
{:ok, [notification]} = Notification.create_notifications(activity)
{:error, _notification} = Notification.dismiss(user, notification.id)
@@ -300,14 +259,14 @@ defmodule Pleroma.NotificationTest do
third_user = insert(:user)
{:ok, activity} =
- TwitterAPI.create_status(user, %{
+ CommonAPI.post(user, %{
"status" => "hey @#{other_user.nickname} and @#{third_user.nickname} !"
})
{:ok, _notifs} = Notification.create_notifications(activity)
{:ok, activity} =
- TwitterAPI.create_status(user, %{
+ CommonAPI.post(user, %{
"status" => "hey again @#{other_user.nickname} and @#{third_user.nickname} !"
})
@@ -325,12 +284,12 @@ defmodule Pleroma.NotificationTest do
other_user = insert(:user)
{:ok, _activity} =
- TwitterAPI.create_status(user, %{
+ CommonAPI.post(user, %{
"status" => "hey @#{other_user.nickname}!"
})
{:ok, _activity} =
- TwitterAPI.create_status(user, %{
+ CommonAPI.post(user, %{
"status" => "hey again @#{other_user.nickname}!"
})
@@ -340,7 +299,7 @@ defmodule Pleroma.NotificationTest do
assert n2.id > n1.id
{:ok, _activity} =
- TwitterAPI.create_status(user, %{
+ CommonAPI.post(user, %{
"status" => "hey yet again @#{other_user.nickname}!"
})
@@ -621,7 +580,8 @@ defmodule Pleroma.NotificationTest do
refute Enum.empty?(Notification.for_user(other_user))
- User.delete(user)
+ {:ok, job} = User.delete(user)
+ ObanHelpers.perform(job)
assert Enum.empty?(Notification.for_user(other_user))
end
@@ -666,6 +626,7 @@ defmodule Pleroma.NotificationTest do
}
{:ok, _delete_activity} = Transmogrifier.handle_incoming(delete_user_message)
+ ObanHelpers.perform_all()
assert Enum.empty?(Notification.for_user(local_user))
end
@@ -677,7 +638,7 @@ defmodule Pleroma.NotificationTest do
muted = insert(:user)
{:ok, user} = User.mute(user, muted, false)
- {:ok, _activity} = TwitterAPI.create_status(muted, %{"status" => "hey @#{user.nickname}"})
+ {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"})
assert length(Notification.for_user(user)) == 1
end
@@ -687,7 +648,7 @@ defmodule Pleroma.NotificationTest do
muted = insert(:user)
{:ok, user} = User.mute(user, muted)
- {:ok, _activity} = TwitterAPI.create_status(muted, %{"status" => "hey @#{user.nickname}"})
+ {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"})
assert Notification.for_user(user) == []
end
@@ -697,7 +658,7 @@ defmodule Pleroma.NotificationTest do
blocked = insert(:user)
{:ok, user} = User.block(user, blocked)
- {:ok, _activity} = TwitterAPI.create_status(blocked, %{"status" => "hey @#{user.nickname}"})
+ {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"})
assert Notification.for_user(user) == []
end
@@ -707,7 +668,7 @@ defmodule Pleroma.NotificationTest do
blocked = insert(:user, ap_id: "http://some-domain.com")
{:ok, user} = User.block_domain(user, "some-domain.com")
- {:ok, _activity} = TwitterAPI.create_status(blocked, %{"status" => "hey @#{user.nickname}"})
+ {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"})
assert Notification.for_user(user) == []
end
@@ -716,8 +677,7 @@ defmodule Pleroma.NotificationTest do
user = insert(:user)
another_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(another_user, %{"status" => "hey @#{user.nickname}"})
+ {:ok, activity} = CommonAPI.post(another_user, %{"status" => "hey @#{user.nickname}"})
{:ok, _} = Pleroma.ThreadMute.add_mute(user.id, activity.data["context"])
assert Notification.for_user(user) == []
@@ -728,7 +688,7 @@ defmodule Pleroma.NotificationTest do
muted = insert(:user)
{:ok, user} = User.mute(user, muted)
- {:ok, _activity} = TwitterAPI.create_status(muted, %{"status" => "hey @#{user.nickname}"})
+ {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"})
assert length(Notification.for_user(user, %{with_muted: true})) == 1
end
@@ -738,7 +698,7 @@ defmodule Pleroma.NotificationTest do
blocked = insert(:user)
{:ok, user} = User.block(user, blocked)
- {:ok, _activity} = TwitterAPI.create_status(blocked, %{"status" => "hey @#{user.nickname}"})
+ {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"})
assert length(Notification.for_user(user, %{with_muted: true})) == 1
end
@@ -748,7 +708,7 @@ defmodule Pleroma.NotificationTest do
blocked = insert(:user, ap_id: "http://some-domain.com")
{:ok, user} = User.block_domain(user, "some-domain.com")
- {:ok, _activity} = TwitterAPI.create_status(blocked, %{"status" => "hey @#{user.nickname}"})
+ {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"})
assert length(Notification.for_user(user, %{with_muted: true})) == 1
end
@@ -757,8 +717,7 @@ defmodule Pleroma.NotificationTest do
user = insert(:user)
another_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(another_user, %{"status" => "hey @#{user.nickname}"})
+ {:ok, activity} = CommonAPI.post(another_user, %{"status" => "hey @#{user.nickname}"})
{:ok, _} = Pleroma.ThreadMute.add_mute(user.id, activity.data["context"])
assert length(Notification.for_user(user, %{with_muted: true})) == 1
diff --git a/test/object_test.exs b/test/object_test.exs
index d138ee091..ba96aeea4 100644
--- a/test/object_test.exs
+++ b/test/object_test.exs
@@ -53,9 +53,12 @@ defmodule Pleroma.ObjectTest do
assert object == cached_object
+ Cachex.put(:web_resp_cache, URI.parse(object.data["id"]).path, "cofe")
+
Object.delete(cached_object)
{:ok, nil} = Cachex.get(:object_cache, "object:#{object.data["id"]}")
+ {:ok, nil} = Cachex.get(:web_resp_cache, URI.parse(object.data["id"]).path)
cached_object = Object.get_cached_by_ap_id(object.data["id"])
diff --git a/test/plugs/cache_test.exs b/test/plugs/cache_test.exs
new file mode 100644
index 000000000..e6e7f409e
--- /dev/null
+++ b/test/plugs/cache_test.exs
@@ -0,0 +1,186 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Plugs.CacheTest do
+ use ExUnit.Case, async: true
+ use Plug.Test
+
+ alias Pleroma.Plugs.Cache
+
+ @miss_resp {200,
+ [
+ {"cache-control", "max-age=0, private, must-revalidate"},
+ {"content-type", "cofe/hot; charset=utf-8"},
+ {"x-cache", "MISS from Pleroma"}
+ ], "cofe"}
+
+ @hit_resp {200,
+ [
+ {"cache-control", "max-age=0, private, must-revalidate"},
+ {"content-type", "cofe/hot; charset=utf-8"},
+ {"x-cache", "HIT from Pleroma"}
+ ], "cofe"}
+
+ @ttl 5
+
+ setup do
+ Cachex.clear(:web_resp_cache)
+ :ok
+ end
+
+ test "caches a response" do
+ assert @miss_resp ==
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+
+ assert_raise(Plug.Conn.AlreadySentError, fn ->
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+ end)
+
+ assert @hit_resp ==
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: nil})
+ |> sent_resp()
+ end
+
+ test "ttl is set" do
+ assert @miss_resp ==
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: @ttl})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+
+ assert @hit_resp ==
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: @ttl})
+ |> sent_resp()
+
+ :timer.sleep(@ttl + 1)
+
+ assert @miss_resp ==
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: @ttl})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+ end
+
+ test "set ttl via conn.assigns" do
+ assert @miss_resp ==
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> assign(:cache_ttl, @ttl)
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+
+ assert @hit_resp ==
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: nil})
+ |> sent_resp()
+
+ :timer.sleep(@ttl + 1)
+
+ assert @miss_resp ==
+ conn(:get, "/")
+ |> Cache.call(%{query_params: false, ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+ end
+
+ test "ignore query string when `query_params` is false" do
+ assert @miss_resp ==
+ conn(:get, "/?cofe")
+ |> Cache.call(%{query_params: false, ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+
+ assert @hit_resp ==
+ conn(:get, "/?cofefe")
+ |> Cache.call(%{query_params: false, ttl: nil})
+ |> sent_resp()
+ end
+
+ test "take query string into account when `query_params` is true" do
+ assert @miss_resp ==
+ conn(:get, "/?cofe")
+ |> Cache.call(%{query_params: true, ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+
+ assert @miss_resp ==
+ conn(:get, "/?cofefe")
+ |> Cache.call(%{query_params: true, ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+ end
+
+ test "take specific query params into account when `query_params` is list" do
+ assert @miss_resp ==
+ conn(:get, "/?a=1&b=2&c=3&foo=bar")
+ |> fetch_query_params()
+ |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+
+ assert @hit_resp ==
+ conn(:get, "/?bar=foo&c=3&b=2&a=1")
+ |> fetch_query_params()
+ |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
+ |> sent_resp()
+
+ assert @miss_resp ==
+ conn(:get, "/?bar=foo&c=3&b=2&a=2")
+ |> fetch_query_params()
+ |> Cache.call(%{query_params: ["a", "b", "c"], ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+ end
+
+ test "ignore not GET requests" do
+ expected =
+ {200,
+ [
+ {"cache-control", "max-age=0, private, must-revalidate"},
+ {"content-type", "cofe/hot; charset=utf-8"}
+ ], "cofe"}
+
+ assert expected ==
+ conn(:post, "/")
+ |> Cache.call(%{query_params: true, ttl: nil})
+ |> put_resp_content_type("cofe/hot")
+ |> send_resp(:ok, "cofe")
+ |> sent_resp()
+ end
+
+ test "ignore non-successful responses" do
+ expected =
+ {418,
+ [
+ {"cache-control", "max-age=0, private, must-revalidate"},
+ {"content-type", "tea/iced; charset=utf-8"}
+ ], "🥤"}
+
+ assert expected ==
+ conn(:get, "/cofe")
+ |> Cache.call(%{query_params: true, ttl: nil})
+ |> put_resp_content_type("tea/iced")
+ |> send_resp(:im_a_teapot, "🥤")
+ |> sent_resp()
+ end
+end
diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex
index ec5892ff5..b39c70677 100644
--- a/test/support/conn_case.ex
+++ b/test/support/conn_case.ex
@@ -40,6 +40,10 @@ defmodule Pleroma.Web.ConnCase do
Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()})
end
+ if tags[:needs_streamer] do
+ start_supervised(Pleroma.Web.Streamer.supervisor())
+ end
+
{:ok, conn: Phoenix.ConnTest.build_conn()}
end
end
diff --git a/test/support/data_case.ex b/test/support/data_case.ex
index f3d98e7e3..17fa15214 100644
--- a/test/support/data_case.ex
+++ b/test/support/data_case.ex
@@ -39,6 +39,10 @@ defmodule Pleroma.DataCase do
Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()})
end
+ if tags[:needs_streamer] do
+ start_supervised(Pleroma.Web.Streamer.supervisor())
+ end
+
:ok
end
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index 05eebbe9b..231e7c498 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -992,6 +992,18 @@ defmodule HttpRequestMock do
{:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rel_me_null.html")}}
end
+ def get("https://skippers-bin.com/notes/7x9tmrp97i", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/misskey_poll_no_end_date.json")
+ }}
+ end
+
+ def get("https://skippers-bin.com/users/7v1w1r8ce6", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/sjw.json")}}
+ end
+
def get(url, query, body, headers) do
{:error,
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{
diff --git a/test/support/oban_helpers.ex b/test/support/oban_helpers.ex
new file mode 100644
index 000000000..989770926
--- /dev/null
+++ b/test/support/oban_helpers.ex
@@ -0,0 +1,42 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Tests.ObanHelpers do
+ @moduledoc """
+ Oban test helpers.
+ """
+
+ alias Pleroma.Repo
+
+ def perform_all do
+ Oban.Job
+ |> Repo.all()
+ |> perform()
+ end
+
+ def perform(%Oban.Job{} = job) do
+ res = apply(String.to_existing_atom("Elixir." <> job.worker), :perform, [job.args, job])
+ Repo.delete(job)
+ res
+ end
+
+ def perform(jobs) when is_list(jobs) do
+ for job <- jobs, do: perform(job)
+ end
+
+ def member?(%{} = job_args, jobs) when is_list(jobs) do
+ Enum.any?(jobs, fn job ->
+ member?(job_args, job.args)
+ end)
+ end
+
+ def member?(%{} = test_attrs, %{} = attrs) do
+ Enum.all?(
+ test_attrs,
+ fn {k, _v} -> member?(test_attrs[k], attrs[k]) end
+ )
+ end
+
+ def member?(x, y), do: x == y
+end
diff --git a/test/tasks/digest_test.exs b/test/tasks/digest_test.exs
index 4bfa1fb93..96d762685 100644
--- a/test/tasks/digest_test.exs
+++ b/test/tasks/digest_test.exs
@@ -4,6 +4,7 @@ defmodule Mix.Tasks.Pleroma.DigestTest do
import Pleroma.Factory
import Swoosh.TestAssertions
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.Web.CommonAPI
setup_all do
@@ -39,6 +40,8 @@ defmodule Mix.Tasks.Pleroma.DigestTest do
:ok = Mix.Tasks.Pleroma.Digest.run(["test", user2.nickname, yesterday_date])
+ ObanHelpers.perform_all()
+
assert_receive {:mix_shell, :info, [message]}
assert message =~ "Digest email have been sent"
diff --git a/test/user_test.exs b/test/user_test.exs
index 2cbc1f525..b09e9311d 100644
--- a/test/user_test.exs
+++ b/test/user_test.exs
@@ -7,14 +7,16 @@ defmodule Pleroma.UserTest do
alias Pleroma.Builders.UserBuilder
alias Pleroma.Object
alias Pleroma.Repo
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.CommonAPI
use Pleroma.DataCase
+ use Oban.Testing, repo: Pleroma.Repo
- import Pleroma.Factory
import Mock
+ import Pleroma.Factory
setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
@@ -69,8 +71,8 @@ defmodule Pleroma.UserTest do
locked = insert(:user, %{info: %{locked: true}})
follower = insert(:user)
- Pleroma.Web.TwitterAPI.TwitterAPI.follow(follower, %{"user_id" => unlocked.id})
- Pleroma.Web.TwitterAPI.TwitterAPI.follow(follower, %{"user_id" => locked.id})
+ CommonAPI.follow(follower, unlocked)
+ CommonAPI.follow(follower, locked)
assert {:ok, []} = User.get_follow_requests(unlocked)
assert {:ok, [activity]} = User.get_follow_requests(locked)
@@ -83,9 +85,9 @@ defmodule Pleroma.UserTest do
pending_follower = insert(:user)
accepted_follower = insert(:user)
- Pleroma.Web.TwitterAPI.TwitterAPI.follow(pending_follower, %{"user_id" => locked.id})
- Pleroma.Web.TwitterAPI.TwitterAPI.follow(pending_follower, %{"user_id" => locked.id})
- Pleroma.Web.TwitterAPI.TwitterAPI.follow(accepted_follower, %{"user_id" => locked.id})
+ CommonAPI.follow(pending_follower, locked)
+ CommonAPI.follow(pending_follower, locked)
+ CommonAPI.follow(accepted_follower, locked)
User.follow(accepted_follower, locked)
assert {:ok, [activity]} = User.get_follow_requests(locked)
@@ -570,22 +572,6 @@ defmodule Pleroma.UserTest do
refute cs.valid?
end)
end
-
- test "it restricts some sizes" do
- bio_limit = Pleroma.Config.get([:instance, :user_bio_length], 5000)
- name_limit = Pleroma.Config.get([:instance, :user_name_length], 100)
-
- [bio: bio_limit, name: name_limit]
- |> Enum.each(fn {field, size} ->
- string = String.pad_leading(".", size)
- cs = User.remote_user_creation(Map.put(@valid_remote, field, string))
- assert cs.valid?
-
- string = String.pad_leading(".", size + 1)
- cs = User.remote_user_creation(Map.put(@valid_remote, field, string))
- refute cs.valid?
- end)
- end
end
describe "followers and friends" do
@@ -725,7 +711,9 @@ defmodule Pleroma.UserTest do
user3.nickname
]
- result = User.follow_import(user1, identifiers)
+ {:ok, job} = User.follow_import(user1, identifiers)
+ result = ObanHelpers.perform(job)
+
assert is_list(result)
assert result == [user2, user3]
end
@@ -936,7 +924,9 @@ defmodule Pleroma.UserTest do
user3.nickname
]
- result = User.blocks_import(user1, identifiers)
+ {:ok, job} = User.blocks_import(user1, identifiers)
+ result = ObanHelpers.perform(job)
+
assert is_list(result)
assert result == [user2, user3]
end
@@ -1053,7 +1043,9 @@ defmodule Pleroma.UserTest do
test "it deletes deactivated user" do
{:ok, user} = insert(:user, info: %{deactivated: true}) |> User.set_cache()
- assert {:ok, _} = User.delete(user)
+ {:ok, job} = User.delete(user)
+ {:ok, _user} = ObanHelpers.perform(job)
+
refute User.get_by_id(user.id)
end
@@ -1071,7 +1063,8 @@ defmodule Pleroma.UserTest do
{:ok, like_two, _} = CommonAPI.favorite(activity.id, follower)
{:ok, repeat, _} = CommonAPI.repeat(activity_two.id, user)
- {:ok, _} = User.delete(user)
+ {:ok, job} = User.delete(user)
+ {:ok, _user} = ObanHelpers.perform(job)
follower = User.get_cached_by_id(follower.id)
@@ -1081,7 +1074,7 @@ defmodule Pleroma.UserTest do
user_activities =
user.ap_id
- |> Activity.query_by_actor()
+ |> Activity.Queries.by_actor()
|> Repo.all()
|> Enum.map(fn act -> act.data["type"] end)
@@ -1103,12 +1096,18 @@ defmodule Pleroma.UserTest do
{:ok, follower} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin")
{:ok, _} = User.follow(follower, user)
- {:ok, _user} = User.delete(user)
-
- assert called(
- Pleroma.Web.ActivityPub.Publisher.publish_one(%{
- inbox: "http://mastodon.example.org/inbox"
- })
+ {:ok, job} = User.delete(user)
+ {:ok, _user} = ObanHelpers.perform(job)
+
+ assert ObanHelpers.member?(
+ %{
+ "op" => "publish_one",
+ "params" => %{
+ "inbox" => "http://mastodon.example.org/inbox",
+ "id" => "pleroma:fakeid"
+ }
+ },
+ all_enqueued(worker: Pleroma.Workers.PublisherWorker)
)
end
end
@@ -1117,11 +1116,60 @@ defmodule Pleroma.UserTest do
assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/users/admin")
end
- test "insert or update a user from given data" do
- user = insert(:user, %{nickname: "nick@name.de"})
- data = %{ap_id: user.ap_id <> "xxx", name: user.name, nickname: user.nickname}
+ describe "insert or update a user from given data" do
+ test "with normal data" do
+ user = insert(:user, %{nickname: "nick@name.de"})
+ data = %{ap_id: user.ap_id <> "xxx", name: user.name, nickname: user.nickname}
+
+ assert {:ok, %User{}} = User.insert_or_update_user(data)
+ end
+
+ test "with overly long fields" do
+ current_max_length = Pleroma.Config.get([:instance, :account_field_value_length], 255)
+ user = insert(:user, nickname: "nickname@supergood.domain")
+
+ data = %{
+ ap_id: user.ap_id,
+ name: user.name,
+ nickname: user.nickname,
+ info: %{
+ fields: [
+ %{"name" => "myfield", "value" => String.duplicate("h", current_max_length + 1)}
+ ]
+ }
+ }
+
+ assert {:ok, %User{}} = User.insert_or_update_user(data)
+ end
+
+ test "with an overly long bio" do
+ current_max_length = Pleroma.Config.get([:instance, :user_bio_length], 5000)
+ user = insert(:user, nickname: "nickname@supergood.domain")
+
+ data = %{
+ ap_id: user.ap_id,
+ name: user.name,
+ nickname: user.nickname,
+ bio: String.duplicate("h", current_max_length + 1),
+ info: %{}
+ }
- assert {:ok, %User{}} = User.insert_or_update_user(data)
+ assert {:ok, %User{}} = User.insert_or_update_user(data)
+ end
+
+ test "with an overly long display name" do
+ current_max_length = Pleroma.Config.get([:instance, :user_name_length], 100)
+ user = insert(:user, nickname: "nickname@supergood.domain")
+
+ data = %{
+ ap_id: user.ap_id,
+ name: String.duplicate("h", current_max_length + 1),
+ nickname: user.nickname,
+ info: %{}
+ }
+
+ assert {:ok, %User{}} = User.insert_or_update_user(data)
+ end
end
describe "per-user rich-text filtering" do
@@ -1153,7 +1201,8 @@ defmodule Pleroma.UserTest do
test "User.delete() plugs any possible zombie objects" do
user = insert(:user)
- {:ok, _} = User.delete(user)
+ {:ok, job} = User.delete(user)
+ {:ok, _} = ObanHelpers.perform(job)
{:ok, cached_user} = Cachex.get(:user_cache, "ap_id:#{user.ap_id}")
@@ -1279,11 +1328,9 @@ defmodule Pleroma.UserTest do
{:ok, _follower2} = User.follow(follower2, user)
{:ok, _follower3} = User.follow(follower3, user)
- {:ok, _} = User.block(user, follower)
+ {:ok, user} = User.block(user, follower)
- user_show = Pleroma.Web.TwitterAPI.UserView.render("show.json", %{user: user})
-
- assert Map.get(user_show, "followers_count") == 2
+ assert User.user_info(user).follower_count == 2
end
describe "list_inactive_users_query/1" do
@@ -1327,7 +1374,7 @@ defmodule Pleroma.UserTest do
to = Enum.random(users -- [user])
{:ok, _} =
- Pleroma.Web.TwitterAPI.TwitterAPI.create_status(user, %{
+ CommonAPI.post(user, %{
"status" => "hey @#{to.nickname}"
})
end)
@@ -1359,12 +1406,12 @@ defmodule Pleroma.UserTest do
Enum.each(recipients, fn to ->
{:ok, _} =
- Pleroma.Web.TwitterAPI.TwitterAPI.create_status(sender, %{
+ CommonAPI.post(sender, %{
"status" => "hey @#{to.nickname}"
})
{:ok, _} =
- Pleroma.Web.TwitterAPI.TwitterAPI.create_status(sender, %{
+ CommonAPI.post(sender, %{
"status" => "hey again @#{to.nickname}"
})
end)
@@ -1616,4 +1663,31 @@ defmodule Pleroma.UserTest do
assert User.user_info(other_user).following_count == 152
end
end
+
+ describe "change_email/2" do
+ setup do
+ [user: insert(:user)]
+ end
+
+ test "blank email returns error", %{user: user} do
+ assert {:error, %{errors: [email: {"can't be blank", _}]}} = User.change_email(user, "")
+ assert {:error, %{errors: [email: {"can't be blank", _}]}} = User.change_email(user, nil)
+ end
+
+ test "non unique email returns error", %{user: user} do
+ %{email: email} = insert(:user)
+
+ assert {:error, %{errors: [email: {"has already been taken", _}]}} =
+ User.change_email(user, email)
+ end
+
+ test "invalid email returns error", %{user: user} do
+ assert {:error, %{errors: [email: {"has invalid format", _}]}} =
+ User.change_email(user, "cofe")
+ end
+
+ test "changes email", %{user: user} do
+ assert {:ok, %User{email: "cofe@cofe.party"}} = User.change_email(user, "cofe@cofe.party")
+ end
+ end
end
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs
index 5192e734f..f83b14452 100644
--- a/test/web/activity_pub/activity_pub_controller_test.exs
+++ b/test/web/activity_pub/activity_pub_controller_test.exs
@@ -4,16 +4,21 @@
defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
use Pleroma.Web.ConnCase
+ use Oban.Testing, repo: Pleroma.Repo
+
import Pleroma.Factory
alias Pleroma.Activity
+ alias Pleroma.Delivery
alias Pleroma.Instances
alias Pleroma.Object
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ObjectView
alias Pleroma.Web.ActivityPub.Relay
alias Pleroma.Web.ActivityPub.UserView
alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Web.CommonAPI
+ alias Pleroma.Workers.ReceiverWorker
setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
@@ -175,6 +180,49 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert json_response(conn, 404)
end
+
+ test "it caches a response", %{conn: conn} do
+ note = insert(:note)
+ uuid = String.split(note.data["id"], "/") |> List.last()
+
+ conn1 =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/objects/#{uuid}")
+
+ assert json_response(conn1, :ok)
+ assert Enum.any?(conn1.resp_headers, &(&1 == {"x-cache", "MISS from Pleroma"}))
+
+ conn2 =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/objects/#{uuid}")
+
+ assert json_response(conn1, :ok) == json_response(conn2, :ok)
+ assert Enum.any?(conn2.resp_headers, &(&1 == {"x-cache", "HIT from Pleroma"}))
+ end
+
+ test "cached purged after object deletion", %{conn: conn} do
+ note = insert(:note)
+ uuid = String.split(note.data["id"], "/") |> List.last()
+
+ conn1 =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/objects/#{uuid}")
+
+ assert json_response(conn1, :ok)
+ assert Enum.any?(conn1.resp_headers, &(&1 == {"x-cache", "MISS from Pleroma"}))
+
+ Object.delete(note)
+
+ conn2 =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/objects/#{uuid}")
+
+ assert "Not found" == json_response(conn2, :not_found)
+ end
end
describe "/object/:uuid/likes" do
@@ -264,6 +312,51 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert json_response(conn, 404)
end
+
+ test "it caches a response", %{conn: conn} do
+ activity = insert(:note_activity)
+ uuid = String.split(activity.data["id"], "/") |> List.last()
+
+ conn1 =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/activities/#{uuid}")
+
+ assert json_response(conn1, :ok)
+ assert Enum.any?(conn1.resp_headers, &(&1 == {"x-cache", "MISS from Pleroma"}))
+
+ conn2 =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/activities/#{uuid}")
+
+ assert json_response(conn1, :ok) == json_response(conn2, :ok)
+ assert Enum.any?(conn2.resp_headers, &(&1 == {"x-cache", "HIT from Pleroma"}))
+ end
+
+ test "cached purged after activity deletion", %{conn: conn} do
+ user = insert(:user)
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "cofe"})
+
+ uuid = String.split(activity.data["id"], "/") |> List.last()
+
+ conn1 =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/activities/#{uuid}")
+
+ assert json_response(conn1, :ok)
+ assert Enum.any?(conn1.resp_headers, &(&1 == {"x-cache", "MISS from Pleroma"}))
+
+ Activity.delete_by_ap_id(activity.object.data["id"])
+
+ conn2 =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/activities/#{uuid}")
+
+ assert "Not found" == json_response(conn2, :not_found)
+ end
end
describe "/inbox" do
@@ -277,7 +370,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> post("/inbox", data)
assert "ok" == json_response(conn, 200)
- :timer.sleep(500)
+
+ ObanHelpers.perform(all_enqueued(worker: ReceiverWorker))
assert Activity.get_by_ap_id(data["id"])
end
@@ -319,7 +413,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> post("/users/#{user.nickname}/inbox", data)
assert "ok" == json_response(conn, 200)
- :timer.sleep(500)
+ ObanHelpers.perform(all_enqueued(worker: ReceiverWorker))
assert Activity.get_by_ap_id(data["id"])
end
@@ -348,7 +442,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> post("/users/#{recipient.nickname}/inbox", data)
assert "ok" == json_response(conn, 200)
- :timer.sleep(500)
+ ObanHelpers.perform(all_enqueued(worker: ReceiverWorker))
assert Activity.get_by_ap_id(data["id"])
end
@@ -365,6 +459,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert json_response(conn, 403)
end
+ test "it doesn't crash without an authenticated user", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/users/#{user.nickname}/inbox")
+
+ assert json_response(conn, 403)
+ end
+
test "it returns a note activity in a collection", %{conn: conn} do
note_activity = insert(:direct_note_activity)
note_object = Object.normalize(note_activity)
@@ -427,6 +532,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> post("/users/#{recipient.nickname}/inbox", data)
|> json_response(200)
+ ObanHelpers.perform(all_enqueued(worker: ReceiverWorker))
+
activity = Activity.get_by_ap_id(data["id"])
assert activity.id
@@ -502,6 +609,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> post("/users/#{user.nickname}/outbox", data)
result = json_response(conn, 201)
+
assert Activity.get_by_ap_id(result["id"])
end
@@ -786,4 +894,86 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert result["totalItems"] == 15
end
end
+
+ describe "delivery tracking" do
+ test "it tracks a signed object fetch", %{conn: conn} do
+ user = insert(:user, local: false)
+ activity = insert(:note_activity)
+ object = Object.normalize(activity)
+
+ object_path = String.trim_leading(object.data["id"], Pleroma.Web.Endpoint.url())
+
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> assign(:user, user)
+ |> get(object_path)
+ |> json_response(200)
+
+ assert Delivery.get(object.id, user.id)
+ end
+
+ test "it tracks a signed activity fetch", %{conn: conn} do
+ user = insert(:user, local: false)
+ activity = insert(:note_activity)
+ object = Object.normalize(activity)
+
+ activity_path = String.trim_leading(activity.data["id"], Pleroma.Web.Endpoint.url())
+
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> assign(:user, user)
+ |> get(activity_path)
+ |> json_response(200)
+
+ assert Delivery.get(object.id, user.id)
+ end
+
+ test "it tracks a signed object fetch when the json is cached", %{conn: conn} do
+ user = insert(:user, local: false)
+ other_user = insert(:user, local: false)
+ activity = insert(:note_activity)
+ object = Object.normalize(activity)
+
+ object_path = String.trim_leading(object.data["id"], Pleroma.Web.Endpoint.url())
+
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> assign(:user, user)
+ |> get(object_path)
+ |> json_response(200)
+
+ build_conn()
+ |> put_req_header("accept", "application/activity+json")
+ |> assign(:user, other_user)
+ |> get(object_path)
+ |> json_response(200)
+
+ assert Delivery.get(object.id, user.id)
+ assert Delivery.get(object.id, other_user.id)
+ end
+
+ test "it tracks a signed activity fetch when the json is cached", %{conn: conn} do
+ user = insert(:user, local: false)
+ other_user = insert(:user, local: false)
+ activity = insert(:note_activity)
+ object = Object.normalize(activity)
+
+ activity_path = String.trim_leading(activity.data["id"], Pleroma.Web.Endpoint.url())
+
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> assign(:user, user)
+ |> get(activity_path)
+ |> json_response(200)
+
+ build_conn()
+ |> put_req_header("accept", "application/activity+json")
+ |> assign(:user, other_user)
+ |> get(activity_path)
+ |> json_response(200)
+
+ assert Delivery.get(object.id, user.id)
+ assert Delivery.get(object.id, other_user.id)
+ end
+ end
end
diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs
index f72b44aed..4100108a5 100644
--- a/test/web/activity_pub/activity_pub_test.exs
+++ b/test/web/activity_pub/activity_pub_test.exs
@@ -38,9 +38,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
stream: fn _, _ -> nil end do
ActivityPub.stream_out_participations(conversation.participations)
- Enum.each(participations, fn participation ->
- assert called(Pleroma.Web.Streamer.stream("participation", participation))
- end)
+ assert called(Pleroma.Web.Streamer.stream("participation", participations))
end
end
end
@@ -686,7 +684,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
user = insert(:user)
{:ok, like_activity, _object} = ActivityPub.like(user, object_activity)
- assert called(Pleroma.Web.Federator.publish(like_activity, 5))
+ assert called(Pleroma.Web.Federator.publish(like_activity))
end
test "returns exist activity if object already liked" do
@@ -747,7 +745,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
{:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object)
assert object.data["like_count"] == 0
- assert called(Pleroma.Web.Federator.publish(unlike_activity, 5))
+ assert called(Pleroma.Web.Federator.publish(unlike_activity))
end
test "unliking a previously liked object" do
diff --git a/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs
index 372e789be..95a809d25 100644
--- a/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs
+++ b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs
@@ -6,6 +6,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicyTest do
use Pleroma.DataCase
alias Pleroma.HTTP
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy
import Mock
@@ -24,6 +25,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicyTest do
test "it prefetches media proxy URIs" do
with_mock HTTP, get: fn _, _, _ -> {:ok, []} end do
MediaProxyWarmingPolicy.filter(@message)
+
+ ObanHelpers.perform_all()
+ # Performing jobs which has been just enqueued
+ ObanHelpers.perform_all()
+
assert called(HTTP.get(:_, :_, :_))
end
end
diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs
index 36a39c84c..df03b4008 100644
--- a/test/web/activity_pub/publisher_test.exs
+++ b/test/web/activity_pub/publisher_test.exs
@@ -3,15 +3,18 @@
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.PublisherTest do
- use Pleroma.DataCase
+ use Pleroma.Web.ConnCase
+ import ExUnit.CaptureLog
import Pleroma.Factory
import Tesla.Mock
import Mock
alias Pleroma.Activity
alias Pleroma.Instances
+ alias Pleroma.Object
alias Pleroma.Web.ActivityPub.Publisher
+ alias Pleroma.Web.CommonAPI
@as_public "https://www.w3.org/ns/activitystreams#Public"
@@ -188,7 +191,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
actor = insert(:user)
inbox = "http://connrefused.site/users/nick1/inbox"
- assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
+ assert capture_log(fn ->
+ assert {:error, _} =
+ Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
+ end) =~ "connrefused"
assert called(Instances.set_unreachable(inbox))
end
@@ -212,14 +218,16 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
actor = insert(:user)
inbox = "http://connrefused.site/users/nick1/inbox"
- assert {:error, _} =
- Publisher.publish_one(%{
- inbox: inbox,
- json: "{}",
- actor: actor,
- id: 1,
- unreachable_since: NaiveDateTime.utc_now()
- })
+ assert capture_log(fn ->
+ assert {:error, _} =
+ Publisher.publish_one(%{
+ inbox: inbox,
+ json: "{}",
+ actor: actor,
+ id: 1,
+ unreachable_since: NaiveDateTime.utc_now()
+ })
+ end) =~ "connrefused"
refute called(Instances.set_unreachable(inbox))
end
@@ -257,10 +265,74 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
assert called(
Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
inbox: "https://domain.com/users/nick1/inbox",
- actor: actor,
+ actor_id: actor.id,
id: note_activity.data["id"]
})
)
end
+
+ test_with_mock "publishes a delete activity to peers who signed fetch requests to the create acitvity/object.",
+ Pleroma.Web.Federator.Publisher,
+ [:passthrough],
+ [] do
+ fetcher =
+ insert(:user,
+ local: false,
+ info: %{
+ ap_enabled: true,
+ source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}
+ }
+ )
+
+ another_fetcher =
+ insert(:user,
+ local: false,
+ info: %{
+ ap_enabled: true,
+ source_data: %{"inbox" => "https://domain2.com/users/nick1/inbox"}
+ }
+ )
+
+ actor = insert(:user)
+
+ note_activity = insert(:note_activity, user: actor)
+ object = Object.normalize(note_activity)
+
+ activity_path = String.trim_leading(note_activity.data["id"], Pleroma.Web.Endpoint.url())
+ object_path = String.trim_leading(object.data["id"], Pleroma.Web.Endpoint.url())
+
+ build_conn()
+ |> put_req_header("accept", "application/activity+json")
+ |> assign(:user, fetcher)
+ |> get(object_path)
+ |> json_response(200)
+
+ build_conn()
+ |> put_req_header("accept", "application/activity+json")
+ |> assign(:user, another_fetcher)
+ |> get(activity_path)
+ |> json_response(200)
+
+ {:ok, delete} = CommonAPI.delete(note_activity.id, actor)
+
+ res = Publisher.publish(actor, delete)
+ assert res == :ok
+
+ assert called(
+ Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
+ inbox: "https://domain.com/users/nick1/inbox",
+ actor_id: actor.id,
+ id: delete.data["id"]
+ })
+ )
+
+ assert called(
+ Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
+ inbox: "https://domain2.com/users/nick1/inbox",
+ actor_id: actor.id,
+ id: delete.data["id"]
+ })
+ )
+ end
end
end
diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs
index 4f7d592a6..7315dce26 100644
--- a/test/web/activity_pub/relay_test.exs
+++ b/test/web/activity_pub/relay_test.exs
@@ -10,6 +10,7 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Relay
+ import ExUnit.CaptureLog
import Pleroma.Factory
import Mock
@@ -20,7 +21,9 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do
describe "follow/1" do
test "returns errors when user not found" do
- assert Relay.follow("test-ap-id") == {:error, "Could not fetch by AP id"}
+ assert capture_log(fn ->
+ assert Relay.follow("test-ap-id") == {:error, "Could not fetch by AP id"}
+ end) =~ "Could not fetch by AP id"
end
test "returns activity" do
@@ -37,7 +40,9 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do
describe "unfollow/1" do
test "returns errors when user not found" do
- assert Relay.unfollow("test-ap-id") == {:error, "Could not fetch by AP id"}
+ assert capture_log(fn ->
+ assert Relay.unfollow("test-ap-id") == {:error, "Could not fetch by AP id"}
+ end) =~ "Could not fetch by AP id"
end
test "returns activity" do
@@ -78,7 +83,9 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do
}
)
- assert Relay.publish(activity) == {:error, nil}
+ assert capture_log(fn ->
+ assert Relay.publish(activity) == {:error, nil}
+ end) =~ "[error] error: nil"
end
test_with_mock "returns announce activity and publish to federate",
@@ -92,7 +99,7 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do
assert activity.data["type"] == "Announce"
assert activity.data["actor"] == service_actor.ap_id
assert activity.data["object"] == obj.data["id"]
- assert called(Pleroma.Web.Federator.publish(activity, 5))
+ assert called(Pleroma.Web.Federator.publish(activity))
end
test_with_mock "returns announce activity and not publish to federate",
@@ -106,7 +113,7 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do
assert activity.data["type"] == "Announce"
assert activity.data["actor"] == service_actor.ap_id
assert activity.data["object"] == obj.data["id"]
- refute called(Pleroma.Web.Federator.publish(activity, 5))
+ refute called(Pleroma.Web.Federator.publish(activity))
end
end
end
diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs
index 0661d5d7c..6c296eb0d 100644
--- a/test/web/activity_pub/transmogrifier_test.exs
+++ b/test/web/activity_pub/transmogrifier_test.exs
@@ -8,6 +8,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
alias Pleroma.Object
alias Pleroma.Object.Fetcher
alias Pleroma.Repo
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Transmogrifier
@@ -102,7 +103,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert capture_log(fn ->
{:ok, _returned_activity} = Transmogrifier.handle_incoming(data)
- end) =~ "[error] Couldn't fetch \"\"https://404.site/whatever\"\", error: nil"
+ end) =~ "[error] Couldn't fetch \"https://404.site/whatever\", error: nil"
end
test "it works for incoming notices" do
@@ -648,6 +649,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|> Poison.decode!()
{:ok, _} = Transmogrifier.handle_incoming(data)
+ ObanHelpers.perform_all()
refute User.get_cached_by_ap_id(ap_id)
end
@@ -1210,6 +1212,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert user.info.note_count == 1
{:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye")
+ ObanHelpers.perform_all()
+
assert user.info.ap_enabled
assert user.info.note_count == 1
assert user.follower_address == "https://niu.moe/users/rye/followers"
diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs
index b1ddd898b..c497ea098 100644
--- a/test/web/admin_api/admin_api_controller_test.exs
+++ b/test/web/admin_api/admin_api_controller_test.exs
@@ -1787,7 +1787,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
%{"tuple" => [":seconds_valid", 60]},
%{"tuple" => [":path", ""]},
%{"tuple" => [":key1", nil]},
- %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}
+ %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},
+ %{"tuple" => [":regex1", "~r/https:\/\/example.com/"]},
+ %{"tuple" => [":regex2", "~r/https:\/\/example.com/u"]},
+ %{"tuple" => [":regex3", "~r/https:\/\/example.com/i"]},
+ %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]}
]
}
]
@@ -1804,7 +1808,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
%{"tuple" => [":seconds_valid", 60]},
%{"tuple" => [":path", ""]},
%{"tuple" => [":key1", nil]},
- %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}
+ %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},
+ %{"tuple" => [":regex1", "~r/https:\\/\\/example.com/"]},
+ %{"tuple" => [":regex2", "~r/https:\\/\\/example.com/u"]},
+ %{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]},
+ %{"tuple" => [":regex4", "~r/https:\\/\\/example.com/s"]}
]
}
]
@@ -2096,7 +2104,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
post(conn, "/api/pleroma/admin/config", %{
configs: [
%{
- "group" => "pleroma_job_queue",
+ "group" => "oban",
"key" => ":queues",
"value" => [
%{"tuple" => [":federator_incoming", 50]},
@@ -2114,7 +2122,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
assert json_response(conn, 200) == %{
"configs" => [
%{
- "group" => "pleroma_job_queue",
+ "group" => "oban",
"key" => ":queues",
"value" => [
%{"tuple" => [":federator_incoming", 50]},
diff --git a/test/web/admin_api/config_test.exs b/test/web/admin_api/config_test.exs
index 3190dc1c8..204446b79 100644
--- a/test/web/admin_api/config_test.exs
+++ b/test/web/admin_api/config_test.exs
@@ -103,6 +103,30 @@ defmodule Pleroma.Web.AdminAPI.ConfigTest do
assert Config.from_binary(binary) == ~r/comp[lL][aA][iI][nN]er/
end
+ test "link sigil" do
+ binary = Config.transform("~r/https:\/\/example.com/")
+ assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/)
+ assert Config.from_binary(binary) == ~r/https:\/\/example.com/
+ end
+
+ test "link sigil with u modifier" do
+ binary = Config.transform("~r/https:\/\/example.com/u")
+ assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/u)
+ assert Config.from_binary(binary) == ~r/https:\/\/example.com/u
+ end
+
+ test "link sigil with i modifier" do
+ binary = Config.transform("~r/https:\/\/example.com/i")
+ assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/i)
+ assert Config.from_binary(binary) == ~r/https:\/\/example.com/i
+ end
+
+ test "link sigil with s modifier" do
+ binary = Config.transform("~r/https:\/\/example.com/s")
+ assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/s)
+ assert Config.from_binary(binary) == ~r/https:\/\/example.com/s
+ end
+
test "2 child tuple" do
binary = Config.transform(%{"tuple" => ["v1", ":v2"]})
assert binary == :erlang.term_to_binary({"v1", :v2})
diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs
index 09e54533f..4096d4690 100644
--- a/test/web/federator_test.exs
+++ b/test/web/federator_test.exs
@@ -4,9 +4,14 @@
defmodule Pleroma.Web.FederatorTest do
alias Pleroma.Instances
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.Federator
+ alias Pleroma.Workers.PublisherWorker
+
use Pleroma.DataCase
+ use Oban.Testing, repo: Pleroma.Repo
+
import Pleroma.Factory
import Mock
@@ -24,15 +29,6 @@ defmodule Pleroma.Web.FederatorTest do
clear_config([:instance, :rewrite_policy])
clear_config([:mrf_keyword])
- describe "Publisher.perform" do
- test "call `perform` with unknown task" do
- assert {
- :error,
- "Don't know what to do with this"
- } = Pleroma.Web.Federator.Publisher.perform("test", :ok, :ok)
- end
- end
-
describe "Publish an activity" do
setup do
user = insert(:user)
@@ -53,6 +49,7 @@ defmodule Pleroma.Web.FederatorTest do
} do
with_mocks([relay_mock]) do
Federator.publish(activity)
+ ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
end
assert_received :relay_publish
@@ -66,6 +63,7 @@ defmodule Pleroma.Web.FederatorTest do
with_mocks([relay_mock]) do
Federator.publish(activity)
+ ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
end
refute_received :relay_publish
@@ -73,10 +71,7 @@ defmodule Pleroma.Web.FederatorTest do
end
describe "Targets reachability filtering in `publish`" do
- test_with_mock "it federates only to reachable instances via AP",
- Pleroma.Web.ActivityPub.Publisher,
- [:passthrough],
- [] do
+ test "it federates only to reachable instances via AP" do
user = insert(:user)
{inbox1, inbox2} =
@@ -104,20 +99,20 @@ defmodule Pleroma.Web.FederatorTest do
{:ok, _activity} =
CommonAPI.post(user, %{"status" => "HI @nick1@domain.com, @nick2@domain2.com!"})
- assert called(
- Pleroma.Web.ActivityPub.Publisher.publish_one(%{
- inbox: inbox1,
- unreachable_since: dt
- })
- )
+ expected_dt = NaiveDateTime.to_iso8601(dt)
- refute called(Pleroma.Web.ActivityPub.Publisher.publish_one(%{inbox: inbox2}))
+ ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
+
+ assert ObanHelpers.member?(
+ %{
+ "op" => "publish_one",
+ "params" => %{"inbox" => inbox1, "unreachable_since" => expected_dt}
+ },
+ all_enqueued(worker: PublisherWorker)
+ )
end
- test_with_mock "it federates only to reachable instances via Websub",
- Pleroma.Web.Websub,
- [:passthrough],
- [] do
+ test "it federates only to reachable instances via Websub" do
user = insert(:user)
websub_topic = Pleroma.Web.OStatus.feed_path(user)
@@ -142,23 +137,27 @@ defmodule Pleroma.Web.FederatorTest do
{:ok, _activity} = CommonAPI.post(user, %{"status" => "HI"})
- assert called(
- Pleroma.Web.Websub.publish_one(%{
- callback: sub2.callback,
- unreachable_since: dt
- })
- )
+ expected_callback = sub2.callback
+ expected_dt = NaiveDateTime.to_iso8601(dt)
+
+ ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
- refute called(Pleroma.Web.Websub.publish_one(%{callback: sub1.callback}))
+ assert ObanHelpers.member?(
+ %{
+ "op" => "publish_one",
+ "params" => %{
+ "callback" => expected_callback,
+ "unreachable_since" => expected_dt
+ }
+ },
+ all_enqueued(worker: PublisherWorker)
+ )
end
- test_with_mock "it federates only to reachable instances via Salmon",
- Pleroma.Web.Salmon,
- [:passthrough],
- [] do
+ test "it federates only to reachable instances via Salmon" do
user = insert(:user)
- remote_user1 =
+ _remote_user1 =
insert(:user, %{
local: false,
nickname: "nick1@domain.com",
@@ -174,6 +173,8 @@ defmodule Pleroma.Web.FederatorTest do
info: %{salmon: "https://domain2.com/salmon"}
})
+ remote_user2_id = remote_user2.id
+
dt = NaiveDateTime.utc_now()
Instances.set_unreachable(remote_user2.ap_id, dt)
@@ -182,14 +183,20 @@ defmodule Pleroma.Web.FederatorTest do
{:ok, _activity} =
CommonAPI.post(user, %{"status" => "HI @nick1@domain.com, @nick2@domain2.com!"})
- assert called(
- Pleroma.Web.Salmon.publish_one(%{
- recipient: remote_user2,
- unreachable_since: dt
- })
- )
+ expected_dt = NaiveDateTime.to_iso8601(dt)
+
+ ObanHelpers.perform(all_enqueued(worker: PublisherWorker))
- refute called(Pleroma.Web.Salmon.publish_one(%{recipient: remote_user1}))
+ assert ObanHelpers.member?(
+ %{
+ "op" => "publish_one",
+ "params" => %{
+ "recipient_id" => remote_user2_id,
+ "unreachable_since" => expected_dt
+ }
+ },
+ all_enqueued(worker: PublisherWorker)
+ )
end
end
@@ -209,7 +216,8 @@ defmodule Pleroma.Web.FederatorTest do
"to" => ["https://www.w3.org/ns/activitystreams#Public"]
}
- {:ok, _activity} = Federator.incoming_ap_doc(params)
+ assert {:ok, job} = Federator.incoming_ap_doc(params)
+ assert {:ok, _activity} = ObanHelpers.perform(job)
end
test "rejects incoming AP docs with incorrect origin" do
@@ -227,7 +235,8 @@ defmodule Pleroma.Web.FederatorTest do
"to" => ["https://www.w3.org/ns/activitystreams#Public"]
}
- :error = Federator.incoming_ap_doc(params)
+ assert {:ok, job} = Federator.incoming_ap_doc(params)
+ assert :error = ObanHelpers.perform(job)
end
test "it does not crash if MRF rejects the post" do
@@ -242,7 +251,8 @@ defmodule Pleroma.Web.FederatorTest do
File.read!("test/fixtures/mastodon-post-activity.json")
|> Poison.decode!()
- assert Federator.incoming_ap_doc(params) == :error
+ assert {:ok, job} = Federator.incoming_ap_doc(params)
+ assert :error = ObanHelpers.perform(job)
end
end
end
diff --git a/test/web/instances/instance_test.exs b/test/web/instances/instance_test.exs
index 3fd011fd3..0b53bc6cd 100644
--- a/test/web/instances/instance_test.exs
+++ b/test/web/instances/instance_test.exs
@@ -16,7 +16,8 @@ defmodule Pleroma.Instances.InstanceTest do
describe "set_reachable/1" do
test "clears `unreachable_since` of existing matching Instance record having non-nil `unreachable_since`" do
- instance = insert(:instance, unreachable_since: NaiveDateTime.utc_now())
+ unreachable_since = NaiveDateTime.to_iso8601(NaiveDateTime.utc_now())
+ instance = insert(:instance, unreachable_since: unreachable_since)
assert {:ok, instance} = Instance.set_reachable(instance.host)
refute instance.unreachable_since
diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs
index 4fd0a5aeb..fb04748bb 100644
--- a/test/web/mastodon_api/mastodon_api_controller_test.exs
+++ b/test/web/mastodon_api/mastodon_api_controller_test.exs
@@ -13,6 +13,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.ScheduledActivity
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.CommonAPI
@@ -21,7 +22,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
alias Pleroma.Web.OAuth.Token
alias Pleroma.Web.OStatus
alias Pleroma.Web.Push
- alias Pleroma.Web.TwitterAPI.TwitterAPI
import Pleroma.Factory
import ExUnit.CaptureLog
import Tesla.Mock
@@ -745,6 +745,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert id == to_string(activity.id)
end
+ test "get statuses by IDs", %{conn: conn} do
+ %{id: id1} = insert(:note_activity)
+ %{id: id2} = insert(:note_activity)
+
+ query_string = "ids[]=#{id1}&ids[]=#{id2}"
+ conn = get(conn, "/api/v1/statuses/?#{query_string}")
+
+ assert [%{"id" => ^id1}, %{"id" => ^id2}] = Enum.sort_by(json_response(conn, :ok), & &1["id"])
+ end
+
describe "deleting a status" do
test "when you created it", %{conn: conn} do
activity = insert(:note_activity)
@@ -1484,12 +1494,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
filename: "an_image.jpg"
}
- media =
- TwitterAPI.upload(file, user, "json")
- |> Jason.decode!()
+ {:ok, %{id: media_id}} = ActivityPub.upload(file, actor: user.ap_id)
- {:ok, image_post} =
- CommonAPI.post(user, %{"status" => "cofe", "media_ids" => [media["media_id"]]})
+ {:ok, image_post} = CommonAPI.post(user, %{"status" => "cofe", "media_ids" => [media_id]})
conn =
conn
@@ -1675,32 +1682,85 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end
end
- test "account fetching", %{conn: conn} do
- user = insert(:user)
+ describe "account fetching" do
+ test "works by id" do
+ user = insert(:user)
- conn =
- conn
- |> get("/api/v1/accounts/#{user.id}")
+ conn =
+ build_conn()
+ |> get("/api/v1/accounts/#{user.id}")
- assert %{"id" => id} = json_response(conn, 200)
- assert id == to_string(user.id)
+ assert %{"id" => id} = json_response(conn, 200)
+ assert id == to_string(user.id)
- conn =
- build_conn()
- |> get("/api/v1/accounts/-1")
+ conn =
+ build_conn()
+ |> get("/api/v1/accounts/-1")
- assert %{"error" => "Can't find user"} = json_response(conn, 404)
- end
+ assert %{"error" => "Can't find user"} = json_response(conn, 404)
+ end
- test "account fetching also works nickname", %{conn: conn} do
- user = insert(:user)
+ test "works by nickname" do
+ user = insert(:user)
- conn =
- conn
- |> get("/api/v1/accounts/#{user.nickname}")
+ conn =
+ build_conn()
+ |> get("/api/v1/accounts/#{user.nickname}")
- assert %{"id" => id} = json_response(conn, 200)
- assert id == user.id
+ assert %{"id" => id} = json_response(conn, 200)
+ assert id == user.id
+ end
+
+ test "works by nickname for remote users" do
+ limit_to_local = Pleroma.Config.get([:instance, :limit_to_local_content])
+ Pleroma.Config.put([:instance, :limit_to_local_content], false)
+ user = insert(:user, nickname: "user@example.com", local: false)
+
+ conn =
+ build_conn()
+ |> get("/api/v1/accounts/#{user.nickname}")
+
+ Pleroma.Config.put([:instance, :limit_to_local_content], limit_to_local)
+ assert %{"id" => id} = json_response(conn, 200)
+ assert id == user.id
+ end
+
+ test "respects limit_to_local_content == :all for remote user nicknames" do
+ limit_to_local = Pleroma.Config.get([:instance, :limit_to_local_content])
+ Pleroma.Config.put([:instance, :limit_to_local_content], :all)
+
+ user = insert(:user, nickname: "user@example.com", local: false)
+
+ conn =
+ build_conn()
+ |> get("/api/v1/accounts/#{user.nickname}")
+
+ Pleroma.Config.put([:instance, :limit_to_local_content], limit_to_local)
+ assert json_response(conn, 404)
+ end
+
+ test "respects limit_to_local_content == :unauthenticated for remote user nicknames" do
+ limit_to_local = Pleroma.Config.get([:instance, :limit_to_local_content])
+ Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
+
+ user = insert(:user, nickname: "user@example.com", local: false)
+ reading_user = insert(:user)
+
+ conn =
+ build_conn()
+ |> get("/api/v1/accounts/#{user.nickname}")
+
+ assert json_response(conn, 404)
+
+ conn =
+ build_conn()
+ |> assign(:user, reading_user)
+ |> get("/api/v1/accounts/#{user.nickname}")
+
+ Pleroma.Config.put([:instance, :limit_to_local_content], limit_to_local)
+ assert %{"id" => id} = json_response(conn, 200)
+ assert id == user.id
+ end
end
test "mascot upload", %{conn: conn} do
@@ -3639,7 +3699,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
build_conn()
|> assign(:user, user)
- [conn: conn, activity: activity]
+ [conn: conn, activity: activity, user: user]
end
test "returns users who have favorited the status", %{conn: conn, activity: activity} do
@@ -3699,6 +3759,32 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
[%{"id" => id}] = response
assert id == other_user.id
end
+
+ test "requires authentification for private posts", %{conn: conn, user: user} do
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "@#{other_user.nickname} wanna get some #cofe together?",
+ "visibility" => "direct"
+ })
+
+ {:ok, _, _} = CommonAPI.favorite(activity.id, other_user)
+
+ conn
+ |> assign(:user, nil)
+ |> get("/api/v1/statuses/#{activity.id}/favourited_by")
+ |> json_response(404)
+
+ response =
+ build_conn()
+ |> assign(:user, other_user)
+ |> get("/api/v1/statuses/#{activity.id}/favourited_by")
+ |> json_response(200)
+
+ [%{"id" => id}] = response
+ assert id == other_user.id
+ end
end
describe "GET /api/v1/statuses/:id/reblogged_by" do
@@ -3710,7 +3796,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
build_conn()
|> assign(:user, user)
- [conn: conn, activity: activity]
+ [conn: conn, activity: activity, user: user]
end
test "returns users who have reblogged the status", %{conn: conn, activity: activity} do
@@ -3770,6 +3856,29 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
[%{"id" => id}] = response
assert id == other_user.id
end
+
+ test "requires authentification for private posts", %{conn: conn, user: user} do
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "@#{other_user.nickname} wanna get some #cofe together?",
+ "visibility" => "direct"
+ })
+
+ conn
+ |> assign(:user, nil)
+ |> get("/api/v1/statuses/#{activity.id}/reblogged_by")
+ |> json_response(404)
+
+ response =
+ build_conn()
+ |> assign(:user, other_user)
+ |> get("/api/v1/statuses/#{activity.id}/reblogged_by")
+ |> json_response(200)
+
+ assert [] == response
+ end
end
describe "POST /auth/password, with valid parameters" do
@@ -3789,6 +3898,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end
test "it sends an email to user", %{user: user} do
+ ObanHelpers.perform_all()
token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token)
@@ -3849,6 +3959,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|> post("/api/v1/pleroma/accounts/confirmation_resend?email=#{user.email}")
|> json_response(:no_content)
+ ObanHelpers.perform_all()
+
email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
notify_email = Config.get([:instance, :notify_email])
instance_name = Config.get([:instance, :name])
@@ -3904,13 +4016,15 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
Config.put([:suggestions, :enabled], true)
Config.put([:suggestions, :third_party_engine], "http://test500?{{host}}&{{user}}")
- res =
- conn
- |> assign(:user, user)
- |> get("/api/v1/suggestions")
- |> json_response(500)
+ assert capture_log(fn ->
+ res =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/suggestions")
+ |> json_response(500)
- assert res == "Something went wrong"
+ assert res == "Something went wrong"
+ end) =~ "Could not retrieve suggestions"
end
test "returns suggestions", %{conn: conn, user: user, other_user: other_user} do
diff --git a/test/web/mastodon_api/mastodon_api_test.exs b/test/web/mastodon_api/mastodon_api_test.exs
index b4c0427c9..7fcb2bd55 100644
--- a/test/web/mastodon_api/mastodon_api_test.exs
+++ b/test/web/mastodon_api/mastodon_api_test.exs
@@ -8,8 +8,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPITest do
alias Pleroma.Notification
alias Pleroma.ScheduledActivity
alias Pleroma.User
+ alias Pleroma.Web.CommonAPI
alias Pleroma.Web.MastodonAPI.MastodonAPI
- alias Pleroma.Web.TwitterAPI.TwitterAPI
import Pleroma.Factory
@@ -75,8 +75,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPITest do
User.subscribe(subscriber, user)
- {:ok, status} = TwitterAPI.create_status(user, %{"status" => "Akariiiin"})
- {:ok, status1} = TwitterAPI.create_status(user, %{"status" => "Magi"})
+ {:ok, status} = CommonAPI.post(user, %{"status" => "Akariiiin"})
+
+ {:ok, status1} = CommonAPI.post(user, %{"status" => "Magi"})
{:ok, [notification]} = Notification.create_notifications(status)
{:ok, [notification1]} = Notification.create_notifications(status1)
res = MastodonAPI.get_notifications(subscriber)
diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs
index 90451cbdc..fcdd7fbcb 100644
--- a/test/web/mastodon_api/views/status_view_test.exs
+++ b/test/web/mastodon_api/views/status_view_test.exs
@@ -551,6 +551,14 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
assert Enum.at(result[:options], 1)[:votes_count] == 1
assert Enum.at(result[:options], 2)[:votes_count] == 1
end
+
+ test "does not crash on polls with no end date" do
+ object = Object.normalize("https://skippers-bin.com/notes/7x9tmrp97i")
+ result = StatusView.render("poll.json", %{object: object})
+
+ assert result[:expires_at] == nil
+ assert result[:expired] == false
+ end
end
test "embeds a relationship in the account" do
diff --git a/test/web/retry_queue_test.exs b/test/web/retry_queue_test.exs
deleted file mode 100644
index ecb3ce5d0..000000000
--- a/test/web/retry_queue_test.exs
+++ /dev/null
@@ -1,48 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule MockActivityPub do
- def publish_one({ret, waiter}) do
- send(waiter, :complete)
- {ret, "success"}
- end
-end
-
-defmodule Pleroma.Web.Federator.RetryQueueTest do
- use Pleroma.DataCase
- alias Pleroma.Web.Federator.RetryQueue
-
- @small_retry_count 0
- @hopeless_retry_count 10
-
- setup do
- RetryQueue.reset_stats()
- end
-
- test "RetryQueue responds to stats request" do
- assert %{delivered: 0, dropped: 0} == RetryQueue.get_stats()
- end
-
- test "failed posts are retried" do
- {:retry, _timeout} = RetryQueue.get_retry_params(@small_retry_count)
-
- wait_task =
- Task.async(fn ->
- receive do
- :complete -> :ok
- end
- end)
-
- RetryQueue.enqueue({:ok, wait_task.pid}, MockActivityPub, @small_retry_count)
- Task.await(wait_task)
- assert %{delivered: 1, dropped: 0} == RetryQueue.get_stats()
- end
-
- test "posts that have been tried too many times are dropped" do
- {:drop, _timeout} = RetryQueue.get_retry_params(@hopeless_retry_count)
-
- RetryQueue.enqueue({:ok, nil}, MockActivityPub, @hopeless_retry_count)
- assert %{delivered: 0, dropped: 1} == RetryQueue.get_stats()
- end
-end
diff --git a/test/web/salmon/salmon_test.exs b/test/web/salmon/salmon_test.exs
index e86e76fe9..0186f3fef 100644
--- a/test/web/salmon/salmon_test.exs
+++ b/test/web/salmon/salmon_test.exs
@@ -96,6 +96,6 @@ defmodule Pleroma.Web.Salmon.SalmonTest do
Salmon.publish(user, activity)
- assert called(Publisher.enqueue_one(Salmon, %{recipient: mentioned_user}))
+ assert called(Publisher.enqueue_one(Salmon, %{recipient_id: mentioned_user.id}))
end
end
diff --git a/test/web/streamer/ping_test.exs b/test/web/streamer/ping_test.exs
new file mode 100644
index 000000000..3d52c00e4
--- /dev/null
+++ b/test/web/streamer/ping_test.exs
@@ -0,0 +1,36 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.PingTest do
+ use Pleroma.DataCase
+
+ import Pleroma.Factory
+ alias Pleroma.Web.Streamer
+
+ setup do
+ start_supervised({Streamer.supervisor(), [ping_interval: 30]})
+
+ :ok
+ end
+
+ describe "sockets" do
+ setup do
+ user = insert(:user)
+ {:ok, %{user: user}}
+ end
+
+ test "it sends pings", %{user: user} do
+ task =
+ Task.async(fn ->
+ assert_receive {:text, received_event}, 40
+ assert_receive {:text, received_event}, 40
+ assert_receive {:text, received_event}, 40
+ end)
+
+ Streamer.add_socket("public", %{transport_pid: task.pid, assigns: %{user: user}})
+
+ Task.await(task)
+ end
+ end
+end
diff --git a/test/web/streamer/state_test.exs b/test/web/streamer/state_test.exs
new file mode 100644
index 000000000..d1aeac541
--- /dev/null
+++ b/test/web/streamer/state_test.exs
@@ -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.Web.StateTest do
+ use Pleroma.DataCase
+
+ import Pleroma.Factory
+ alias Pleroma.Web.Streamer
+ alias Pleroma.Web.Streamer.StreamerSocket
+
+ @moduletag needs_streamer: true
+
+ describe "sockets" do
+ setup do
+ user = insert(:user)
+ user2 = insert(:user)
+ {:ok, %{user: user, user2: user2}}
+ end
+
+ test "it can add a socket", %{user: user} do
+ Streamer.add_socket("public", %{transport_pid: 1, assigns: %{user: user}})
+
+ assert(%{"public" => [%StreamerSocket{transport_pid: 1}]} = Streamer.get_sockets())
+ end
+
+ test "it can add multiple sockets per user", %{user: user} do
+ Streamer.add_socket("public", %{transport_pid: 1, assigns: %{user: user}})
+ Streamer.add_socket("public", %{transport_pid: 2, assigns: %{user: user}})
+
+ assert(
+ %{
+ "public" => [
+ %StreamerSocket{transport_pid: 2},
+ %StreamerSocket{transport_pid: 1}
+ ]
+ } = Streamer.get_sockets()
+ )
+ end
+
+ test "it will not add a duplicate socket", %{user: user} do
+ Streamer.add_socket("activity", %{transport_pid: 1, assigns: %{user: user}})
+ Streamer.add_socket("activity", %{transport_pid: 1, assigns: %{user: user}})
+
+ assert(
+ %{
+ "activity" => [
+ %StreamerSocket{transport_pid: 1}
+ ]
+ } = Streamer.get_sockets()
+ )
+ end
+ end
+end
diff --git a/test/web/streamer_test.exs b/test/web/streamer/streamer_test.exs
index 96fa7645f..88847e20f 100644
--- a/test/web/streamer_test.exs
+++ b/test/web/streamer/streamer_test.exs
@@ -5,24 +5,20 @@
defmodule Pleroma.Web.StreamerTest do
use Pleroma.DataCase
+ import Pleroma.Factory
+
alias Pleroma.List
alias Pleroma.User
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.Streamer
- import Pleroma.Factory
+ alias Pleroma.Web.Streamer.StreamerSocket
+ alias Pleroma.Web.Streamer.Worker
+ @moduletag needs_streamer: true
clear_config_all([:instance, :skip_thread_containment])
describe "user streams" do
setup do
- GenServer.start(Streamer, %{}, name: Streamer)
-
- on_exit(fn ->
- if pid = Process.whereis(Streamer) do
- Process.exit(pid, :kill)
- end
- end)
-
user = insert(:user)
notify = insert(:notification, user: user, activity: build(:note_activity))
{:ok, %{user: user, notify: notify}}
@@ -125,11 +121,9 @@ defmodule Pleroma.Web.StreamerTest do
assert_receive {:text, _}, 4_000
end)
- fake_socket = %{
+ fake_socket = %StreamerSocket{
transport_pid: task.pid,
- assigns: %{
- user: user
- }
+ user: user
}
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "Test"})
@@ -138,7 +132,7 @@ defmodule Pleroma.Web.StreamerTest do
"public" => [fake_socket]
}
- Streamer.push_to_socket(topics, "public", activity)
+ Worker.push_to_socket(topics, "public", activity)
Task.await(task)
@@ -155,11 +149,9 @@ defmodule Pleroma.Web.StreamerTest do
assert received_event == expected_event
end)
- fake_socket = %{
+ fake_socket = %StreamerSocket{
transport_pid: task.pid,
- assigns: %{
- user: user
- }
+ user: user
}
{:ok, activity} = CommonAPI.delete(activity.id, other_user)
@@ -168,7 +160,7 @@ defmodule Pleroma.Web.StreamerTest do
"public" => [fake_socket]
}
- Streamer.push_to_socket(topics, "public", activity)
+ Worker.push_to_socket(topics, "public", activity)
Task.await(task)
end
@@ -189,9 +181,9 @@ defmodule Pleroma.Web.StreamerTest do
)
task = Task.async(fn -> refute_receive {:text, _}, 1_000 end)
- fake_socket = %{transport_pid: task.pid, assigns: %{user: user}}
+ fake_socket = %StreamerSocket{transport_pid: task.pid, user: user}
topics = %{"public" => [fake_socket]}
- Streamer.push_to_socket(topics, "public", activity)
+ Worker.push_to_socket(topics, "public", activity)
Task.await(task)
end
@@ -211,9 +203,9 @@ defmodule Pleroma.Web.StreamerTest do
)
task = Task.async(fn -> assert_receive {:text, _}, 1_000 end)
- fake_socket = %{transport_pid: task.pid, assigns: %{user: user}}
+ fake_socket = %StreamerSocket{transport_pid: task.pid, user: user}
topics = %{"public" => [fake_socket]}
- Streamer.push_to_socket(topics, "public", activity)
+ Worker.push_to_socket(topics, "public", activity)
Task.await(task)
end
@@ -233,9 +225,9 @@ defmodule Pleroma.Web.StreamerTest do
)
task = Task.async(fn -> assert_receive {:text, _}, 1_000 end)
- fake_socket = %{transport_pid: task.pid, assigns: %{user: user}}
+ fake_socket = %StreamerSocket{transport_pid: task.pid, user: user}
topics = %{"public" => [fake_socket]}
- Streamer.push_to_socket(topics, "public", activity)
+ Worker.push_to_socket(topics, "public", activity)
Task.await(task)
end
@@ -251,11 +243,9 @@ defmodule Pleroma.Web.StreamerTest do
refute_receive {:text, _}, 1_000
end)
- fake_socket = %{
+ fake_socket = %StreamerSocket{
transport_pid: task.pid,
- assigns: %{
- user: user
- }
+ user: user
}
{:ok, activity} = CommonAPI.post(blocked_user, %{"status" => "Test"})
@@ -264,7 +254,7 @@ defmodule Pleroma.Web.StreamerTest do
"public" => [fake_socket]
}
- Streamer.push_to_socket(topics, "public", activity)
+ Worker.push_to_socket(topics, "public", activity)
Task.await(task)
end
@@ -284,11 +274,9 @@ defmodule Pleroma.Web.StreamerTest do
refute_receive {:text, _}, 1_000
end)
- fake_socket = %{
+ fake_socket = %StreamerSocket{
transport_pid: task.pid,
- assigns: %{
- user: user_a
- }
+ user: user_a
}
{:ok, activity} =
@@ -301,7 +289,7 @@ defmodule Pleroma.Web.StreamerTest do
"list:#{list.id}" => [fake_socket]
}
- Streamer.handle_cast(%{action: :stream, topic: "list", item: activity}, topics)
+ Worker.handle_call({:stream, "list", activity}, self(), topics)
Task.await(task)
end
@@ -318,11 +306,9 @@ defmodule Pleroma.Web.StreamerTest do
refute_receive {:text, _}, 1_000
end)
- fake_socket = %{
+ fake_socket = %StreamerSocket{
transport_pid: task.pid,
- assigns: %{
- user: user_a
- }
+ user: user_a
}
{:ok, activity} =
@@ -335,12 +321,12 @@ defmodule Pleroma.Web.StreamerTest do
"list:#{list.id}" => [fake_socket]
}
- Streamer.handle_cast(%{action: :stream, topic: "list", item: activity}, topics)
+ Worker.handle_call({:stream, "list", activity}, self(), topics)
Task.await(task)
end
- test "it send wanted private posts to list" do
+ test "it sends wanted private posts to list" do
user_a = insert(:user)
user_b = insert(:user)
@@ -354,11 +340,9 @@ defmodule Pleroma.Web.StreamerTest do
assert_receive {:text, _}, 1_000
end)
- fake_socket = %{
+ fake_socket = %StreamerSocket{
transport_pid: task.pid,
- assigns: %{
- user: user_a
- }
+ user: user_a
}
{:ok, activity} =
@@ -367,11 +351,12 @@ defmodule Pleroma.Web.StreamerTest do
"visibility" => "private"
})
- topics = %{
- "list:#{list.id}" => [fake_socket]
- }
+ Streamer.add_socket(
+ "list:#{list.id}",
+ fake_socket
+ )
- Streamer.handle_cast(%{action: :stream, topic: "list", item: activity}, topics)
+ Worker.handle_call({:stream, "list", activity}, self(), %{})
Task.await(task)
end
@@ -387,11 +372,9 @@ defmodule Pleroma.Web.StreamerTest do
refute_receive {:text, _}, 1_000
end)
- fake_socket = %{
+ fake_socket = %StreamerSocket{
transport_pid: task.pid,
- assigns: %{
- user: user1
- }
+ user: user1
}
{:ok, create_activity} = CommonAPI.post(user3, %{"status" => "I'm kawen"})
@@ -401,7 +384,7 @@ defmodule Pleroma.Web.StreamerTest do
"public" => [fake_socket]
}
- Streamer.push_to_socket(topics, "public", announce_activity)
+ Worker.push_to_socket(topics, "public", announce_activity)
Task.await(task)
end
@@ -417,6 +400,8 @@ defmodule Pleroma.Web.StreamerTest do
task = Task.async(fn -> refute_receive {:text, _}, 4_000 end)
+ Process.sleep(4000)
+
Streamer.add_socket(
"user",
%{transport_pid: task.pid, assigns: %{user: user2}}
@@ -428,14 +413,6 @@ defmodule Pleroma.Web.StreamerTest do
describe "direct streams" do
setup do
- GenServer.start(Streamer, %{}, name: Streamer)
-
- on_exit(fn ->
- if pid = Process.whereis(Streamer) do
- Process.exit(pid, :kill)
- end
- end)
-
:ok
end
@@ -480,6 +457,8 @@ defmodule Pleroma.Web.StreamerTest do
refute_receive {:text, _}, 4_000
end)
+ Process.sleep(1000)
+
Streamer.add_socket(
"direct",
%{transport_pid: task.pid, assigns: %{user: user}}
@@ -521,6 +500,8 @@ defmodule Pleroma.Web.StreamerTest do
assert last_status["id"] == to_string(create_activity.id)
end)
+ Process.sleep(1000)
+
Streamer.add_socket(
"direct",
%{transport_pid: task.pid, assigns: %{user: user}}
diff --git a/test/web/twitter_api/representers/object_representer_test.exs b/test/web/twitter_api/representers/object_representer_test.exs
deleted file mode 100644
index c3cf330f1..000000000
--- a/test/web/twitter_api/representers/object_representer_test.exs
+++ /dev/null
@@ -1,60 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.TwitterAPI.Representers.ObjectReprenterTest do
- use Pleroma.DataCase
-
- alias Pleroma.Object
- alias Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter
-
- test "represent an image attachment" do
- object = %Object{
- id: 5,
- data: %{
- "type" => "Image",
- "url" => [
- %{
- "mediaType" => "sometype",
- "href" => "someurl"
- }
- ],
- "uuid" => 6
- }
- }
-
- expected_object = %{
- id: 6,
- url: "someurl",
- mimetype: "sometype",
- oembed: false,
- description: nil
- }
-
- assert expected_object == ObjectRepresenter.to_map(object)
- end
-
- test "represents mastodon-style attachments" do
- object = %Object{
- id: nil,
- data: %{
- "mediaType" => "image/png",
- "name" => "blabla",
- "type" => "Document",
- "url" =>
- "http://mastodon.example.org/system/media_attachments/files/000/000/001/original/8619f31c6edec470.png"
- }
- }
-
- expected_object = %{
- url:
- "http://mastodon.example.org/system/media_attachments/files/000/000/001/original/8619f31c6edec470.png",
- mimetype: "image/png",
- oembed: false,
- id: nil,
- description: "blabla"
- }
-
- assert expected_object == ObjectRepresenter.to_map(object)
- end
-end
diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs
deleted file mode 100644
index 8ef14b4c5..000000000
--- a/test/web/twitter_api/twitter_api_controller_test.exs
+++ /dev/null
@@ -1,2150 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.TwitterAPI.ControllerTest do
- use Pleroma.Web.ConnCase
- alias Comeonin.Pbkdf2
- alias Ecto.Changeset
- alias Pleroma.Activity
- alias Pleroma.Builders.ActivityBuilder
- alias Pleroma.Builders.UserBuilder
- alias Pleroma.Notification
- alias Pleroma.Object
- alias Pleroma.Repo
- alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.OAuth.Token
- alias Pleroma.Web.TwitterAPI.ActivityView
- alias Pleroma.Web.TwitterAPI.Controller
- alias Pleroma.Web.TwitterAPI.NotificationView
- alias Pleroma.Web.TwitterAPI.TwitterAPI
- alias Pleroma.Web.TwitterAPI.UserView
-
- import Mock
- import Pleroma.Factory
- import Swoosh.TestAssertions
-
- @banner "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7"
-
- describe "POST /api/account/update_profile_banner" do
- test "it updates the banner", %{conn: conn} do
- user = insert(:user)
-
- conn
- |> assign(:user, user)
- |> post(authenticated_twitter_api__path(conn, :update_banner), %{"banner" => @banner})
- |> json_response(200)
-
- user = refresh_record(user)
- assert user.info.banner["type"] == "Image"
- end
-
- test "profile banner can be reset", %{conn: conn} do
- user = insert(:user)
-
- conn
- |> assign(:user, user)
- |> post(authenticated_twitter_api__path(conn, :update_banner), %{"banner" => ""})
- |> json_response(200)
-
- user = refresh_record(user)
- assert user.info.banner == %{}
- end
- end
-
- describe "POST /api/qvitter/update_background_image" do
- test "it updates the background", %{conn: conn} do
- user = insert(:user)
-
- conn
- |> assign(:user, user)
- |> post(authenticated_twitter_api__path(conn, :update_background), %{"img" => @banner})
- |> json_response(200)
-
- user = refresh_record(user)
- assert user.info.background["type"] == "Image"
- end
-
- test "background can be reset", %{conn: conn} do
- user = insert(:user)
-
- conn
- |> assign(:user, user)
- |> post(authenticated_twitter_api__path(conn, :update_background), %{"img" => ""})
- |> json_response(200)
-
- user = refresh_record(user)
- assert user.info.background == %{}
- end
- end
-
- describe "POST /api/account/verify_credentials" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = post(conn, "/api/account/verify_credentials.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: user} do
- response =
- conn
- |> with_credentials(user.nickname, "test")
- |> post("/api/account/verify_credentials.json")
- |> json_response(200)
-
- assert response ==
- UserView.render("show.json", %{user: user, token: response["token"], for: user})
- end
- end
-
- describe "POST /statuses/update.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = post(conn, "/api/statuses/update.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: user} do
- conn_with_creds = conn |> with_credentials(user.nickname, "test")
- request_path = "/api/statuses/update.json"
-
- error_response = %{
- "request" => request_path,
- "error" => "Client must provide a 'status' parameter with a value."
- }
-
- conn =
- conn_with_creds
- |> post(request_path)
-
- assert json_response(conn, 400) == error_response
-
- conn =
- conn_with_creds
- |> post(request_path, %{status: ""})
-
- assert json_response(conn, 400) == error_response
-
- conn =
- conn_with_creds
- |> post(request_path, %{status: " "})
-
- assert json_response(conn, 400) == error_response
-
- # we post with visibility private in order to avoid triggering relay
- conn =
- conn_with_creds
- |> post(request_path, %{status: "Nice meme.", visibility: "private"})
-
- assert json_response(conn, 200) ==
- ActivityView.render("activity.json", %{
- activity: Repo.one(Activity),
- user: user,
- for: user
- })
- end
- end
-
- describe "GET /statuses/public_timeline.json" do
- setup [:valid_user]
- clear_config([:instance, :public])
-
- test "returns statuses", %{conn: conn} do
- user = insert(:user)
- activities = ActivityBuilder.insert_list(30, %{}, %{user: user})
- ActivityBuilder.insert_list(10, %{}, %{user: user})
- since_id = List.last(activities).id
-
- conn =
- conn
- |> get("/api/statuses/public_timeline.json", %{since_id: since_id})
-
- response = json_response(conn, 200)
-
- assert length(response) == 10
- end
-
- test "returns 403 to unauthenticated request when the instance is not public", %{conn: conn} do
- Pleroma.Config.put([:instance, :public], false)
-
- conn
- |> get("/api/statuses/public_timeline.json")
- |> json_response(403)
- end
-
- test "returns 200 to authenticated request when the instance is not public",
- %{conn: conn, user: user} do
- Pleroma.Config.put([:instance, :public], false)
-
- conn
- |> with_credentials(user.nickname, "test")
- |> get("/api/statuses/public_timeline.json")
- |> json_response(200)
- end
-
- test "returns 200 to unauthenticated request when the instance is public", %{conn: conn} do
- conn
- |> get("/api/statuses/public_timeline.json")
- |> json_response(200)
- end
-
- test "returns 200 to authenticated request when the instance is public",
- %{conn: conn, user: user} do
- conn
- |> with_credentials(user.nickname, "test")
- |> get("/api/statuses/public_timeline.json")
- |> json_response(200)
- end
-
- test_with_mock "treats user as unauthenticated if `assigns[:token]` is present but lacks `read` permission",
- Controller,
- [:passthrough],
- [] do
- token = insert(:oauth_token, scopes: ["write"])
-
- build_conn()
- |> put_req_header("authorization", "Bearer #{token.token}")
- |> get("/api/statuses/public_timeline.json")
- |> json_response(200)
-
- assert called(Controller.public_timeline(%{assigns: %{user: nil}}, :_))
- end
- end
-
- describe "GET /statuses/public_and_external_timeline.json" do
- setup [:valid_user]
- clear_config([:instance, :public])
-
- test "returns 403 to unauthenticated request when the instance is not public", %{conn: conn} do
- Pleroma.Config.put([:instance, :public], false)
-
- conn
- |> get("/api/statuses/public_and_external_timeline.json")
- |> json_response(403)
- end
-
- test "returns 200 to authenticated request when the instance is not public",
- %{conn: conn, user: user} do
- Pleroma.Config.put([:instance, :public], false)
-
- conn
- |> with_credentials(user.nickname, "test")
- |> get("/api/statuses/public_and_external_timeline.json")
- |> json_response(200)
- end
-
- test "returns 200 to unauthenticated request when the instance is public", %{conn: conn} do
- conn
- |> get("/api/statuses/public_and_external_timeline.json")
- |> json_response(200)
- end
-
- test "returns 200 to authenticated request when the instance is public",
- %{conn: conn, user: user} do
- conn
- |> with_credentials(user.nickname, "test")
- |> get("/api/statuses/public_and_external_timeline.json")
- |> json_response(200)
- end
- end
-
- describe "GET /statuses/show/:id.json" do
- test "returns one status", %{conn: conn} do
- user = insert(:user)
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey!"})
- actor = User.get_cached_by_ap_id(activity.data["actor"])
-
- conn =
- conn
- |> get("/api/statuses/show/#{activity.id}.json")
-
- response = json_response(conn, 200)
-
- assert response == ActivityView.render("activity.json", %{activity: activity, user: actor})
- end
- end
-
- describe "GET /users/show.json" do
- test "gets user with screen_name", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> get("/api/users/show.json", %{"screen_name" => user.nickname})
-
- response = json_response(conn, 200)
-
- assert response["id"] == user.id
- end
-
- test "gets user with user_id", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> get("/api/users/show.json", %{"user_id" => user.id})
-
- response = json_response(conn, 200)
-
- assert response["id"] == user.id
- end
-
- test "gets a user for a logged in user", %{conn: conn} do
- user = insert(:user)
- logged_in = insert(:user)
-
- {:ok, logged_in, user, _activity} = TwitterAPI.follow(logged_in, %{"user_id" => user.id})
-
- conn =
- conn
- |> with_credentials(logged_in.nickname, "test")
- |> get("/api/users/show.json", %{"user_id" => user.id})
-
- response = json_response(conn, 200)
-
- assert response["following"] == true
- end
- end
-
- describe "GET /statusnet/conversation/:id.json" do
- test "returns the statuses in the conversation", %{conn: conn} do
- {:ok, _user} = UserBuilder.insert()
- {:ok, activity} = ActivityBuilder.insert(%{"type" => "Create", "context" => "2hu"})
- {:ok, _activity_two} = ActivityBuilder.insert(%{"type" => "Create", "context" => "2hu"})
- {:ok, _activity_three} = ActivityBuilder.insert(%{"type" => "Create", "context" => "3hu"})
-
- conn =
- conn
- |> get("/api/statusnet/conversation/#{activity.data["context_id"]}.json")
-
- response = json_response(conn, 200)
-
- assert length(response) == 2
- end
- end
-
- describe "GET /statuses/friends_timeline.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = get(conn, "/api/statuses/friends_timeline.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- user = insert(:user)
-
- activities =
- ActivityBuilder.insert_list(30, %{"to" => [User.ap_followers(user)]}, %{user: user})
-
- returned_activities =
- ActivityBuilder.insert_list(10, %{"to" => [User.ap_followers(user)]}, %{user: user})
-
- other_user = insert(:user)
- ActivityBuilder.insert_list(10, %{}, %{user: other_user})
- since_id = List.last(activities).id
-
- current_user =
- Changeset.change(current_user, following: [User.ap_followers(user)])
- |> Repo.update!()
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/statuses/friends_timeline.json", %{since_id: since_id})
-
- response = json_response(conn, 200)
-
- assert length(response) == 10
-
- assert response ==
- Enum.map(returned_activities, fn activity ->
- ActivityView.render("activity.json", %{
- activity: activity,
- user: User.get_cached_by_ap_id(activity.data["actor"]),
- for: current_user
- })
- end)
- end
- end
-
- describe "GET /statuses/dm_timeline.json" do
- test "it show direct messages", %{conn: conn} do
- user_one = insert(:user)
- user_two = insert(:user)
-
- {:ok, user_two} = User.follow(user_two, user_one)
-
- {:ok, direct} =
- CommonAPI.post(user_one, %{
- "status" => "Hi @#{user_two.nickname}!",
- "visibility" => "direct"
- })
-
- {:ok, direct_two} =
- CommonAPI.post(user_two, %{
- "status" => "Hi @#{user_one.nickname}!",
- "visibility" => "direct"
- })
-
- {:ok, _follower_only} =
- CommonAPI.post(user_one, %{
- "status" => "Hi @#{user_two.nickname}!",
- "visibility" => "private"
- })
-
- # Only direct should be visible here
- res_conn =
- conn
- |> assign(:user, user_two)
- |> get("/api/statuses/dm_timeline.json")
-
- [status, status_two] = json_response(res_conn, 200)
- assert status["id"] == direct_two.id
- assert status_two["id"] == direct.id
- end
-
- test "doesn't include DMs from blocked users", %{conn: conn} do
- blocker = insert(:user)
- blocked = insert(:user)
- user = insert(:user)
- {:ok, blocker} = User.block(blocker, blocked)
-
- {:ok, _blocked_direct} =
- CommonAPI.post(blocked, %{
- "status" => "Hi @#{blocker.nickname}!",
- "visibility" => "direct"
- })
-
- {:ok, direct} =
- CommonAPI.post(user, %{
- "status" => "Hi @#{blocker.nickname}!",
- "visibility" => "direct"
- })
-
- res_conn =
- conn
- |> assign(:user, blocker)
- |> get("/api/statuses/dm_timeline.json")
-
- [status] = json_response(res_conn, 200)
- assert status["id"] == direct.id
- end
- end
-
- describe "GET /statuses/mentions.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = get(conn, "/api/statuses/mentions.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- {:ok, activity} =
- CommonAPI.post(current_user, %{
- "status" => "why is tenshi eating a corndog so cute?",
- "visibility" => "public"
- })
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/statuses/mentions.json")
-
- response = json_response(conn, 200)
-
- assert length(response) == 1
-
- assert Enum.at(response, 0) ==
- ActivityView.render("activity.json", %{
- user: current_user,
- for: current_user,
- activity: activity
- })
- end
-
- test "does not show DMs in mentions timeline", %{conn: conn, user: current_user} do
- {:ok, _activity} =
- CommonAPI.post(current_user, %{
- "status" => "Have you guys ever seen how cute tenshi eating a corndog is?",
- "visibility" => "direct"
- })
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/statuses/mentions.json")
-
- response = json_response(conn, 200)
-
- assert Enum.empty?(response)
- end
- end
-
- describe "GET /api/qvitter/statuses/notifications.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = get(conn, "/api/qvitter/statuses/notifications.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- other_user = insert(:user)
-
- {:ok, _activity} =
- ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: other_user})
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/qvitter/statuses/notifications.json")
-
- response = json_response(conn, 200)
-
- assert length(response) == 1
-
- assert response ==
- NotificationView.render("notification.json", %{
- notifications: Notification.for_user(current_user),
- for: current_user
- })
- end
-
- test "muted user", %{conn: conn, user: current_user} do
- other_user = insert(:user)
-
- {:ok, current_user} = User.mute(current_user, other_user)
-
- {:ok, _activity} =
- ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: other_user})
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/qvitter/statuses/notifications.json")
-
- assert json_response(conn, 200) == []
- end
-
- test "muted user with with_muted parameter", %{conn: conn, user: current_user} do
- other_user = insert(:user)
-
- {:ok, current_user} = User.mute(current_user, other_user)
-
- {:ok, _activity} =
- ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: other_user})
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/qvitter/statuses/notifications.json", %{"with_muted" => "true"})
-
- assert length(json_response(conn, 200)) == 1
- end
- end
-
- describe "POST /api/qvitter/statuses/notifications/read" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = post(conn, "/api/qvitter/statuses/notifications/read", %{"latest_id" => 1_234_567})
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials, without any params", %{conn: conn, user: current_user} do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/qvitter/statuses/notifications/read")
-
- assert json_response(conn, 400) == %{
- "error" => "You need to specify latest_id",
- "request" => "/api/qvitter/statuses/notifications/read"
- }
- end
-
- test "with credentials, with params", %{conn: conn, user: current_user} do
- other_user = insert(:user)
-
- {:ok, _activity} =
- ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: other_user})
-
- response_conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/qvitter/statuses/notifications.json")
-
- [notification] = response = json_response(response_conn, 200)
-
- assert length(response) == 1
-
- assert notification["is_seen"] == 0
-
- response_conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/qvitter/statuses/notifications/read", %{"latest_id" => notification["id"]})
-
- [notification] = response = json_response(response_conn, 200)
-
- assert length(response) == 1
-
- assert notification["is_seen"] == 1
- end
- end
-
- describe "GET /statuses/user_timeline.json" do
- setup [:valid_user]
-
- test "without any params", %{conn: conn} do
- conn = get(conn, "/api/statuses/user_timeline.json")
-
- assert json_response(conn, 400) == %{
- "error" => "You need to specify screen_name or user_id",
- "request" => "/api/statuses/user_timeline.json"
- }
- end
-
- test "with user_id", %{conn: conn} do
- user = insert(:user)
- {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: user})
-
- conn = get(conn, "/api/statuses/user_timeline.json", %{"user_id" => user.id})
- response = json_response(conn, 200)
- assert length(response) == 1
-
- assert Enum.at(response, 0) ==
- ActivityView.render("activity.json", %{user: user, activity: activity})
- end
-
- test "with screen_name", %{conn: conn} do
- user = insert(:user)
- {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: user})
-
- conn = get(conn, "/api/statuses/user_timeline.json", %{"screen_name" => user.nickname})
- response = json_response(conn, 200)
- assert length(response) == 1
-
- assert Enum.at(response, 0) ==
- ActivityView.render("activity.json", %{user: user, activity: activity})
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: current_user})
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/statuses/user_timeline.json")
-
- response = json_response(conn, 200)
-
- assert length(response) == 1
-
- assert Enum.at(response, 0) ==
- ActivityView.render("activity.json", %{
- user: current_user,
- for: current_user,
- activity: activity
- })
- end
-
- test "with credentials with user_id", %{conn: conn, user: current_user} do
- user = insert(:user)
- {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: user})
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/statuses/user_timeline.json", %{"user_id" => user.id})
-
- response = json_response(conn, 200)
-
- assert length(response) == 1
-
- assert Enum.at(response, 0) ==
- ActivityView.render("activity.json", %{user: user, activity: activity})
- end
-
- test "with credentials screen_name", %{conn: conn, user: current_user} do
- user = insert(:user)
- {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: user})
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/statuses/user_timeline.json", %{"screen_name" => user.nickname})
-
- response = json_response(conn, 200)
-
- assert length(response) == 1
-
- assert Enum.at(response, 0) ==
- ActivityView.render("activity.json", %{user: user, activity: activity})
- end
-
- test "with credentials with user_id, excluding RTs", %{conn: conn, user: current_user} do
- user = insert(:user)
- {:ok, activity} = ActivityBuilder.insert(%{"id" => 1, "type" => "Create"}, %{user: user})
- {:ok, _} = ActivityBuilder.insert(%{"id" => 2, "type" => "Announce"}, %{user: user})
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/statuses/user_timeline.json", %{
- "user_id" => user.id,
- "include_rts" => "false"
- })
-
- response = json_response(conn, 200)
-
- assert length(response) == 1
-
- assert Enum.at(response, 0) ==
- ActivityView.render("activity.json", %{user: user, activity: activity})
-
- conn =
- conn
- |> get("/api/statuses/user_timeline.json", %{"user_id" => user.id, "include_rts" => "0"})
-
- response = json_response(conn, 200)
-
- assert length(response) == 1
-
- assert Enum.at(response, 0) ==
- ActivityView.render("activity.json", %{user: user, activity: activity})
- end
- end
-
- describe "POST /friendships/create.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = post(conn, "/api/friendships/create.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- followed = insert(:user)
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/friendships/create.json", %{user_id: followed.id})
-
- current_user = User.get_cached_by_id(current_user.id)
- assert User.ap_followers(followed) in current_user.following
-
- assert json_response(conn, 200) ==
- UserView.render("show.json", %{user: followed, for: current_user})
- end
-
- test "for restricted account", %{conn: conn, user: current_user} do
- followed = insert(:user, info: %User.Info{locked: true})
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/friendships/create.json", %{user_id: followed.id})
-
- current_user = User.get_cached_by_id(current_user.id)
- followed = User.get_cached_by_id(followed.id)
-
- refute User.ap_followers(followed) in current_user.following
-
- assert json_response(conn, 200) ==
- UserView.render("show.json", %{user: followed, for: current_user})
- end
- end
-
- describe "POST /friendships/destroy.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = post(conn, "/api/friendships/destroy.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- followed = insert(:user)
-
- {:ok, current_user} = User.follow(current_user, followed)
- assert User.ap_followers(followed) in current_user.following
- ActivityPub.follow(current_user, followed)
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/friendships/destroy.json", %{user_id: followed.id})
-
- current_user = User.get_cached_by_id(current_user.id)
- assert current_user.following == [current_user.ap_id]
-
- assert json_response(conn, 200) ==
- UserView.render("show.json", %{user: followed, for: current_user})
- end
- end
-
- describe "POST /blocks/create.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = post(conn, "/api/blocks/create.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- blocked = insert(:user)
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/blocks/create.json", %{user_id: blocked.id})
-
- current_user = User.get_cached_by_id(current_user.id)
- assert User.blocks?(current_user, blocked)
-
- assert json_response(conn, 200) ==
- UserView.render("show.json", %{user: blocked, for: current_user})
- end
- end
-
- describe "POST /blocks/destroy.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = post(conn, "/api/blocks/destroy.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- blocked = insert(:user)
-
- {:ok, current_user, blocked} = TwitterAPI.block(current_user, %{"user_id" => blocked.id})
- assert User.blocks?(current_user, blocked)
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/blocks/destroy.json", %{user_id: blocked.id})
-
- current_user = User.get_cached_by_id(current_user.id)
- assert current_user.info.blocks == []
-
- assert json_response(conn, 200) ==
- UserView.render("show.json", %{user: blocked, for: current_user})
- end
- end
-
- describe "GET /help/test.json" do
- test "returns \"ok\"", %{conn: conn} do
- conn = get(conn, "/api/help/test.json")
- assert json_response(conn, 200) == "ok"
- end
- end
-
- describe "POST /api/qvitter/update_avatar.json" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- conn = post(conn, "/api/qvitter/update_avatar.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- avatar_image = File.read!("test/fixtures/avatar_data_uri")
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/qvitter/update_avatar.json", %{img: avatar_image})
-
- current_user = User.get_cached_by_id(current_user.id)
- assert is_map(current_user.avatar)
-
- assert json_response(conn, 200) ==
- UserView.render("show.json", %{user: current_user, for: current_user})
- end
-
- test "user avatar can be reset", %{conn: conn, user: current_user} do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/qvitter/update_avatar.json", %{img: ""})
-
- current_user = User.get_cached_by_id(current_user.id)
- assert current_user.avatar == nil
-
- assert json_response(conn, 200) ==
- UserView.render("show.json", %{user: current_user, for: current_user})
- end
- end
-
- describe "GET /api/qvitter/mutes.json" do
- setup [:valid_user]
-
- test "unimplemented mutes without valid credentials", %{conn: conn} do
- conn = get(conn, "/api/qvitter/mutes.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "unimplemented mutes with credentials", %{conn: conn, user: current_user} do
- response =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> get("/api/qvitter/mutes.json")
- |> json_response(200)
-
- assert [] = response
- end
- end
-
- describe "POST /api/favorites/create/:id" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- note_activity = insert(:note_activity)
- conn = post(conn, "/api/favorites/create/#{note_activity.id}.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- note_activity = insert(:note_activity)
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/favorites/create/#{note_activity.id}.json")
-
- assert json_response(conn, 200)
- end
-
- test "with credentials, invalid param", %{conn: conn, user: current_user} do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/favorites/create/wrong.json")
-
- assert json_response(conn, 400)
- end
-
- test "with credentials, invalid activity", %{conn: conn, user: current_user} do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/favorites/create/1.json")
-
- assert json_response(conn, 400)
- end
- end
-
- describe "POST /api/favorites/destroy/:id" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- note_activity = insert(:note_activity)
- conn = post(conn, "/api/favorites/destroy/#{note_activity.id}.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- note_activity = insert(:note_activity)
- object = Object.normalize(note_activity)
- ActivityPub.like(current_user, object)
-
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/favorites/destroy/#{note_activity.id}.json")
-
- assert json_response(conn, 200)
- end
- end
-
- describe "POST /api/statuses/retweet/:id" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- note_activity = insert(:note_activity)
- conn = post(conn, "/api/statuses/retweet/#{note_activity.id}.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- note_activity = insert(:note_activity)
-
- request_path = "/api/statuses/retweet/#{note_activity.id}.json"
-
- response =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post(request_path)
-
- activity = Activity.get_by_id(note_activity.id)
- activity_user = User.get_cached_by_ap_id(note_activity.data["actor"])
-
- assert json_response(response, 200) ==
- ActivityView.render("activity.json", %{
- user: activity_user,
- for: current_user,
- activity: activity
- })
- end
- end
-
- describe "POST /api/statuses/unretweet/:id" do
- setup [:valid_user]
-
- test "without valid credentials", %{conn: conn} do
- note_activity = insert(:note_activity)
- conn = post(conn, "/api/statuses/unretweet/#{note_activity.id}.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: current_user} do
- note_activity = insert(:note_activity)
-
- request_path = "/api/statuses/retweet/#{note_activity.id}.json"
-
- _response =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post(request_path)
-
- request_path = String.replace(request_path, "retweet", "unretweet")
-
- response =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post(request_path)
-
- activity = Activity.get_by_id(note_activity.id)
- activity_user = User.get_cached_by_ap_id(note_activity.data["actor"])
-
- assert json_response(response, 200) ==
- ActivityView.render("activity.json", %{
- user: activity_user,
- for: current_user,
- activity: activity
- })
- end
- end
-
- describe "POST /api/account/register" do
- test "it creates a new user", %{conn: conn} do
- data = %{
- "nickname" => "lain",
- "email" => "lain@wired.jp",
- "fullname" => "lain iwakura",
- "bio" => "close the world.",
- "password" => "bear",
- "confirm" => "bear"
- }
-
- conn =
- conn
- |> post("/api/account/register", data)
-
- user = json_response(conn, 200)
-
- fetched_user = User.get_cached_by_nickname("lain")
- assert user == UserView.render("show.json", %{user: fetched_user})
- end
-
- test "it returns errors on a problem", %{conn: conn} do
- data = %{
- "email" => "lain@wired.jp",
- "fullname" => "lain iwakura",
- "bio" => "close the world.",
- "password" => "bear",
- "confirm" => "bear"
- }
-
- conn =
- conn
- |> post("/api/account/register", data)
-
- errors = json_response(conn, 400)
-
- assert is_binary(errors["error"])
- end
- end
-
- describe "POST /api/account/password_reset, with valid parameters" do
- setup %{conn: conn} do
- user = insert(:user)
- conn = post(conn, "/api/account/password_reset?email=#{user.email}")
- %{conn: conn, user: user}
- end
-
- test "it returns 204", %{conn: conn} do
- assert json_response(conn, :no_content)
- end
-
- test "it creates a PasswordResetToken record for user", %{user: user} do
- token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
- assert token_record
- end
-
- test "it sends an email to user", %{user: user} do
- token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
-
- email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token)
- notify_email = Pleroma.Config.get([:instance, :notify_email])
- instance_name = Pleroma.Config.get([:instance, :name])
-
- assert_email_sent(
- from: {instance_name, notify_email},
- to: {user.name, user.email},
- html_body: email.html_body
- )
- end
- end
-
- describe "POST /api/account/password_reset, with invalid parameters" do
- setup [:valid_user]
-
- test "it returns 404 when user is not found", %{conn: conn, user: user} do
- conn = post(conn, "/api/account/password_reset?email=nonexisting_#{user.email}")
- assert conn.status == 404
- assert conn.resp_body == ""
- end
-
- test "it returns 400 when user is not local", %{conn: conn, user: user} do
- {:ok, user} = Repo.update(Changeset.change(user, local: false))
- conn = post(conn, "/api/account/password_reset?email=#{user.email}")
- assert conn.status == 400
- assert conn.resp_body == ""
- end
- end
-
- describe "GET /api/account/confirm_email/:id/:token" do
- setup do
- user = insert(:user)
- info_change = User.Info.confirmation_changeset(user.info, need_confirmation: true)
-
- {:ok, user} =
- user
- |> Changeset.change()
- |> Changeset.put_embed(:info, info_change)
- |> Repo.update()
-
- assert user.info.confirmation_pending
-
- [user: user]
- end
-
- test "it redirects to root url", %{conn: conn, user: user} do
- conn = get(conn, "/api/account/confirm_email/#{user.id}/#{user.info.confirmation_token}")
-
- assert 302 == conn.status
- end
-
- test "it confirms the user account", %{conn: conn, user: user} do
- get(conn, "/api/account/confirm_email/#{user.id}/#{user.info.confirmation_token}")
-
- user = User.get_cached_by_id(user.id)
-
- refute user.info.confirmation_pending
- refute user.info.confirmation_token
- end
-
- test "it returns 500 if user cannot be found by id", %{conn: conn, user: user} do
- conn = get(conn, "/api/account/confirm_email/0/#{user.info.confirmation_token}")
-
- assert 500 == conn.status
- end
-
- test "it returns 500 if token is invalid", %{conn: conn, user: user} do
- conn = get(conn, "/api/account/confirm_email/#{user.id}/wrong_token")
-
- assert 500 == conn.status
- end
- end
-
- describe "POST /api/account/resend_confirmation_email" do
- setup do
- user = insert(:user)
- info_change = User.Info.confirmation_changeset(user.info, need_confirmation: true)
-
- {:ok, user} =
- user
- |> Changeset.change()
- |> Changeset.put_embed(:info, info_change)
- |> Repo.update()
-
- assert user.info.confirmation_pending
-
- [user: user]
- end
-
- clear_config([:instance, :account_activation_required]) do
- Pleroma.Config.put([:instance, :account_activation_required], true)
- end
-
- test "it returns 204 No Content", %{conn: conn, user: user} do
- conn
- |> assign(:user, user)
- |> post("/api/account/resend_confirmation_email?email=#{user.email}")
- |> json_response(:no_content)
- end
-
- test "it sends confirmation email", %{conn: conn, user: user} do
- conn
- |> assign(:user, user)
- |> post("/api/account/resend_confirmation_email?email=#{user.email}")
-
- email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
- notify_email = Pleroma.Config.get([:instance, :notify_email])
- instance_name = Pleroma.Config.get([:instance, :name])
-
- assert_email_sent(
- from: {instance_name, notify_email},
- to: {user.name, user.email},
- html_body: email.html_body
- )
- end
- end
-
- describe "GET /api/externalprofile/show" do
- test "it returns the user", %{conn: conn} do
- user = insert(:user)
- other_user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> get("/api/externalprofile/show", %{profileurl: other_user.ap_id})
-
- assert json_response(conn, 200) == UserView.render("show.json", %{user: other_user})
- end
- end
-
- describe "GET /api/statuses/followers" do
- test "it returns a user's followers", %{conn: conn} do
- user = insert(:user)
- follower_one = insert(:user)
- follower_two = insert(:user)
- _not_follower = insert(:user)
-
- {:ok, follower_one} = User.follow(follower_one, user)
- {:ok, follower_two} = User.follow(follower_two, user)
-
- conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/followers")
-
- expected = UserView.render("index.json", %{users: [follower_one, follower_two], for: user})
- result = json_response(conn, 200)
- assert Enum.sort(expected) == Enum.sort(result)
- end
-
- test "it returns 20 followers per page", %{conn: conn} do
- user = insert(:user)
- followers = insert_list(21, :user)
-
- Enum.each(followers, fn follower ->
- User.follow(follower, user)
- end)
-
- res_conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/followers")
-
- result = json_response(res_conn, 200)
- assert length(result) == 20
-
- res_conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/followers?page=2")
-
- result = json_response(res_conn, 200)
- assert length(result) == 1
- end
-
- test "it returns a given user's followers with user_id", %{conn: conn} do
- user = insert(:user)
- follower_one = insert(:user)
- follower_two = insert(:user)
- not_follower = insert(:user)
-
- {:ok, follower_one} = User.follow(follower_one, user)
- {:ok, follower_two} = User.follow(follower_two, user)
-
- conn =
- conn
- |> assign(:user, not_follower)
- |> get("/api/statuses/followers", %{"user_id" => user.id})
-
- assert MapSet.equal?(
- MapSet.new(json_response(conn, 200)),
- MapSet.new(
- UserView.render("index.json", %{
- users: [follower_one, follower_two],
- for: not_follower
- })
- )
- )
- end
-
- test "it returns empty when hide_followers is set to true", %{conn: conn} do
- user = insert(:user, %{info: %{hide_followers: true}})
- follower_one = insert(:user)
- follower_two = insert(:user)
- not_follower = insert(:user)
-
- {:ok, _follower_one} = User.follow(follower_one, user)
- {:ok, _follower_two} = User.follow(follower_two, user)
-
- response =
- conn
- |> assign(:user, not_follower)
- |> get("/api/statuses/followers", %{"user_id" => user.id})
- |> json_response(200)
-
- assert [] == response
- end
-
- test "it returns the followers when hide_followers is set to true if requested by the user themselves",
- %{
- conn: conn
- } do
- user = insert(:user, %{info: %{hide_followers: true}})
- follower_one = insert(:user)
- follower_two = insert(:user)
- _not_follower = insert(:user)
-
- {:ok, _follower_one} = User.follow(follower_one, user)
- {:ok, _follower_two} = User.follow(follower_two, user)
-
- conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/followers", %{"user_id" => user.id})
-
- refute [] == json_response(conn, 200)
- end
- end
-
- describe "GET /api/statuses/blocks" do
- test "it returns the list of users blocked by requester", %{conn: conn} do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, user} = User.block(user, other_user)
-
- conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/blocks")
-
- expected = UserView.render("index.json", %{users: [other_user], for: user})
- result = json_response(conn, 200)
- assert Enum.sort(expected) == Enum.sort(result)
- end
- end
-
- describe "GET /api/statuses/friends" do
- test "it returns the logged in user's friends", %{conn: conn} do
- user = insert(:user)
- followed_one = insert(:user)
- followed_two = insert(:user)
- _not_followed = insert(:user)
-
- {:ok, user} = User.follow(user, followed_one)
- {:ok, user} = User.follow(user, followed_two)
-
- conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/friends")
-
- expected = UserView.render("index.json", %{users: [followed_one, followed_two], for: user})
- result = json_response(conn, 200)
- assert Enum.sort(expected) == Enum.sort(result)
- end
-
- test "it returns 20 friends per page, except if 'export' is set to true", %{conn: conn} do
- user = insert(:user)
- followeds = insert_list(21, :user)
-
- {:ok, user} =
- Enum.reduce(followeds, {:ok, user}, fn followed, {:ok, user} ->
- User.follow(user, followed)
- end)
-
- res_conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/friends")
-
- result = json_response(res_conn, 200)
- assert length(result) == 20
-
- res_conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/friends", %{page: 2})
-
- result = json_response(res_conn, 200)
- assert length(result) == 1
-
- res_conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/friends", %{all: true})
-
- result = json_response(res_conn, 200)
- assert length(result) == 21
- end
-
- test "it returns a given user's friends with user_id", %{conn: conn} do
- user = insert(:user)
- followed_one = insert(:user)
- followed_two = insert(:user)
- _not_followed = insert(:user)
-
- {:ok, user} = User.follow(user, followed_one)
- {:ok, user} = User.follow(user, followed_two)
-
- conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/friends", %{"user_id" => user.id})
-
- assert MapSet.equal?(
- MapSet.new(json_response(conn, 200)),
- MapSet.new(
- UserView.render("index.json", %{users: [followed_one, followed_two], for: user})
- )
- )
- end
-
- test "it returns empty when hide_follows is set to true", %{conn: conn} do
- user = insert(:user, %{info: %{hide_follows: true}})
- followed_one = insert(:user)
- followed_two = insert(:user)
- not_followed = insert(:user)
-
- {:ok, user} = User.follow(user, followed_one)
- {:ok, user} = User.follow(user, followed_two)
-
- conn =
- conn
- |> assign(:user, not_followed)
- |> get("/api/statuses/friends", %{"user_id" => user.id})
-
- assert [] == json_response(conn, 200)
- end
-
- test "it returns friends when hide_follows is set to true if the user themselves request it",
- %{
- conn: conn
- } do
- user = insert(:user, %{info: %{hide_follows: true}})
- followed_one = insert(:user)
- followed_two = insert(:user)
- _not_followed = insert(:user)
-
- {:ok, _user} = User.follow(user, followed_one)
- {:ok, _user} = User.follow(user, followed_two)
-
- response =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/friends", %{"user_id" => user.id})
- |> json_response(200)
-
- refute [] == response
- end
-
- test "it returns a given user's friends with screen_name", %{conn: conn} do
- user = insert(:user)
- followed_one = insert(:user)
- followed_two = insert(:user)
- _not_followed = insert(:user)
-
- {:ok, user} = User.follow(user, followed_one)
- {:ok, user} = User.follow(user, followed_two)
-
- conn =
- conn
- |> assign(:user, user)
- |> get("/api/statuses/friends", %{"screen_name" => user.nickname})
-
- assert MapSet.equal?(
- MapSet.new(json_response(conn, 200)),
- MapSet.new(
- UserView.render("index.json", %{users: [followed_one, followed_two], for: user})
- )
- )
- end
- end
-
- describe "GET /friends/ids" do
- test "it returns a user's friends", %{conn: conn} do
- user = insert(:user)
- followed_one = insert(:user)
- followed_two = insert(:user)
- _not_followed = insert(:user)
-
- {:ok, user} = User.follow(user, followed_one)
- {:ok, user} = User.follow(user, followed_two)
-
- conn =
- conn
- |> assign(:user, user)
- |> get("/api/friends/ids")
-
- expected = [followed_one.id, followed_two.id]
-
- assert MapSet.equal?(
- MapSet.new(Poison.decode!(json_response(conn, 200))),
- MapSet.new(expected)
- )
- end
- end
-
- describe "POST /api/account/update_profile.json" do
- test "it updates a user's profile", %{conn: conn} do
- user = insert(:user)
- user2 = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "name" => "new name",
- "description" => "hi @#{user2.nickname}"
- })
-
- user = Repo.get!(User, user.id)
- assert user.name == "new name"
-
- assert user.bio ==
- "hi <span class='h-card'><a data-user='#{user2.id}' class='u-url mention' href='#{
- user2.ap_id
- }'>@<span>#{user2.nickname}</span></a></span>"
-
- assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
- end
-
- test "it sets and un-sets hide_follows", %{conn: conn} do
- user = insert(:user)
-
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "hide_follows" => "true"
- })
-
- user = Repo.get!(User, user.id)
- assert user.info.hide_follows == true
-
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "hide_follows" => "false"
- })
-
- user = refresh_record(user)
- assert user.info.hide_follows == false
- assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
- end
-
- test "it sets and un-sets hide_followers", %{conn: conn} do
- user = insert(:user)
-
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "hide_followers" => "true"
- })
-
- user = Repo.get!(User, user.id)
- assert user.info.hide_followers == true
-
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "hide_followers" => "false"
- })
-
- user = Repo.get!(User, user.id)
- assert user.info.hide_followers == false
- assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
- end
-
- test "it sets and un-sets show_role", %{conn: conn} do
- user = insert(:user)
-
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "show_role" => "true"
- })
-
- user = Repo.get!(User, user.id)
- assert user.info.show_role == true
-
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "show_role" => "false"
- })
-
- user = Repo.get!(User, user.id)
- assert user.info.show_role == false
- assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
- end
-
- test "it sets and un-sets skip_thread_containment", %{conn: conn} do
- user = insert(:user)
-
- response =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{"skip_thread_containment" => "true"})
- |> json_response(200)
-
- assert response["pleroma"]["skip_thread_containment"] == true
- user = refresh_record(user)
- assert user.info.skip_thread_containment
-
- response =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{"skip_thread_containment" => "false"})
- |> json_response(200)
-
- assert response["pleroma"]["skip_thread_containment"] == false
- refute refresh_record(user).info.skip_thread_containment
- end
-
- test "it locks an account", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "locked" => "true"
- })
-
- user = Repo.get!(User, user.id)
- assert user.info.locked == true
-
- assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
- end
-
- test "it unlocks an account", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "locked" => "false"
- })
-
- user = Repo.get!(User, user.id)
- assert user.info.locked == false
-
- assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
- end
-
- # Broken before the change to class="emoji" and non-<img/> in the DB
- @tag :skip
- test "it formats emojos", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "bio" => "I love our :moominmamma:​"
- })
-
- assert response = json_response(conn, 200)
-
- assert %{
- "description" => "I love our :moominmamma:",
- "description_html" =>
- ~s{I love our <img class="emoji" alt="moominmamma" title="moominmamma" src="} <>
- _
- } = response
-
- conn =
- conn
- |> get("/api/users/show.json?user_id=#{user.nickname}")
-
- assert response == json_response(conn, 200)
- end
- end
-
- defp valid_user(_context) do
- user = insert(:user)
- [user: user]
- end
-
- defp with_credentials(conn, username, password) do
- header_content = "Basic " <> Base.encode64("#{username}:#{password}")
- put_req_header(conn, "authorization", header_content)
- end
-
- describe "GET /api/search.json" do
- test "it returns search results", %{conn: conn} do
- user = insert(:user)
- user_two = insert(:user, %{nickname: "shp@shitposter.club"})
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
- {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
-
- conn =
- conn
- |> get("/api/search.json", %{"q" => "2hu", "page" => "1", "rpp" => "1"})
-
- assert [status] = json_response(conn, 200)
- assert status["id"] == activity.id
- end
- end
-
- describe "GET /api/statusnet/tags/timeline/:tag.json" do
- test "it returns the tags timeline", %{conn: conn} do
- user = insert(:user)
- user_two = insert(:user, %{nickname: "shp@shitposter.club"})
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about #2hu"})
- {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
-
- conn =
- conn
- |> get("/api/statusnet/tags/timeline/2hu.json")
-
- assert [status] = json_response(conn, 200)
- assert status["id"] == activity.id
- end
- end
-
- test "Convert newlines to <br> in bio", %{conn: conn} do
- user = insert(:user)
-
- _conn =
- conn
- |> assign(:user, user)
- |> post("/api/account/update_profile.json", %{
- "description" => "Hello,\r\nWorld! I\n am a test."
- })
-
- user = Repo.get!(User, user.id)
- assert user.bio == "Hello,<br>World! I<br> am a test."
- end
-
- describe "POST /api/pleroma/change_password" do
- setup [:valid_user]
-
- test "without credentials", %{conn: conn} do
- conn = post(conn, "/api/pleroma/change_password")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials and invalid password", %{conn: conn, user: current_user} do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/pleroma/change_password", %{
- "password" => "hi",
- "new_password" => "newpass",
- "new_password_confirmation" => "newpass"
- })
-
- assert json_response(conn, 200) == %{"error" => "Invalid password."}
- end
-
- test "with credentials, valid password and new password and confirmation not matching", %{
- conn: conn,
- user: current_user
- } do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/pleroma/change_password", %{
- "password" => "test",
- "new_password" => "newpass",
- "new_password_confirmation" => "notnewpass"
- })
-
- assert json_response(conn, 200) == %{
- "error" => "New password does not match confirmation."
- }
- end
-
- test "with credentials, valid password and invalid new password", %{
- conn: conn,
- user: current_user
- } do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/pleroma/change_password", %{
- "password" => "test",
- "new_password" => "",
- "new_password_confirmation" => ""
- })
-
- assert json_response(conn, 200) == %{
- "error" => "New password can't be blank."
- }
- end
-
- test "with credentials, valid password and matching new password and confirmation", %{
- conn: conn,
- user: current_user
- } do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/pleroma/change_password", %{
- "password" => "test",
- "new_password" => "newpass",
- "new_password_confirmation" => "newpass"
- })
-
- assert json_response(conn, 200) == %{"status" => "success"}
- fetched_user = User.get_cached_by_id(current_user.id)
- assert Pbkdf2.checkpw("newpass", fetched_user.password_hash) == true
- end
- end
-
- describe "POST /api/pleroma/delete_account" do
- setup [:valid_user]
-
- test "without credentials", %{conn: conn} do
- conn = post(conn, "/api/pleroma/delete_account")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials and invalid password", %{conn: conn, user: current_user} do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/pleroma/delete_account", %{"password" => "hi"})
-
- assert json_response(conn, 200) == %{"error" => "Invalid password."}
- end
-
- test "with credentials and valid password", %{conn: conn, user: current_user} do
- conn =
- conn
- |> with_credentials(current_user.nickname, "test")
- |> post("/api/pleroma/delete_account", %{"password" => "test"})
-
- assert json_response(conn, 200) == %{"status" => "success"}
- # Wait a second for the started task to end
- :timer.sleep(1000)
- end
- end
-
- describe "GET /api/pleroma/friend_requests" do
- test "it lists friend requests" do
- user = insert(:user)
- 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/pleroma/friend_requests")
-
- assert [relationship] = json_response(conn, 200)
- assert other_user.id == relationship["id"]
- end
-
- test "requires 'read' permission", %{conn: conn} do
- token1 = insert(:oauth_token, scopes: ["write"])
- token2 = insert(:oauth_token, scopes: ["read"])
-
- for token <- [token1, token2] do
- conn =
- conn
- |> put_req_header("authorization", "Bearer #{token.token}")
- |> get("/api/pleroma/friend_requests")
-
- if token == token1 do
- assert %{"error" => "Insufficient permissions: read."} == json_response(conn, 403)
- else
- assert json_response(conn, 200)
- end
- end
- end
- end
-
- describe "POST /api/pleroma/friendships/approve" do
- test "it approves a friend request" do
- user = insert(:user)
- 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/pleroma/friendships/approve", %{"user_id" => other_user.id})
-
- assert relationship = json_response(conn, 200)
- assert other_user.id == relationship["id"]
- assert relationship["follows_you"] == true
- end
- end
-
- describe "POST /api/pleroma/friendships/deny" do
- test "it denies a friend request" do
- user = insert(:user)
- 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/pleroma/friendships/deny", %{"user_id" => other_user.id})
-
- assert relationship = json_response(conn, 200)
- assert other_user.id == relationship["id"]
- assert relationship["follows_you"] == false
- end
- end
-
- describe "GET /api/pleroma/search_user" do
- test "it returns users, ordered by similarity", %{conn: conn} do
- user = insert(:user, %{name: "eal"})
- user_two = insert(:user, %{name: "eal me"})
- _user_three = insert(:user, %{name: "zzz"})
-
- resp =
- conn
- |> get(twitter_api_search__path(conn, :search_user), query: "eal me")
- |> json_response(200)
-
- assert length(resp) == 2
- assert [user_two.id, user.id] == Enum.map(resp, fn %{"id" => id} -> id end)
- end
- end
-
- describe "POST /api/media/upload" do
- setup context do
- Pleroma.DataCase.ensure_local_uploader(context)
- end
-
- test "it performs the upload and sets `data[actor]` with AP id of uploader user", %{
- conn: conn
- } do
- user = insert(:user)
-
- upload_filename = "test/fixtures/image_tmp.jpg"
- File.cp!("test/fixtures/image.jpg", upload_filename)
-
- file = %Plug.Upload{
- content_type: "image/jpg",
- path: Path.absname(upload_filename),
- filename: "image.jpg"
- }
-
- response =
- conn
- |> assign(:user, user)
- |> put_req_header("content-type", "application/octet-stream")
- |> post("/api/media/upload", %{
- "media" => file
- })
- |> json_response(:ok)
-
- assert response["media_id"]
- object = Repo.get(Object, response["media_id"])
- assert object
- assert object.data["actor"] == User.ap_id(user)
- end
- end
-
- describe "POST /api/media/metadata/create" do
- setup do
- object = insert(:note)
- user = User.get_cached_by_ap_id(object.data["actor"])
- %{object: object, user: user}
- end
-
- test "it returns :forbidden status on attempt to modify someone else's upload", %{
- conn: conn,
- object: object
- } do
- initial_description = object.data["name"]
- another_user = insert(:user)
-
- conn
- |> assign(:user, another_user)
- |> post("/api/media/metadata/create", %{"media_id" => object.id})
- |> json_response(:forbidden)
-
- object = Repo.get(Object, object.id)
- assert object.data["name"] == initial_description
- end
-
- test "it updates `data[name]` of referenced Object with provided value", %{
- conn: conn,
- object: object,
- user: user
- } do
- description = "Informative description of the image. Initial value: #{object.data["name"]}}"
-
- conn
- |> assign(:user, user)
- |> post("/api/media/metadata/create", %{
- "media_id" => object.id,
- "alt_text" => %{"text" => description}
- })
- |> json_response(:no_content)
-
- object = Repo.get(Object, object.id)
- assert object.data["name"] == description
- end
- end
-
- describe "POST /api/statuses/user_timeline.json?user_id=:user_id&pinned=true" do
- test "it returns a list of pinned statuses", %{conn: conn} do
- Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
-
- user = insert(:user, %{name: "egor"})
- {:ok, %{id: activity_id}} = CommonAPI.post(user, %{"status" => "HI!!!"})
- {:ok, _} = CommonAPI.pin(activity_id, user)
-
- resp =
- conn
- |> get("/api/statuses/user_timeline.json", %{user_id: user.id, pinned: true})
- |> json_response(200)
-
- assert length(resp) == 1
- assert [%{"id" => ^activity_id, "pinned" => true}] = resp
- end
- end
-
- describe "POST /api/statuses/pin/:id" do
- setup do
- Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
- [user: insert(:user)]
- end
-
- test "without valid credentials", %{conn: conn} do
- note_activity = insert(:note_activity)
- conn = post(conn, "/api/statuses/pin/#{note_activity.id}.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: user} do
- {:ok, activity} = CommonAPI.post(user, %{"status" => "test!"})
-
- request_path = "/api/statuses/pin/#{activity.id}.json"
-
- response =
- conn
- |> with_credentials(user.nickname, "test")
- |> post(request_path)
-
- user = refresh_record(user)
-
- assert json_response(response, 200) ==
- ActivityView.render("activity.json", %{user: user, for: user, activity: activity})
- end
- end
-
- describe "POST /api/statuses/unpin/:id" do
- setup do
- Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
- [user: insert(:user)]
- end
-
- test "without valid credentials", %{conn: conn} do
- note_activity = insert(:note_activity)
- conn = post(conn, "/api/statuses/unpin/#{note_activity.id}.json")
- assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
- end
-
- test "with credentials", %{conn: conn, user: user} do
- {:ok, activity} = CommonAPI.post(user, %{"status" => "test!"})
- {:ok, activity} = CommonAPI.pin(activity.id, user)
-
- request_path = "/api/statuses/unpin/#{activity.id}.json"
-
- response =
- conn
- |> with_credentials(user.nickname, "test")
- |> post(request_path)
-
- user = refresh_record(user)
-
- assert json_response(response, 200) ==
- ActivityView.render("activity.json", %{user: user, for: user, activity: activity})
- end
- end
-
- describe "GET /api/oauth_tokens" do
- setup do
- token = insert(:oauth_token) |> Repo.preload(:user)
-
- %{token: token}
- end
-
- test "renders list", %{token: token} do
- response =
- build_conn()
- |> assign(:user, token.user)
- |> get("/api/oauth_tokens")
-
- keys =
- json_response(response, 200)
- |> hd()
- |> Map.keys()
-
- assert keys -- ["id", "app_name", "valid_until"] == []
- end
-
- test "revoke token", %{token: token} do
- response =
- build_conn()
- |> assign(:user, token.user)
- |> delete("/api/oauth_tokens/#{token.id}")
-
- tokens = Token.get_user_tokens(token.user)
-
- assert tokens == []
- assert response.status == 201
- end
- end
-end
diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs
index cbe83852e..3c0528776 100644
--- a/test/web/twitter_api/twitter_api_test.exs
+++ b/test/web/twitter_api/twitter_api_test.exs
@@ -4,270 +4,18 @@
defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
use Pleroma.DataCase
- alias Pleroma.Activity
- alias Pleroma.Object
alias Pleroma.Repo
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.UserInviteToken
- alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.TwitterAPI.ActivityView
+ alias Pleroma.Web.MastodonAPI.AccountView
alias Pleroma.Web.TwitterAPI.TwitterAPI
- alias Pleroma.Web.TwitterAPI.UserView
-
- import Pleroma.Factory
setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
- test "create a status" do
- user = insert(:user)
- mentioned_user = insert(:user, %{nickname: "shp", ap_id: "shp"})
-
- object_data = %{
- "type" => "Image",
- "url" => [
- %{
- "type" => "Link",
- "mediaType" => "image/jpg",
- "href" => "http://example.org/image.jpg"
- }
- ],
- "uuid" => 1
- }
-
- object = Repo.insert!(%Object{data: object_data})
-
- input = %{
- "status" =>
- "Hello again, @shp.<script></script>\nThis is on another :firefox: line. #2hu #epic #phantasmagoric",
- "media_ids" => [object.id]
- }
-
- {:ok, activity = %Activity{}} = TwitterAPI.create_status(user, input)
- object = Object.normalize(activity)
-
- expected_text =
- "Hello again, <span class='h-card'><a data-user='#{mentioned_user.id}' class='u-url mention' href='shp'>@<span>shp</span></a></span>.&lt;script&gt;&lt;/script&gt;<br>This is on another :firefox: line. <a class='hashtag' data-tag='2hu' href='http://localhost:4001/tag/2hu' rel='tag'>#2hu</a> <a class='hashtag' data-tag='epic' href='http://localhost:4001/tag/epic' rel='tag'>#epic</a> <a class='hashtag' data-tag='phantasmagoric' href='http://localhost:4001/tag/phantasmagoric' rel='tag'>#phantasmagoric</a><br><a href=\"http://example.org/image.jpg\" class='attachment'>image.jpg</a>"
-
- assert get_in(object.data, ["content"]) == expected_text
- assert get_in(object.data, ["type"]) == "Note"
- assert get_in(object.data, ["actor"]) == user.ap_id
- assert get_in(activity.data, ["actor"]) == user.ap_id
- assert Enum.member?(get_in(activity.data, ["cc"]), User.ap_followers(user))
-
- assert Enum.member?(
- get_in(activity.data, ["to"]),
- "https://www.w3.org/ns/activitystreams#Public"
- )
-
- assert Enum.member?(get_in(activity.data, ["to"]), "shp")
- assert activity.local == true
-
- assert %{"firefox" => "http://localhost:4001/emoji/Firefox.gif"} = object.data["emoji"]
-
- # hashtags
- assert object.data["tag"] == ["2hu", "epic", "phantasmagoric"]
-
- # Add a context
- assert is_binary(get_in(activity.data, ["context"]))
- assert is_binary(get_in(object.data, ["context"]))
-
- assert is_list(object.data["attachment"])
-
- assert activity.data["object"] == object.data["id"]
-
- user = User.get_cached_by_ap_id(user.ap_id)
-
- assert user.info.note_count == 1
- end
-
- test "create a status that is a reply" do
- user = insert(:user)
-
- input = %{
- "status" => "Hello again."
- }
-
- {:ok, activity = %Activity{}} = TwitterAPI.create_status(user, input)
- object = Object.normalize(activity)
-
- input = %{
- "status" => "Here's your (you).",
- "in_reply_to_status_id" => activity.id
- }
-
- {:ok, reply = %Activity{}} = TwitterAPI.create_status(user, input)
- reply_object = Object.normalize(reply)
-
- assert get_in(reply.data, ["context"]) == get_in(activity.data, ["context"])
-
- assert get_in(reply_object.data, ["context"]) == get_in(object.data, ["context"])
-
- assert get_in(reply_object.data, ["inReplyTo"]) == get_in(activity.data, ["object"])
- assert Activity.get_in_reply_to_activity(reply).id == activity.id
- end
-
- test "Follow another user using user_id" do
- user = insert(:user)
- followed = insert(:user)
-
- {:ok, user, followed, _activity} = TwitterAPI.follow(user, %{"user_id" => followed.id})
- assert User.ap_followers(followed) in user.following
-
- {:ok, _, _, _} = TwitterAPI.follow(user, %{"user_id" => followed.id})
- end
-
- test "Follow another user using screen_name" do
- user = insert(:user)
- followed = insert(:user)
-
- {:ok, user, followed, _activity} =
- TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
-
- assert User.ap_followers(followed) in user.following
-
- followed = User.get_cached_by_ap_id(followed.ap_id)
- assert followed.info.follower_count == 1
-
- {:ok, _, _, _} = TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
- end
-
- test "Unfollow another user using user_id" do
- unfollowed = insert(:user)
- user = insert(:user, %{following: [User.ap_followers(unfollowed)]})
- ActivityPub.follow(user, unfollowed)
-
- {:ok, user, unfollowed} = TwitterAPI.unfollow(user, %{"user_id" => unfollowed.id})
- assert user.following == []
-
- {:error, msg} = TwitterAPI.unfollow(user, %{"user_id" => unfollowed.id})
- assert msg == "Not subscribed!"
- end
-
- test "Unfollow another user using screen_name" do
- unfollowed = insert(:user)
- user = insert(:user, %{following: [User.ap_followers(unfollowed)]})
-
- ActivityPub.follow(user, unfollowed)
-
- {:ok, user, unfollowed} = TwitterAPI.unfollow(user, %{"screen_name" => unfollowed.nickname})
- assert user.following == []
-
- {:error, msg} = TwitterAPI.unfollow(user, %{"screen_name" => unfollowed.nickname})
- assert msg == "Not subscribed!"
- end
-
- test "Block another user using user_id" do
- user = insert(:user)
- blocked = insert(:user)
-
- {:ok, user, blocked} = TwitterAPI.block(user, %{"user_id" => blocked.id})
- assert User.blocks?(user, blocked)
- end
-
- test "Block another user using screen_name" do
- user = insert(:user)
- blocked = insert(:user)
-
- {:ok, user, blocked} = TwitterAPI.block(user, %{"screen_name" => blocked.nickname})
- assert User.blocks?(user, blocked)
- end
-
- test "Unblock another user using user_id" do
- unblocked = insert(:user)
- user = insert(:user)
- {:ok, user, _unblocked} = TwitterAPI.block(user, %{"user_id" => unblocked.id})
-
- {:ok, user, _unblocked} = TwitterAPI.unblock(user, %{"user_id" => unblocked.id})
- assert user.info.blocks == []
- end
-
- test "Unblock another user using screen_name" do
- unblocked = insert(:user)
- user = insert(:user)
- {:ok, user, _unblocked} = TwitterAPI.block(user, %{"screen_name" => unblocked.nickname})
-
- {:ok, user, _unblocked} = TwitterAPI.unblock(user, %{"screen_name" => unblocked.nickname})
- assert user.info.blocks == []
- end
-
- test "upload a file" do
- user = insert(:user)
-
- file = %Plug.Upload{
- content_type: "image/jpg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- response = TwitterAPI.upload(file, user)
-
- assert is_binary(response)
- end
-
- test "it favorites a status, returns the updated activity" do
- user = insert(:user)
- other_user = insert(:user)
- note_activity = insert(:note_activity)
-
- {:ok, status} = TwitterAPI.fav(user, note_activity.id)
- updated_activity = Activity.get_by_ap_id(note_activity.data["id"])
- assert ActivityView.render("activity.json", %{activity: updated_activity})["fave_num"] == 1
-
- object = Object.normalize(note_activity)
-
- assert object.data["like_count"] == 1
-
- assert status == updated_activity
-
- {:ok, _status} = TwitterAPI.fav(other_user, note_activity.id)
-
- object = Object.normalize(note_activity)
-
- assert object.data["like_count"] == 2
-
- updated_activity = Activity.get_by_ap_id(note_activity.data["id"])
- assert ActivityView.render("activity.json", %{activity: updated_activity})["fave_num"] == 2
- end
-
- test "it unfavorites a status, returns the updated activity" do
- user = insert(:user)
- note_activity = insert(:note_activity)
- object = Object.normalize(note_activity)
-
- {:ok, _like_activity, _object} = ActivityPub.like(user, object)
- updated_activity = Activity.get_by_ap_id(note_activity.data["id"])
-
- assert ActivityView.render("activity.json", activity: updated_activity)["fave_num"] == 1
-
- {:ok, activity} = TwitterAPI.unfav(user, note_activity.id)
-
- assert ActivityView.render("activity.json", activity: activity)["fave_num"] == 0
- end
-
- test "it retweets a status and returns the retweet" do
- user = insert(:user)
- note_activity = insert(:note_activity)
-
- {:ok, status} = TwitterAPI.repeat(user, note_activity.id)
- updated_activity = Activity.get_by_ap_id(note_activity.data["id"])
-
- assert status == updated_activity
- end
-
- test "it unretweets an already retweeted status" do
- user = insert(:user)
- note_activity = insert(:note_activity)
-
- {:ok, _status} = TwitterAPI.repeat(user, note_activity.id)
- {:ok, status} = TwitterAPI.unrepeat(user, note_activity.id)
- updated_activity = Activity.get_by_ap_id(note_activity.data["id"])
-
- assert status == updated_activity
- end
-
test "it registers a new user and returns the user." do
data = %{
"nickname" => "lain",
@@ -281,8 +29,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
fetched_user = User.get_cached_by_nickname("lain")
- assert UserView.render("show.json", %{user: user}) ==
- UserView.render("show.json", %{user: fetched_user})
+ assert AccountView.render("account.json", %{user: user}) ==
+ AccountView.render("account.json", %{user: fetched_user})
end
test "it registers a new user with empty string in bio and returns the user." do
@@ -299,8 +47,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
fetched_user = User.get_cached_by_nickname("lain")
- assert UserView.render("show.json", %{user: user}) ==
- UserView.render("show.json", %{user: fetched_user})
+ assert AccountView.render("account.json", %{user: user}) ==
+ AccountView.render("account.json", %{user: fetched_user})
end
test "it sends confirmation email if :account_activation_required is specified in instance config" do
@@ -321,6 +69,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
}
{:ok, user} = TwitterAPI.register_user(data)
+ ObanHelpers.perform_all()
assert user.info.confirmation_pending
@@ -397,8 +146,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
assert invite.used == true
- assert UserView.render("show.json", %{user: user}) ==
- UserView.render("show.json", %{user: fetched_user})
+ assert AccountView.render("account.json", %{user: user}) ==
+ AccountView.render("account.json", %{user: fetched_user})
end
test "returns error on invalid token" do
@@ -462,8 +211,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
{:ok, user} = TwitterAPI.register_user(data)
fetched_user = User.get_cached_by_nickname("vinny")
- assert UserView.render("show.json", %{user: user}) ==
- UserView.render("show.json", %{user: fetched_user})
+ assert AccountView.render("account.json", %{user: user}) ==
+ AccountView.render("account.json", %{user: fetched_user})
end
{:ok, data: data, check_fn: check_fn}
@@ -537,8 +286,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
assert invite.used == true
- assert UserView.render("show.json", %{user: user}) ==
- UserView.render("show.json", %{user: fetched_user})
+ assert AccountView.render("account.json", %{user: user}) ==
+ AccountView.render("account.json", %{user: fetched_user})
data = %{
"nickname" => "GrimReaper",
@@ -588,8 +337,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
refute invite.used
- assert UserView.render("show.json", %{user: user}) ==
- UserView.render("show.json", %{user: fetched_user})
+ assert AccountView.render("account.json", %{user: user}) ==
+ AccountView.render("account.json", %{user: fetched_user})
end
test "error after max uses" do
@@ -612,8 +361,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
invite = Repo.get_by(UserInviteToken, token: invite.token)
assert invite.used == true
- assert UserView.render("show.json", %{user: user}) ==
- UserView.render("show.json", %{user: fetched_user})
+ assert AccountView.render("account.json", %{user: user}) ==
+ AccountView.render("account.json", %{user: fetched_user})
data = %{
"nickname" => "GrimReaper",
@@ -689,31 +438,9 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
refute User.get_cached_by_nickname("lain")
end
- test "it assigns an integer conversation_id" do
- note_activity = insert(:note_activity)
- status = ActivityView.render("activity.json", activity: note_activity)
-
- assert is_number(status["statusnet_conversation_id"])
- end
-
setup do
Supervisor.terminate_child(Pleroma.Supervisor, Cachex)
Supervisor.restart_child(Pleroma.Supervisor, Cachex)
:ok
end
-
- describe "fetching a user by uri" do
- test "fetches a user by uri" do
- id = "https://mastodon.social/users/lambadalambda"
- user = insert(:user)
- {:ok, represented} = TwitterAPI.get_external_profile(user, id)
- remote = User.get_cached_by_ap_id(id)
-
- assert represented["id"] == UserView.render("show.json", %{user: remote, for: user})["id"]
-
- # Also fetches the feed.
- # assert Activity.get_create_by_object_ap_id("tag:mastodon.social,2017-04-05:objectId=1641750:objectType=Status")
- # credo:disable-for-previous-line Credo.Check.Readability.MaxLineLength
- end
- end
end
diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs
index cf8e69d2b..0a2a48fb7 100644
--- a/test/web/twitter_api/util_controller_test.exs
+++ b/test/web/twitter_api/util_controller_test.exs
@@ -4,10 +4,13 @@
defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
use Pleroma.Web.ConnCase
+ use Oban.Testing, repo: Pleroma.Repo
alias Pleroma.Repo
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.CommonAPI
+ import ExUnit.CaptureLog
import Pleroma.Factory
import Mock
@@ -42,8 +45,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
{File, [],
read!: fn "follow_list.txt" ->
"Account address,Show boosts\n#{user2.ap_id},true"
- end},
- {PleromaJobQueue, [:passthrough], []}
+ end}
]) do
response =
conn
@@ -51,15 +53,16 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
|> post("/api/pleroma/follow_import", %{"list" => %Plug.Upload{path: "follow_list.txt"}})
|> json_response(:ok)
- assert called(
- PleromaJobQueue.enqueue(
- :background,
- User,
- [:follow_import, user1, [user2.ap_id]]
- )
- )
-
assert response == "job started"
+
+ assert ObanHelpers.member?(
+ %{
+ "op" => "follow_import",
+ "follower_id" => user1.id,
+ "followed_identifiers" => [user2.ap_id]
+ },
+ all_enqueued(worker: Pleroma.Workers.BackgroundWorker)
+ )
end
end
@@ -118,8 +121,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
user3 = insert(:user)
with_mocks([
- {File, [], read!: fn "blocks_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end},
- {PleromaJobQueue, [:passthrough], []}
+ {File, [], read!: fn "blocks_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end}
]) do
response =
conn
@@ -127,15 +129,16 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
|> post("/api/pleroma/blocks_import", %{"list" => %Plug.Upload{path: "blocks_list.txt"}})
|> json_response(:ok)
- assert called(
- PleromaJobQueue.enqueue(
- :background,
- User,
- [:blocks_import, user1, [user2.ap_id, user3.ap_id]]
- )
- )
-
assert response == "job started"
+
+ assert ObanHelpers.member?(
+ %{
+ "op" => "blocks_import",
+ "blocker_id" => user1.id,
+ "blocked_identifiers" => [user2.ap_id, user3.ap_id]
+ },
+ all_enqueued(worker: Pleroma.Workers.BackgroundWorker)
+ )
end
end
end
@@ -338,12 +341,14 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
test "show follow page with error when user cannot fecth by `acct` link", %{conn: conn} do
user = insert(:user)
- response =
- conn
- |> assign(:user, user)
- |> get("/ostatus_subscribe?acct=https://mastodon.social/users/not_found")
+ assert capture_log(fn ->
+ response =
+ conn
+ |> assign(:user, user)
+ |> get("/ostatus_subscribe?acct=https://mastodon.social/users/not_found")
- assert html_response(response, 200) =~ "Error fetching user"
+ assert html_response(response, 200) =~ "Error fetching user"
+ end) =~ "Object has been deleted"
end
end
@@ -557,6 +562,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
|> json_response(:ok)
assert response == %{"status" => "success"}
+ ObanHelpers.perform_all()
user = User.get_cached_by_id(user.id)
@@ -662,4 +668,111 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
assert called(Pleroma.Captcha.new())
end
end
+
+ defp with_credentials(conn, username, password) do
+ header_content = "Basic " <> Base.encode64("#{username}:#{password}")
+ put_req_header(conn, "authorization", header_content)
+ end
+
+ defp valid_user(_context) do
+ user = insert(:user)
+ [user: user]
+ end
+
+ describe "POST /api/pleroma/change_email" do
+ setup [:valid_user]
+
+ test "without credentials", %{conn: conn} do
+ conn = post(conn, "/api/pleroma/change_email")
+ assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
+ end
+
+ test "with credentials and invalid password", %{conn: conn, user: current_user} do
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> post("/api/pleroma/change_email", %{
+ "password" => "hi",
+ "email" => "test@test.com"
+ })
+
+ assert json_response(conn, 200) == %{"error" => "Invalid password."}
+ end
+
+ test "with credentials, valid password and invalid email", %{
+ conn: conn,
+ user: current_user
+ } do
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> post("/api/pleroma/change_email", %{
+ "password" => "test",
+ "email" => "foobar"
+ })
+
+ assert json_response(conn, 200) == %{"error" => "Email has invalid format."}
+ end
+
+ test "with credentials, valid password and no email", %{
+ conn: conn,
+ user: current_user
+ } do
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> post("/api/pleroma/change_email", %{
+ "password" => "test"
+ })
+
+ assert json_response(conn, 200) == %{"error" => "Email can't be blank."}
+ end
+
+ test "with credentials, valid password and blank email", %{
+ conn: conn,
+ user: current_user
+ } do
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> post("/api/pleroma/change_email", %{
+ "password" => "test",
+ "email" => ""
+ })
+
+ assert json_response(conn, 200) == %{"error" => "Email can't be blank."}
+ end
+
+ test "with credentials, valid password and non unique email", %{
+ conn: conn,
+ user: current_user
+ } do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> post("/api/pleroma/change_email", %{
+ "password" => "test",
+ "email" => user.email
+ })
+
+ assert json_response(conn, 200) == %{"error" => "Email has already been taken."}
+ end
+
+ test "with credentials, valid password and valid email", %{
+ conn: conn,
+ user: current_user
+ } do
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> post("/api/pleroma/change_email", %{
+ "password" => "test",
+ "email" => "cofe@foobar.com"
+ })
+
+ assert json_response(conn, 200) == %{"status" => "success"}
+ end
+ end
end
diff --git a/test/web/twitter_api/views/activity_view_test.exs b/test/web/twitter_api/views/activity_view_test.exs
deleted file mode 100644
index 56d861efb..000000000
--- a/test/web/twitter_api/views/activity_view_test.exs
+++ /dev/null
@@ -1,384 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
- use Pleroma.DataCase
-
- alias Pleroma.Activity
- alias Pleroma.Object
- alias Pleroma.Repo
- alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.CommonAPI.Utils
- alias Pleroma.Web.TwitterAPI.ActivityView
- alias Pleroma.Web.TwitterAPI.UserView
-
- import Pleroma.Factory
- import Tesla.Mock
-
- setup do
- mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
- :ok
- end
-
- import Mock
-
- test "returns a temporary ap_id based user for activities missing db users" do
- user = insert(:user)
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
-
- Repo.delete(user)
- Cachex.clear(:user_cache)
-
- %{"user" => tw_user} = ActivityView.render("activity.json", activity: activity)
-
- assert tw_user["screen_name"] == "erroruser@example.com"
- assert tw_user["name"] == user.ap_id
- assert tw_user["statusnet_profile_url"] == user.ap_id
- end
-
- test "tries to get a user by nickname if fetching by ap_id doesn't work" do
- user = insert(:user)
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
-
- {:ok, user} =
- user
- |> Ecto.Changeset.change(%{ap_id: "#{user.ap_id}/extension/#{user.nickname}"})
- |> Repo.update()
-
- Cachex.clear(:user_cache)
-
- result = ActivityView.render("activity.json", activity: activity)
- assert result["user"]["id"] == user.id
- end
-
- test "tells if the message is muted for some reason" do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, user} = User.mute(user, other_user)
-
- {:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"})
- status = ActivityView.render("activity.json", %{activity: activity})
-
- assert status["muted"] == false
-
- status = ActivityView.render("activity.json", %{activity: activity, for: user})
-
- assert status["muted"] == true
- end
-
- test "a create activity with a html status" do
- text = """
- #Bike log - Commute Tuesday\nhttps://pla.bike/posts/20181211/\n#cycling #CHScycling #commute\nMVIMG_20181211_054020.jpg
- """
-
- {:ok, activity} = CommonAPI.post(insert(:user), %{"status" => text})
-
- result = ActivityView.render("activity.json", activity: activity)
-
- assert result["statusnet_html"] ==
- "<a class=\"hashtag\" data-tag=\"bike\" href=\"http://localhost:4001/tag/bike\" rel=\"tag\">#Bike</a> log - Commute Tuesday<br /><a href=\"https://pla.bike/posts/20181211/\">https://pla.bike/posts/20181211/</a><br /><a class=\"hashtag\" data-tag=\"cycling\" href=\"http://localhost:4001/tag/cycling\" rel=\"tag\">#cycling</a> <a class=\"hashtag\" data-tag=\"chscycling\" href=\"http://localhost:4001/tag/chscycling\" rel=\"tag\">#CHScycling</a> <a class=\"hashtag\" data-tag=\"commute\" href=\"http://localhost:4001/tag/commute\" rel=\"tag\">#commute</a><br />MVIMG_20181211_054020.jpg"
-
- assert result["text"] ==
- "#Bike log - Commute Tuesday\nhttps://pla.bike/posts/20181211/\n#cycling #CHScycling #commute\nMVIMG_20181211_054020.jpg"
- end
-
- test "a create activity with a summary containing emoji" do
- {:ok, activity} =
- CommonAPI.post(insert(:user), %{
- "spoiler_text" => ":firefox: meow",
- "status" => "."
- })
-
- result = ActivityView.render("activity.json", activity: activity)
-
- expected = ":firefox: meow"
-
- expected_html =
- "<img class=\"emoji\" alt=\"firefox\" title=\"firefox\" src=\"http://localhost:4001/emoji/Firefox.gif\" /> meow"
-
- assert result["summary"] == expected
- assert result["summary_html"] == expected_html
- end
-
- test "a create activity with a summary containing invalid HTML" do
- {:ok, activity} =
- CommonAPI.post(insert(:user), %{
- "spoiler_text" => "<span style=\"color: magenta; font-size: 32px;\">meow</span>",
- "status" => "."
- })
-
- result = ActivityView.render("activity.json", activity: activity)
-
- expected = "meow"
-
- assert result["summary"] == expected
- assert result["summary_html"] == expected
- end
-
- test "a create activity with a note" do
- user = insert(:user)
- other_user = insert(:user, %{nickname: "shp"})
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
- object = Object.normalize(activity)
-
- result = ActivityView.render("activity.json", activity: activity)
-
- convo_id = Utils.context_to_conversation_id(object.data["context"])
-
- expected = %{
- "activity_type" => "post",
- "attachments" => [],
- "attentions" => [
- UserView.render("show.json", %{user: other_user})
- ],
- "created_at" => object.data["published"] |> Utils.date_to_asctime(),
- "external_url" => object.data["id"],
- "fave_num" => 0,
- "favorited" => false,
- "id" => activity.id,
- "in_reply_to_status_id" => nil,
- "in_reply_to_screen_name" => nil,
- "in_reply_to_user_id" => nil,
- "in_reply_to_profileurl" => nil,
- "in_reply_to_ostatus_uri" => nil,
- "is_local" => true,
- "is_post_verb" => true,
- "possibly_sensitive" => false,
- "repeat_num" => 0,
- "repeated" => false,
- "pinned" => false,
- "statusnet_conversation_id" => convo_id,
- "summary" => "",
- "summary_html" => "",
- "statusnet_html" =>
- "Hey <span class=\"h-card\"><a data-user=\"#{other_user.id}\" class=\"u-url mention\" href=\"#{
- other_user.ap_id
- }\">@<span>shp</span></a></span>!",
- "tags" => [],
- "text" => "Hey @shp!",
- "uri" => object.data["id"],
- "user" => UserView.render("show.json", %{user: user}),
- "visibility" => "direct",
- "card" => nil,
- "muted" => false
- }
-
- assert result == expected
- end
-
- test "a list of activities" do
- user = insert(:user)
- other_user = insert(:user, %{nickname: "shp"})
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"})
- object = Object.normalize(activity)
-
- convo_id = Utils.context_to_conversation_id(object.data["context"])
-
- mocks = [
- {
- Utils,
- [:passthrough],
- [context_to_conversation_id: fn _ -> false end]
- },
- {
- User,
- [:passthrough],
- [get_cached_by_ap_id: fn _ -> nil end]
- }
- ]
-
- with_mocks mocks do
- [result] = ActivityView.render("index.json", activities: [activity])
-
- assert result["statusnet_conversation_id"] == convo_id
- assert result["user"]
- refute called(Utils.context_to_conversation_id(:_))
- refute called(User.get_cached_by_ap_id(user.ap_id))
- refute called(User.get_cached_by_ap_id(other_user.ap_id))
- end
- end
-
- test "an activity that is a reply" do
- user = insert(:user)
- other_user = insert(:user, %{nickname: "shp"})
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"})
-
- {:ok, answer} =
- CommonAPI.post(other_user, %{"status" => "Hi!", "in_reply_to_status_id" => activity.id})
-
- result = ActivityView.render("activity.json", %{activity: answer})
-
- assert result["in_reply_to_status_id"] == activity.id
- end
-
- test "a like activity" do
- user = insert(:user)
- other_user = insert(:user, %{nickname: "shp"})
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"})
- {:ok, like, _object} = CommonAPI.favorite(activity.id, other_user)
-
- result = ActivityView.render("activity.json", activity: like)
- activity = Pleroma.Activity.get_by_ap_id(activity.data["id"])
-
- expected = %{
- "activity_type" => "like",
- "created_at" => like.data["published"] |> Utils.date_to_asctime(),
- "external_url" => like.data["id"],
- "id" => like.id,
- "in_reply_to_status_id" => activity.id,
- "is_local" => true,
- "is_post_verb" => false,
- "favorited_status" => ActivityView.render("activity.json", activity: activity),
- "statusnet_html" => "shp favorited a status.",
- "text" => "shp favorited a status.",
- "uri" => "tag:#{like.data["id"]}:objectType=Favourite",
- "user" => UserView.render("show.json", user: other_user)
- }
-
- assert result == expected
- end
-
- test "a like activity for deleted post" do
- user = insert(:user)
- other_user = insert(:user, %{nickname: "shp"})
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"})
- {:ok, like, _object} = CommonAPI.favorite(activity.id, other_user)
- CommonAPI.delete(activity.id, user)
-
- result = ActivityView.render("activity.json", activity: like)
-
- expected = %{
- "activity_type" => "like",
- "created_at" => like.data["published"] |> Utils.date_to_asctime(),
- "external_url" => like.data["id"],
- "id" => like.id,
- "in_reply_to_status_id" => nil,
- "is_local" => true,
- "is_post_verb" => false,
- "favorited_status" => nil,
- "statusnet_html" => "shp favorited a status.",
- "text" => "shp favorited a status.",
- "uri" => "tag:#{like.data["id"]}:objectType=Favourite",
- "user" => UserView.render("show.json", user: other_user)
- }
-
- assert result == expected
- end
-
- test "an announce activity" do
- user = insert(:user)
- other_user = insert(:user, %{nickname: "shp"})
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"})
- {:ok, announce, object} = CommonAPI.repeat(activity.id, other_user)
-
- convo_id = Utils.context_to_conversation_id(object.data["context"])
-
- activity = Activity.get_by_id(activity.id)
-
- result = ActivityView.render("activity.json", activity: announce)
-
- expected = %{
- "activity_type" => "repeat",
- "created_at" => announce.data["published"] |> Utils.date_to_asctime(),
- "external_url" => announce.data["id"],
- "id" => announce.id,
- "is_local" => true,
- "is_post_verb" => false,
- "statusnet_html" => "shp repeated a status.",
- "text" => "shp repeated a status.",
- "uri" => "tag:#{announce.data["id"]}:objectType=note",
- "user" => UserView.render("show.json", user: other_user),
- "retweeted_status" => ActivityView.render("activity.json", activity: activity),
- "statusnet_conversation_id" => convo_id
- }
-
- assert result == expected
- end
-
- test "A follow activity" do
- user = insert(:user)
- other_user = insert(:user, %{nickname: "shp"})
-
- {:ok, follower} = User.follow(user, other_user)
- {:ok, follow} = ActivityPub.follow(follower, other_user)
-
- result = ActivityView.render("activity.json", activity: follow)
-
- expected = %{
- "activity_type" => "follow",
- "attentions" => [],
- "created_at" => follow.data["published"] |> Utils.date_to_asctime(),
- "external_url" => follow.data["id"],
- "id" => follow.id,
- "in_reply_to_status_id" => nil,
- "is_local" => true,
- "is_post_verb" => false,
- "statusnet_html" => "#{user.nickname} started following shp",
- "text" => "#{user.nickname} started following shp",
- "user" => UserView.render("show.json", user: user)
- }
-
- assert result == expected
- end
-
- test "a delete activity" do
- user = insert(:user)
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"})
- {:ok, delete} = CommonAPI.delete(activity.id, user)
-
- result = ActivityView.render("activity.json", activity: delete)
-
- expected = %{
- "activity_type" => "delete",
- "attentions" => [],
- "created_at" => delete.data["published"] |> Utils.date_to_asctime(),
- "external_url" => delete.data["id"],
- "id" => delete.id,
- "in_reply_to_status_id" => nil,
- "is_local" => true,
- "is_post_verb" => false,
- "statusnet_html" => "deleted notice {{tag",
- "text" => "deleted notice {{tag",
- "uri" => Object.normalize(delete).data["id"],
- "user" => UserView.render("show.json", user: user)
- }
-
- assert result == expected
- end
-
- test "a peertube video" do
- {:ok, object} =
- Pleroma.Object.Fetcher.fetch_object_from_id(
- "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"
- )
-
- %Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"])
-
- result = ActivityView.render("activity.json", activity: activity)
-
- assert length(result["attachments"]) == 1
- assert result["summary"] == "Friday Night"
- end
-
- test "special characters are not escaped in text field for status created" do
- text = "<3 is on the way"
-
- {:ok, activity} = CommonAPI.post(insert(:user), %{"status" => text})
-
- result = ActivityView.render("activity.json", activity: activity)
-
- assert result["text"] == text
- end
-end
diff --git a/test/web/twitter_api/views/notification_view_test.exs b/test/web/twitter_api/views/notification_view_test.exs
deleted file mode 100644
index 6baeeaf63..000000000
--- a/test/web/twitter_api/views/notification_view_test.exs
+++ /dev/null
@@ -1,112 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.TwitterAPI.NotificationViewTest do
- use Pleroma.DataCase
-
- alias Pleroma.Notification
- alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.CommonAPI.Utils
- alias Pleroma.Web.TwitterAPI.ActivityView
- alias Pleroma.Web.TwitterAPI.NotificationView
- alias Pleroma.Web.TwitterAPI.TwitterAPI
- alias Pleroma.Web.TwitterAPI.UserView
-
- import Pleroma.Factory
-
- setup do
- user = insert(:user, bio: "<span>Here's some html</span>")
- [user: user]
- end
-
- test "A follow notification" do
- note_activity = insert(:note_activity)
- user = User.get_cached_by_ap_id(note_activity.data["actor"])
- follower = insert(:user)
-
- {:ok, follower} = User.follow(follower, user)
- {:ok, activity} = ActivityPub.follow(follower, user)
- Cachex.put(:user_cache, "user_info:#{user.id}", User.user_info(Repo.get!(User, user.id)))
- [follow_notif] = Notification.for_user(user)
-
- represented = %{
- "created_at" => follow_notif.inserted_at |> Utils.format_naive_asctime(),
- "from_profile" => UserView.render("show.json", %{user: follower, for: user}),
- "id" => follow_notif.id,
- "is_seen" => 0,
- "notice" => ActivityView.render("activity.json", %{activity: activity, for: user}),
- "ntype" => "follow"
- }
-
- assert represented ==
- NotificationView.render("notification.json", %{notification: follow_notif, for: user})
- end
-
- test "A mention notification" do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, activity} =
- TwitterAPI.create_status(other_user, %{"status" => "Päivää, @#{user.nickname}"})
-
- [notification] = Notification.for_user(user)
-
- represented = %{
- "created_at" => notification.inserted_at |> Utils.format_naive_asctime(),
- "from_profile" => UserView.render("show.json", %{user: other_user, for: user}),
- "id" => notification.id,
- "is_seen" => 0,
- "notice" => ActivityView.render("activity.json", %{activity: activity, for: user}),
- "ntype" => "mention"
- }
-
- assert represented ==
- NotificationView.render("notification.json", %{notification: notification, for: user})
- end
-
- test "A retweet notification" do
- note_activity = insert(:note_activity)
- user = User.get_cached_by_ap_id(note_activity.data["actor"])
- repeater = insert(:user)
-
- {:ok, _activity} = TwitterAPI.repeat(repeater, note_activity.id)
- [notification] = Notification.for_user(user)
-
- represented = %{
- "created_at" => notification.inserted_at |> Utils.format_naive_asctime(),
- "from_profile" => UserView.render("show.json", %{user: repeater, for: user}),
- "id" => notification.id,
- "is_seen" => 0,
- "notice" =>
- ActivityView.render("activity.json", %{activity: notification.activity, for: user}),
- "ntype" => "repeat"
- }
-
- assert represented ==
- NotificationView.render("notification.json", %{notification: notification, for: user})
- end
-
- test "A like notification" do
- note_activity = insert(:note_activity)
- user = User.get_cached_by_ap_id(note_activity.data["actor"])
- liker = insert(:user)
-
- {:ok, _activity} = TwitterAPI.fav(liker, note_activity.id)
- [notification] = Notification.for_user(user)
-
- represented = %{
- "created_at" => notification.inserted_at |> Utils.format_naive_asctime(),
- "from_profile" => UserView.render("show.json", %{user: liker, for: user}),
- "id" => notification.id,
- "is_seen" => 0,
- "notice" =>
- ActivityView.render("activity.json", %{activity: notification.activity, for: user}),
- "ntype" => "like"
- }
-
- assert represented ==
- NotificationView.render("notification.json", %{notification: notification, for: user})
- end
-end
diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs
deleted file mode 100644
index 70c5a0b7f..000000000
--- a/test/web/twitter_api/views/user_view_test.exs
+++ /dev/null
@@ -1,323 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.TwitterAPI.UserViewTest do
- use Pleroma.DataCase
-
- alias Pleroma.User
- alias Pleroma.Web.CommonAPI.Utils
- alias Pleroma.Web.TwitterAPI.UserView
-
- import Pleroma.Factory
-
- setup do
- user = insert(:user, bio: "<span>Here's some html</span>")
- [user: user]
- end
-
- test "A user with only a nickname", %{user: user} do
- user = %{user | name: nil, nickname: "scarlett@catgirl.science"}
- represented = UserView.render("show.json", %{user: user})
- assert represented["name"] == user.nickname
- assert represented["name_html"] == user.nickname
- end
-
- test "A user with an avatar object", %{user: user} do
- image = "image"
- user = %{user | avatar: %{"url" => [%{"href" => image}]}}
- represented = UserView.render("show.json", %{user: user})
- assert represented["profile_image_url"] == image
- end
-
- test "A user with emoji in username" do
- expected =
- "<img class=\"emoji\" alt=\"karjalanpiirakka\" title=\"karjalanpiirakka\" src=\"/file.png\" /> man"
-
- user =
- insert(:user, %{
- info: %{
- source_data: %{
- "tag" => [
- %{
- "type" => "Emoji",
- "icon" => %{"url" => "/file.png"},
- "name" => ":karjalanpiirakka:"
- }
- ]
- }
- },
- name: ":karjalanpiirakka: man"
- })
-
- represented = UserView.render("show.json", %{user: user})
- assert represented["name_html"] == expected
- end
-
- test "A user" do
- note_activity = insert(:note_activity)
- user = User.get_cached_by_ap_id(note_activity.data["actor"])
- {:ok, user} = User.update_note_count(user)
- follower = insert(:user)
- second_follower = insert(:user)
-
- User.follow(follower, user)
- User.follow(second_follower, user)
- User.follow(user, follower)
- {:ok, user} = User.update_follower_count(user)
- Cachex.put(:user_cache, "user_info:#{user.id}", User.user_info(Repo.get!(User, user.id)))
-
- image = "http://localhost:4001/images/avi.png"
- banner = "http://localhost:4001/images/banner.png"
-
- represented = %{
- "id" => user.id,
- "name" => user.name,
- "screen_name" => user.nickname,
- "name_html" => user.name,
- "description" => HtmlSanitizeEx.strip_tags(user.bio |> String.replace("<br>", "\n")),
- "description_html" => HtmlSanitizeEx.basic_html(user.bio),
- "created_at" => user.inserted_at |> Utils.format_naive_asctime(),
- "favourites_count" => 0,
- "statuses_count" => 1,
- "friends_count" => 1,
- "followers_count" => 2,
- "profile_image_url" => image,
- "profile_image_url_https" => image,
- "profile_image_url_profile_size" => image,
- "profile_image_url_original" => image,
- "following" => false,
- "follows_you" => false,
- "statusnet_blocking" => false,
- "statusnet_profile_url" => user.ap_id,
- "cover_photo" => banner,
- "background_image" => nil,
- "is_local" => true,
- "locked" => false,
- "hide_follows" => false,
- "hide_followers" => false,
- "fields" => [],
- "pleroma" => %{
- "confirmation_pending" => false,
- "tags" => [],
- "skip_thread_containment" => false
- },
- "rights" => %{"admin" => false, "delete_others_notice" => false},
- "role" => "member"
- }
-
- assert represented == UserView.render("show.json", %{user: user})
- end
-
- test "User exposes settings for themselves and only for themselves", %{user: user} do
- as_user = UserView.render("show.json", %{user: user, for: user})
- assert as_user["default_scope"] == user.info.default_scope
- assert as_user["no_rich_text"] == user.info.no_rich_text
- assert as_user["pleroma"]["notification_settings"] == user.info.notification_settings
- as_stranger = UserView.render("show.json", %{user: user})
- refute as_stranger["default_scope"]
- refute as_stranger["no_rich_text"]
- refute as_stranger["pleroma"]["notification_settings"]
- end
-
- test "A user for a given other follower", %{user: user} do
- follower = insert(:user, %{following: [User.ap_followers(user)]})
- {:ok, user} = User.update_follower_count(user)
- image = "http://localhost:4001/images/avi.png"
- banner = "http://localhost:4001/images/banner.png"
-
- represented = %{
- "id" => user.id,
- "name" => user.name,
- "screen_name" => user.nickname,
- "name_html" => user.name,
- "description" => HtmlSanitizeEx.strip_tags(user.bio |> String.replace("<br>", "\n")),
- "description_html" => HtmlSanitizeEx.basic_html(user.bio),
- "created_at" => user.inserted_at |> Utils.format_naive_asctime(),
- "favourites_count" => 0,
- "statuses_count" => 0,
- "friends_count" => 0,
- "followers_count" => 1,
- "profile_image_url" => image,
- "profile_image_url_https" => image,
- "profile_image_url_profile_size" => image,
- "profile_image_url_original" => image,
- "following" => true,
- "follows_you" => false,
- "statusnet_blocking" => false,
- "statusnet_profile_url" => user.ap_id,
- "cover_photo" => banner,
- "background_image" => nil,
- "is_local" => true,
- "locked" => false,
- "hide_follows" => false,
- "hide_followers" => false,
- "fields" => [],
- "pleroma" => %{
- "confirmation_pending" => false,
- "tags" => [],
- "skip_thread_containment" => false
- },
- "rights" => %{"admin" => false, "delete_others_notice" => false},
- "role" => "member"
- }
-
- assert represented == UserView.render("show.json", %{user: user, for: follower})
- end
-
- test "A user that follows you", %{user: user} do
- follower = insert(:user)
- {:ok, follower} = User.follow(follower, user)
- {:ok, user} = User.update_follower_count(user)
- image = "http://localhost:4001/images/avi.png"
- banner = "http://localhost:4001/images/banner.png"
-
- represented = %{
- "id" => follower.id,
- "name" => follower.name,
- "screen_name" => follower.nickname,
- "name_html" => follower.name,
- "description" => HtmlSanitizeEx.strip_tags(follower.bio |> String.replace("<br>", "\n")),
- "description_html" => HtmlSanitizeEx.basic_html(follower.bio),
- "created_at" => follower.inserted_at |> Utils.format_naive_asctime(),
- "favourites_count" => 0,
- "statuses_count" => 0,
- "friends_count" => 1,
- "followers_count" => 0,
- "profile_image_url" => image,
- "profile_image_url_https" => image,
- "profile_image_url_profile_size" => image,
- "profile_image_url_original" => image,
- "following" => false,
- "follows_you" => true,
- "statusnet_blocking" => false,
- "statusnet_profile_url" => follower.ap_id,
- "cover_photo" => banner,
- "background_image" => nil,
- "is_local" => true,
- "locked" => false,
- "hide_follows" => false,
- "hide_followers" => false,
- "fields" => [],
- "pleroma" => %{
- "confirmation_pending" => false,
- "tags" => [],
- "skip_thread_containment" => false
- },
- "rights" => %{"admin" => false, "delete_others_notice" => false},
- "role" => "member"
- }
-
- assert represented == UserView.render("show.json", %{user: follower, for: user})
- end
-
- test "a user that is a moderator" do
- user = insert(:user, %{info: %{is_moderator: true}})
- represented = UserView.render("show.json", %{user: user, for: user})
-
- assert represented["rights"]["delete_others_notice"]
- assert represented["role"] == "moderator"
- end
-
- test "a user that is a admin" do
- user = insert(:user, %{info: %{is_admin: true}})
- represented = UserView.render("show.json", %{user: user, for: user})
-
- assert represented["rights"]["admin"]
- assert represented["role"] == "admin"
- end
-
- test "A moderator with hidden role for another user", %{user: user} do
- admin = insert(:user, %{info: %{is_moderator: true, show_role: false}})
- represented = UserView.render("show.json", %{user: admin, for: user})
-
- assert represented["role"] == nil
- end
-
- test "An admin with hidden role for another user", %{user: user} do
- admin = insert(:user, %{info: %{is_admin: true, show_role: false}})
- represented = UserView.render("show.json", %{user: admin, for: user})
-
- assert represented["role"] == nil
- end
-
- test "A regular user for the admin", %{user: user} do
- admin = insert(:user, %{info: %{is_admin: true}})
- represented = UserView.render("show.json", %{user: user, for: admin})
-
- assert represented["pleroma"]["deactivated"] == false
- end
-
- test "A blocked user for the blocker" do
- user = insert(:user)
- blocker = insert(:user)
- User.block(blocker, user)
- image = "http://localhost:4001/images/avi.png"
- banner = "http://localhost:4001/images/banner.png"
-
- represented = %{
- "id" => user.id,
- "name" => user.name,
- "screen_name" => user.nickname,
- "name_html" => user.name,
- "description" => HtmlSanitizeEx.strip_tags(user.bio |> String.replace("<br>", "\n")),
- "description_html" => HtmlSanitizeEx.basic_html(user.bio),
- "created_at" => user.inserted_at |> Utils.format_naive_asctime(),
- "favourites_count" => 0,
- "statuses_count" => 0,
- "friends_count" => 0,
- "followers_count" => 0,
- "profile_image_url" => image,
- "profile_image_url_https" => image,
- "profile_image_url_profile_size" => image,
- "profile_image_url_original" => image,
- "following" => false,
- "follows_you" => false,
- "statusnet_blocking" => true,
- "statusnet_profile_url" => user.ap_id,
- "cover_photo" => banner,
- "background_image" => nil,
- "is_local" => true,
- "locked" => false,
- "hide_follows" => false,
- "hide_followers" => false,
- "fields" => [],
- "pleroma" => %{
- "confirmation_pending" => false,
- "tags" => [],
- "skip_thread_containment" => false
- },
- "rights" => %{"admin" => false, "delete_others_notice" => false},
- "role" => "member"
- }
-
- blocker = User.get_cached_by_id(blocker.id)
- assert represented == UserView.render("show.json", %{user: user, for: blocker})
- end
-
- test "a user with mastodon fields" do
- fields = [
- %{
- "name" => "Pronouns",
- "value" => "she/her"
- },
- %{
- "name" => "Website",
- "value" => "https://example.org/"
- }
- ]
-
- user =
- insert(:user, %{
- info: %{
- source_data: %{
- "attachment" =>
- Enum.map(fields, fn field -> Map.put(field, "type", "PropertyValue") end)
- }
- }
- })
-
- userview = UserView.render("show.json", %{user: user})
- assert userview["fields"] == fields
- end
-end
diff --git a/test/web/web_finger/web_finger_controller_test.exs b/test/web/web_finger/web_finger_controller_test.exs
index e23086b2a..bd3ccaaf7 100644
--- a/test/web/web_finger/web_finger_controller_test.exs
+++ b/test/web/web_finger/web_finger_controller_test.exs
@@ -5,6 +5,7 @@
defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
use Pleroma.Web.ConnCase
+ import ExUnit.CaptureLog
import Pleroma.Factory
import Tesla.Mock
@@ -75,11 +76,13 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
test "Sends a 404 when invalid format" do
user = insert(:user)
- assert_raise Phoenix.NotAcceptableError, fn ->
- build_conn()
- |> put_req_header("accept", "text/html")
- |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
- end
+ assert capture_log(fn ->
+ assert_raise Phoenix.NotAcceptableError, fn ->
+ build_conn()
+ |> put_req_header("accept", "text/html")
+ |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
+ end
+ end) =~ "no supported media type in accept header"
end
test "Sends a 400 when resource param is missing" do
diff --git a/test/web/websub/websub_test.exs b/test/web/websub/websub_test.exs
index 74386d7db..929acf5a2 100644
--- a/test/web/websub/websub_test.exs
+++ b/test/web/websub/websub_test.exs
@@ -4,11 +4,14 @@
defmodule Pleroma.Web.WebsubTest do
use Pleroma.DataCase
+ use Oban.Testing, repo: Pleroma.Repo
+ alias Pleroma.Tests.ObanHelpers
alias Pleroma.Web.Router.Helpers
alias Pleroma.Web.Websub
alias Pleroma.Web.Websub.WebsubClientSubscription
alias Pleroma.Web.Websub.WebsubServerSubscription
+ alias Pleroma.Workers.SubscriberWorker
import Pleroma.Factory
import Tesla.Mock
@@ -224,6 +227,7 @@ defmodule Pleroma.Web.WebsubTest do
})
_refresh = Websub.refresh_subscriptions()
+ ObanHelpers.perform(all_enqueued(worker: SubscriberWorker))
assert still_good == Repo.get(WebsubClientSubscription, still_good.id)
refute needs_refresh == Repo.get(WebsubClientSubscription, needs_refresh.id)