import Ecto.{Changeset, Query}
alias Pleroma.{Repo, User, Object, Web}
alias Comeonin.Pbkdf2
- alias Pleroma.Web.OStatus
+ alias Pleroma.Web.{OStatus, Websub}
schema "users" do
field :bio, :string
{:error,
"Could not follow user: #{followed.nickname} is already on your list."}
else
+ if !followed.local do
+ Websub.subscribe(follower, followed)
+ end
+
following = [ap_followers | follower.following]
|> Enum.uniq
topic = subscribed.info["topic"]
# FIXME: Race condition, use transactions
{:ok, subscription} = with subscription when not is_nil(subscription) <- Repo.get_by(WebsubClientSubscription, topic: topic) do
- subscribers = [subscriber.ap_id, subscription.subscribers] |> Enum.uniq
+ subscribers = [subscriber.ap_id | subscription.subscribers] |> Enum.uniq
change = Ecto.Changeset.change(subscription, %{subscribers: subscribers})
Repo.update(change)
else _e ->
defmodule Pleroma.UserTest do
alias Pleroma.Builders.UserBuilder
- alias Pleroma.User
+ alias Pleroma.{User, Repo}
+ alias Pleroma.Web.OStatus
+ alias Pleroma.Web.Websub.WebsubClientSubscription
use Pleroma.DataCase
import Pleroma.Factory
+ import Ecto.Query
test "ap_id returns the activity pub id for the user" do
host =
user = insert(:user)
followed = insert(:user)
- {:ok, user } = User.follow(user, followed)
+ {:ok, user} = User.follow(user, followed)
user = Repo.get(User, user.id)
assert user.following == [User.ap_followers(followed)]
end
+ test "following a remote user will ensure a websub subscription is present" do
+ user = insert(:user)
+ {:ok, followed} = OStatus.make_user("shp@social.heldscal.la")
+
+ assert followed.local == false
+
+ {:ok, user} = User.follow(user, followed)
+ assert user.following == [User.ap_followers(followed)]
+
+ query = from w in WebsubClientSubscription,
+ where: w.topic == ^followed.info["topic"]
+ websub = Repo.one(query)
+
+ assert websub
+ end
+
test "unfollow takes a user and another user" do
followed = insert(:user)
user = insert(:user, %{following: [User.ap_followers(followed)]})
assert user == fetched_user
end
- # TODO: Make the test local.
test "fetches an external user via ostatus if no user exists" do
fetched_user = User.get_or_fetch_by_nickname("shp@social.heldscal.la")
assert fetched_user.nickname == "shp@social.heldscal.la"