2018-12-23 13:11:29 -07:00
|
|
|
# Pleroma: A lightweight social networking server
|
2023-01-01 04:11:47 -07:00
|
|
|
# Copyright © 2017-2023 Pleroma Authors <https://pleroma.social/>
|
2018-12-23 13:11:29 -07:00
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
2017-09-09 04:09:53 -06:00
|
|
|
defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
|
2022-06-21 01:21:45 -06:00
|
|
|
use Pleroma.DataCase, async: false
|
2020-03-25 11:33:34 -06:00
|
|
|
|
2017-09-13 07:55:10 -06:00
|
|
|
alias Pleroma.User
|
2020-03-25 11:33:34 -06:00
|
|
|
alias Pleroma.UserRelationship
|
2019-07-16 05:04:11 -06:00
|
|
|
alias Pleroma.Web.CommonAPI
|
2019-03-04 19:52:23 -07:00
|
|
|
alias Pleroma.Web.MastodonAPI.AccountView
|
2017-09-09 04:09:53 -06:00
|
|
|
|
2020-03-29 14:01:49 -06:00
|
|
|
import Pleroma.Factory
|
|
|
|
import Tesla.Mock
|
|
|
|
|
|
|
|
setup do
|
|
|
|
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
|
|
|
:ok
|
|
|
|
end
|
|
|
|
|
2017-09-09 04:09:53 -06:00
|
|
|
test "Represent a user account" do
|
2019-06-13 11:08:05 -06:00
|
|
|
background_image = %{
|
|
|
|
"url" => [%{"href" => "https://example.com/images/asuka_hospital.png"}]
|
|
|
|
}
|
|
|
|
|
2018-03-30 07:01:53 -06:00
|
|
|
user =
|
|
|
|
insert(:user, %{
|
2019-10-16 12:59:21 -06:00
|
|
|
follower_count: 3,
|
|
|
|
note_count: 5,
|
|
|
|
background: background_image,
|
2018-03-30 07:01:53 -06:00
|
|
|
nickname: "shp@shitposter.club",
|
2018-08-08 00:24:50 -06:00
|
|
|
name: ":karjalanpiirakka: shp",
|
2020-03-22 09:38:12 -06:00
|
|
|
bio:
|
2020-05-08 03:33:01 -06:00
|
|
|
"<script src=\"invalid-html\"></script><span>valid html</span>. a<br>b<br/>c<br >d<br />f '&<>\"",
|
2020-04-03 05:03:32 -06:00
|
|
|
inserted_at: ~N[2017-08-15 15:47:06.597036],
|
2020-03-23 15:52:25 -06:00
|
|
|
emoji: %{"karjalanpiirakka" => "/file.png"},
|
2020-07-16 21:19:17 -06:00
|
|
|
raw_bio: "valid html. a\nb\nc\nd\nf '&<>\"",
|
2020-08-07 15:48:03 -06:00
|
|
|
also_known_as: ["https://shitposter.zone/users/shp"]
|
2018-03-30 07:01:53 -06:00
|
|
|
})
|
2017-09-09 04:09:53 -06:00
|
|
|
|
|
|
|
expected = %{
|
2017-11-10 09:18:19 -07:00
|
|
|
id: to_string(user.id),
|
2017-09-12 01:34:39 -06:00
|
|
|
username: "shp",
|
2017-09-09 04:09:53 -06:00
|
|
|
acct: user.nickname,
|
|
|
|
display_name: user.name,
|
|
|
|
locked: false,
|
2017-09-15 09:50:47 -06:00
|
|
|
created_at: "2017-08-15T15:47:06.000Z",
|
2017-09-09 04:09:53 -06:00
|
|
|
followers_count: 3,
|
|
|
|
following_count: 0,
|
|
|
|
statuses_count: 5,
|
2020-05-08 03:33:01 -06:00
|
|
|
note: "<span>valid html</span>. a<br/>b<br/>c<br/>d<br/>f '&<>"",
|
2017-09-09 04:09:53 -06:00
|
|
|
url: user.ap_id,
|
2018-02-03 04:43:14 -07:00
|
|
|
avatar: "http://localhost:4001/images/avi.png",
|
|
|
|
avatar_static: "http://localhost:4001/images/avi.png",
|
|
|
|
header: "http://localhost:4001/images/banner.png",
|
|
|
|
header_static: "http://localhost:4001/images/banner.png",
|
2018-08-08 00:24:50 -06:00
|
|
|
emojis: [
|
|
|
|
%{
|
2020-05-27 10:35:35 -06:00
|
|
|
static_url: "/file.png",
|
|
|
|
url: "/file.png",
|
|
|
|
shortcode: "karjalanpiirakka",
|
|
|
|
visible_in_picker: false
|
2018-08-08 00:24:50 -06:00
|
|
|
}
|
|
|
|
],
|
2018-06-04 09:44:08 -06:00
|
|
|
fields: [],
|
2018-08-09 17:44:38 -06:00
|
|
|
bot: false,
|
|
|
|
source: %{
|
2020-05-08 03:33:01 -06:00
|
|
|
note: "valid html. a\nb\nc\nd\nf '&<>\"",
|
2019-04-25 00:14:35 -06:00
|
|
|
sensitive: false,
|
2019-09-25 20:57:41 -06:00
|
|
|
pleroma: %{
|
2019-12-10 06:19:26 -07:00
|
|
|
actor_type: "Person",
|
2020-09-14 09:40:52 -06:00
|
|
|
discoverable: true
|
2019-09-25 20:57:41 -06:00
|
|
|
},
|
2019-07-24 06:48:15 -06:00
|
|
|
fields: []
|
2018-12-06 10:38:52 -07:00
|
|
|
},
|
2021-01-28 09:49:43 -07:00
|
|
|
fqn: "shp@shitposter.club",
|
2021-12-25 19:35:17 -07:00
|
|
|
last_status_at: nil,
|
2018-12-18 04:07:05 -07:00
|
|
|
pleroma: %{
|
2020-04-16 07:27:35 -06:00
|
|
|
ap_id: user.ap_id,
|
2020-08-07 15:48:03 -06:00
|
|
|
also_known_as: ["https://shitposter.zone/users/shp"],
|
2019-06-13 11:08:05 -06:00
|
|
|
background_image: "https://example.com/images/asuka_hospital.png",
|
2020-09-07 07:57:42 -06:00
|
|
|
favicon: nil,
|
2020-10-13 13:29:34 -06:00
|
|
|
is_confirmed: true,
|
2019-01-27 02:21:13 -07:00
|
|
|
tags: [],
|
|
|
|
is_admin: false,
|
2019-02-27 06:01:10 -07:00
|
|
|
is_moderator: false,
|
2022-06-21 03:13:32 -06:00
|
|
|
privileges: [],
|
2021-11-26 22:10:01 -07:00
|
|
|
is_suggested: false,
|
2019-04-24 11:01:42 -06:00
|
|
|
hide_favorites: true,
|
|
|
|
hide_followers: false,
|
|
|
|
hide_follows: false,
|
2019-09-13 08:37:30 -06:00
|
|
|
hide_followers_count: false,
|
|
|
|
hide_follows_count: false,
|
2019-06-03 13:51:14 -06:00
|
|
|
relationship: %{},
|
2020-07-03 05:07:33 -06:00
|
|
|
skip_thread_containment: false,
|
2020-07-03 05:24:16 -06:00
|
|
|
accepts_chat_messages: nil
|
2018-12-18 04:07:05 -07:00
|
|
|
}
|
2018-08-09 17:44:38 -06:00
|
|
|
}
|
|
|
|
|
2020-07-23 06:08:30 -06:00
|
|
|
assert expected == AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
2018-08-09 17:44:38 -06:00
|
|
|
end
|
|
|
|
|
2022-06-21 03:13:32 -06:00
|
|
|
describe "roles and privileges" do
|
|
|
|
setup do
|
|
|
|
clear_config([:instance, :moderator_privileges], [:cofe, :only_moderator])
|
|
|
|
clear_config([:instance, :admin_privileges], [:cofe, :only_admin])
|
|
|
|
|
|
|
|
%{
|
|
|
|
user: insert(:user),
|
|
|
|
moderator: insert(:user, is_moderator: true),
|
|
|
|
admin: insert(:user, is_admin: true),
|
|
|
|
moderator_admin: insert(:user, is_moderator: true, is_admin: true),
|
|
|
|
user_no_show_roles: insert(:user, show_role: false),
|
|
|
|
moderator_admin_no_show_roles:
|
|
|
|
insert(:user, is_moderator: true, is_admin: true, show_role: false)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
test "shows roles and privileges when show_role: true", %{
|
|
|
|
user: user,
|
|
|
|
moderator: moderator,
|
|
|
|
admin: admin,
|
|
|
|
moderator_admin: moderator_admin,
|
|
|
|
user_no_show_roles: user_no_show_roles,
|
|
|
|
moderator_admin_no_show_roles: moderator_admin_no_show_roles
|
|
|
|
} do
|
|
|
|
assert %{pleroma: %{is_moderator: false, is_admin: false}} =
|
|
|
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
|
|
|
|
|
|
|
assert [] ==
|
|
|
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})[
|
|
|
|
:pleroma
|
|
|
|
][:privileges]
|
|
|
|
|> Enum.sort()
|
|
|
|
|
|
|
|
assert %{pleroma: %{is_moderator: true, is_admin: false}} =
|
|
|
|
AccountView.render("show.json", %{user: moderator, skip_visibility_check: true})
|
|
|
|
|
|
|
|
assert [:cofe, :only_moderator] ==
|
|
|
|
AccountView.render("show.json", %{user: moderator, skip_visibility_check: true})[
|
|
|
|
:pleroma
|
|
|
|
][:privileges]
|
|
|
|
|> Enum.sort()
|
|
|
|
|
|
|
|
assert %{pleroma: %{is_moderator: false, is_admin: true}} =
|
|
|
|
AccountView.render("show.json", %{user: admin, skip_visibility_check: true})
|
|
|
|
|
|
|
|
assert [:cofe, :only_admin] ==
|
|
|
|
AccountView.render("show.json", %{user: admin, skip_visibility_check: true})[
|
|
|
|
:pleroma
|
|
|
|
][:privileges]
|
|
|
|
|> Enum.sort()
|
|
|
|
|
|
|
|
assert %{pleroma: %{is_moderator: true, is_admin: true}} =
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: moderator_admin,
|
|
|
|
skip_visibility_check: true
|
|
|
|
})
|
|
|
|
|
|
|
|
assert [:cofe, :only_admin, :only_moderator] ==
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: moderator_admin,
|
|
|
|
skip_visibility_check: true
|
|
|
|
})[:pleroma][:privileges]
|
|
|
|
|> Enum.sort()
|
|
|
|
|
|
|
|
refute match?(
|
|
|
|
%{pleroma: %{is_moderator: _}},
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: user_no_show_roles,
|
|
|
|
skip_visibility_check: true
|
|
|
|
})
|
|
|
|
)
|
|
|
|
|
|
|
|
refute match?(
|
|
|
|
%{pleroma: %{is_admin: _}},
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: user_no_show_roles,
|
|
|
|
skip_visibility_check: true
|
|
|
|
})
|
|
|
|
)
|
|
|
|
|
|
|
|
refute match?(
|
|
|
|
%{pleroma: %{privileges: _}},
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: user_no_show_roles,
|
|
|
|
skip_visibility_check: true
|
|
|
|
})
|
|
|
|
)
|
|
|
|
|
|
|
|
refute match?(
|
|
|
|
%{pleroma: %{is_moderator: _}},
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: moderator_admin_no_show_roles,
|
|
|
|
skip_visibility_check: true
|
|
|
|
})
|
|
|
|
)
|
|
|
|
|
|
|
|
refute match?(
|
|
|
|
%{pleroma: %{is_admin: _}},
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: moderator_admin_no_show_roles,
|
|
|
|
skip_visibility_check: true
|
|
|
|
})
|
|
|
|
)
|
|
|
|
|
|
|
|
refute match?(
|
|
|
|
%{pleroma: %{privileges: _}},
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: moderator_admin_no_show_roles,
|
|
|
|
skip_visibility_check: true
|
|
|
|
})
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
test "shows roles and privileges when viewing own account, even when show_role: false", %{
|
|
|
|
user_no_show_roles: user_no_show_roles,
|
|
|
|
moderator_admin_no_show_roles: moderator_admin_no_show_roles
|
|
|
|
} do
|
|
|
|
assert %{pleroma: %{is_moderator: false, is_admin: false, privileges: []}} =
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: user_no_show_roles,
|
|
|
|
skip_visibility_check: true,
|
|
|
|
for: user_no_show_roles
|
|
|
|
})
|
|
|
|
|
|
|
|
assert %{
|
|
|
|
pleroma: %{
|
|
|
|
is_moderator: true,
|
|
|
|
is_admin: true,
|
|
|
|
privileges: privileges
|
|
|
|
}
|
|
|
|
} =
|
|
|
|
AccountView.render("show.json", %{
|
|
|
|
user: moderator_admin_no_show_roles,
|
|
|
|
skip_visibility_check: true,
|
|
|
|
for: moderator_admin_no_show_roles
|
|
|
|
})
|
|
|
|
|
|
|
|
assert [:cofe, :only_admin, :only_moderator] == privileges |> Enum.sort()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-09-07 07:57:42 -06:00
|
|
|
describe "favicon" do
|
|
|
|
setup do
|
|
|
|
[user: insert(:user)]
|
|
|
|
end
|
2020-07-07 21:56:24 -06:00
|
|
|
|
2020-09-07 07:57:42 -06:00
|
|
|
test "is parsed when :instance_favicons is enabled", %{user: user} do
|
|
|
|
clear_config([:instances_favicons, :enabled], true)
|
2020-07-07 21:56:24 -06:00
|
|
|
|
2020-09-07 07:57:42 -06:00
|
|
|
assert %{
|
|
|
|
pleroma: %{
|
|
|
|
favicon:
|
|
|
|
"https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-16x16.png"
|
|
|
|
}
|
|
|
|
} = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
|
|
|
end
|
2020-07-07 21:56:24 -06:00
|
|
|
|
2020-09-07 07:57:42 -06:00
|
|
|
test "is nil when :instances_favicons is disabled", %{user: user} do
|
|
|
|
assert %{pleroma: %{favicon: nil}} =
|
|
|
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
|
|
|
end
|
2020-07-07 21:56:24 -06:00
|
|
|
end
|
|
|
|
|
2019-03-28 05:52:09 -06:00
|
|
|
test "Represent the user account for the account owner" do
|
|
|
|
user = insert(:user)
|
|
|
|
|
2020-05-12 13:59:26 -06:00
|
|
|
notification_settings = %{
|
2020-06-26 10:24:28 -06:00
|
|
|
block_from_strangers: false,
|
2020-06-26 11:45:46 -06:00
|
|
|
hide_notification_contents: false
|
2020-05-12 13:59:26 -06:00
|
|
|
}
|
|
|
|
|
2019-10-16 12:59:21 -06:00
|
|
|
privacy = user.default_scope
|
2019-04-24 11:01:42 -06:00
|
|
|
|
|
|
|
assert %{
|
2019-11-12 04:36:50 -07:00
|
|
|
pleroma: %{notification_settings: ^notification_settings, allow_following_move: true},
|
2019-04-24 11:01:42 -06:00
|
|
|
source: %{privacy: ^privacy}
|
2019-09-30 06:10:54 -06:00
|
|
|
} = AccountView.render("show.json", %{user: user, for: user})
|
2019-03-28 05:52:09 -06:00
|
|
|
end
|
|
|
|
|
2018-08-09 17:44:38 -06:00
|
|
|
test "Represent a Service(bot) account" do
|
|
|
|
user =
|
|
|
|
insert(:user, %{
|
2019-10-16 12:59:21 -06:00
|
|
|
follower_count: 3,
|
|
|
|
note_count: 5,
|
2019-12-10 06:19:26 -07:00
|
|
|
actor_type: "Service",
|
2018-08-09 17:44:38 -06:00
|
|
|
nickname: "shp@shitposter.club",
|
|
|
|
inserted_at: ~N[2017-08-15 15:47:06.597036]
|
|
|
|
})
|
|
|
|
|
|
|
|
expected = %{
|
|
|
|
id: to_string(user.id),
|
|
|
|
username: "shp",
|
|
|
|
acct: user.nickname,
|
|
|
|
display_name: user.name,
|
|
|
|
locked: false,
|
|
|
|
created_at: "2017-08-15T15:47:06.000Z",
|
|
|
|
followers_count: 3,
|
|
|
|
following_count: 0,
|
|
|
|
statuses_count: 5,
|
|
|
|
note: user.bio,
|
|
|
|
url: user.ap_id,
|
|
|
|
avatar: "http://localhost:4001/images/avi.png",
|
|
|
|
avatar_static: "http://localhost:4001/images/avi.png",
|
|
|
|
header: "http://localhost:4001/images/banner.png",
|
|
|
|
header_static: "http://localhost:4001/images/banner.png",
|
|
|
|
emojis: [],
|
|
|
|
fields: [],
|
|
|
|
bot: true,
|
2017-09-16 03:52:33 -06:00
|
|
|
source: %{
|
2019-05-21 23:22:19 -06:00
|
|
|
note: user.bio,
|
2019-04-25 00:14:35 -06:00
|
|
|
sensitive: false,
|
2019-09-25 20:57:41 -06:00
|
|
|
pleroma: %{
|
2019-12-10 06:19:26 -07:00
|
|
|
actor_type: "Service",
|
2020-09-14 09:40:52 -06:00
|
|
|
discoverable: true
|
2019-09-25 20:57:41 -06:00
|
|
|
},
|
2019-07-24 06:48:15 -06:00
|
|
|
fields: []
|
2018-12-06 10:38:52 -07:00
|
|
|
},
|
2021-01-28 09:49:43 -07:00
|
|
|
fqn: "shp@shitposter.club",
|
2021-12-25 19:35:17 -07:00
|
|
|
last_status_at: nil,
|
2018-12-18 04:07:05 -07:00
|
|
|
pleroma: %{
|
2020-04-16 07:27:35 -06:00
|
|
|
ap_id: user.ap_id,
|
2020-08-07 15:48:03 -06:00
|
|
|
also_known_as: [],
|
2019-06-13 11:08:05 -06:00
|
|
|
background_image: nil,
|
2020-09-07 07:57:42 -06:00
|
|
|
favicon: nil,
|
2020-10-13 13:29:34 -06:00
|
|
|
is_confirmed: true,
|
2019-01-27 02:21:13 -07:00
|
|
|
tags: [],
|
|
|
|
is_admin: false,
|
2019-02-27 06:01:10 -07:00
|
|
|
is_moderator: false,
|
2022-06-21 03:13:32 -06:00
|
|
|
privileges: [],
|
2021-11-26 22:10:01 -07:00
|
|
|
is_suggested: false,
|
2019-04-24 11:01:42 -06:00
|
|
|
hide_favorites: true,
|
|
|
|
hide_followers: false,
|
|
|
|
hide_follows: false,
|
2019-09-13 08:37:30 -06:00
|
|
|
hide_followers_count: false,
|
|
|
|
hide_follows_count: false,
|
2019-06-03 13:51:14 -06:00
|
|
|
relationship: %{},
|
2020-07-03 05:07:33 -06:00
|
|
|
skip_thread_containment: false,
|
2020-07-03 05:24:16 -06:00
|
|
|
accepts_chat_messages: nil
|
2018-12-18 04:07:05 -07:00
|
|
|
}
|
2017-09-09 04:09:53 -06:00
|
|
|
}
|
|
|
|
|
2020-07-23 06:08:30 -06:00
|
|
|
assert expected == AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
2017-09-09 04:09:53 -06:00
|
|
|
end
|
|
|
|
|
2020-03-29 14:01:49 -06:00
|
|
|
test "Represent a Funkwhale channel" do
|
|
|
|
{:ok, user} =
|
|
|
|
User.get_or_fetch_by_ap_id(
|
|
|
|
"https://channels.tests.funkwhale.audio/federation/actors/compositions"
|
|
|
|
)
|
|
|
|
|
2020-07-23 06:08:30 -06:00
|
|
|
assert represented =
|
|
|
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
|
|
|
|
2020-03-29 14:01:49 -06:00
|
|
|
assert represented.acct == "compositions@channels.tests.funkwhale.audio"
|
2020-03-29 18:01:09 -06:00
|
|
|
assert represented.url == "https://channels.tests.funkwhale.audio/channels/compositions"
|
2020-03-29 14:01:49 -06:00
|
|
|
end
|
|
|
|
|
2022-06-21 01:21:45 -06:00
|
|
|
test "Represent a deactivated user for a privileged user" do
|
2022-07-01 01:54:05 -06:00
|
|
|
clear_config([:instance, :moderator_privileges], [:users_manage_activation_state])
|
2022-06-21 01:21:45 -06:00
|
|
|
|
|
|
|
admin = insert(:user, is_moderator: true)
|
2020-10-12 16:42:27 -06:00
|
|
|
deactivated_user = insert(:user, is_active: false)
|
2019-09-30 06:10:54 -06:00
|
|
|
represented = AccountView.render("show.json", %{user: deactivated_user, for: admin})
|
2019-07-16 05:14:46 -06:00
|
|
|
assert represented[:pleroma][:deactivated] == true
|
|
|
|
end
|
|
|
|
|
2017-09-09 04:09:53 -06:00
|
|
|
test "Represent a smaller mention" do
|
|
|
|
user = insert(:user)
|
|
|
|
|
|
|
|
expected = %{
|
2017-11-10 09:18:19 -07:00
|
|
|
id: to_string(user.id),
|
2017-09-09 04:09:53 -06:00
|
|
|
acct: user.nickname,
|
|
|
|
username: user.nickname,
|
|
|
|
url: user.ap_id
|
|
|
|
}
|
|
|
|
|
|
|
|
assert expected == AccountView.render("mention.json", %{user: user})
|
|
|
|
end
|
2017-09-13 07:55:10 -06:00
|
|
|
|
2020-07-23 06:08:30 -06:00
|
|
|
test "demands :for or :skip_visibility_check option for account rendering" do
|
2020-07-22 10:06:00 -06:00
|
|
|
clear_config([:restrict_unauthenticated, :profiles, :local], false)
|
|
|
|
|
|
|
|
user = insert(:user)
|
|
|
|
user_id = user.id
|
|
|
|
|
|
|
|
assert %{id: ^user_id} = AccountView.render("show.json", %{user: user, for: nil})
|
|
|
|
assert %{id: ^user_id} = AccountView.render("show.json", %{user: user, for: user})
|
|
|
|
|
2020-07-23 06:08:30 -06:00
|
|
|
assert %{id: ^user_id} =
|
|
|
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
|
|
|
|
|
|
|
assert_raise RuntimeError, ~r/:skip_visibility_check or :for option is required/, fn ->
|
2020-07-22 10:06:00 -06:00
|
|
|
AccountView.render("show.json", %{user: user})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-07-16 05:04:11 -06:00
|
|
|
describe "relationship" do
|
2020-03-25 11:33:34 -06:00
|
|
|
defp test_relationship_rendering(user, other_user, expected_result) do
|
2020-03-26 23:01:03 -06:00
|
|
|
opts = %{user: user, target: other_user, relationships: nil}
|
2020-03-25 11:33:34 -06:00
|
|
|
assert expected_result == AccountView.render("relationship.json", opts)
|
|
|
|
|
|
|
|
relationships_opt = UserRelationship.view_relationships_option(user, [other_user])
|
|
|
|
opts = Map.put(opts, :relationships, relationships_opt)
|
|
|
|
assert expected_result == AccountView.render("relationship.json", opts)
|
2020-04-02 10:23:30 -06:00
|
|
|
|
|
|
|
assert [expected_result] ==
|
|
|
|
AccountView.render("relationships.json", %{user: user, targets: [other_user]})
|
2020-03-25 11:33:34 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
@blank_response %{
|
|
|
|
following: false,
|
|
|
|
followed_by: false,
|
|
|
|
blocking: false,
|
|
|
|
blocked_by: false,
|
|
|
|
muting: false,
|
|
|
|
muting_notifications: false,
|
|
|
|
subscribing: false,
|
2021-12-06 13:23:34 -07:00
|
|
|
notifying: false,
|
2020-03-25 11:33:34 -06:00
|
|
|
requested: false,
|
|
|
|
domain_blocking: false,
|
|
|
|
showing_reblogs: true,
|
2021-11-21 08:53:30 -07:00
|
|
|
endorsed: false,
|
|
|
|
note: ""
|
2020-03-25 11:33:34 -06:00
|
|
|
}
|
|
|
|
|
2019-07-16 05:04:11 -06:00
|
|
|
test "represent a relationship for the following and followed user" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
2017-09-13 07:55:10 -06:00
|
|
|
|
2020-12-01 13:17:52 -07:00
|
|
|
{:ok, user, other_user} = User.follow(user, other_user)
|
|
|
|
{:ok, other_user, user} = User.follow(other_user, user)
|
2019-11-20 05:46:11 -07:00
|
|
|
{:ok, _subscription} = User.subscribe(user, other_user)
|
2020-09-08 04:26:44 -06:00
|
|
|
{:ok, _user_relationships} = User.mute(user, other_user, %{notifications: true})
|
2019-11-19 13:22:10 -07:00
|
|
|
{:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, other_user)
|
2017-09-13 07:55:10 -06:00
|
|
|
|
2020-03-25 11:33:34 -06:00
|
|
|
expected =
|
|
|
|
Map.merge(
|
|
|
|
@blank_response,
|
|
|
|
%{
|
|
|
|
following: true,
|
|
|
|
followed_by: true,
|
|
|
|
muting: true,
|
|
|
|
muting_notifications: true,
|
|
|
|
subscribing: true,
|
2021-12-06 13:23:34 -07:00
|
|
|
notifying: true,
|
2020-03-25 11:33:34 -06:00
|
|
|
showing_reblogs: false,
|
|
|
|
id: to_string(other_user.id)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
test_relationship_rendering(user, other_user, expected)
|
2019-07-16 05:04:11 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "represent a relationship for the blocking and blocked user" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
2020-12-01 13:17:52 -07:00
|
|
|
{:ok, user, other_user} = User.follow(user, other_user)
|
2019-11-20 05:46:11 -07:00
|
|
|
{:ok, _subscription} = User.subscribe(user, other_user)
|
2019-11-19 13:22:10 -07:00
|
|
|
{:ok, _user_relationship} = User.block(user, other_user)
|
|
|
|
{:ok, _user_relationship} = User.block(other_user, user)
|
2019-07-16 05:04:11 -06:00
|
|
|
|
2020-03-25 11:33:34 -06:00
|
|
|
expected =
|
|
|
|
Map.merge(
|
|
|
|
@blank_response,
|
|
|
|
%{following: false, blocking: true, blocked_by: true, id: to_string(other_user.id)}
|
|
|
|
)
|
2019-07-16 05:04:11 -06:00
|
|
|
|
2020-03-25 11:33:34 -06:00
|
|
|
test_relationship_rendering(user, other_user, expected)
|
2019-07-16 05:04:11 -06:00
|
|
|
end
|
|
|
|
|
2019-07-24 09:12:27 -06:00
|
|
|
test "represent a relationship for the user blocking a domain" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user, ap_id: "https://bad.site/users/other_user")
|
|
|
|
|
|
|
|
{:ok, user} = User.block_domain(user, "bad.site")
|
|
|
|
|
2020-03-25 11:33:34 -06:00
|
|
|
expected =
|
|
|
|
Map.merge(
|
|
|
|
@blank_response,
|
|
|
|
%{domain_blocking: true, blocking: false, id: to_string(other_user.id)}
|
|
|
|
)
|
|
|
|
|
|
|
|
test_relationship_rendering(user, other_user, expected)
|
2019-07-24 09:12:27 -06:00
|
|
|
end
|
|
|
|
|
2019-07-16 05:04:11 -06:00
|
|
|
test "represent a relationship for the user with a pending follow request" do
|
|
|
|
user = insert(:user)
|
2020-10-13 08:31:13 -06:00
|
|
|
other_user = insert(:user, is_locked: true)
|
2019-07-16 05:04:11 -06:00
|
|
|
|
|
|
|
{:ok, user, other_user, _} = CommonAPI.follow(user, other_user)
|
|
|
|
user = User.get_cached_by_id(user.id)
|
|
|
|
other_user = User.get_cached_by_id(other_user.id)
|
|
|
|
|
2020-03-25 11:33:34 -06:00
|
|
|
expected =
|
|
|
|
Map.merge(
|
|
|
|
@blank_response,
|
|
|
|
%{requested: true, following: false, id: to_string(other_user.id)}
|
|
|
|
)
|
2017-09-13 07:55:10 -06:00
|
|
|
|
2020-03-25 11:33:34 -06:00
|
|
|
test_relationship_rendering(user, other_user, expected)
|
2019-07-16 05:04:11 -06:00
|
|
|
end
|
2017-09-13 07:55:10 -06:00
|
|
|
end
|
2019-02-27 06:01:10 -07:00
|
|
|
|
2019-05-31 06:27:15 -06:00
|
|
|
test "returns the settings store if the requesting user is the represented user and it's requested specifically" do
|
2019-10-16 12:59:21 -06:00
|
|
|
user = insert(:user, pleroma_settings_store: %{fe: "test"})
|
2019-05-31 06:27:15 -06:00
|
|
|
|
|
|
|
result =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user, with_pleroma_settings: true})
|
2019-05-31 06:27:15 -06:00
|
|
|
|
2019-05-31 06:49:46 -06:00
|
|
|
assert result.pleroma.settings_store == %{:fe => "test"}
|
2019-05-31 06:27:15 -06:00
|
|
|
|
2020-07-22 10:06:00 -06:00
|
|
|
result = AccountView.render("show.json", %{user: user, for: nil, with_pleroma_settings: true})
|
2019-05-31 06:49:46 -06:00
|
|
|
assert result.pleroma[:settings_store] == nil
|
2019-05-31 06:27:15 -06:00
|
|
|
|
2019-09-30 06:10:54 -06:00
|
|
|
result = AccountView.render("show.json", %{user: user, for: user})
|
2019-05-31 06:49:46 -06:00
|
|
|
assert result.pleroma[:settings_store] == nil
|
2019-05-31 06:27:15 -06:00
|
|
|
end
|
2019-06-18 05:09:15 -06:00
|
|
|
|
2020-01-30 09:47:57 -07:00
|
|
|
test "doesn't sanitize display names" do
|
2019-06-18 05:09:15 -06:00
|
|
|
user = insert(:user, name: "<marquee> username </marquee>")
|
2020-07-23 06:08:30 -06:00
|
|
|
result = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
2020-01-30 09:47:57 -07:00
|
|
|
assert result.display_name == "<marquee> username </marquee>"
|
2019-06-18 05:09:15 -06:00
|
|
|
end
|
2019-08-09 07:49:09 -06:00
|
|
|
|
2019-11-27 06:48:28 -07:00
|
|
|
test "never display nil user follow counts" do
|
|
|
|
user = insert(:user, following_count: 0, follower_count: 0)
|
2020-07-23 06:08:30 -06:00
|
|
|
result = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
2019-11-27 06:48:28 -07:00
|
|
|
|
|
|
|
assert result.following_count == 0
|
|
|
|
assert result.followers_count == 0
|
|
|
|
end
|
|
|
|
|
2019-08-09 07:49:09 -06:00
|
|
|
describe "hiding follows/following" do
|
2019-09-13 08:37:30 -06:00
|
|
|
test "shows when follows/followers stats are hidden and sets follow/follower count to 0" do
|
2019-10-16 12:59:21 -06:00
|
|
|
user =
|
|
|
|
insert(:user, %{
|
|
|
|
hide_followers: true,
|
|
|
|
hide_followers_count: true,
|
|
|
|
hide_follows: true,
|
|
|
|
hide_follows_count: true
|
|
|
|
})
|
2019-09-13 08:37:30 -06:00
|
|
|
|
2019-08-09 07:49:09 -06:00
|
|
|
other_user = insert(:user)
|
|
|
|
{:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user)
|
|
|
|
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
|
|
|
|
|
|
|
|
assert %{
|
|
|
|
followers_count: 0,
|
|
|
|
following_count: 0,
|
2019-09-13 08:37:30 -06:00
|
|
|
pleroma: %{hide_follows_count: true, hide_followers_count: true}
|
2020-07-23 06:08:30 -06:00
|
|
|
} = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
2019-09-13 08:37:30 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "shows when follows/followers are hidden" do
|
2019-10-16 12:59:21 -06:00
|
|
|
user = insert(:user, hide_followers: true, hide_follows: true)
|
2019-09-13 08:37:30 -06:00
|
|
|
other_user = insert(:user)
|
|
|
|
{:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user)
|
|
|
|
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
|
|
|
|
|
|
|
|
assert %{
|
|
|
|
followers_count: 1,
|
|
|
|
following_count: 1,
|
2019-08-09 07:49:09 -06:00
|
|
|
pleroma: %{hide_follows: true, hide_followers: true}
|
2020-07-23 06:08:30 -06:00
|
|
|
} = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
2019-08-09 07:49:09 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "shows actual follower/following count to the account owner" do
|
2019-10-16 12:59:21 -06:00
|
|
|
user = insert(:user, hide_followers: true, hide_follows: true)
|
2019-08-09 07:49:09 -06:00
|
|
|
other_user = insert(:user)
|
|
|
|
{:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user)
|
2020-07-08 07:40:56 -06:00
|
|
|
|
|
|
|
assert User.following?(user, other_user)
|
|
|
|
assert Pleroma.FollowingRelationship.follower_count(other_user) == 1
|
2019-08-09 07:49:09 -06:00
|
|
|
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
|
|
|
|
|
|
|
|
assert %{
|
|
|
|
followers_count: 1,
|
|
|
|
following_count: 1
|
2019-09-30 06:10:54 -06:00
|
|
|
} = AccountView.render("show.json", %{user: user, for: user})
|
2019-08-09 07:49:09 -06:00
|
|
|
end
|
2019-10-01 15:37:08 -06:00
|
|
|
|
|
|
|
test "shows unread_conversation_count only to the account owner" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, _activity} =
|
2019-10-17 06:25:15 -06:00
|
|
|
CommonAPI.post(other_user, %{
|
2020-05-12 13:59:26 -06:00
|
|
|
status: "Hey @#{user.nickname}.",
|
|
|
|
visibility: "direct"
|
2019-10-01 15:37:08 -06:00
|
|
|
})
|
|
|
|
|
|
|
|
user = User.get_cached_by_ap_id(user.ap_id)
|
|
|
|
|
|
|
|
assert AccountView.render("show.json", %{user: user, for: other_user})[:pleroma][
|
|
|
|
:unread_conversation_count
|
|
|
|
] == nil
|
|
|
|
|
|
|
|
assert AccountView.render("show.json", %{user: user, for: user})[:pleroma][
|
|
|
|
:unread_conversation_count
|
|
|
|
] == 1
|
|
|
|
end
|
2020-05-06 06:08:38 -06:00
|
|
|
|
|
|
|
test "shows unread_count only to the account owner" do
|
|
|
|
user = insert(:user)
|
2020-09-15 06:32:49 -06:00
|
|
|
insert_list(7, :notification, user: user, activity: insert(:note_activity))
|
2020-05-06 06:08:38 -06:00
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
user = User.get_cached_by_ap_id(user.ap_id)
|
|
|
|
|
|
|
|
assert AccountView.render(
|
|
|
|
"show.json",
|
|
|
|
%{user: user, for: other_user}
|
|
|
|
)[:pleroma][:unread_notifications_count] == nil
|
|
|
|
|
|
|
|
assert AccountView.render(
|
|
|
|
"show.json",
|
|
|
|
%{user: user, for: user}
|
|
|
|
)[:pleroma][:unread_notifications_count] == 7
|
|
|
|
end
|
2021-05-20 11:50:43 -06:00
|
|
|
|
|
|
|
test "shows email only to the account owner" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
user = User.get_cached_by_ap_id(user.ap_id)
|
|
|
|
|
|
|
|
assert AccountView.render(
|
|
|
|
"show.json",
|
|
|
|
%{user: user, for: other_user}
|
|
|
|
)[:pleroma][:email] == nil
|
|
|
|
|
|
|
|
assert AccountView.render(
|
|
|
|
"show.json",
|
|
|
|
%{user: user, for: user}
|
|
|
|
)[:pleroma][:email] == user.email
|
|
|
|
end
|
2019-08-09 07:49:09 -06:00
|
|
|
end
|
2019-09-26 22:22:40 -06:00
|
|
|
|
2022-01-25 09:10:40 -07:00
|
|
|
describe "hiding birthday" do
|
|
|
|
test "doesn't show birthday if hidden" do
|
|
|
|
user =
|
|
|
|
insert(:user, %{
|
|
|
|
birthday: "2001-02-12",
|
|
|
|
show_birthday: false
|
|
|
|
})
|
|
|
|
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
user = User.get_cached_by_ap_id(user.ap_id)
|
|
|
|
|
|
|
|
assert AccountView.render(
|
|
|
|
"show.json",
|
|
|
|
%{user: user, for: other_user}
|
|
|
|
)[:birthday] == nil
|
|
|
|
end
|
|
|
|
|
|
|
|
test "shows hidden birthday to the account owner" do
|
|
|
|
user =
|
|
|
|
insert(:user, %{
|
|
|
|
birthday: "2001-02-12",
|
|
|
|
show_birthday: false
|
|
|
|
})
|
|
|
|
|
|
|
|
user = User.get_cached_by_ap_id(user.ap_id)
|
|
|
|
|
|
|
|
assert AccountView.render(
|
|
|
|
"show.json",
|
|
|
|
%{user: user, for: user}
|
|
|
|
)[:birthday] == nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-09-26 22:22:40 -06:00
|
|
|
describe "follow requests counter" do
|
|
|
|
test "shows zero when no follow requests are pending" do
|
|
|
|
user = insert(:user)
|
|
|
|
|
|
|
|
assert %{follow_requests_count: 0} =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
|
|
|
|
other_user = insert(:user)
|
|
|
|
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
|
|
|
|
|
|
|
|
assert %{follow_requests_count: 0} =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "shows non-zero when follow requests are pending" do
|
2020-10-13 08:31:13 -06:00
|
|
|
user = insert(:user, is_locked: true)
|
2019-09-26 22:22:40 -06:00
|
|
|
|
2019-09-30 06:10:54 -06:00
|
|
|
assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
|
|
|
|
other_user = insert(:user)
|
|
|
|
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
|
|
|
|
|
|
|
|
assert %{locked: true, follow_requests_count: 1} =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "decreases when accepting a follow request" do
|
2020-10-13 08:31:13 -06:00
|
|
|
user = insert(:user, is_locked: true)
|
2019-09-26 22:22:40 -06:00
|
|
|
|
2019-09-30 06:10:54 -06:00
|
|
|
assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
|
|
|
|
other_user = insert(:user)
|
|
|
|
{:ok, other_user, user, _activity} = CommonAPI.follow(other_user, user)
|
|
|
|
|
|
|
|
assert %{locked: true, follow_requests_count: 1} =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
|
|
|
|
{:ok, _other_user} = CommonAPI.accept_follow_request(other_user, user)
|
|
|
|
|
|
|
|
assert %{locked: true, follow_requests_count: 0} =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "decreases when rejecting a follow request" do
|
2020-10-13 08:31:13 -06:00
|
|
|
user = insert(:user, is_locked: true)
|
2019-09-26 22:22:40 -06:00
|
|
|
|
2019-09-30 06:10:54 -06:00
|
|
|
assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
|
|
|
|
other_user = insert(:user)
|
|
|
|
{:ok, other_user, user, _activity} = CommonAPI.follow(other_user, user)
|
|
|
|
|
|
|
|
assert %{locked: true, follow_requests_count: 1} =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
|
|
|
|
{:ok, _other_user} = CommonAPI.reject_follow_request(other_user, user)
|
|
|
|
|
|
|
|
assert %{locked: true, follow_requests_count: 0} =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "shows non-zero when historical unapproved requests are present" do
|
2020-10-13 08:31:13 -06:00
|
|
|
user = insert(:user, is_locked: true)
|
2019-09-26 22:22:40 -06:00
|
|
|
|
2019-09-30 06:10:54 -06:00
|
|
|
assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
|
|
|
|
other_user = insert(:user)
|
|
|
|
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
|
|
|
|
|
2020-10-13 08:31:13 -06:00
|
|
|
{:ok, user} = User.update_and_set_cache(user, %{is_locked: false})
|
2019-09-26 22:22:40 -06:00
|
|
|
|
|
|
|
assert %{locked: false, follow_requests_count: 1} =
|
2019-09-30 06:10:54 -06:00
|
|
|
AccountView.render("show.json", %{user: user, for: user})
|
2019-09-26 22:22:40 -06:00
|
|
|
end
|
|
|
|
end
|
2020-05-27 10:35:35 -06:00
|
|
|
|
2020-09-05 07:16:35 -06:00
|
|
|
test "uses mediaproxy urls when it's enabled (regardless of media preview proxy state)" do
|
2020-05-27 10:35:35 -06:00
|
|
|
clear_config([:media_proxy, :enabled], true)
|
2020-09-05 07:16:35 -06:00
|
|
|
clear_config([:media_preview_proxy, :enabled])
|
2020-05-27 10:35:35 -06:00
|
|
|
|
|
|
|
user =
|
|
|
|
insert(:user,
|
|
|
|
avatar: %{"url" => [%{"href" => "https://evil.website/avatar.png"}]},
|
|
|
|
banner: %{"url" => [%{"href" => "https://evil.website/banner.png"}]},
|
|
|
|
emoji: %{"joker_smile" => "https://evil.website/society.png"}
|
|
|
|
)
|
|
|
|
|
2020-09-05 07:16:35 -06:00
|
|
|
with media_preview_enabled <- [false, true] do
|
2021-01-26 10:58:43 -07:00
|
|
|
clear_config([:media_preview_proxy, :enabled], media_preview_enabled)
|
2020-09-05 07:16:35 -06:00
|
|
|
|
|
|
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
|
|
|
|> Enum.all?(fn
|
|
|
|
{key, url} when key in [:avatar, :avatar_static, :header, :header_static] ->
|
2021-05-31 14:09:11 -06:00
|
|
|
String.starts_with?(url, Pleroma.Web.Endpoint.url())
|
2020-09-05 07:16:35 -06:00
|
|
|
|
|
|
|
{:emojis, emojis} ->
|
|
|
|
Enum.all?(emojis, fn %{url: url, static_url: static_url} ->
|
2021-05-31 14:09:11 -06:00
|
|
|
String.starts_with?(url, Pleroma.Web.Endpoint.url()) &&
|
|
|
|
String.starts_with?(static_url, Pleroma.Web.Endpoint.url())
|
2020-09-05 07:16:35 -06:00
|
|
|
end)
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
true
|
|
|
|
end)
|
|
|
|
|> assert()
|
|
|
|
end
|
2020-05-27 10:35:35 -06:00
|
|
|
end
|
2022-07-08 12:54:12 -06:00
|
|
|
|
|
|
|
test "renders mute expiration date" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, _user_relationships} =
|
2022-07-31 09:22:34 -06:00
|
|
|
User.mute(user, other_user, %{notifications: true, duration: 24 * 60 * 60})
|
2022-07-08 12:54:12 -06:00
|
|
|
|
|
|
|
%{
|
|
|
|
mute_expires_at: mute_expires_at
|
|
|
|
} = AccountView.render("show.json", %{user: other_user, for: user, mutes: true})
|
|
|
|
|
2022-07-16 08:09:47 -06:00
|
|
|
assert DateTime.diff(
|
2022-07-08 12:54:12 -06:00
|
|
|
mute_expires_at,
|
2022-07-16 08:09:47 -06:00
|
|
|
DateTime.utc_now() |> DateTime.add(24 * 60 * 60)
|
2022-07-08 12:54:12 -06:00
|
|
|
) in -3..3
|
|
|
|
end
|
2017-09-09 04:09:53 -06:00
|
|
|
end
|