Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

264 lines
7.6KB

  1. defmodule Pleroma.UserTest do
  2. alias Pleroma.Builders.UserBuilder
  3. alias Pleroma.{User, Repo}
  4. alias Pleroma.Web.OStatus
  5. alias Pleroma.Web.Websub.WebsubClientSubscription
  6. use Pleroma.DataCase
  7. import Pleroma.Factory
  8. import Ecto.Query
  9. test "ap_id returns the activity pub id for the user" do
  10. host =
  11. Application.get_env(:pleroma, Pleroma.Web.Endpoint)
  12. |> Keyword.fetch!(:url)
  13. |> Keyword.fetch!(:host)
  14. user = UserBuilder.build
  15. expected_ap_id = "#{Pleroma.Web.base_url}/users/#{user.nickname}"
  16. assert expected_ap_id == User.ap_id(user)
  17. end
  18. test "ap_followers returns the followers collection for the user" do
  19. user = UserBuilder.build
  20. expected_followers_collection = "#{User.ap_id(user)}/followers"
  21. assert expected_followers_collection == User.ap_followers(user)
  22. end
  23. test "follow takes a user and another user" do
  24. user = insert(:user)
  25. followed = insert(:user)
  26. {:ok, user} = User.follow(user, followed)
  27. user = Repo.get(User, user.id)
  28. followed = User.get_by_ap_id(followed.ap_id)
  29. assert followed.info["follower_count"] == 1
  30. assert user.following == [User.ap_followers(followed)]
  31. end
  32. test "following a remote user will ensure a websub subscription is present" do
  33. user = insert(:user)
  34. {:ok, followed} = OStatus.make_user("shp@social.heldscal.la")
  35. assert followed.local == false
  36. {:ok, user} = User.follow(user, followed)
  37. assert user.following == [User.ap_followers(followed)]
  38. query = from w in WebsubClientSubscription,
  39. where: w.topic == ^followed.info["topic"]
  40. websub = Repo.one(query)
  41. assert websub
  42. end
  43. test "unfollow takes a user and another user" do
  44. followed = insert(:user)
  45. user = insert(:user, %{following: [User.ap_followers(followed)]})
  46. {:ok, user, _activity } = User.unfollow(user, followed)
  47. user = Repo.get(User, user.id)
  48. assert user.following == []
  49. end
  50. test "test if a user is following another user" do
  51. followed = insert(:user)
  52. user = insert(:user, %{following: [User.ap_followers(followed)]})
  53. assert User.following?(user, followed)
  54. refute User.following?(followed, user)
  55. end
  56. describe "user registration" do
  57. @full_user_data %{
  58. bio: "A guy",
  59. name: "my name",
  60. nickname: "nick",
  61. password: "test",
  62. password_confirmation: "test",
  63. email: "email@example.com"
  64. }
  65. test "it requires a bio, email, name, nickname and password" do
  66. @full_user_data
  67. |> Map.keys
  68. |> Enum.each(fn (key) ->
  69. params = Map.delete(@full_user_data, key)
  70. changeset = User.register_changeset(%User{}, params)
  71. assert changeset.valid? == false
  72. end)
  73. end
  74. test "it sets the password_hash, ap_id and following fields" do
  75. changeset = User.register_changeset(%User{}, @full_user_data)
  76. assert changeset.valid?
  77. assert is_binary(changeset.changes[:password_hash])
  78. assert changeset.changes[:ap_id] == User.ap_id(%User{nickname: @full_user_data.nickname})
  79. assert changeset.changes[:following] == [User.ap_followers(%User{nickname: @full_user_data.nickname})]
  80. assert changeset.changes.follower_address == "#{changeset.changes.ap_id}/followers"
  81. end
  82. end
  83. describe "fetching a user from nickname or trying to build one" do
  84. test "gets an existing user" do
  85. user = insert(:user)
  86. fetched_user = User.get_or_fetch_by_nickname(user.nickname)
  87. assert user == fetched_user
  88. end
  89. test "gets an existing user, case insensitive" do
  90. user = insert(:user, nickname: "nick")
  91. fetched_user = User.get_or_fetch_by_nickname("NICK")
  92. assert user == fetched_user
  93. end
  94. test "fetches an external user via ostatus if no user exists" do
  95. fetched_user = User.get_or_fetch_by_nickname("shp@social.heldscal.la")
  96. assert fetched_user.nickname == "shp@social.heldscal.la"
  97. end
  98. test "returns nil if no user could be fetched" do
  99. fetched_user = User.get_or_fetch_by_nickname("nonexistant@social.heldscal.la")
  100. assert fetched_user == nil
  101. end
  102. test "returns nil for nonexistant local user" do
  103. fetched_user = User.get_or_fetch_by_nickname("nonexistant")
  104. assert fetched_user == nil
  105. end
  106. end
  107. test "returns an ap_id for a user" do
  108. user = insert(:user)
  109. assert User.ap_id(user) == Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, user.nickname)
  110. end
  111. test "returns an ap_followers link for a user" do
  112. user = insert(:user)
  113. assert User.ap_followers(user) == Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, user.nickname) <> "/followers"
  114. end
  115. describe "remote user creation changeset" do
  116. @valid_remote %{
  117. bio: "hello",
  118. name: "Someone",
  119. nickname: "a@b.de",
  120. ap_id: "http...",
  121. info: %{some: "info"},
  122. avatar: %{some: "avatar"}
  123. }
  124. test "it confirms validity" do
  125. cs = User.remote_user_creation(@valid_remote)
  126. assert cs.valid?
  127. end
  128. test "it sets the follower_adress" do
  129. cs = User.remote_user_creation(@valid_remote)
  130. # remote users get a fake local follower address
  131. assert cs.changes.follower_address == User.ap_followers(%User{ nickname: @valid_remote[:nickname] })
  132. end
  133. test "it enforces the fqn format for nicknames" do
  134. cs = User.remote_user_creation(%{@valid_remote | nickname: "bla"})
  135. assert cs.changes.local == false
  136. assert cs.changes.avatar
  137. refute cs.valid?
  138. end
  139. test "it has required fields" do
  140. [:name, :nickname, :ap_id]
  141. |> Enum.each(fn (field) ->
  142. cs = User.remote_user_creation(Map.delete(@valid_remote, field))
  143. refute cs.valid?
  144. end)
  145. end
  146. test "it restricts some sizes" do
  147. [bio: 5000, name: 100]
  148. |> Enum.each(fn ({field, size}) ->
  149. string = String.pad_leading(".", size)
  150. cs = User.remote_user_creation(Map.put(@valid_remote, field, string))
  151. assert cs.valid?
  152. string = String.pad_leading(".", size + 1)
  153. cs = User.remote_user_creation(Map.put(@valid_remote, field, string))
  154. refute cs.valid?
  155. end)
  156. end
  157. end
  158. describe "followers and friends" do
  159. test "gets all followers for a given user" do
  160. user = insert(:user)
  161. follower_one = insert(:user)
  162. follower_two = insert(:user)
  163. not_follower = insert(:user)
  164. {:ok, follower_one} = User.follow(follower_one, user)
  165. {:ok, follower_two} = User.follow(follower_two, user)
  166. {:ok, res} = User.get_followers(user)
  167. assert res == [follower_one, follower_two]
  168. end
  169. test "gets all friends (followed users) for a given user" do
  170. user = insert(:user)
  171. followed_one = insert(:user)
  172. followed_two = insert(:user)
  173. not_followed = insert(:user)
  174. {:ok, user} = User.follow(user, followed_one)
  175. {:ok, user} = User.follow(user, followed_two)
  176. {:ok, res} = User.get_friends(user)
  177. followed_one = User.get_by_ap_id(followed_one.ap_id)
  178. followed_two = User.get_by_ap_id(followed_two.ap_id)
  179. assert res == [followed_one, followed_two]
  180. end
  181. end
  182. describe "updating note and follower count" do
  183. test "it sets the info->note_count property" do
  184. note = insert(:note)
  185. user = User.get_by_ap_id(note.data["actor"])
  186. assert user.info["note_count"] == nil
  187. {:ok, user} = User.update_note_count(user)
  188. assert user.info["note_count"] == 1
  189. end
  190. test "it sets the info->follower_count property" do
  191. user = insert(:user)
  192. follower = insert(:user)
  193. User.follow(follower, user)
  194. assert user.info["follower_count"] == nil
  195. {:ok, user} = User.update_follower_count(user)
  196. assert user.info["follower_count"] == 1
  197. end
  198. end
  199. end