1 defmodule Pleroma.LoadTesting.Users do
3 Module for generating users with friends.
6 import Pleroma.LoadTesting.Helper, only: [to_sec: 1]
10 alias Pleroma.User.Query
19 @spec generate(keyword()) :: User.t()
20 def generate(opts \\ []) do
21 opts = Keyword.merge(@defaults, opts)
23 IO.puts("Starting generating #{opts[:users]} users...")
25 {time, _} = :timer.tc(fn -> generate_users(opts[:users]) end)
27 IO.puts("Generating users take #{to_sec(time)} sec.\n")
30 Repo.one(from(u in User, where: u.local == true, order_by: fragment("RANDOM()"), limit: 1))
32 IO.puts("Starting making friends for #{opts[:friends]} users...")
33 {time, _} = :timer.tc(fn -> make_friends(main_user, opts[:friends]) end)
35 IO.puts("Making friends take #{to_sec(time)} sec.\n")
37 Repo.get(User, main_user.id)
40 defp generate_users(max) do
44 max_concurrency: @max_concurrency,
50 defp generate_user(i) do
51 remote = Enum.random([true, false])
54 name: "Test ใในใ User #{i}",
55 email: "user#{i}@example.com",
57 password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
58 bio: "Tester Number #{i}",
65 defp user_urls(%{local: true} = user) do
67 ap_id: User.ap_id(user),
68 follower_address: User.ap_followers(user),
69 following_address: User.ap_following(user)
75 defp user_urls(%{local: false} = user) do
76 base_domain = Enum.random(["domain1.com", "domain2.com", "domain3.com"])
78 ap_id = "https://#{base_domain}/users/#{user.nickname}"
82 follower_address: ap_id <> "/followers",
83 following_address: ap_id <> "/following"
89 defp make_friends(main_user, max) when is_integer(max) do
95 |> get_users(%{limit: number_of_users, local: :local})
96 |> run_stream(main_user)
99 |> get_users(%{limit: number_of_users, local: :external})
100 |> run_stream(main_user)
103 defp make_friends(%User{} = main_user, %User{} = user) do
104 {:ok, _} = User.follow(main_user, user)
105 {:ok, _} = User.follow(user, main_user)
108 @spec get_users(User.t(), keyword()) :: [User.t()]
109 def get_users(user, opts) do
110 criteria = %{limit: opts[:limit]}
114 Map.put(criteria, opts[:local], true)
120 if opts[:friends?] do
121 Map.put(criteria, :friends, user)
129 |> random_without_user(user)
132 if opts[:friends?] == false do
139 from(u in query, where: u.id not in ^friends_ids)
147 defp random_without_user(query, user) do
149 where: u.id != ^user.id,
150 order_by: fragment("RANDOM()")
154 defp run_stream(users, main_user) do
155 Task.async_stream(users, &make_friends(main_user, &1),
156 max_concurrency: @max_concurrency,