From b5ed9560c4130754076c1763fbfede07bfe02bd1 Mon Sep 17 00:00:00 2001 From: floatingghost Date: Sun, 4 Dec 2022 20:04:09 +0000 Subject: [PATCH] revert 4a94c9a31ef11f63ea71ad9c1f085c18cf8ef083 revert Add ability to follow hashtags (#336) Co-authored-by: FloatingGhost Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/336 --- lib/mix/tasks/pleroma/user.ex | 7 -- lib/pleroma/hashtag.ex | 27 ------ lib/pleroma/user.ex | 58 ----------- lib/pleroma/user/hashtag_follow.ex | 49 ---------- lib/pleroma/web/activity_pub/activity_pub.ex | 25 +---- .../web/api_spec/operations/tag_operation.ex | 65 ------------- lib/pleroma/web/api_spec/schemas/tag.ex | 7 +- .../controllers/tag_controller.ex | 47 --------- .../controllers/timeline_controller.ex | 6 -- .../web/mastodon_api/views/tag_view.ex | 21 ---- lib/pleroma/web/router.ex | 4 - lib/pleroma/web/streamer.ex | 13 +-- ...0221203232118_add_user_follows_hashtag.exs | 12 --- test/pleroma/user_test.exs | 70 ------------- .../web/activity_pub/activity_pub_test.exs | 18 ---- .../controllers/tag_controller_test.exs | 97 ------------------- test/pleroma/web/streamer_test.exs | 30 ------ test/support/factory.ex | 7 -- 18 files changed, 3 insertions(+), 560 deletions(-) delete mode 100644 lib/pleroma/user/hashtag_follow.ex delete mode 100644 lib/pleroma/web/api_spec/operations/tag_operation.ex delete mode 100644 lib/pleroma/web/mastodon_api/controllers/tag_controller.ex delete mode 100644 lib/pleroma/web/mastodon_api/views/tag_view.ex delete mode 100644 priv/repo/migrations/20221203232118_add_user_follows_hashtag.exs delete mode 100644 test/pleroma/web/mastodon_api/controllers/tag_controller_test.exs diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index dd1cdca5b..278a01acc 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -471,15 +471,9 @@ def run(["blocking", nickname]) do def run(["timeline_query", nickname]) do start_pleroma() - params = %{local: true} with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do - followed_hashtags = - user - |> User.followed_hashtags() - |> Enum.map(& &1.id) - params = params |> Map.put(:type, ["Create", "Announce"]) @@ -490,7 +484,6 @@ def run(["timeline_query", nickname]) do |> Map.put(:announce_filtering_user, user) |> Map.put(:user, user) |> Map.put(:local_only, params[:local]) - |> Map.put(:hashtags, followed_hashtags) |> Map.delete(:local) _activities = diff --git a/lib/pleroma/hashtag.ex b/lib/pleroma/hashtag.ex index 9030ee4e9..53e2e9c89 100644 --- a/lib/pleroma/hashtag.ex +++ b/lib/pleroma/hashtag.ex @@ -10,7 +10,6 @@ defmodule Pleroma.Hashtag do alias Ecto.Multi alias Pleroma.Hashtag - alias Pleroma.User.HashtagFollow alias Pleroma.Object alias Pleroma.Repo @@ -28,14 +27,6 @@ def normalize_name(name) do |> String.trim() end - def get_by_id(id) do - Repo.get(Hashtag, id) - end - - def get_by_name(name) do - Repo.get_by(Hashtag, name: normalize_name(name)) - end - def get_or_create_by_name(name) do changeset = changeset(%Hashtag{}, %{name: name}) @@ -112,22 +103,4 @@ def delete_unreferenced(ids) do {:ok, deleted_count} end end - - def get_followers(%Hashtag{id: hashtag_id}) do - from(hf in HashtagFollow) - |> where([hf], hf.hashtag_id == ^hashtag_id) - |> join(:inner, [hf], u in assoc(hf, :user)) - |> select([hf, u], u.id) - |> Repo.all() - end - - def get_recipients_for_activity(%Pleroma.Activity{object: %{hashtags: tags}}) - when is_list(tags) do - tags - |> Enum.map(&get_followers/1) - |> List.flatten() - |> Enum.uniq() - end - - def get_recipients_for_activity(_activity), do: [] end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 9aac6d8c9..adc854ddd 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -18,8 +18,6 @@ defmodule Pleroma.User do alias Pleroma.Emoji alias Pleroma.FollowingRelationship alias Pleroma.Formatter - alias Pleroma.Hashtag - alias Pleroma.User.HashtagFollow alias Pleroma.HTML alias Pleroma.Keys alias Pleroma.MFA @@ -171,12 +169,6 @@ defmodule Pleroma.User do has_many(:frontend_profiles, Pleroma.Akkoma.FrontendSettingsProfile) - many_to_many(:followed_hashtags, Hashtag, - on_replace: :delete, - on_delete: :delete_all, - join_through: HashtagFollow - ) - for {relationship_type, [ {outgoing_relation, outgoing_relation_target}, @@ -2584,54 +2576,4 @@ def update_last_status_at(user) do _ -> {:error, user} end end - - defp maybe_load_followed_hashtags(%User{followed_hashtags: follows} = user) - when is_list(follows), - do: user - - defp maybe_load_followed_hashtags(%User{} = user) do - followed_hashtags = HashtagFollow.get_by_user(user) - %{user | followed_hashtags: followed_hashtags} - end - - def followed_hashtags(%User{followed_hashtags: follows}) - when is_list(follows), - do: follows - - def followed_hashtags(%User{} = user) do - {:ok, user} = - user - |> maybe_load_followed_hashtags() - |> set_cache() - - user.followed_hashtags - end - - def follow_hashtag(%User{} = user, %Hashtag{} = hashtag) do - Logger.debug("Follow hashtag #{hashtag.name} for user #{user.nickname}") - user = maybe_load_followed_hashtags(user) - - with {:ok, _} <- HashtagFollow.new(user, hashtag), - follows <- HashtagFollow.get_by_user(user), - %User{} = user <- user |> Map.put(:followed_hashtags, follows) do - user - |> set_cache() - end - end - - def unfollow_hashtag(%User{} = user, %Hashtag{} = hashtag) do - Logger.debug("Unfollow hashtag #{hashtag.name} for user #{user.nickname}") - user = maybe_load_followed_hashtags(user) - - with {:ok, _} <- HashtagFollow.delete(user, hashtag), - follows <- HashtagFollow.get_by_user(user), - %User{} = user <- user |> Map.put(:followed_hashtags, follows) do - user - |> set_cache() - end - end - - def following_hashtag?(%User{} = user, %Hashtag{} = hashtag) do - not is_nil(HashtagFollow.get(user, hashtag)) - end end diff --git a/lib/pleroma/user/hashtag_follow.ex b/lib/pleroma/user/hashtag_follow.ex deleted file mode 100644 index 43ed93f4d..000000000 --- a/lib/pleroma/user/hashtag_follow.ex +++ /dev/null @@ -1,49 +0,0 @@ -defmodule Pleroma.User.HashtagFollow do - use Ecto.Schema - import Ecto.Query - import Ecto.Changeset - - alias Pleroma.User - alias Pleroma.Hashtag - alias Pleroma.Repo - - schema "user_follows_hashtag" do - belongs_to(:user, User, type: FlakeId.Ecto.CompatType) - belongs_to(:hashtag, Hashtag) - end - - def changeset(%__MODULE__{} = user_hashtag_follow, attrs) do - user_hashtag_follow - |> cast(attrs, [:user_id, :hashtag_id]) - |> unique_constraint(:hashtag_id, - name: :user_hashtag_follows_user_id_hashtag_id_index, - message: "already following" - ) - |> validate_required([:user_id, :hashtag_id]) - end - - def new(%User{} = user, %Hashtag{} = hashtag) do - %__MODULE__{} - |> changeset(%{user_id: user.id, hashtag_id: hashtag.id}) - |> Repo.insert(on_conflict: :nothing) - end - - def delete(%User{} = user, %Hashtag{} = hashtag) do - with %__MODULE__{} = user_hashtag_follow <- get(user, hashtag) do - Repo.delete(user_hashtag_follow) - else - _ -> {:ok, nil} - end - end - - def get(%User{} = user, %Hashtag{} = hashtag) do - from(hf in __MODULE__) - |> where([hf], hf.user_id == ^user.id and hf.hashtag_id == ^hashtag.id) - |> Repo.one() - end - - def get_by_user(%User{} = user) do - Ecto.assoc(user, :followed_hashtags) - |> Repo.all() - end -end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 2e69f49c5..340d73925 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -933,29 +933,6 @@ defp restrict_recipients(query, recipients, user) do ) end - # Essentially, either look for activities addressed to `recipients`, _OR_ ones - # that reference a hashtag that the user follows - # Firstly, two fallbacks in case there's no hashtag constraint, or the user doesn't - # follow any - defp restrict_recipients_or_hashtags(query, recipients, user, nil) do - restrict_recipients(query, recipients, user) - end - - defp restrict_recipients_or_hashtags(query, recipients, user, []) do - restrict_recipients(query, recipients, user) - end - - defp restrict_recipients_or_hashtags(query, recipients, _user, hashtag_ids) do - from( - [activity, object] in query, - join: hto in "hashtags_objects", - on: hto.object_id == object.id, - where: - (hto.hashtag_id in ^hashtag_ids and ^Constants.as_public() in activity.recipients) or - fragment("? && ?", ^recipients, activity.recipients) - ) - end - defp restrict_local(query, %{local_only: true}) do from(activity in query, where: activity.local == true) end @@ -1427,7 +1404,7 @@ def fetch_activities_query(recipients, opts \\ %{}) do |> maybe_preload_report_notes(opts) |> maybe_set_thread_muted_field(opts) |> maybe_order(opts) - |> restrict_recipients_or_hashtags(recipients, opts[:user], opts[:followed_hashtags]) + |> restrict_recipients(recipients, opts[:user]) |> restrict_replies(opts) |> restrict_since(opts) |> restrict_local(opts) diff --git a/lib/pleroma/web/api_spec/operations/tag_operation.ex b/lib/pleroma/web/api_spec/operations/tag_operation.ex deleted file mode 100644 index e22457159..000000000 --- a/lib/pleroma/web/api_spec/operations/tag_operation.ex +++ /dev/null @@ -1,65 +0,0 @@ -defmodule Pleroma.Web.ApiSpec.TagOperation do - alias OpenApiSpex.Operation - alias OpenApiSpex.Schema - alias Pleroma.Web.ApiSpec.Schemas.ApiError - alias Pleroma.Web.ApiSpec.Schemas.Tag - - def open_api_operation(action) do - operation = String.to_existing_atom("#{action}_operation") - apply(__MODULE__, operation, []) - end - - def show_operation do - %Operation{ - tags: ["Tags"], - summary: "Hashtag", - description: "View a hashtag", - security: [%{"oAuth" => ["read"]}], - parameters: [id_param()], - operationId: "TagController.show", - responses: %{ - 200 => Operation.response("Hashtag", "application/json", Tag), - 404 => Operation.response("Not Found", "application/json", ApiError) - } - } - end - - def follow_operation do - %Operation{ - tags: ["Tags"], - summary: "Follow a hashtag", - description: "Follow a hashtag", - security: [%{"oAuth" => ["write:follows"]}], - parameters: [id_param()], - operationId: "TagController.follow", - responses: %{ - 200 => Operation.response("Hashtag", "application/json", Tag), - 404 => Operation.response("Not Found", "application/json", ApiError) - } - } - end - - def unfollow_operation do - %Operation{ - tags: ["Tags"], - summary: "Unfollow a hashtag", - description: "Unfollow a hashtag", - security: [%{"oAuth" => ["write:follow"]}], - parameters: [id_param()], - operationId: "TagController.unfollow", - responses: %{ - 200 => Operation.response("Hashtag", "application/json", Tag), - 404 => Operation.response("Not Found", "application/json", ApiError) - } - } - end - - defp id_param do - Operation.parameter( - :id, - :path, - %Schema{type: :string}, - "Name of the hashtag" - ) - end -end diff --git a/lib/pleroma/web/api_spec/schemas/tag.ex b/lib/pleroma/web/api_spec/schemas/tag.ex index 41b5e5c78..657b675e5 100644 --- a/lib/pleroma/web/api_spec/schemas/tag.ex +++ b/lib/pleroma/web/api_spec/schemas/tag.ex @@ -17,16 +17,11 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Tag do type: :string, format: :uri, description: "A link to the hashtag on the instance" - }, - following: %Schema{ - type: :boolean, - description: "Whether the authenticated user is following the hashtag" } }, example: %{ name: "cofe", - url: "https://lain.com/tag/cofe", - following: false + url: "https://lain.com/tag/cofe" } }) end diff --git a/lib/pleroma/web/mastodon_api/controllers/tag_controller.ex b/lib/pleroma/web/mastodon_api/controllers/tag_controller.ex deleted file mode 100644 index b8995eb00..000000000 --- a/lib/pleroma/web/mastodon_api/controllers/tag_controller.ex +++ /dev/null @@ -1,47 +0,0 @@ -defmodule Pleroma.Web.MastodonAPI.TagController do - @moduledoc "Hashtag routes for mastodon API" - use Pleroma.Web, :controller - - alias Pleroma.User - alias Pleroma.Hashtag - - plug(Pleroma.Web.ApiSpec.CastAndValidate) - plug(Pleroma.Web.Plugs.OAuthScopesPlug, %{scopes: ["read"]} when action in [:show]) - - plug( - Pleroma.Web.Plugs.OAuthScopesPlug, - %{scopes: ["write:follows"]} when action in [:follow, :unfollow] - ) - - defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.TagOperation - - def show(conn, %{id: id}) do - with %Hashtag{} = hashtag <- Hashtag.get_by_name(id) do - render(conn, "show.json", tag: hashtag, for_user: conn.assigns.user) - else - _ -> conn |> render_error(:not_found, "Hashtag not found") - end - end - - def follow(conn, %{id: id}) do - with %Hashtag{} = hashtag <- Hashtag.get_by_name(id), - %User{} = user <- conn.assigns.user, - {:ok, _} <- - User.follow_hashtag(user, hashtag) do - render(conn, "show.json", tag: hashtag, for_user: user) - else - _ -> render_error(conn, :not_found, "Hashtag not found") - end - end - - def unfollow(conn, %{id: id}) do - with %Hashtag{} = hashtag <- Hashtag.get_by_name(id), - %User{} = user <- conn.assigns.user, - {:ok, _} <- - User.unfollow_hashtag(user, hashtag) do - render(conn, "show.json", tag: hashtag, for_user: user) - else - _ -> render_error(conn, :not_found, "Hashtag not found") - end - end -end diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 2d0e36420..5f8acb2df 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -41,11 +41,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do # GET /api/v1/timelines/home def home(%{assigns: %{user: user}} = conn, params) do - followed_hashtags = - user - |> User.followed_hashtags() - |> Enum.map(& &1.id) - params = params |> Map.put(:type, ["Create", "Announce"]) @@ -55,7 +50,6 @@ def home(%{assigns: %{user: user}} = conn, params) do |> Map.put(:announce_filtering_user, user) |> Map.put(:user, user) |> Map.put(:local_only, params[:local]) - |> Map.put(:followed_hashtags, followed_hashtags) |> Map.delete(:local) activities = diff --git a/lib/pleroma/web/mastodon_api/views/tag_view.ex b/lib/pleroma/web/mastodon_api/views/tag_view.ex deleted file mode 100644 index 6e491c261..000000000 --- a/lib/pleroma/web/mastodon_api/views/tag_view.ex +++ /dev/null @@ -1,21 +0,0 @@ -defmodule Pleroma.Web.MastodonAPI.TagView do - use Pleroma.Web, :view - alias Pleroma.User - alias Pleroma.Web.Router.Helpers - - def render("show.json", %{tag: tag, for_user: user}) do - following = - with %User{} <- user do - User.following_hashtag?(user, tag) - else - _ -> false - end - - %{ - name: tag.name, - url: Helpers.tag_feed_url(Pleroma.Web.Endpoint, :feed, tag.name), - history: [], - following: following - } - end -end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 33511959e..2c133ed87 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -622,10 +622,6 @@ defmodule Pleroma.Web.Router do get("/announcements", AnnouncementController, :index) post("/announcements/:id/dismiss", AnnouncementController, :mark_read) - - get("/tags/:id", TagController, :show) - post("/tags/:id/follow", TagController, :follow) - post("/tags/:id/unfollow", TagController, :unfollow) end scope "/api/web", Pleroma.Web do diff --git a/lib/pleroma/web/streamer.ex b/lib/pleroma/web/streamer.ex index 023e36ea3..5d1108efe 100644 --- a/lib/pleroma/web/streamer.ex +++ b/lib/pleroma/web/streamer.ex @@ -18,7 +18,6 @@ defmodule Pleroma.Web.Streamer do alias Pleroma.Web.OAuth.Token alias Pleroma.Web.Plugs.OAuthScopesPlug alias Pleroma.Web.StreamerView - require Pleroma.Constants @mix_env Mix.env() @registry Pleroma.Web.StreamerRegistry @@ -267,17 +266,7 @@ defp do_stream("user", item) do User.get_recipients_from_activity(item) |> Enum.map(fn %{id: id} -> "user:#{id}" end) - hashtag_recipients = - if Pleroma.Constants.as_public() in item.recipients do - Pleroma.Hashtag.get_recipients_for_activity(item) - |> Enum.map(fn id -> "user:#{id}" end) - else - [] - end - - all_recipients = Enum.uniq(recipient_topics ++ hashtag_recipients) - - Enum.each(all_recipients, fn topic -> + Enum.each(recipient_topics, fn topic -> push_to_socket(topic, item) end) end diff --git a/priv/repo/migrations/20221203232118_add_user_follows_hashtag.exs b/priv/repo/migrations/20221203232118_add_user_follows_hashtag.exs deleted file mode 100644 index 27fff2586..000000000 --- a/priv/repo/migrations/20221203232118_add_user_follows_hashtag.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule Pleroma.Repo.Migrations.AddUserFollowsHashtag do - use Ecto.Migration - - def change do - create table(:user_follows_hashtag) do - add(:hashtag_id, references(:hashtags)) - add(:user_id, references(:users, type: :uuid, on_delete: :delete_all)) - end - - create(unique_index(:user_follows_hashtag, [:user_id, :hashtag_id])) - end -end diff --git a/test/pleroma/user_test.exs b/test/pleroma/user_test.exs index 675187647..554e6a813 100644 --- a/test/pleroma/user_test.exs +++ b/test/pleroma/user_test.exs @@ -2722,74 +2722,4 @@ test "should report error on non-existing alias" do assert user.ap_id in user3_updated.also_known_as end end - - describe "follow_hashtag/2" do - test "should follow a hashtag" do - user = insert(:user) - hashtag = insert(:hashtag) - - assert {:ok, _} = user |> User.follow_hashtag(hashtag) - - user = User.get_cached_by_ap_id(user.ap_id) - - assert user.followed_hashtags |> Enum.count() == 1 - assert hashtag.name in Enum.map(user.followed_hashtags, fn %{name: name} -> name end) - end - - test "should not follow a hashtag twice" do - user = insert(:user) - hashtag = insert(:hashtag) - - assert {:ok, _} = user |> User.follow_hashtag(hashtag) - - assert {:ok, _} = user |> User.follow_hashtag(hashtag) - - user = User.get_cached_by_ap_id(user.ap_id) - - assert user.followed_hashtags |> Enum.count() == 1 - assert hashtag.name in Enum.map(user.followed_hashtags, fn %{name: name} -> name end) - end - - test "can follow multiple hashtags" do - user = insert(:user) - hashtag = insert(:hashtag) - other_hashtag = insert(:hashtag) - - assert {:ok, _} = user |> User.follow_hashtag(hashtag) - assert {:ok, _} = user |> User.follow_hashtag(other_hashtag) - - user = User.get_cached_by_ap_id(user.ap_id) - - assert user.followed_hashtags |> Enum.count() == 2 - assert hashtag.name in Enum.map(user.followed_hashtags, fn %{name: name} -> name end) - assert other_hashtag.name in Enum.map(user.followed_hashtags, fn %{name: name} -> name end) - end - end - - describe "unfollow_hashtag/2" do - test "should unfollow a hashtag" do - user = insert(:user) - hashtag = insert(:hashtag) - - assert {:ok, _} = user |> User.follow_hashtag(hashtag) - assert {:ok, _} = user |> User.unfollow_hashtag(hashtag) - - user = User.get_cached_by_ap_id(user.ap_id) - - assert user.followed_hashtags |> Enum.count() == 0 - end - - test "should not error when trying to unfollow a hashtag twice" do - user = insert(:user) - hashtag = insert(:hashtag) - - assert {:ok, _} = user |> User.follow_hashtag(hashtag) - assert {:ok, _} = user |> User.unfollow_hashtag(hashtag) - assert {:ok, _} = user |> User.unfollow_hashtag(hashtag) - - user = User.get_cached_by_ap_id(user.ap_id) - - assert user.followed_hashtags |> Enum.count() == 0 - end - end end diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs index fc283986a..ce3bab1a2 100644 --- a/test/pleroma/web/activity_pub/activity_pub_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_test.exs @@ -726,24 +726,6 @@ test "retrieve the activities for certain recipients" do end end - describe "fetch activities for followed hashtags" do - test "it should return public activities that reference a given hashtag" do - hashtag = insert(:hashtag, name: "tenshi") - user = insert(:user) - - {:ok, public} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "public"}) - {:ok, _unrelated} = CommonAPI.post(user, %{status: "dai #tensh", visibility: "public"}) - {:ok, unlisted} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "unlisted"}) - {:ok, _private} = CommonAPI.post(user, %{status: "maji #tenshi", visibility: "private"}) - - activities = ActivityPub.fetch_activities([], %{followed_hashtags: [hashtag.id]}) - assert length(activities) == 2 - public_id = public.id - unlisted_id = unlisted.id - assert [%{id: ^public_id}, %{id: ^unlisted_id}] = activities - end - end - describe "fetch activities in context" do test "retrieves activities that have a given context" do {:ok, activity} = ActivityBuilder.insert(%{"type" => "Create", "context" => "2hu"}) diff --git a/test/pleroma/web/mastodon_api/controllers/tag_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/tag_controller_test.exs deleted file mode 100644 index a1b73ad78..000000000 --- a/test/pleroma/web/mastodon_api/controllers/tag_controller_test.exs +++ /dev/null @@ -1,97 +0,0 @@ -defmodule Pleroma.Web.MastodonAPI.TagControllerTest do - use Pleroma.Web.ConnCase - - import Pleroma.Factory - import Tesla.Mock - - alias Pleroma.User - - setup do - mock(fn env -> apply(HttpRequestMock, :request, [env]) end) - :ok - end - - describe "GET /api/v1/tags/:id" do - test "returns 200 with tag" do - %{user: user, conn: conn} = oauth_access(["read"]) - - tag = insert(:hashtag, name: "jubjub") - {:ok, _user} = User.follow_hashtag(user, tag) - - response = - conn - |> get("/api/v1/tags/jubjub") - |> json_response_and_validate_schema(200) - - assert %{ - "name" => "jubjub", - "url" => "http://localhost:4001/tags/jubjub", - "history" => [], - "following" => true - } = response - end - - test "returns 404 with unknown tag" do - %{conn: conn} = oauth_access(["read"]) - - conn - |> get("/api/v1/tags/jubjub") - |> json_response_and_validate_schema(404) - end - end - - describe "POST /api/v1/tags/:id/follow" do - test "should follow a hashtag" do - %{user: user, conn: conn} = oauth_access(["write:follows"]) - hashtag = insert(:hashtag, name: "jubjub") - - response = - conn - |> post("/api/v1/tags/jubjub/follow") - |> json_response_and_validate_schema(200) - - assert response["following"] == true - user = User.get_cached_by_ap_id(user.ap_id) - assert User.following_hashtag?(user, hashtag) - end - - test "should 404 if hashtag doesn't exist" do - %{conn: conn} = oauth_access(["write:follows"]) - - response = - conn - |> post("/api/v1/tags/rubrub/follow") - |> json_response_and_validate_schema(404) - - assert response["error"] == "Hashtag not found" - end - end - - describe "POST /api/v1/tags/:id/unfollow" do - test "should unfollow a hashtag" do - %{user: user, conn: conn} = oauth_access(["write:follows"]) - hashtag = insert(:hashtag, name: "jubjub") - {:ok, user} = User.follow_hashtag(user, hashtag) - - response = - conn - |> post("/api/v1/tags/jubjub/unfollow") - |> json_response_and_validate_schema(200) - - assert response["following"] == false - user = User.get_cached_by_ap_id(user.ap_id) - refute User.following_hashtag?(user, hashtag) - end - - test "should 404 if hashtag doesn't exist" do - %{conn: conn} = oauth_access(["write:follows"]) - - response = - conn - |> post("/api/v1/tags/rubrub/unfollow") - |> json_response_and_validate_schema(404) - - assert response["error"] == "Hashtag not found" - end - end -end diff --git a/test/pleroma/web/streamer_test.exs b/test/pleroma/web/streamer_test.exs index 219d9109e..e7f356ab2 100644 --- a/test/pleroma/web/streamer_test.exs +++ b/test/pleroma/web/streamer_test.exs @@ -478,36 +478,6 @@ test "it streams own edits in the 'user' stream", %{user: user, token: oauth_tok assert_receive {:render_with_user, _, "status_update.json", ^create, ^stream} refute Streamer.filtered_by_user?(user, edited) end - - test "it streams posts containing followed hashtags on the 'user' stream", %{ - user: user, - token: oauth_token - } do - hashtag = insert(:hashtag, %{name: "tenshi"}) - other_user = insert(:user) - {:ok, user} = User.follow_hashtag(user, hashtag) - - Streamer.get_topic_and_add_socket("user", user, oauth_token) - {:ok, activity} = CommonAPI.post(other_user, %{status: "hey #tenshi"}) - - assert_receive {:render_with_user, _, "update.json", ^activity, _} - end - - test "should not stream private posts containing followed hashtags on the 'user' stream", %{ - user: user, - token: oauth_token - } do - hashtag = insert(:hashtag, %{name: "tenshi"}) - other_user = insert(:user) - {:ok, user} = User.follow_hashtag(user, hashtag) - - Streamer.get_topic_and_add_socket("user", user, oauth_token) - - {:ok, activity} = - CommonAPI.post(other_user, %{status: "hey #tenshi", visibility: "private"}) - - refute_receive {:render_with_user, _, "update.json", ^activity, _} - end end describe "public streams" do diff --git a/test/support/factory.ex b/test/support/factory.ex index 808f8f887..6ce4decbc 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -716,11 +716,4 @@ def delivery_factory(params \\ %{}) do user: user } end - - def hashtag_factory(params \\ %{}) do - %Pleroma.Hashtag{ - name: "test #{sequence(:hashtag_name, & &1)}" - } - |> Map.merge(params) - end end