Merge branch 'feature/new-user-routes' into 'develop'
[akkoma] / test / web / twitter_api / views / user_view_test.exs
1 defmodule Pleroma.Web.TwitterAPI.UserViewTest do
2 use Pleroma.DataCase
3
4 alias Pleroma.User
5 alias Pleroma.Web.TwitterAPI.UserView
6 alias Pleroma.Web.CommonAPI.Utils
7
8 import Pleroma.Factory
9
10 setup do
11 user = insert(:user, bio: "<span>Here's some html</span>")
12 [user: user]
13 end
14
15 test "A user with only a nickname", %{user: user} do
16 user = %{user | name: nil, nickname: "scarlett@catgirl.science"}
17 represented = UserView.render("show.json", %{user: user})
18 assert represented["name"] == user.nickname
19 assert represented["name_html"] == user.nickname
20 end
21
22 test "A user with an avatar object", %{user: user} do
23 image = "image"
24 user = %{user | avatar: %{"url" => [%{"href" => image}]}}
25 represented = UserView.render("show.json", %{user: user})
26 assert represented["profile_image_url"] == image
27 end
28
29 test "A user with emoji in username" do
30 expected =
31 "<img height=\"32px\" width=\"32px\" alt=\"karjalanpiirakka\" title=\"karjalanpiirakka\" src=\"/file.png\" /> man"
32
33 user =
34 insert(:user, %{
35 info: %{
36 source_data: %{
37 "tag" => [
38 %{
39 "type" => "Emoji",
40 "icon" => %{"url" => "/file.png"},
41 "name" => ":karjalanpiirakka:"
42 }
43 ]
44 }
45 },
46 name: ":karjalanpiirakka: man"
47 })
48
49 represented = UserView.render("show.json", %{user: user})
50 assert represented["name_html"] == expected
51 end
52
53 test "A user" do
54 note_activity = insert(:note_activity)
55 user = User.get_cached_by_ap_id(note_activity.data["actor"])
56 {:ok, user} = User.update_note_count(user)
57 follower = insert(:user)
58 second_follower = insert(:user)
59
60 User.follow(follower, user)
61 User.follow(second_follower, user)
62 User.follow(user, follower)
63 {:ok, user} = User.update_follower_count(user)
64 Cachex.put(:user_cache, "user_info:#{user.id}", User.user_info(Repo.get!(User, user.id)))
65
66 image = "http://localhost:4001/images/avi.png"
67 banner = "http://localhost:4001/images/banner.png"
68
69 represented = %{
70 "id" => user.id,
71 "name" => user.name,
72 "screen_name" => user.nickname,
73 "name_html" => user.name,
74 "description" => HtmlSanitizeEx.strip_tags(user.bio |> String.replace("<br>", "\n")),
75 "description_html" => HtmlSanitizeEx.basic_html(user.bio),
76 "created_at" => user.inserted_at |> Utils.format_naive_asctime(),
77 "favourites_count" => 0,
78 "statuses_count" => 1,
79 "friends_count" => 1,
80 "followers_count" => 2,
81 "profile_image_url" => image,
82 "profile_image_url_https" => image,
83 "profile_image_url_profile_size" => image,
84 "profile_image_url_original" => image,
85 "following" => false,
86 "follows_you" => false,
87 "statusnet_blocking" => false,
88 "rights" => %{
89 "delete_others_notice" => false
90 },
91 "statusnet_profile_url" => user.ap_id,
92 "cover_photo" => banner,
93 "background_image" => nil,
94 "is_local" => true,
95 "locked" => false,
96 "default_scope" => "public",
97 "no_rich_text" => false,
98 "fields" => [],
99 "pleroma" => %{"tags" => []}
100 }
101
102 assert represented == UserView.render("show.json", %{user: user})
103 end
104
105 test "A user for a given other follower", %{user: user} do
106 follower = insert(:user, %{following: [User.ap_followers(user)]})
107 {:ok, user} = User.update_follower_count(user)
108 image = "http://localhost:4001/images/avi.png"
109 banner = "http://localhost:4001/images/banner.png"
110
111 represented = %{
112 "id" => user.id,
113 "name" => user.name,
114 "screen_name" => user.nickname,
115 "name_html" => user.name,
116 "description" => HtmlSanitizeEx.strip_tags(user.bio |> String.replace("<br>", "\n")),
117 "description_html" => HtmlSanitizeEx.basic_html(user.bio),
118 "created_at" => user.inserted_at |> Utils.format_naive_asctime(),
119 "favourites_count" => 0,
120 "statuses_count" => 0,
121 "friends_count" => 0,
122 "followers_count" => 1,
123 "profile_image_url" => image,
124 "profile_image_url_https" => image,
125 "profile_image_url_profile_size" => image,
126 "profile_image_url_original" => image,
127 "following" => true,
128 "follows_you" => false,
129 "statusnet_blocking" => false,
130 "rights" => %{
131 "delete_others_notice" => false
132 },
133 "statusnet_profile_url" => user.ap_id,
134 "cover_photo" => banner,
135 "background_image" => nil,
136 "is_local" => true,
137 "locked" => false,
138 "default_scope" => "public",
139 "no_rich_text" => false,
140 "fields" => [],
141 "pleroma" => %{"tags" => []}
142 }
143
144 assert represented == UserView.render("show.json", %{user: user, for: follower})
145 end
146
147 test "A user that follows you", %{user: user} do
148 follower = insert(:user)
149 {:ok, follower} = User.follow(follower, user)
150 {:ok, user} = User.update_follower_count(user)
151 image = "http://localhost:4001/images/avi.png"
152 banner = "http://localhost:4001/images/banner.png"
153
154 represented = %{
155 "id" => follower.id,
156 "name" => follower.name,
157 "screen_name" => follower.nickname,
158 "name_html" => follower.name,
159 "description" => HtmlSanitizeEx.strip_tags(follower.bio |> String.replace("<br>", "\n")),
160 "description_html" => HtmlSanitizeEx.basic_html(follower.bio),
161 "created_at" => follower.inserted_at |> Utils.format_naive_asctime(),
162 "favourites_count" => 0,
163 "statuses_count" => 0,
164 "friends_count" => 1,
165 "followers_count" => 0,
166 "profile_image_url" => image,
167 "profile_image_url_https" => image,
168 "profile_image_url_profile_size" => image,
169 "profile_image_url_original" => image,
170 "following" => false,
171 "follows_you" => true,
172 "statusnet_blocking" => false,
173 "rights" => %{
174 "delete_others_notice" => false
175 },
176 "statusnet_profile_url" => follower.ap_id,
177 "cover_photo" => banner,
178 "background_image" => nil,
179 "is_local" => true,
180 "locked" => false,
181 "default_scope" => "public",
182 "no_rich_text" => false,
183 "fields" => [],
184 "pleroma" => %{"tags" => []}
185 }
186
187 assert represented == UserView.render("show.json", %{user: follower, for: user})
188 end
189
190 test "a user that is a moderator" do
191 user = insert(:user, %{info: %{is_moderator: true}})
192 represented = UserView.render("show.json", %{user: user, for: user})
193
194 assert represented["rights"]["delete_others_notice"]
195 end
196
197 test "A blocked user for the blocker" do
198 user = insert(:user)
199 blocker = insert(:user)
200 User.block(blocker, user)
201 image = "http://localhost:4001/images/avi.png"
202 banner = "http://localhost:4001/images/banner.png"
203
204 represented = %{
205 "id" => user.id,
206 "name" => user.name,
207 "screen_name" => user.nickname,
208 "name_html" => user.name,
209 "description" => HtmlSanitizeEx.strip_tags(user.bio |> String.replace("<br>", "\n")),
210 "description_html" => HtmlSanitizeEx.basic_html(user.bio),
211 "created_at" => user.inserted_at |> Utils.format_naive_asctime(),
212 "favourites_count" => 0,
213 "statuses_count" => 0,
214 "friends_count" => 0,
215 "followers_count" => 0,
216 "profile_image_url" => image,
217 "profile_image_url_https" => image,
218 "profile_image_url_profile_size" => image,
219 "profile_image_url_original" => image,
220 "following" => false,
221 "follows_you" => false,
222 "statusnet_blocking" => true,
223 "rights" => %{
224 "delete_others_notice" => false
225 },
226 "statusnet_profile_url" => user.ap_id,
227 "cover_photo" => banner,
228 "background_image" => nil,
229 "is_local" => true,
230 "locked" => false,
231 "default_scope" => "public",
232 "no_rich_text" => false,
233 "fields" => [],
234 "pleroma" => %{"tags" => []}
235 }
236
237 blocker = Repo.get(User, blocker.id)
238 assert represented == UserView.render("show.json", %{user: user, for: blocker})
239 end
240
241 test "a user with mastodon fields" do
242 fields = [
243 %{
244 "name" => "Pronouns",
245 "value" => "she/her"
246 },
247 %{
248 "name" => "Website",
249 "value" => "https://example.org/"
250 }
251 ]
252
253 user =
254 insert(:user, %{
255 info: %{
256 source_data: %{
257 "attachment" =>
258 Enum.map(fields, fn field -> Map.put(field, "type", "PropertyValue") end)
259 }
260 }
261 })
262
263 userview = UserView.render("show.json", %{user: user})
264 assert userview["fields"] == fields
265 end
266 end