Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into feature/jobs
# Conflicts: # lib/pleroma/web/activity_pub/activity_pub.ex # lib/pleroma/web/federator/federator.ex
This commit is contained in:
commit
3a3a3996b7
604 changed files with 7319 additions and 692 deletions
4874
test/fixtures/rich_media/malformed-data.html
vendored
Normal file
4874
test/fixtures/rich_media/malformed-data.html
vendored
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -33,6 +33,7 @@ defmodule Pleroma.Web.ConnCase do
|
|||
|
||||
setup tags do
|
||||
Cachex.clear(:user_cache)
|
||||
Cachex.clear(:object_cache)
|
||||
:ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo)
|
||||
|
||||
unless tags[:async] do
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ defmodule Pleroma.DataCase do
|
|||
|
||||
setup tags do
|
||||
Cachex.clear(:user_cache)
|
||||
Cachex.clear(:object_cache)
|
||||
:ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo)
|
||||
|
||||
unless tags[:async] do
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ defmodule Pleroma.Factory do
|
|||
def websub_subscription_factory do
|
||||
%Pleroma.Web.Websub.WebsubServerSubscription{
|
||||
topic: "http://example.org",
|
||||
callback: "http://example/org/callback",
|
||||
callback: "http://example.org/callback",
|
||||
secret: "here's a secret",
|
||||
valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), 100),
|
||||
state: "requested"
|
||||
|
|
@ -220,4 +220,11 @@ defmodule Pleroma.Factory do
|
|||
client_secret: "aaa;/&bbb"
|
||||
}
|
||||
end
|
||||
|
||||
def instance_factory do
|
||||
%Pleroma.Instances.Instance{
|
||||
host: "domain.com",
|
||||
unreachable_since: nil
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -143,7 +143,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("https://squeet.me/xrd/?uri=lain@squeet.me", _, _,
|
||||
def get(
|
||||
"https://squeet.me/xrd/?uri=lain@squeet.me",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/xrd+xml,application/jrd+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -153,7 +156,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("https://mst3k.interlinked.me/users/luciferMysticus", _, _,
|
||||
def get(
|
||||
"https://mst3k.interlinked.me/users/luciferMysticus",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/activity+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -171,7 +177,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("https://hubzilla.example.org/channel/kaniini", _, _,
|
||||
def get(
|
||||
"https://hubzilla.example.org/channel/kaniini",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/activity+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -248,7 +257,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("http://mastodon.example.org/@admin/99541947525187367", _, _,
|
||||
def get(
|
||||
"http://mastodon.example.org/@admin/99541947525187367",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/activity+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -274,7 +286,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("https://mstdn.io/users/mayuutann/statuses/99568293732299394", _, _,
|
||||
def get(
|
||||
"https://mstdn.io/users/mayuutann/statuses/99568293732299394",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/activity+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -429,7 +444,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056", _, _,
|
||||
def get(
|
||||
"https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/atom+xml"
|
||||
) do
|
||||
{:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/sakamoto.atom")}}
|
||||
|
|
@ -510,7 +528,10 @@ defmodule HttpRequestMock do
|
|||
%Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/squeet.me_host_meta")}}
|
||||
end
|
||||
|
||||
def get("https://squeet.me/xrd?uri=lain@squeet.me", _, _,
|
||||
def get(
|
||||
"https://squeet.me/xrd?uri=lain@squeet.me",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/xrd+xml,application/jrd+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -541,7 +562,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("http://framatube.org/main/xrd?uri=framasoft@framatube.org", _, _,
|
||||
def get(
|
||||
"http://framatube.org/main/xrd?uri=framasoft@framatube.org",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/xrd+xml,application/jrd+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -560,7 +584,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("http://gnusocial.de/main/xrd?uri=winterdienst@gnusocial.de", _, _,
|
||||
def get(
|
||||
"http://gnusocial.de/main/xrd?uri=winterdienst@gnusocial.de",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/xrd+xml,application/jrd+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -594,7 +621,10 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def get("https://gerzilla.de/xrd/?uri=kaniini@gerzilla.de", _, _,
|
||||
def get(
|
||||
"https://gerzilla.de/xrd/?uri=kaniini@gerzilla.de",
|
||||
_,
|
||||
_,
|
||||
Accept: "application/xrd+xml,application/jrd+json"
|
||||
) do
|
||||
{:ok,
|
||||
|
|
@ -657,10 +687,23 @@ defmodule HttpRequestMock do
|
|||
{:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.html")}}
|
||||
end
|
||||
|
||||
def get("http://example.com/malformed", _, _, _) do
|
||||
{:ok,
|
||||
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/malformed-data.html")}}
|
||||
end
|
||||
|
||||
def get("http://example.com/empty", _, _, _) do
|
||||
{:ok, %Tesla.Env{status: 200, body: "hello"}}
|
||||
end
|
||||
|
||||
def get("http://404.site" <> _, _, _, _) do
|
||||
{:ok,
|
||||
%Tesla.Env{
|
||||
status: 404,
|
||||
body: ""
|
||||
}}
|
||||
end
|
||||
|
||||
def get(url, query, body, headers) do
|
||||
{:error,
|
||||
"Not implemented the mock response for get #{inspect(url)}, #{query}, #{inspect(body)}, #{
|
||||
|
|
@ -681,6 +724,26 @@ defmodule HttpRequestMock do
|
|||
}}
|
||||
end
|
||||
|
||||
def post("http://200.site" <> _, _, _, _) do
|
||||
{:ok,
|
||||
%Tesla.Env{
|
||||
status: 200,
|
||||
body: ""
|
||||
}}
|
||||
end
|
||||
|
||||
def post("http://connrefused.site" <> _, _, _, _) do
|
||||
{:error, :connrefused}
|
||||
end
|
||||
|
||||
def post("http://404.site" <> _, _, _, _) do
|
||||
{:ok,
|
||||
%Tesla.Env{
|
||||
status: 404,
|
||||
body: ""
|
||||
}}
|
||||
end
|
||||
|
||||
def post(url, _query, _body, _headers) do
|
||||
{:error, "Not implemented the mock response for post #{inspect(url)}"}
|
||||
end
|
||||
|
|
|
|||
|
|
@ -65,6 +65,19 @@ defmodule Pleroma.UserTest do
|
|||
refute User.following?(user, not_followed)
|
||||
end
|
||||
|
||||
test "follow_all follows mutliple users without duplicating" do
|
||||
user = insert(:user)
|
||||
followed_zero = insert(:user)
|
||||
followed_one = insert(:user)
|
||||
followed_two = insert(:user)
|
||||
|
||||
{:ok, user} = User.follow_all(user, [followed_zero, followed_one])
|
||||
assert length(user.following) == 3
|
||||
|
||||
{:ok, user} = User.follow_all(user, [followed_one, followed_two])
|
||||
assert length(user.following) == 4
|
||||
end
|
||||
|
||||
test "follow takes a user and another user" do
|
||||
user = insert(:user)
|
||||
followed = insert(:user)
|
||||
|
|
@ -951,4 +964,31 @@ defmodule Pleroma.UserTest do
|
|||
assert expected_text == User.parse_bio(bio, user)
|
||||
end
|
||||
end
|
||||
|
||||
test "bookmarks" do
|
||||
user = insert(:user)
|
||||
|
||||
{:ok, activity1} =
|
||||
CommonAPI.post(user, %{
|
||||
"status" => "heweoo!"
|
||||
})
|
||||
|
||||
id1 = activity1.data["object"]["id"]
|
||||
|
||||
{:ok, activity2} =
|
||||
CommonAPI.post(user, %{
|
||||
"status" => "heweoo!"
|
||||
})
|
||||
|
||||
id2 = activity2.data["object"]["id"]
|
||||
|
||||
assert {:ok, user_state1} = User.bookmark(user, id1)
|
||||
assert user_state1.bookmarks == [id1]
|
||||
|
||||
assert {:ok, user_state2} = User.unbookmark(user, id1)
|
||||
assert user_state2.bookmarks == []
|
||||
|
||||
assert {:ok, user_state3} = User.bookmark(user, id2)
|
||||
assert user_state3.bookmarks == [id2]
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -6,8 +6,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
|||
use Pleroma.Web.ConnCase
|
||||
import Pleroma.Factory
|
||||
alias Pleroma.Web.ActivityPub.{UserView, ObjectView}
|
||||
alias Pleroma.{Object, Repo, User}
|
||||
alias Pleroma.Activity
|
||||
alias Pleroma.{Object, Repo, Activity, User, Instances}
|
||||
|
||||
setup_all do
|
||||
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
||||
|
|
@ -144,6 +143,23 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
|||
:timer.sleep(500)
|
||||
assert Activity.get_by_ap_id(data["id"])
|
||||
end
|
||||
|
||||
test "it clears `unreachable` federation status of the sender", %{conn: conn} do
|
||||
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
|
||||
|
||||
sender_url = data["actor"]
|
||||
Instances.set_consistently_unreachable(sender_url)
|
||||
refute Instances.reachable?(sender_url)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> assign(:valid_signature, true)
|
||||
|> put_req_header("content-type", "application/activity+json")
|
||||
|> post("/inbox", data)
|
||||
|
||||
assert "ok" == json_response(conn, 200)
|
||||
assert Instances.reachable?(sender_url)
|
||||
end
|
||||
end
|
||||
|
||||
describe "/users/:nickname/inbox" do
|
||||
|
|
@ -191,6 +207,28 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
|||
|
||||
assert response(conn, 200) =~ note_activity.data["object"]["content"]
|
||||
end
|
||||
|
||||
test "it clears `unreachable` federation status of the sender", %{conn: conn} do
|
||||
user = insert(:user)
|
||||
|
||||
data =
|
||||
File.read!("test/fixtures/mastodon-post-activity.json")
|
||||
|> Poison.decode!()
|
||||
|> Map.put("bcc", [user.ap_id])
|
||||
|
||||
sender_host = URI.parse(data["actor"]).host
|
||||
Instances.set_consistently_unreachable(sender_host)
|
||||
refute Instances.reachable?(sender_host)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> assign(:valid_signature, true)
|
||||
|> put_req_header("content-type", "application/activity+json")
|
||||
|> post("/users/#{user.nickname}/inbox", data)
|
||||
|
||||
assert "ok" == json_response(conn, 200)
|
||||
assert Instances.reachable?(sender_host)
|
||||
end
|
||||
end
|
||||
|
||||
describe "/users/:nickname/outbox" do
|
||||
|
|
|
|||
|
|
@ -7,11 +7,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
|
|||
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||
alias Pleroma.Web.ActivityPub.Utils
|
||||
alias Pleroma.Web.CommonAPI
|
||||
alias Pleroma.{Activity, Object, User}
|
||||
alias Pleroma.{Activity, Object, User, Instances}
|
||||
alias Pleroma.Builders.ActivityBuilder
|
||||
|
||||
import Pleroma.Factory
|
||||
import Tesla.Mock
|
||||
import Mock
|
||||
|
||||
setup do
|
||||
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
||||
|
|
@ -696,6 +697,115 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
|
|||
assert 3 = length(activities)
|
||||
end
|
||||
|
||||
describe "publish_one/1" do
|
||||
test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is not specified",
|
||||
Instances,
|
||||
[:passthrough],
|
||||
[] do
|
||||
actor = insert(:user)
|
||||
inbox = "http://200.site/users/nick1/inbox"
|
||||
|
||||
assert {:ok, _} = ActivityPub.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
|
||||
|
||||
assert called(Instances.set_reachable(inbox))
|
||||
end
|
||||
|
||||
test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is set",
|
||||
Instances,
|
||||
[:passthrough],
|
||||
[] do
|
||||
actor = insert(:user)
|
||||
inbox = "http://200.site/users/nick1/inbox"
|
||||
|
||||
assert {:ok, _} =
|
||||
ActivityPub.publish_one(%{
|
||||
inbox: inbox,
|
||||
json: "{}",
|
||||
actor: actor,
|
||||
id: 1,
|
||||
unreachable_since: NaiveDateTime.utc_now()
|
||||
})
|
||||
|
||||
assert called(Instances.set_reachable(inbox))
|
||||
end
|
||||
|
||||
test_with_mock "does NOT call `Instances.set_reachable` on successful federation if `unreachable_since` is nil",
|
||||
Instances,
|
||||
[:passthrough],
|
||||
[] do
|
||||
actor = insert(:user)
|
||||
inbox = "http://200.site/users/nick1/inbox"
|
||||
|
||||
assert {:ok, _} =
|
||||
ActivityPub.publish_one(%{
|
||||
inbox: inbox,
|
||||
json: "{}",
|
||||
actor: actor,
|
||||
id: 1,
|
||||
unreachable_since: nil
|
||||
})
|
||||
|
||||
refute called(Instances.set_reachable(inbox))
|
||||
end
|
||||
|
||||
test_with_mock "calls `Instances.set_unreachable` on target inbox on non-2xx HTTP response code",
|
||||
Instances,
|
||||
[:passthrough],
|
||||
[] do
|
||||
actor = insert(:user)
|
||||
inbox = "http://404.site/users/nick1/inbox"
|
||||
|
||||
assert {:error, _} =
|
||||
ActivityPub.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
|
||||
|
||||
assert called(Instances.set_unreachable(inbox))
|
||||
end
|
||||
|
||||
test_with_mock "it calls `Instances.set_unreachable` on target inbox on request error of any kind",
|
||||
Instances,
|
||||
[:passthrough],
|
||||
[] do
|
||||
actor = insert(:user)
|
||||
inbox = "http://connrefused.site/users/nick1/inbox"
|
||||
|
||||
assert {:error, _} =
|
||||
ActivityPub.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
|
||||
|
||||
assert called(Instances.set_unreachable(inbox))
|
||||
end
|
||||
|
||||
test_with_mock "does NOT call `Instances.set_unreachable` if target is reachable",
|
||||
Instances,
|
||||
[:passthrough],
|
||||
[] do
|
||||
actor = insert(:user)
|
||||
inbox = "http://200.site/users/nick1/inbox"
|
||||
|
||||
assert {:ok, _} = ActivityPub.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
|
||||
|
||||
refute called(Instances.set_unreachable(inbox))
|
||||
end
|
||||
|
||||
test_with_mock "does NOT call `Instances.set_unreachable` if target instance has non-nil `unreachable_since`",
|
||||
Instances,
|
||||
[:passthrough],
|
||||
[] do
|
||||
actor = insert(:user)
|
||||
inbox = "http://connrefused.site/users/nick1/inbox"
|
||||
|
||||
assert {:error, _} =
|
||||
ActivityPub.publish_one(%{
|
||||
inbox: inbox,
|
||||
json: "{}",
|
||||
actor: actor,
|
||||
id: 1,
|
||||
unreachable_since: NaiveDateTime.utc_now()
|
||||
})
|
||||
|
||||
refute called(Instances.set_unreachable(inbox))
|
||||
end
|
||||
end
|
||||
|
||||
def data_uri do
|
||||
File.read!("test/fixtures/avatar_data_uri")
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@
|
|||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.FederatorTest do
|
||||
alias Pleroma.Web.Federator
|
||||
alias Pleroma.Web.CommonAPI
|
||||
alias Pleroma.Web.{CommonAPI, Federator}
|
||||
alias Pleroma.Instances
|
||||
use Pleroma.DataCase
|
||||
import Pleroma.Factory
|
||||
import Mock
|
||||
|
|
@ -55,6 +55,124 @@ defmodule Pleroma.Web.FederatorTest do
|
|||
end
|
||||
end
|
||||
|
||||
describe "Targets reachability filtering in `publish`" do
|
||||
test_with_mock "it federates only to reachable instances via AP",
|
||||
Federator,
|
||||
[:passthrough],
|
||||
[] do
|
||||
user = insert(:user)
|
||||
|
||||
{inbox1, inbox2} =
|
||||
{"https://domain.com/users/nick1/inbox", "https://domain2.com/users/nick2/inbox"}
|
||||
|
||||
insert(:user, %{
|
||||
local: false,
|
||||
nickname: "nick1@domain.com",
|
||||
ap_id: "https://domain.com/users/nick1",
|
||||
info: %{ap_enabled: true, source_data: %{"inbox" => inbox1}}
|
||||
})
|
||||
|
||||
insert(:user, %{
|
||||
local: false,
|
||||
nickname: "nick2@domain2.com",
|
||||
ap_id: "https://domain2.com/users/nick2",
|
||||
info: %{ap_enabled: true, source_data: %{"inbox" => inbox2}}
|
||||
})
|
||||
|
||||
dt = NaiveDateTime.utc_now()
|
||||
Instances.set_unreachable(inbox1, dt)
|
||||
|
||||
Instances.set_consistently_unreachable(URI.parse(inbox2).host)
|
||||
|
||||
{:ok, _activity} =
|
||||
CommonAPI.post(user, %{"status" => "HI @nick1@domain.com, @nick2@domain2.com!"})
|
||||
|
||||
assert called(
|
||||
Federator.enqueue(:publish_single_ap, %{inbox: inbox1, unreachable_since: dt})
|
||||
)
|
||||
|
||||
refute called(Federator.enqueue(:publish_single_ap, %{inbox: inbox2}))
|
||||
end
|
||||
|
||||
test_with_mock "it federates only to reachable instances via Websub",
|
||||
Federator,
|
||||
[:passthrough],
|
||||
[] do
|
||||
user = insert(:user)
|
||||
websub_topic = Pleroma.Web.OStatus.feed_path(user)
|
||||
|
||||
sub1 =
|
||||
insert(:websub_subscription, %{
|
||||
topic: websub_topic,
|
||||
state: "active",
|
||||
callback: "http://pleroma.soykaf.com/cb"
|
||||
})
|
||||
|
||||
sub2 =
|
||||
insert(:websub_subscription, %{
|
||||
topic: websub_topic,
|
||||
state: "active",
|
||||
callback: "https://pleroma2.soykaf.com/cb"
|
||||
})
|
||||
|
||||
dt = NaiveDateTime.utc_now()
|
||||
Instances.set_unreachable(sub2.callback, dt)
|
||||
|
||||
Instances.set_consistently_unreachable(sub1.callback)
|
||||
|
||||
{:ok, _activity} = CommonAPI.post(user, %{"status" => "HI"})
|
||||
|
||||
assert called(
|
||||
Federator.enqueue(:publish_single_websub, %{
|
||||
callback: sub2.callback,
|
||||
unreachable_since: dt
|
||||
})
|
||||
)
|
||||
|
||||
refute called(Federator.enqueue(:publish_single_websub, %{callback: sub1.callback}))
|
||||
end
|
||||
|
||||
test_with_mock "it federates only to reachable instances via Salmon",
|
||||
Federator,
|
||||
[:passthrough],
|
||||
[] do
|
||||
user = insert(:user)
|
||||
|
||||
remote_user1 =
|
||||
insert(:user, %{
|
||||
local: false,
|
||||
nickname: "nick1@domain.com",
|
||||
ap_id: "https://domain.com/users/nick1",
|
||||
info: %{salmon: "https://domain.com/salmon"}
|
||||
})
|
||||
|
||||
remote_user2 =
|
||||
insert(:user, %{
|
||||
local: false,
|
||||
nickname: "nick2@domain2.com",
|
||||
ap_id: "https://domain2.com/users/nick2",
|
||||
info: %{salmon: "https://domain2.com/salmon"}
|
||||
})
|
||||
|
||||
dt = NaiveDateTime.utc_now()
|
||||
Instances.set_unreachable(remote_user2.ap_id, dt)
|
||||
|
||||
Instances.set_consistently_unreachable("domain.com")
|
||||
|
||||
{:ok, _activity} =
|
||||
CommonAPI.post(user, %{"status" => "HI @nick1@domain.com, @nick2@domain2.com!"})
|
||||
|
||||
assert called(
|
||||
Federator.enqueue(:publish_single_salmon, %{
|
||||
recipient: remote_user2,
|
||||
unreachable_since: dt
|
||||
})
|
||||
)
|
||||
|
||||
refute called(Federator.enqueue(:publish_single_websub, %{recipient: remote_user1}))
|
||||
end
|
||||
end
|
||||
|
||||
describe "Receive an activity" do
|
||||
test "successfully processes incoming AP docs with correct origin" do
|
||||
params = %{
|
||||
|
|
|
|||
107
test/web/instances/instance_test.exs
Normal file
107
test/web/instances/instance_test.exs
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Instances.InstanceTest do
|
||||
alias Pleroma.Repo
|
||||
alias Pleroma.Instances.Instance
|
||||
|
||||
use Pleroma.DataCase
|
||||
|
||||
import Pleroma.Factory
|
||||
|
||||
setup_all do
|
||||
config_path = [:instance, :federation_reachability_timeout_days]
|
||||
initial_setting = Pleroma.Config.get(config_path)
|
||||
|
||||
Pleroma.Config.put(config_path, 1)
|
||||
on_exit(fn -> Pleroma.Config.put(config_path, initial_setting) end)
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
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())
|
||||
|
||||
assert {:ok, instance} = Instance.set_reachable(instance.host)
|
||||
refute instance.unreachable_since
|
||||
end
|
||||
|
||||
test "keeps nil `unreachable_since` of existing matching Instance record having nil `unreachable_since`" do
|
||||
instance = insert(:instance, unreachable_since: nil)
|
||||
|
||||
assert {:ok, instance} = Instance.set_reachable(instance.host)
|
||||
refute instance.unreachable_since
|
||||
end
|
||||
|
||||
test "does NOT create an Instance record in case of no existing matching record" do
|
||||
host = "domain.org"
|
||||
assert nil == Instance.set_reachable(host)
|
||||
|
||||
assert [] = Repo.all(Ecto.Query.from(i in Instance))
|
||||
assert Instance.reachable?(host)
|
||||
end
|
||||
end
|
||||
|
||||
describe "set_unreachable/1" do
|
||||
test "creates new record having `unreachable_since` to current time if record does not exist" do
|
||||
assert {:ok, instance} = Instance.set_unreachable("https://domain.com/path")
|
||||
|
||||
instance = Repo.get(Instance, instance.id)
|
||||
assert instance.unreachable_since
|
||||
assert "domain.com" == instance.host
|
||||
end
|
||||
|
||||
test "sets `unreachable_since` of existing record having nil `unreachable_since`" do
|
||||
instance = insert(:instance, unreachable_since: nil)
|
||||
refute instance.unreachable_since
|
||||
|
||||
assert {:ok, _} = Instance.set_unreachable(instance.host)
|
||||
|
||||
instance = Repo.get(Instance, instance.id)
|
||||
assert instance.unreachable_since
|
||||
end
|
||||
|
||||
test "does NOT modify `unreachable_since` value of existing record in case it's present" do
|
||||
instance =
|
||||
insert(:instance, unreachable_since: NaiveDateTime.add(NaiveDateTime.utc_now(), -10))
|
||||
|
||||
assert instance.unreachable_since
|
||||
initial_value = instance.unreachable_since
|
||||
|
||||
assert {:ok, _} = Instance.set_unreachable(instance.host)
|
||||
|
||||
instance = Repo.get(Instance, instance.id)
|
||||
assert initial_value == instance.unreachable_since
|
||||
end
|
||||
end
|
||||
|
||||
describe "set_unreachable/2" do
|
||||
test "sets `unreachable_since` value of existing record in case it's newer than supplied value" do
|
||||
instance =
|
||||
insert(:instance, unreachable_since: NaiveDateTime.add(NaiveDateTime.utc_now(), -10))
|
||||
|
||||
assert instance.unreachable_since
|
||||
|
||||
past_value = NaiveDateTime.add(NaiveDateTime.utc_now(), -100)
|
||||
assert {:ok, _} = Instance.set_unreachable(instance.host, past_value)
|
||||
|
||||
instance = Repo.get(Instance, instance.id)
|
||||
assert past_value == instance.unreachable_since
|
||||
end
|
||||
|
||||
test "does NOT modify `unreachable_since` value of existing record in case it's equal to or older than supplied value" do
|
||||
instance =
|
||||
insert(:instance, unreachable_since: NaiveDateTime.add(NaiveDateTime.utc_now(), -10))
|
||||
|
||||
assert instance.unreachable_since
|
||||
initial_value = instance.unreachable_since
|
||||
|
||||
assert {:ok, _} = Instance.set_unreachable(instance.host, NaiveDateTime.utc_now())
|
||||
|
||||
instance = Repo.get(Instance, instance.id)
|
||||
assert initial_value == instance.unreachable_since
|
||||
end
|
||||
end
|
||||
end
|
||||
131
test/web/instances/instances_test.exs
Normal file
131
test/web/instances/instances_test.exs
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.InstancesTest do
|
||||
alias Pleroma.Instances
|
||||
|
||||
use Pleroma.DataCase
|
||||
|
||||
setup_all do
|
||||
config_path = [:instance, :federation_reachability_timeout_days]
|
||||
initial_setting = Pleroma.Config.get(config_path)
|
||||
|
||||
Pleroma.Config.put(config_path, 1)
|
||||
on_exit(fn -> Pleroma.Config.put(config_path, initial_setting) end)
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
describe "reachable?/1" do
|
||||
test "returns `true` for host / url with unknown reachability status" do
|
||||
assert Instances.reachable?("unknown.site")
|
||||
assert Instances.reachable?("http://unknown.site")
|
||||
end
|
||||
|
||||
test "returns `false` for host / url marked unreachable for at least `reachability_datetime_threshold()`" do
|
||||
host = "consistently-unreachable.name"
|
||||
Instances.set_consistently_unreachable(host)
|
||||
|
||||
refute Instances.reachable?(host)
|
||||
refute Instances.reachable?("http://#{host}/path")
|
||||
end
|
||||
|
||||
test "returns `true` for host / url marked unreachable for less than `reachability_datetime_threshold()`" do
|
||||
url = "http://eventually-unreachable.name/path"
|
||||
|
||||
Instances.set_unreachable(url)
|
||||
|
||||
assert Instances.reachable?(url)
|
||||
assert Instances.reachable?(URI.parse(url).host)
|
||||
end
|
||||
|
||||
test "returns true on non-binary input" do
|
||||
assert Instances.reachable?(nil)
|
||||
assert Instances.reachable?(1)
|
||||
end
|
||||
end
|
||||
|
||||
describe "filter_reachable/1" do
|
||||
setup do
|
||||
host = "consistently-unreachable.name"
|
||||
url1 = "http://eventually-unreachable.com/path"
|
||||
url2 = "http://domain.com/path"
|
||||
|
||||
Instances.set_consistently_unreachable(host)
|
||||
Instances.set_unreachable(url1)
|
||||
|
||||
result = Instances.filter_reachable([host, url1, url2, nil])
|
||||
%{result: result, url1: url1, url2: url2}
|
||||
end
|
||||
|
||||
test "returns a map with keys containing 'not marked consistently unreachable' elements of supplied list",
|
||||
%{result: result, url1: url1, url2: url2} do
|
||||
assert is_map(result)
|
||||
assert Enum.sort([url1, url2]) == result |> Map.keys() |> Enum.sort()
|
||||
end
|
||||
|
||||
test "returns a map with `unreachable_since` values for keys",
|
||||
%{result: result, url1: url1, url2: url2} do
|
||||
assert is_map(result)
|
||||
assert %NaiveDateTime{} = result[url1]
|
||||
assert is_nil(result[url2])
|
||||
end
|
||||
|
||||
test "returns an empty map for empty list or list containing no hosts / url" do
|
||||
assert %{} == Instances.filter_reachable([])
|
||||
assert %{} == Instances.filter_reachable([nil])
|
||||
end
|
||||
end
|
||||
|
||||
describe "set_reachable/1" do
|
||||
test "sets unreachable url or host reachable" do
|
||||
host = "domain.com"
|
||||
Instances.set_consistently_unreachable(host)
|
||||
refute Instances.reachable?(host)
|
||||
|
||||
Instances.set_reachable(host)
|
||||
assert Instances.reachable?(host)
|
||||
end
|
||||
|
||||
test "keeps reachable url or host reachable" do
|
||||
url = "https://site.name?q="
|
||||
assert Instances.reachable?(url)
|
||||
|
||||
Instances.set_reachable(url)
|
||||
assert Instances.reachable?(url)
|
||||
end
|
||||
|
||||
test "returns error status on non-binary input" do
|
||||
assert {:error, _} = Instances.set_reachable(nil)
|
||||
assert {:error, _} = Instances.set_reachable(1)
|
||||
end
|
||||
end
|
||||
|
||||
# Note: implementation-specific (e.g. Instance) details of set_unreachable/1 should be tested in implementation-specific tests
|
||||
describe "set_unreachable/1" do
|
||||
test "returns error status on non-binary input" do
|
||||
assert {:error, _} = Instances.set_unreachable(nil)
|
||||
assert {:error, _} = Instances.set_unreachable(1)
|
||||
end
|
||||
end
|
||||
|
||||
describe "set_consistently_unreachable/1" do
|
||||
test "sets reachable url or host unreachable" do
|
||||
url = "http://domain.com?q="
|
||||
assert Instances.reachable?(url)
|
||||
|
||||
Instances.set_consistently_unreachable(url)
|
||||
refute Instances.reachable?(url)
|
||||
end
|
||||
|
||||
test "keeps unreachable url or host unreachable" do
|
||||
host = "site.name"
|
||||
Instances.set_consistently_unreachable(host)
|
||||
refute Instances.reachable?(host)
|
||||
|
||||
Instances.set_consistently_unreachable(host)
|
||||
refute Instances.reachable?(host)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -137,6 +137,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
|||
end
|
||||
|
||||
test "posting a status with OGP link preview", %{conn: conn} do
|
||||
Pleroma.Config.put([:rich_media, :enabled], true)
|
||||
user = insert(:user)
|
||||
|
||||
conn =
|
||||
|
|
@ -148,6 +149,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
|||
|
||||
assert %{"id" => id, "card" => %{"title" => "The Rock"}} = json_response(conn, 200)
|
||||
assert Repo.get(Activity, id)
|
||||
Pleroma.Config.put([:rich_media, :enabled], false)
|
||||
end
|
||||
|
||||
test "posting a direct status", %{conn: conn} do
|
||||
|
|
@ -1667,6 +1669,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
|||
end
|
||||
|
||||
test "Status rich-media Card", %{conn: conn, user: user} do
|
||||
Pleroma.Config.put([:rich_media, :enabled], true)
|
||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "http://example.com/ogp"})
|
||||
|
||||
response =
|
||||
|
|
@ -1691,6 +1694,59 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pleroma.Config.put([:rich_media, :enabled], false)
|
||||
end
|
||||
end
|
||||
|
||||
test "bookmarks" do
|
||||
user = insert(:user)
|
||||
for_user = insert(:user)
|
||||
|
||||
{:ok, activity1} =
|
||||
CommonAPI.post(user, %{
|
||||
"status" => "heweoo?"
|
||||
})
|
||||
|
||||
{:ok, activity2} =
|
||||
CommonAPI.post(user, %{
|
||||
"status" => "heweoo!"
|
||||
})
|
||||
|
||||
response1 =
|
||||
build_conn()
|
||||
|> assign(:user, for_user)
|
||||
|> post("/api/v1/statuses/#{activity1.id}/bookmark")
|
||||
|
||||
assert json_response(response1, 200)["bookmarked"] == true
|
||||
|
||||
response2 =
|
||||
build_conn()
|
||||
|> assign(:user, for_user)
|
||||
|> post("/api/v1/statuses/#{activity2.id}/bookmark")
|
||||
|
||||
assert json_response(response2, 200)["bookmarked"] == true
|
||||
|
||||
bookmarks =
|
||||
build_conn()
|
||||
|> assign(:user, for_user)
|
||||
|> get("/api/v1/bookmarks")
|
||||
|
||||
assert [json_response(response2, 200), json_response(response1, 200)] ==
|
||||
json_response(bookmarks, 200)
|
||||
|
||||
response1 =
|
||||
build_conn()
|
||||
|> assign(:user, for_user)
|
||||
|> post("/api/v1/statuses/#{activity1.id}/unbookmark")
|
||||
|
||||
assert json_response(response1, 200)["bookmarked"] == false
|
||||
|
||||
bookmarks =
|
||||
build_conn()
|
||||
|> assign(:user, for_user)
|
||||
|> get("/api/v1/bookmarks")
|
||||
|
||||
assert [json_response(response2, 200)] == json_response(bookmarks, 200)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
|
|||
replies_count: 0,
|
||||
favourites_count: 0,
|
||||
reblogged: false,
|
||||
bookmarked: false,
|
||||
favourited: false,
|
||||
muted: false,
|
||||
pinned: false,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ defmodule Pleroma.Web.NodeInfoTest do
|
|||
|
||||
conn =
|
||||
conn
|
||||
|> get("/nodeinfo/2.0.json")
|
||||
|> get("/nodeinfo/2.1.json")
|
||||
|
||||
assert result = json_response(conn, 200)
|
||||
|
||||
|
|
@ -22,7 +22,7 @@ defmodule Pleroma.Web.NodeInfoTest do
|
|||
test "nodeinfo shows restricted nicknames", %{conn: conn} do
|
||||
conn =
|
||||
conn
|
||||
|> get("/nodeinfo/2.0.json")
|
||||
|> get("/nodeinfo/2.1.json")
|
||||
|
||||
assert result = json_response(conn, 200)
|
||||
|
||||
|
|
@ -41,6 +41,38 @@ defmodule Pleroma.Web.NodeInfoTest do
|
|||
|> get("/.well-known/nodeinfo")
|
||||
|> json_response(404)
|
||||
|
||||
conn
|
||||
|> get("/nodeinfo/2.1.json")
|
||||
|> json_response(404)
|
||||
|
||||
instance =
|
||||
Application.get_env(:pleroma, :instance)
|
||||
|> Keyword.put(:federating, true)
|
||||
|
||||
Application.put_env(:pleroma, :instance, instance)
|
||||
end
|
||||
|
||||
test "returns 200 when federation is enabled", %{conn: conn} do
|
||||
conn
|
||||
|> get("/.well-known/nodeinfo")
|
||||
|> json_response(200)
|
||||
|
||||
conn
|
||||
|> get("/nodeinfo/2.1.json")
|
||||
|> json_response(200)
|
||||
end
|
||||
|
||||
test "returns 404 when federation is disabled (nodeinfo 2.0)", %{conn: conn} do
|
||||
instance =
|
||||
Application.get_env(:pleroma, :instance)
|
||||
|> Keyword.put(:federating, false)
|
||||
|
||||
Application.put_env(:pleroma, :instance, instance)
|
||||
|
||||
conn
|
||||
|> get("/.well-known/nodeinfo")
|
||||
|> json_response(404)
|
||||
|
||||
conn
|
||||
|> get("/nodeinfo/2.0.json")
|
||||
|> json_response(404)
|
||||
|
|
@ -52,7 +84,7 @@ defmodule Pleroma.Web.NodeInfoTest do
|
|||
Application.put_env(:pleroma, :instance, instance)
|
||||
end
|
||||
|
||||
test "returns 200 when federation is enabled", %{conn: conn} do
|
||||
test "returns 200 when federation is enabled (nodeinfo 2.0)", %{conn: conn} do
|
||||
conn
|
||||
|> get("/.well-known/nodeinfo")
|
||||
|> json_response(200)
|
||||
|
|
@ -61,4 +93,17 @@ defmodule Pleroma.Web.NodeInfoTest do
|
|||
|> get("/nodeinfo/2.0.json")
|
||||
|> json_response(200)
|
||||
end
|
||||
|
||||
test "returns software.repository field in nodeinfo 2.1", %{conn: conn} do
|
||||
conn
|
||||
|> get("/.well-known/nodeinfo")
|
||||
|> json_response(200)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> get("/nodeinfo/2.1.json")
|
||||
|
||||
assert result = json_response(conn, 200)
|
||||
assert Pleroma.Application.repository() == result["software"]["repository"]
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,9 +2,16 @@ defmodule Pleroma.Web.OStatus.DeleteHandlingTest do
|
|||
use Pleroma.DataCase
|
||||
|
||||
import Pleroma.Factory
|
||||
import Tesla.Mock
|
||||
|
||||
alias Pleroma.{Repo, Activity, Object}
|
||||
alias Pleroma.Web.OStatus
|
||||
|
||||
setup do
|
||||
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
||||
:ok
|
||||
end
|
||||
|
||||
describe "deletions" do
|
||||
test "it removes the mentioned activity" do
|
||||
note = insert(:note_activity)
|
||||
|
|
|
|||
|
|
@ -14,49 +14,51 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
|
|||
:ok
|
||||
end
|
||||
|
||||
test "decodes a salmon", %{conn: conn} do
|
||||
user = insert(:user)
|
||||
salmon = File.read!("test/fixtures/salmon.xml")
|
||||
describe "salmon_incoming" do
|
||||
test "decodes a salmon", %{conn: conn} do
|
||||
user = insert(:user)
|
||||
salmon = File.read!("test/fixtures/salmon.xml")
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/users/#{user.nickname}/salmon", salmon)
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/users/#{user.nickname}/salmon", salmon)
|
||||
|
||||
assert response(conn, 200)
|
||||
end
|
||||
assert response(conn, 200)
|
||||
end
|
||||
|
||||
test "decodes a salmon with a changed magic key", %{conn: conn} do
|
||||
user = insert(:user)
|
||||
salmon = File.read!("test/fixtures/salmon.xml")
|
||||
test "decodes a salmon with a changed magic key", %{conn: conn} do
|
||||
user = insert(:user)
|
||||
salmon = File.read!("test/fixtures/salmon.xml")
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/users/#{user.nickname}/salmon", salmon)
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/users/#{user.nickname}/salmon", salmon)
|
||||
|
||||
assert response(conn, 200)
|
||||
assert response(conn, 200)
|
||||
|
||||
# Set a wrong magic-key for a user so it has to refetch
|
||||
salmon_user = User.get_by_ap_id("http://gs.example.org:4040/index.php/user/1")
|
||||
# Wrong key
|
||||
info_cng =
|
||||
User.Info.remote_user_creation(salmon_user.info, %{
|
||||
magic_key:
|
||||
"RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwrong1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB"
|
||||
})
|
||||
# Set a wrong magic-key for a user so it has to refetch
|
||||
salmon_user = User.get_by_ap_id("http://gs.example.org:4040/index.php/user/1")
|
||||
# Wrong key
|
||||
info_cng =
|
||||
User.Info.remote_user_creation(salmon_user.info, %{
|
||||
magic_key:
|
||||
"RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwrong1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB"
|
||||
})
|
||||
|
||||
salmon_user
|
||||
|> Ecto.Changeset.change()
|
||||
|> Ecto.Changeset.put_embed(:info, info_cng)
|
||||
|> Repo.update()
|
||||
salmon_user
|
||||
|> Ecto.Changeset.change()
|
||||
|> Ecto.Changeset.put_embed(:info, info_cng)
|
||||
|> Repo.update()
|
||||
|
||||
conn =
|
||||
build_conn()
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/users/#{user.nickname}/salmon", salmon)
|
||||
conn =
|
||||
build_conn()
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/users/#{user.nickname}/salmon", salmon)
|
||||
|
||||
assert response(conn, 200)
|
||||
assert response(conn, 200)
|
||||
end
|
||||
end
|
||||
|
||||
test "gets a feed", %{conn: conn} do
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ defmodule Pleroma.Web.OStatusTest do
|
|||
use Pleroma.DataCase
|
||||
alias Pleroma.Web.OStatus
|
||||
alias Pleroma.Web.XML
|
||||
alias Pleroma.{Object, Repo, User, Activity}
|
||||
alias Pleroma.{Object, Repo, User, Activity, Instances}
|
||||
import Pleroma.Factory
|
||||
import ExUnit.CaptureLog
|
||||
|
||||
|
|
@ -311,6 +311,22 @@ defmodule Pleroma.Web.OStatusTest do
|
|||
refute User.following?(follower, followed)
|
||||
end
|
||||
|
||||
test "it clears `unreachable` federation status of the sender" do
|
||||
incoming_reaction_xml = File.read!("test/fixtures/share-gs.xml")
|
||||
doc = XML.parse_document(incoming_reaction_xml)
|
||||
actor_uri = XML.string_from_xpath("//author/uri[1]", doc)
|
||||
reacted_to_author_uri = XML.string_from_xpath("//author/uri[2]", doc)
|
||||
|
||||
Instances.set_consistently_unreachable(actor_uri)
|
||||
Instances.set_consistently_unreachable(reacted_to_author_uri)
|
||||
refute Instances.reachable?(actor_uri)
|
||||
refute Instances.reachable?(reacted_to_author_uri)
|
||||
|
||||
{:ok, _} = OStatus.handle_incoming(incoming_reaction_xml)
|
||||
assert Instances.reachable?(actor_uri)
|
||||
refute Instances.reachable?(reacted_to_author_uri)
|
||||
end
|
||||
|
||||
describe "new remote user creation" do
|
||||
test "returns local users" do
|
||||
local_user = insert(:user)
|
||||
|
|
@ -514,6 +530,8 @@ defmodule Pleroma.Web.OStatusTest do
|
|||
note_object.data
|
||||
|> Map.put("type", "Article")
|
||||
|
||||
Cachex.clear(:object_cache)
|
||||
|
||||
cs = Object.change(note_object, %{data: note_data})
|
||||
{:ok, _article_object} = Repo.update(cs)
|
||||
|
||||
|
|
|
|||
|
|
@ -88,4 +88,8 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
|
|||
width: "1024"
|
||||
}}
|
||||
end
|
||||
|
||||
test "rejects invalid OGP data" do
|
||||
assert {:error, _} = Pleroma.Web.RichMedia.Parser.parse("http://example.com/malformed")
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -200,12 +200,27 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
|
|||
|
||||
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.data["object"])
|
||||
|
||||
assert object.data["like_count"] == 1
|
||||
|
||||
assert status == updated_activity
|
||||
|
||||
{:ok, _status} = TwitterAPI.fav(other_user, note_activity.id)
|
||||
|
||||
object = Object.normalize(note_activity.data["object"])
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -50,35 +50,37 @@ defmodule Pleroma.Web.Websub.WebsubControllerTest do
|
|||
assert_in_delta NaiveDateTime.diff(websub.valid_until, NaiveDateTime.utc_now()), 100, 5
|
||||
end
|
||||
|
||||
test "handles incoming feed updates", %{conn: conn} do
|
||||
websub = insert(:websub_client_subscription)
|
||||
doc = "some stuff"
|
||||
signature = Websub.sign(websub.secret, doc)
|
||||
describe "websub_incoming" do
|
||||
test "handles incoming feed updates", %{conn: conn} do
|
||||
websub = insert(:websub_client_subscription)
|
||||
doc = "some stuff"
|
||||
signature = Websub.sign(websub.secret, doc)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("x-hub-signature", "sha1=" <> signature)
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/push/subscriptions/#{websub.id}", doc)
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("x-hub-signature", "sha1=" <> signature)
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/push/subscriptions/#{websub.id}", doc)
|
||||
|
||||
assert response(conn, 200) == "OK"
|
||||
assert response(conn, 200) == "OK"
|
||||
|
||||
assert length(Repo.all(Activity)) == 1
|
||||
end
|
||||
assert length(Repo.all(Activity)) == 1
|
||||
end
|
||||
|
||||
test "rejects incoming feed updates with the wrong signature", %{conn: conn} do
|
||||
websub = insert(:websub_client_subscription)
|
||||
doc = "some stuff"
|
||||
signature = Websub.sign("wrong secret", doc)
|
||||
test "rejects incoming feed updates with the wrong signature", %{conn: conn} do
|
||||
websub = insert(:websub_client_subscription)
|
||||
doc = "some stuff"
|
||||
signature = Websub.sign("wrong secret", doc)
|
||||
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("x-hub-signature", "sha1=" <> signature)
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/push/subscriptions/#{websub.id}", doc)
|
||||
conn =
|
||||
conn
|
||||
|> put_req_header("x-hub-signature", "sha1=" <> signature)
|
||||
|> put_req_header("content-type", "application/atom+xml")
|
||||
|> post("/push/subscriptions/#{websub.id}", doc)
|
||||
|
||||
assert response(conn, 500) == "Error"
|
||||
assert response(conn, 500) == "Error"
|
||||
|
||||
assert length(Repo.all(Activity)) == 0
|
||||
assert length(Repo.all(Activity)) == 0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue