forked from AkkomaGang/akkoma
Merge branch 'develop' into feature/activitypub
This commit is contained in:
commit
b331cb449a
36 changed files with 119 additions and 95 deletions
|
@ -21,4 +21,4 @@ before_script:
|
||||||
unit-testing:
|
unit-testing:
|
||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- MIX_ENV=test mix test
|
- MIX_ENV=test mix test --trace
|
||||||
|
|
|
@ -32,7 +32,7 @@ def update_stats do
|
||||||
domain_count = Enum.count(peers)
|
domain_count = Enum.count(peers)
|
||||||
status_query = from(u in User.local_user_query,
|
status_query = from(u in User.local_user_query,
|
||||||
select: fragment("sum((?->>'note_count')::int)", u.info))
|
select: fragment("sum((?->>'note_count')::int)", u.info))
|
||||||
status_count = Repo.one(status_query) |> IO.inspect
|
status_count = Repo.one(status_query)
|
||||||
user_count = Repo.aggregate(User.local_user_query, :count, :id)
|
user_count = Repo.aggregate(User.local_user_query, :count, :id)
|
||||||
Agent.update(__MODULE__, fn _ ->
|
Agent.update(__MODULE__, fn _ ->
|
||||||
{peers, %{domain_count: domain_count, status_count: status_count, user_count: user_count}}
|
{peers, %{domain_count: domain_count, status_count: status_count, user_count: user_count}}
|
||||||
|
|
|
@ -10,6 +10,8 @@ def to_simple_form(user, activities, _users) do
|
||||||
|
|
||||||
h = fn(str) -> [to_charlist(str)] end
|
h = fn(str) -> [to_charlist(str)] end
|
||||||
|
|
||||||
|
last_activity = List.last(activities)
|
||||||
|
|
||||||
entries = activities
|
entries = activities
|
||||||
|> Enum.map(fn(activity) ->
|
|> Enum.map(fn(activity) ->
|
||||||
{:entry, ActivityRepresenter.to_simple_form(activity, user)}
|
{:entry, ActivityRepresenter.to_simple_form(activity, user)}
|
||||||
|
@ -32,7 +34,15 @@ def to_simple_form(user, activities, _users) do
|
||||||
{:link, [rel: 'salmon', href: h.(OStatus.salmon_path(user))], []},
|
{:link, [rel: 'salmon', href: h.(OStatus.salmon_path(user))], []},
|
||||||
{:link, [rel: 'self', href: h.(OStatus.feed_path(user)), type: 'application/atom+xml'], []},
|
{:link, [rel: 'self', href: h.(OStatus.feed_path(user)), type: 'application/atom+xml'], []},
|
||||||
{:author, UserRepresenter.to_simple_form(user)},
|
{:author, UserRepresenter.to_simple_form(user)},
|
||||||
] ++ entries
|
] ++
|
||||||
|
if last_activity do
|
||||||
|
[{:link, [rel: 'next',
|
||||||
|
href: to_charlist(OStatus.feed_path(user)) ++ '?max_id=' ++ to_charlist(last_activity.id),
|
||||||
|
type: 'application/atom+xml'], []}]
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
++ entries
|
||||||
}]
|
}]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,7 +19,7 @@ def feed_redirect(conn, %{"nickname" => nickname} = params) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def feed(conn, %{"nickname" => nickname}) do
|
def feed(conn, %{"nickname" => nickname} = params) do
|
||||||
user = User.get_cached_by_nickname(nickname)
|
user = User.get_cached_by_nickname(nickname)
|
||||||
query = from activity in Activity,
|
query = from activity in Activity,
|
||||||
where: fragment("?->>'actor' = ?", activity.data, ^user.ap_id),
|
where: fragment("?->>'actor' = ?", activity.data, ^user.ap_id),
|
||||||
|
@ -27,6 +27,7 @@ def feed(conn, %{"nickname" => nickname}) do
|
||||||
order_by: [desc: :id]
|
order_by: [desc: :id]
|
||||||
|
|
||||||
activities = query
|
activities = query
|
||||||
|
|> restrict_max(params)
|
||||||
|> Repo.all
|
|> Repo.all
|
||||||
|
|
||||||
response = user
|
response = user
|
||||||
|
@ -56,6 +57,11 @@ defp decode_or_retry(body) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp restrict_max(query, %{"max_id" => max_id}) do
|
||||||
|
from activity in query, where: activity.id < ^max_id
|
||||||
|
end
|
||||||
|
defp restrict_max(query, _), do: query
|
||||||
|
|
||||||
def salmon_incoming(conn, _) do
|
def salmon_incoming(conn, _) do
|
||||||
{:ok, body, _conn} = read_body(conn)
|
{:ok, body, _conn} = read_body(conn)
|
||||||
{:ok, doc} = decode_or_retry(body)
|
{:ok, doc} = decode_or_retry(body)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Pleroma</title><link rel=stylesheet href=/static/font/css/fontello.css><link rel=stylesheet href=/static/font/css/animation.css><link href=/static/css/app.b3deb1dd44970d86cc6b368f36fd09d9.css rel=stylesheet></head><body style="display: none"><div id=app></div><script type=text/javascript src=/static/js/manifest.15dfe939c498cca9840c.js></script><script type=text/javascript src=/static/js/vendor.409059e5a814f448f5bc.js></script><script type=text/javascript src=/static/js/app.30c01d7540d43b760f03.js></script></body></html>
|
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Pleroma</title><link rel=stylesheet href=/static/font/css/fontello.css><link rel=stylesheet href=/static/font/css/animation.css><link href=/static/css/app.b3deb1dd44970d86cc6b368f36fd09d9.css rel=stylesheet></head><body style="display: none"><div id=app></div><script type=text/javascript src=/static/js/manifest.f8637fb66085728d1fbd.js></script><script type=text/javascript src=/static/js/vendor.6ceb4478f308829a2829.js></script><script type=text/javascript src=/static/js/app.23c1437e78f655a31c4a.js></script></body></html>
|
4
priv/static/instance/panel.html
Normal file
4
priv/static/instance/panel.html
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<div style="margin-left:12px; margin-right:12px">
|
||||||
|
<p>This is a <a href="https://pleroma.social" target="_blank">Pleroma</a> instance.</p>
|
||||||
|
</div>
|
||||||
|
|
|
@ -3,5 +3,6 @@
|
||||||
"background": "/static/bg.jpg",
|
"background": "/static/bg.jpg",
|
||||||
"logo": "/static/logo.png",
|
"logo": "/static/logo.png",
|
||||||
"defaultPath": "/main/all",
|
"defaultPath": "/main/all",
|
||||||
"chatDisabled": false
|
"chatDisabled": false,
|
||||||
|
"showInstanceSpecificPanel": false
|
||||||
}
|
}
|
||||||
|
|
BIN
priv/static/static/js/app.23c1437e78f655a31c4a.js
Normal file
BIN
priv/static/static/js/app.23c1437e78f655a31c4a.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/app.23c1437e78f655a31c4a.js.map
Normal file
BIN
priv/static/static/js/app.23c1437e78f655a31c4a.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/manifest.f8637fb66085728d1fbd.js
Normal file
BIN
priv/static/static/js/manifest.f8637fb66085728d1fbd.js
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/vendor.6ceb4478f308829a2829.js.map
Normal file
BIN
priv/static/static/js/vendor.6ceb4478f308829a2829.js.map
Normal file
Binary file not shown.
|
@ -50,7 +50,7 @@ test "it returns error if the notification doesn't belong to the user" do
|
||||||
|
|
||||||
{:ok, activity} = TwitterAPI.create_status(user, %{"status" => "hey @#{other_user.nickname}"})
|
{:ok, activity} = TwitterAPI.create_status(user, %{"status" => "hey @#{other_user.nickname}"})
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity)
|
{:ok, [notification]} = Notification.create_notifications(activity)
|
||||||
{:error, notification} = Notification.get(user, notification.id)
|
{:error, _notification} = Notification.get(user, notification.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ test "it returns error if the notification doesn't belong to the user" do
|
||||||
|
|
||||||
{:ok, activity} = TwitterAPI.create_status(user, %{"status" => "hey @#{other_user.nickname}"})
|
{:ok, activity} = TwitterAPI.create_status(user, %{"status" => "hey @#{other_user.nickname}"})
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity)
|
{:ok, [notification]} = Notification.create_notifications(activity)
|
||||||
{:error, notification} = Notification.dismiss(user, notification.id)
|
{:error, _notification} = Notification.dismiss(user, notification.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ test "it ensures uniqueness of the id" do
|
||||||
cs = Object.change(%Object{}, %{data: %{id: object.data["id"]}})
|
cs = Object.change(%Object{}, %{data: %{id: object.data["id"]}})
|
||||||
assert cs.valid?
|
assert cs.valid?
|
||||||
|
|
||||||
{:error, result} = Repo.insert(cs)
|
{:error, _result} = Repo.insert(cs)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
6
test/support/ostatus_mock.ex
Normal file
6
test/support/ostatus_mock.ex
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
defmodule Pleroma.Web.OStatusMock do
|
||||||
|
import Pleroma.Factory
|
||||||
|
def handle_incoming(_doc) do
|
||||||
|
insert(:note_activity)
|
||||||
|
end
|
||||||
|
end
|
|
@ -326,7 +326,7 @@ test "get recipients from activity" do
|
||||||
assert [addressed] == User.get_recipients_from_activity(activity)
|
assert [addressed] == User.get_recipients_from_activity(activity)
|
||||||
|
|
||||||
{:ok, user} = User.follow(user, actor)
|
{:ok, user} = User.follow(user, actor)
|
||||||
{:ok, user_two} = User.follow(user_two, actor)
|
{:ok, _user_two} = User.follow(user_two, actor)
|
||||||
recipients = User.get_recipients_from_activity(activity)
|
recipients = User.get_recipients_from_activity(activity)
|
||||||
assert length(recipients) == 2
|
assert length(recipients) == 2
|
||||||
assert user in recipients
|
assert user in recipients
|
||||||
|
|
|
@ -123,7 +123,7 @@ test "doesn't return blocked activities" do
|
||||||
|
|
||||||
describe "public fetch activities" do
|
describe "public fetch activities" do
|
||||||
test "retrieves public activities" do
|
test "retrieves public activities" do
|
||||||
activities = ActivityPub.fetch_public_activities
|
_activities = ActivityPub.fetch_public_activities
|
||||||
|
|
||||||
%{public: public} = ActivityBuilder.public_and_non_public
|
%{public: public} = ActivityBuilder.public_and_non_public
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
||||||
alias Pleroma.Web.{OStatus, CommonAPI}
|
alias Pleroma.Web.{OStatus, CommonAPI}
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
import ExUnit.CaptureLog
|
||||||
|
|
||||||
test "the home timeline", %{conn: conn} do
|
test "the home timeline", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
@ -31,23 +32,25 @@ test "the home timeline", %{conn: conn} do
|
||||||
test "the public timeline", %{conn: conn} do
|
test "the public timeline", %{conn: conn} do
|
||||||
following = insert(:user)
|
following = insert(:user)
|
||||||
|
|
||||||
{:ok, _activity} = TwitterAPI.create_status(following, %{"status" => "test"})
|
capture_log fn ->
|
||||||
{:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
|
{:ok, _activity} = TwitterAPI.create_status(following, %{"status" => "test"})
|
||||||
|
{:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
|
||||||
|
|
||||||
conn = conn
|
conn = conn
|
||||||
|> get("/api/v1/timelines/public", %{"local" => "False"})
|
|> get("/api/v1/timelines/public", %{"local" => "False"})
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 2
|
assert length(json_response(conn, 200)) == 2
|
||||||
|
|
||||||
conn = build_conn()
|
conn = build_conn()
|
||||||
|> get("/api/v1/timelines/public", %{"local" => "True"})
|
|> get("/api/v1/timelines/public", %{"local" => "True"})
|
||||||
|
|
||||||
assert [%{"content" => "test"}] = json_response(conn, 200)
|
assert [%{"content" => "test"}] = json_response(conn, 200)
|
||||||
|
|
||||||
conn = build_conn()
|
conn = build_conn()
|
||||||
|> get("/api/v1/timelines/public", %{"local" => "1"})
|
|> get("/api/v1/timelines/public", %{"local" => "1"})
|
||||||
|
|
||||||
assert [%{"content" => "test"}] = json_response(conn, 200)
|
assert [%{"content" => "test"}] = json_response(conn, 200)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "posting a status", %{conn: conn} do
|
test "posting a status", %{conn: conn} do
|
||||||
|
@ -144,7 +147,7 @@ test "list of notifications", %{conn: conn} do
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = TwitterAPI.create_status(other_user, %{"status" => "hi @#{user.nickname}"})
|
{:ok, activity} = TwitterAPI.create_status(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity)
|
{:ok, [_notification]} = Notification.create_notifications(activity)
|
||||||
|
|
||||||
conn = conn
|
conn = conn
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|
@ -190,7 +193,7 @@ test "clearing all notifications", %{conn: conn} do
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = TwitterAPI.create_status(other_user, %{"status" => "hi @#{user.nickname}"})
|
{:ok, activity} = TwitterAPI.create_status(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity)
|
{:ok, [_notification]} = Notification.create_notifications(activity)
|
||||||
|
|
||||||
conn = conn
|
conn = conn
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|
@ -338,15 +341,16 @@ test "media upload", %{conn: conn} do
|
||||||
test "hashtag timeline", %{conn: conn} do
|
test "hashtag timeline", %{conn: conn} do
|
||||||
following = insert(:user)
|
following = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = TwitterAPI.create_status(following, %{"status" => "test #2hu"})
|
capture_log fn ->
|
||||||
{:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
|
{:ok, activity} = TwitterAPI.create_status(following, %{"status" => "test #2hu"})
|
||||||
|
{:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
|
||||||
|
conn = conn
|
||||||
|
|> get("/api/v1/timelines/tag/2hu")
|
||||||
|
|
||||||
conn = conn
|
assert [%{"id" => id}] = json_response(conn, 200)
|
||||||
|> get("/api/v1/timelines/tag/2hu")
|
|
||||||
|
|
||||||
assert [%{"id" => id}] = json_response(conn, 200)
|
assert id == to_string(activity.id)
|
||||||
|
end
|
||||||
assert id == to_string(activity.id)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "getting followers", %{conn: conn} do
|
test "getting followers", %{conn: conn} do
|
||||||
|
@ -381,14 +385,14 @@ test "following / unfollowing a user", %{conn: conn} do
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> post("/api/v1/accounts/#{other_user.id}/follow")
|
|> post("/api/v1/accounts/#{other_user.id}/follow")
|
||||||
|
|
||||||
assert %{"id" => id, "following" => true} = json_response(conn, 200)
|
assert %{"id" => _id, "following" => true} = json_response(conn, 200)
|
||||||
|
|
||||||
user = Repo.get(User, user.id)
|
user = Repo.get(User, user.id)
|
||||||
conn = build_conn()
|
conn = build_conn()
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> post("/api/v1/accounts/#{other_user.id}/unfollow")
|
|> post("/api/v1/accounts/#{other_user.id}/unfollow")
|
||||||
|
|
||||||
assert %{"id" => id, "following" => false} = json_response(conn, 200)
|
assert %{"id" => _id, "following" => false} = json_response(conn, 200)
|
||||||
|
|
||||||
user = Repo.get(User, user.id)
|
user = Repo.get(User, user.id)
|
||||||
conn = build_conn()
|
conn = build_conn()
|
||||||
|
@ -407,14 +411,14 @@ test "blocking / unblocking a user", %{conn: conn} do
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> post("/api/v1/accounts/#{other_user.id}/block")
|
|> post("/api/v1/accounts/#{other_user.id}/block")
|
||||||
|
|
||||||
assert %{"id" => id, "blocking" => true} = json_response(conn, 200)
|
assert %{"id" => _id, "blocking" => true} = json_response(conn, 200)
|
||||||
|
|
||||||
user = Repo.get(User, user.id)
|
user = Repo.get(User, user.id)
|
||||||
conn = build_conn()
|
conn = build_conn()
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> post("/api/v1/accounts/#{other_user.id}/unblock")
|
|> post("/api/v1/accounts/#{other_user.id}/unblock")
|
||||||
|
|
||||||
assert %{"id" => id, "blocking" => false} = json_response(conn, 200)
|
assert %{"id" => _id, "blocking" => false} = json_response(conn, 200)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "getting a list of blocks", %{conn: conn} do
|
test "getting a list of blocks", %{conn: conn} do
|
||||||
|
@ -461,7 +465,7 @@ test "unimplemented mutes, follow_requests, blocks, domain blocks" do
|
||||||
|
|
||||||
test "account search", %{conn: conn} do
|
test "account search", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
user_two = insert(:user, %{nickname: "shp@shitposter.club"})
|
_user_two = insert(:user, %{nickname: "shp@shitposter.club"})
|
||||||
user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
|
user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
|
||||||
|
|
||||||
conn = conn
|
conn = conn
|
||||||
|
@ -495,12 +499,14 @@ test "search", %{conn: conn} do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "search fetches remote statuses", %{conn: conn} do
|
test "search fetches remote statuses", %{conn: conn} do
|
||||||
conn = conn
|
capture_log fn ->
|
||||||
|> get("/api/v1/search", %{"q" => "https://shitposter.club/notice/2827873"})
|
conn = conn
|
||||||
assert results = json_response(conn, 200)
|
|> get("/api/v1/search", %{"q" => "https://shitposter.club/notice/2827873"})
|
||||||
|
assert results = json_response(conn, 200)
|
||||||
|
|
||||||
[status] = results["statuses"]
|
[status] = results["statuses"]
|
||||||
assert status["uri"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
|
assert status["uri"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "search fetches remote accounts", %{conn: conn} do
|
test "search fetches remote accounts", %{conn: conn} do
|
||||||
|
@ -530,7 +536,7 @@ test "returns the favorites of a user", %{conn: conn} do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "updating credentials" do
|
describe "updating credentials" do
|
||||||
test "updates the user's bio" do
|
test "updates the user's bio", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
conn = conn
|
conn = conn
|
||||||
|
@ -541,7 +547,7 @@ test "updates the user's bio" do
|
||||||
assert user["note"] == "I drink #cofe"
|
assert user["note"] == "I drink #cofe"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates the user's name" do
|
test "updates the user's name", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
conn = conn
|
conn = conn
|
||||||
|
@ -552,7 +558,7 @@ test "updates the user's name" do
|
||||||
assert user["display_name"] == "markorepairs"
|
assert user["display_name"] == "markorepairs"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates the user's avatar" do
|
test "updates the user's avatar", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
new_avatar = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
|
new_avatar = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
|
||||||
|
@ -565,7 +571,7 @@ test "updates the user's avatar" do
|
||||||
assert user["avatar"] != "https://placehold.it/48x48"
|
assert user["avatar"] != "https://placehold.it/48x48"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates the user's banner" do
|
test "updates the user's banner", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
new_header = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
|
new_header = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
|
||||||
|
@ -579,7 +585,7 @@ test "updates the user's banner" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "get instance information" do
|
test "get instance information", %{conn: conn} do
|
||||||
insert(:user, %{local: true})
|
insert(:user, %{local: true})
|
||||||
user = insert(:user, %{local: true})
|
user = insert(:user, %{local: true})
|
||||||
insert(:user, %{local: false})
|
insert(:user, %{local: false})
|
||||||
|
|
|
@ -96,7 +96,7 @@ test "an announce activity" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
object = Object.get_cached_by_ap_id(note.data["object"]["id"])
|
object = Object.get_cached_by_ap_id(note.data["object"]["id"])
|
||||||
|
|
||||||
{:ok, announce, object} = ActivityPub.announce(user, object)
|
{:ok, announce, _object} = ActivityPub.announce(user, object)
|
||||||
|
|
||||||
announce = Repo.get(Activity, announce.id)
|
announce = Repo.get(Activity, announce.id)
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ test "returns a feed of the last 20 items of the user" do
|
||||||
<author>
|
<author>
|
||||||
#{user_xml}
|
#{user_xml}
|
||||||
</author>
|
</author>
|
||||||
|
<link rel="next" href="#{OStatus.feed_path(user)}?max_id=#{note_activity.id}" type="application/atom+xml" />
|
||||||
<entry>
|
<entry>
|
||||||
#{entry_xml}
|
#{entry_xml}
|
||||||
</entry>
|
</entry>
|
||||||
|
|
|
@ -12,7 +12,7 @@ test "it removes the mentioned activity" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
object = Object.get_by_ap_id(note.data["object"]["id"])
|
object = Object.get_by_ap_id(note.data["object"]["id"])
|
||||||
|
|
||||||
{:ok, like, object} = Pleroma.Web.ActivityPub.ActivityPub.like(user, object)
|
{:ok, like, _object} = Pleroma.Web.ActivityPub.ActivityPub.like(user, object)
|
||||||
|
|
||||||
incoming = File.read!("test/fixtures/delete.xml")
|
incoming = File.read!("test/fixtures/delete.xml")
|
||||||
|> String.replace("tag:mastodon.sdf.org,2017-06-10:objectId=310513:objectType=Status", note.data["object"]["id"])
|
|> String.replace("tag:mastodon.sdf.org,2017-06-10:objectId=310513:objectType=Status", note.data["object"]["id"])
|
||||||
|
|
|
@ -84,10 +84,3 @@ test "gets a notice", %{conn: conn} do
|
||||||
assert response(conn, 200)
|
assert response(conn, 200)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defmodule Pleroma.Web.OStatusMock do
|
|
||||||
import Pleroma.Factory
|
|
||||||
def handle_incoming(_doc) do
|
|
||||||
insert(:note_activity)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ defmodule Pleroma.Web.OStatusTest do
|
||||||
alias Pleroma.Web.XML
|
alias Pleroma.Web.XML
|
||||||
alias Pleroma.{Object, Repo, User, Activity}
|
alias Pleroma.{Object, Repo, User, Activity}
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
import ExUnit.CaptureLog
|
||||||
|
|
||||||
test "don't insert create notes twice" do
|
test "don't insert create notes twice" do
|
||||||
incoming = File.read!("test/fixtures/incoming_note_activity.xml")
|
incoming = File.read!("test/fixtures/incoming_note_activity.xml")
|
||||||
|
@ -91,7 +92,7 @@ test "handle incoming notes - Mastodon, with CW" do
|
||||||
|
|
||||||
test "handle incoming retweets - Mastodon, with CW" do
|
test "handle incoming retweets - Mastodon, with CW" do
|
||||||
incoming = File.read!("test/fixtures/cw_retweet.xml")
|
incoming = File.read!("test/fixtures/cw_retweet.xml")
|
||||||
{:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)
|
{:ok, [[_activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)
|
||||||
|
|
||||||
assert retweeted_activity.data["object"]["summary"] == "Hey."
|
assert retweeted_activity.data["object"]["summary"] == "Hey."
|
||||||
end
|
end
|
||||||
|
@ -168,19 +169,21 @@ test "handle incoming retweets - Mastodon, salmon" do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "handle incoming favorites - GS, websub" do
|
test "handle incoming favorites - GS, websub" do
|
||||||
incoming = File.read!("test/fixtures/favorite.xml")
|
capture_log fn ->
|
||||||
{:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming)
|
incoming = File.read!("test/fixtures/favorite.xml")
|
||||||
|
{:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming)
|
||||||
|
|
||||||
assert activity.data["type"] == "Like"
|
assert activity.data["type"] == "Like"
|
||||||
assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
|
assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
|
||||||
assert activity.data["object"] == favorited_activity.data["object"]["id"]
|
assert activity.data["object"] == favorited_activity.data["object"]["id"]
|
||||||
assert activity.data["id"] == "tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00"
|
assert activity.data["id"] == "tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00"
|
||||||
|
|
||||||
refute activity.local
|
refute activity.local
|
||||||
assert favorited_activity.data["type"] == "Create"
|
assert favorited_activity.data["type"] == "Create"
|
||||||
assert favorited_activity.data["actor"] == "https://shitposter.club/user/1"
|
assert favorited_activity.data["actor"] == "https://shitposter.club/user/1"
|
||||||
assert favorited_activity.data["object"]["id"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
|
assert favorited_activity.data["object"]["id"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
|
||||||
refute favorited_activity.local
|
refute favorited_activity.local
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "handle conversation references" do
|
test "handle conversation references" do
|
||||||
|
@ -335,11 +338,13 @@ test "it works with the uri" do
|
||||||
|
|
||||||
describe "fetching a status by it's HTML url" do
|
describe "fetching a status by it's HTML url" do
|
||||||
test "it builds a missing status from an html url" do
|
test "it builds a missing status from an html url" do
|
||||||
url = "https://shitposter.club/notice/2827873"
|
capture_log fn ->
|
||||||
{:ok, [activity] } = OStatus.fetch_activity_from_url(url)
|
url = "https://shitposter.club/notice/2827873"
|
||||||
|
{:ok, [activity] } = OStatus.fetch_activity_from_url(url)
|
||||||
|
|
||||||
assert activity.data["actor"] == "https://shitposter.club/user/1"
|
assert activity.data["actor"] == "https://shitposter.club/user/1"
|
||||||
assert activity.data["object"]["id"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
|
assert activity.data["object"]["id"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it works for atom notes, too" do
|
test "it works for atom notes, too" do
|
||||||
|
|
|
@ -35,7 +35,7 @@ test "it encodes a magic key from a public key" do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it decodes a friendica public key" do
|
test "it decodes a friendica public key" do
|
||||||
key = Salmon.decode_key(@magickey_friendica)
|
_key = Salmon.decode_key(@magickey_friendica)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns a public and private key from a pem" do
|
test "returns a public and private key from a pem" do
|
||||||
|
@ -90,7 +90,7 @@ test "it pushes an activity to remote accounts it's addressed to" do
|
||||||
user = Repo.get_by(User, ap_id: activity.data["actor"])
|
user = Repo.get_by(User, ap_id: activity.data["actor"])
|
||||||
{:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user)
|
{:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user)
|
||||||
|
|
||||||
poster = fn (url, data, headers, options) ->
|
poster = fn (url, _data, _headers, _options) ->
|
||||||
assert url == "http://example.org/salmon"
|
assert url == "http://example.org/salmon"
|
||||||
end
|
end
|
||||||
Salmon.publish(user, activity, poster)
|
Salmon.publish(user, activity, poster)
|
||||||
|
|
|
@ -147,7 +147,7 @@ test "an undo for a follow" do
|
||||||
follower = insert(:user)
|
follower = insert(:user)
|
||||||
followed = insert(:user)
|
followed = insert(:user)
|
||||||
|
|
||||||
{:ok, follow} = ActivityPub.follow(follower, followed)
|
{:ok, _follow} = ActivityPub.follow(follower, followed)
|
||||||
{:ok, unfollow} = ActivityPub.unfollow(follower, followed)
|
{:ok, unfollow} = ActivityPub.unfollow(follower, followed)
|
||||||
|
|
||||||
map = ActivityRepresenter.to_map(unfollow, %{user: follower})
|
map = ActivityRepresenter.to_map(unfollow, %{user: follower})
|
||||||
|
|
|
@ -504,7 +504,7 @@ test "it returns a user's followers", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
follower_one = insert(:user)
|
follower_one = insert(:user)
|
||||||
follower_two = insert(:user)
|
follower_two = insert(:user)
|
||||||
not_follower = insert(:user)
|
_not_follower = insert(:user)
|
||||||
|
|
||||||
{:ok, follower_one} = User.follow(follower_one, user)
|
{:ok, follower_one} = User.follow(follower_one, user)
|
||||||
{:ok, follower_two} = User.follow(follower_two, user)
|
{:ok, follower_two} = User.follow(follower_two, user)
|
||||||
|
@ -522,7 +522,7 @@ test "it returns the logged in user's friends", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
followed_one = insert(:user)
|
followed_one = insert(:user)
|
||||||
followed_two = insert(:user)
|
followed_two = insert(:user)
|
||||||
not_followed = insert(:user)
|
_not_followed = insert(:user)
|
||||||
|
|
||||||
{:ok, user} = User.follow(user, followed_one)
|
{:ok, user} = User.follow(user, followed_one)
|
||||||
{:ok, user} = User.follow(user, followed_two)
|
{:ok, user} = User.follow(user, followed_two)
|
||||||
|
@ -538,7 +538,7 @@ test "it returns a given user's friends with user_id", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
followed_one = insert(:user)
|
followed_one = insert(:user)
|
||||||
followed_two = insert(:user)
|
followed_two = insert(:user)
|
||||||
not_followed = insert(:user)
|
_not_followed = insert(:user)
|
||||||
|
|
||||||
{:ok, user} = User.follow(user, followed_one)
|
{:ok, user} = User.follow(user, followed_one)
|
||||||
{:ok, user} = User.follow(user, followed_two)
|
{:ok, user} = User.follow(user, followed_two)
|
||||||
|
@ -553,7 +553,7 @@ test "it returns a given user's friends with screen_name", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
followed_one = insert(:user)
|
followed_one = insert(:user)
|
||||||
followed_two = insert(:user)
|
followed_two = insert(:user)
|
||||||
not_followed = insert(:user)
|
_not_followed = insert(:user)
|
||||||
|
|
||||||
{:ok, user} = User.follow(user, followed_one)
|
{:ok, user} = User.follow(user, followed_one)
|
||||||
{:ok, user} = User.follow(user, followed_two)
|
{:ok, user} = User.follow(user, followed_two)
|
||||||
|
@ -570,7 +570,7 @@ test "it returns a user's friends", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
followed_one = insert(:user)
|
followed_one = insert(:user)
|
||||||
followed_two = insert(:user)
|
followed_two = insert(:user)
|
||||||
not_followed = insert(:user)
|
_not_followed = insert(:user)
|
||||||
|
|
||||||
{:ok, user} = User.follow(user, followed_one)
|
{:ok, user} = User.follow(user, followed_one)
|
||||||
{:ok, user} = User.follow(user, followed_two)
|
{:ok, user} = User.follow(user, followed_two)
|
||||||
|
@ -585,7 +585,7 @@ test "it returns a user's friends", %{conn: conn} do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "POST /api/account/update_profile.json" do
|
describe "POST /api/account/update_profile.json" do
|
||||||
test "it updates a user's profile" do
|
test "it updates a user's profile", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
conn = conn
|
conn = conn
|
||||||
|
@ -627,7 +627,7 @@ test "it returns search results", %{conn: conn} do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /api/statusnet/tags/timeline/:tag.json" do
|
describe "GET /api/statusnet/tags/timeline/:tag.json" do
|
||||||
test "it returns the tags timeline" do
|
test "it returns the tags timeline", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
user_two = insert(:user, %{nickname: "shp@shitposter.club"})
|
user_two = insert(:user, %{nickname: "shp@shitposter.club"})
|
||||||
|
|
||||||
|
|
|
@ -247,7 +247,7 @@ test "Unblock another user using user_id" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
User.block(user, unblocked)
|
User.block(user, unblocked)
|
||||||
|
|
||||||
{:ok, user, unblocked} = TwitterAPI.unblock(user, %{"user_id" => unblocked.id})
|
{:ok, user, _unblocked} = TwitterAPI.unblock(user, %{"user_id" => unblocked.id})
|
||||||
assert user.info["blocks"] == []
|
assert user.info["blocks"] == []
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -256,7 +256,7 @@ test "Unblock another user using screen_name" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
User.block(user, unblocked)
|
User.block(user, unblocked)
|
||||||
|
|
||||||
{:ok, user, unblocked} = TwitterAPI.unblock(user, %{"screen_name" => unblocked.nickname})
|
{:ok, user, _unblocked} = TwitterAPI.unblock(user, %{"screen_name" => unblocked.nickname})
|
||||||
assert user.info["blocks"] == []
|
assert user.info["blocks"] == []
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ test "A user that follows you", %{user: user} do
|
||||||
assert represented == UserView.render("show.json", %{user: follower, for: user})
|
assert represented == UserView.render("show.json", %{user: follower, for: user})
|
||||||
end
|
end
|
||||||
|
|
||||||
test "A blocked user for the blocker", %{user: user} do
|
test "A blocked user for the blocker" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
blocker = insert(:user)
|
blocker = insert(:user)
|
||||||
User.block(blocker, user)
|
User.block(blocker, user)
|
||||||
|
|
|
@ -42,8 +42,7 @@ test "returns the info for a user" do
|
||||||
test "it works for friendica" do
|
test "it works for friendica" do
|
||||||
user = "lain@squeet.me"
|
user = "lain@squeet.me"
|
||||||
|
|
||||||
{:ok, data} = WebFinger.finger(user)
|
{:ok, _data} = WebFinger.finger(user)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it gets the xrd endpoint" do
|
test "it gets the xrd endpoint" do
|
||||||
|
|
|
@ -74,10 +74,3 @@ test "rejects incoming feed updates with the wrong signature", %{conn: conn} do
|
||||||
assert length(Repo.all(Activity)) == 0
|
assert length(Repo.all(Activity)) == 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defmodule Pleroma.Web.OStatusMock do
|
|
||||||
import Pleroma.Factory
|
|
||||||
def handle_incoming(_doc) do
|
|
||||||
insert(:note_activity)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
|
@ -174,7 +174,7 @@ test "sign a text" do
|
||||||
signed = Websub.sign("secret", "text")
|
signed = Websub.sign("secret", "text")
|
||||||
assert signed == "B8392C23690CCF871F37EC270BE1582DEC57A503" |> String.downcase
|
assert signed == "B8392C23690CCF871F37EC270BE1582DEC57A503" |> String.downcase
|
||||||
|
|
||||||
signed = Websub.sign("secret", [["て"], ['す']])
|
_signed = Websub.sign("secret", [["て"], ['す']])
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "renewing subscriptions" do
|
describe "renewing subscriptions" do
|
||||||
|
@ -184,7 +184,7 @@ test "it renews subscriptions that have less than a day of time left" do
|
||||||
still_good = insert(:websub_client_subscription, %{valid_until: NaiveDateTime.add(now, 2 * day), topic: "http://example.org/still_good", state: "accepted"})
|
still_good = insert(:websub_client_subscription, %{valid_until: NaiveDateTime.add(now, 2 * day), topic: "http://example.org/still_good", state: "accepted"})
|
||||||
needs_refresh = insert(:websub_client_subscription, %{valid_until: NaiveDateTime.add(now, day - 100), topic: "http://example.org/needs_refresh", state: "accepted"})
|
needs_refresh = insert(:websub_client_subscription, %{valid_until: NaiveDateTime.add(now, day - 100), topic: "http://example.org/needs_refresh", state: "accepted"})
|
||||||
|
|
||||||
refresh = Websub.refresh_subscriptions()
|
_refresh = Websub.refresh_subscriptions()
|
||||||
|
|
||||||
assert still_good == Repo.get(WebsubClientSubscription, still_good.id)
|
assert still_good == Repo.get(WebsubClientSubscription, still_good.id)
|
||||||
refute needs_refresh == Repo.get(WebsubClientSubscription, needs_refresh.id)
|
refute needs_refresh == Repo.get(WebsubClientSubscription, needs_refresh.id)
|
||||||
|
|
Loading…
Reference in a new issue