+
+ describe "unfavoriting" do
+ test "unfavorites a status and returns it", %{conn: conn} do
+ activity = insert(:note_activity)
+ user = insert(:user)
+
+ {:ok, _, _} = CommonAPI.favorite(activity.id, user)
+
+ conn = conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses/#{activity.id}/unfavourite")
+
+ assert %{"id" => id, "favourites_count" => 0, "favourited" => false} = json_response(conn, 200)
+ assert activity.id == id
+ end
+ end
+
+ describe "user timelines" do
+ test "gets a users statuses", %{conn: conn} do
+ _note = insert(:note_activity)
+ note_two = insert(:note_activity)
+
+ user = User.get_by_ap_id(note_two.data["actor"])
+
+ conn = conn
+ |> get("/api/v1/accounts/#{user.id}/statuses")
+
+ assert [%{"id" => id}] = json_response(conn, 200)
+
+ assert id == note_two.id
+ end
+ end
+
+ describe "user relationships" do
+ test "returns the relationships for the current user", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+ {:ok, user} = User.follow(user, other_user)
+
+ conn = conn
+ |> assign(:user, user)
+ |> get("/api/v1/accounts/relationships", %{"id" => [other_user.id]})
+
+ assert [relationship] = json_response(conn, 200)
+
+ assert other_user.id == relationship["id"]
+ end
+ end
+
+ test "account fetching", %{conn: conn} do
+ user = insert(:user)
+
+ conn = conn
+ |> get("/api/v1/accounts/#{user.id}")
+
+ assert %{"id" => id} = json_response(conn, 200)
+ assert id == user.id
+
+ conn = build_conn()
+ |> get("/api/v1/accounts/-1")
+
+ assert %{"error" => "Can't find user"} = json_response(conn, 404)
+ end
+
+ test "media upload", %{conn: conn} do
+ file = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
+
+ user = insert(:user)
+
+ conn = conn
+ |> assign(:user, user)
+ |> post("/api/v1/media", %{"file" => file})
+
+ assert media = json_response(conn, 200)
+
+ assert media["type"] == "image"
+ end
+
+ test "hashtag timeline", %{conn: conn} do
+ following = insert(:user)
+
+ {:ok, activity} = TwitterAPI.create_status(following, %{"status" => "test #2hu"})
+ {:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
+
+ conn = conn
+ |> get("/api/v1/timelines/tag/2hu")
+
+ assert [%{"id" => id}] = json_response(conn, 200)
+
+ assert id == activity.id
+ end
+
+ test "getting followers", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+ {:ok, user} = User.follow(user, other_user)
+
+ conn = conn
+ |> get("/api/v1/accounts/#{other_user.id}/followers")
+
+ assert [%{"id" => id}] = json_response(conn, 200)
+ assert id = user.id
+ end
+
+ test "getting following", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+ {:ok, user} = User.follow(user, other_user)
+
+ conn = conn
+ |> get("/api/v1/accounts/#{user.id}/following")
+
+ assert [%{"id" => id}] = json_response(conn, 200)
+ assert id = other_user.id
+ end
+
+ test "following / unfollowing a user", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ conn = conn
+ |> assign(:user, user)
+ |> post("/api/v1/accounts/#{other_user.id}/follow")
+
+ assert %{"id" => id, "following" => true} = json_response(conn, 200)
+
+ user = Repo.get(User, user.id)
+ conn = build_conn()
+ |> assign(:user, user)
+ |> post("/api/v1/accounts/#{other_user.id}/unfollow")
+
+ assert %{"id" => id, "following" => false} = json_response(conn, 200)
+ end
+
+ test "unimplemented block/mute endpoints" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ ["block", "unblock", "mute", "unmute"]
+ |> Enum.each(fn(endpoint) ->
+ conn = build_conn()
+ |> assign(:user, user)
+ |> post("/api/v1/accounts/#{other_user.id}/#{endpoint}")
+
+ assert %{"id" => id} = json_response(conn, 200)
+ assert id == other_user.id
+ end)
+ end
+
+ test "unimplemented mutes, follow_requests, blocks, domain blocks" do
+ user = insert(:user)
+
+ ["blocks", "domain_blocks", "mutes", "follow_requests"]
+ |> Enum.each(fn(endpoint) ->
+ conn = build_conn()
+ |> assign(:user, user)
+ |> get("/api/v1/#{endpoint}")
+
+ assert [] = json_response(conn, 200)
+ end)
+ end
+
+ test "search", %{conn: conn} do
+ user = insert(:user)
+ user_two = insert(:user, %{nickname: "shp@shitposter.club"})
+ user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
+ {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
+
+ conn = conn
+ |> get("/api/v1/search", %{"q" => "2hu"})
+
+ assert results = json_response(conn, 200)
+
+ [account] = results["accounts"]
+ assert account["id"] == user_three.id
+
+ assert results["hashtags"] == []
+
+ [status] = results["statuses"]
+ assert status["id"] == activity.id
+ end