Birth dates: Add tests
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
397f67fef8
commit
dfb2808535
9 changed files with 210 additions and 9 deletions
|
@ -535,7 +535,8 @@ defmodule Pleroma.User do
|
||||||
:actor_type,
|
:actor_type,
|
||||||
:accepts_chat_messages,
|
:accepts_chat_messages,
|
||||||
:disclose_client,
|
:disclose_client,
|
||||||
:birth_date
|
:birth_date,
|
||||||
|
:hide_birth_date
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|> validate_min_age()
|
|> validate_min_age()
|
||||||
|
@ -2583,4 +2584,13 @@ defmodule Pleroma.User do
|
||||||
_ -> {:error, user}
|
_ -> {:error, user}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_friends_birthdays_query(%User{} = user, day, month) do
|
||||||
|
User.Query.build(%{
|
||||||
|
friends: user,
|
||||||
|
deactivated: false,
|
||||||
|
birth_day: day,
|
||||||
|
birth_month: month
|
||||||
|
})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -234,12 +234,14 @@ defmodule Pleroma.User.Query do
|
||||||
|
|
||||||
defp compose_query({:birth_day, day}, query) do
|
defp compose_query({:birth_day, day}, query) do
|
||||||
query
|
query
|
||||||
|
|> where([u], u.hide_birth_date == false)
|
||||||
|> where([u], not is_nil(u.birth_date))
|
|> where([u], not is_nil(u.birth_date))
|
||||||
|> where([u], fragment("date_part('day', ?)", u.birth_date) == ^day)
|
|> where([u], fragment("date_part('day', ?)", u.birth_date) == ^day)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp compose_query({:birth_month, month}, query) do
|
defp compose_query({:birth_month, month}, query) do
|
||||||
query
|
query
|
||||||
|
|> where([u], u.hide_birth_date == false)
|
||||||
|> where([u], not is_nil(u.birth_date))
|
|> where([u], not is_nil(u.birth_date))
|
||||||
|> where([u], fragment("date_part('month', ?)", u.birth_date) == ^month)
|
|> where([u], fragment("date_part('month', ?)", u.birth_date) == ^month)
|
||||||
end
|
end
|
||||||
|
|
|
@ -54,7 +54,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
|
||||||
description:
|
description:
|
||||||
"whether the user account is waiting on email confirmation to be activated"
|
"whether the user account is waiting on email confirmation to be activated"
|
||||||
},
|
},
|
||||||
hide_birth_date: %Schema{type: :boolean},
|
hide_birth_date: %Schema{type: :boolean, nullable: true},
|
||||||
hide_favorites: %Schema{type: :boolean},
|
hide_favorites: %Schema{type: :boolean},
|
||||||
hide_followers_count: %Schema{
|
hide_followers_count: %Schema{
|
||||||
type: :boolean,
|
type: :boolean,
|
||||||
|
|
|
@ -249,11 +249,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
birth_date =
|
|
||||||
if !user.hide_birth_date or opts[:for] == user,
|
|
||||||
do: user.birth_date,
|
|
||||||
else: nil
|
|
||||||
|
|
||||||
%{
|
%{
|
||||||
id: to_string(user.id),
|
id: to_string(user.id),
|
||||||
username: username_from_nickname(user.nickname),
|
username: username_from_nickname(user.nickname),
|
||||||
|
@ -303,7 +298,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
background_image: image_url(user.background) |> MediaProxy.url(),
|
background_image: image_url(user.background) |> MediaProxy.url(),
|
||||||
accepts_chat_messages: user.accepts_chat_messages,
|
accepts_chat_messages: user.accepts_chat_messages,
|
||||||
favicon: favicon,
|
favicon: favicon,
|
||||||
birth_date: birth_date
|
birth_date: user.birth_date,
|
||||||
|
hide_birth_date: user.hide_birth_date
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|> maybe_put_role(user, opts[:for])
|
|> maybe_put_role(user, opts[:for])
|
||||||
|
@ -317,6 +313,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
|> maybe_put_unread_conversation_count(user, opts[:for])
|
|> maybe_put_unread_conversation_count(user, opts[:for])
|
||||||
|> maybe_put_unread_notification_count(user, opts[:for])
|
|> maybe_put_unread_notification_count(user, opts[:for])
|
||||||
|> maybe_put_email_address(user, opts[:for])
|
|> maybe_put_email_address(user, opts[:for])
|
||||||
|
|> maybe_hide_birth_date(user, opts[:for])
|
||||||
end
|
end
|
||||||
|
|
||||||
defp username_from_nickname(string) when is_binary(string) do
|
defp username_from_nickname(string) when is_binary(string) do
|
||||||
|
@ -438,6 +435,23 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
|
|
||||||
defp maybe_put_email_address(data, _, _), do: data
|
defp maybe_put_email_address(data, _, _), do: data
|
||||||
|
|
||||||
|
defp maybe_hide_birth_date(data, %User{id: user_id}, %User{id: user_id}) do
|
||||||
|
data
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_hide_birth_date(data, %User{hide_birth_date: true}, _) do
|
||||||
|
data
|
||||||
|
|> Kernel.pop_in([:pleroma, :birth_date])
|
||||||
|
|> Kernel.pop_in([:pleroma, :hide_birth_date])
|
||||||
|
|> elem(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_hide_birth_date(data, _, _) do
|
||||||
|
data
|
||||||
|
|> Kernel.pop_in([:pleroma, :hide_birth_date])
|
||||||
|
|> elem(1)
|
||||||
|
end
|
||||||
|
|
||||||
defp image_url(%{"url" => [%{"href" => href} | _]}), do: href
|
defp image_url(%{"url" => [%{"href" => href} | _]}), do: href
|
||||||
defp image_url(_), do: nil
|
defp image_url(_), do: nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -146,7 +146,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
|
||||||
@doc "GET /api/v1/pleroma/birthday_reminders"
|
@doc "GET /api/v1/pleroma/birthday_reminders"
|
||||||
def birthdays(%{assigns: %{user: %User{} = user}} = conn, %{day: day, month: month} = _params) do
|
def birthdays(%{assigns: %{user: %User{} = user}} = conn, %{day: day, month: month} = _params) do
|
||||||
birthdays =
|
birthdays =
|
||||||
User.Query.build(%{friends: user, deactivated: false, birth_day: day, birth_month: month})
|
User.get_friends_birthdays_query(user, day, month)
|
||||||
|> Pleroma.Repo.all()
|
|> Pleroma.Repo.all()
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -755,6 +755,54 @@ defmodule Pleroma.UserTest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "user registration, with :birth_date_required and :birth_date_min_age" do
|
||||||
|
@full_user_data %{
|
||||||
|
bio: "A guy",
|
||||||
|
name: "my name",
|
||||||
|
nickname: "nick",
|
||||||
|
password: "test",
|
||||||
|
password_confirmation: "test",
|
||||||
|
email: "email@example.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup do
|
||||||
|
clear_config([:instance, :birth_date_required], true)
|
||||||
|
clear_config([:instance, :birth_date_min_age], 18 * 365)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it passes when correct birth date is provided" do
|
||||||
|
today = Date.utc_today()
|
||||||
|
birth_date = Date.add(today, -19 * 365)
|
||||||
|
|
||||||
|
params =
|
||||||
|
@full_user_data
|
||||||
|
|> Map.put(:birth_date, birth_date)
|
||||||
|
|
||||||
|
changeset = User.register_changeset(%User{}, params)
|
||||||
|
|
||||||
|
assert changeset.valid?
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it fails when birth date is not provided" do
|
||||||
|
changeset = User.register_changeset(%User{}, @full_user_data)
|
||||||
|
|
||||||
|
refute changeset.valid?
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it fails when provided invalid birth date" do
|
||||||
|
today = Date.utc_today()
|
||||||
|
birth_date = Date.add(today, -17 * 365)
|
||||||
|
|
||||||
|
params =
|
||||||
|
@full_user_data
|
||||||
|
|> Map.put(:birth_date, birth_date)
|
||||||
|
|
||||||
|
changeset = User.register_changeset(%User{}, params)
|
||||||
|
|
||||||
|
refute changeset.valid?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "get_or_fetch/1" do
|
describe "get_or_fetch/1" do
|
||||||
test "gets an existing user by nickname" do
|
test "gets an existing user by nickname" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
|
@ -1586,6 +1586,60 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "create account with required birth date" do
|
||||||
|
setup %{conn: conn} do
|
||||||
|
clear_config([:instance, :birth_date_required], true)
|
||||||
|
clear_config([:instance, :birth_date_min_age], 18 * 365)
|
||||||
|
|
||||||
|
app_token = insert(:oauth_token, user: nil)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_req_header("authorization", "Bearer " <> app_token.token)
|
||||||
|
|> put_req_header("content-type", "multipart/form-data")
|
||||||
|
|
||||||
|
[conn: conn]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "creates an account if provided valid birth date", %{conn: conn} do
|
||||||
|
birth_date =
|
||||||
|
Date.utc_today()
|
||||||
|
|> Date.add(-19 * 365)
|
||||||
|
|> Date.to_string()
|
||||||
|
|
||||||
|
params = %{
|
||||||
|
username: "mkljczk",
|
||||||
|
email: "mkljczk@example.org",
|
||||||
|
password: "dupa.8",
|
||||||
|
agreement: true,
|
||||||
|
birth_date: birth_date
|
||||||
|
}
|
||||||
|
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> post("/api/v1/accounts", params)
|
||||||
|
|
||||||
|
assert json_response_and_validate_schema(res, 200)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns an error if missing birth date", %{conn: conn} do
|
||||||
|
params = %{
|
||||||
|
username: "mkljczk",
|
||||||
|
email: "mkljczk@example.org",
|
||||||
|
password: "dupa.8",
|
||||||
|
agreement: true
|
||||||
|
}
|
||||||
|
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> post("/api/v1/accounts", params)
|
||||||
|
|
||||||
|
assert json_response_and_validate_schema(res, 400) == %{
|
||||||
|
"error" => "{\"birth_date\":[\"can't be blank\"]}"
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "GET /api/v1/accounts/:id/lists - account_lists" do
|
describe "GET /api/v1/accounts/:id/lists - account_lists" do
|
||||||
test "returns lists to which the account belongs" do
|
test "returns lists to which the account belongs" do
|
||||||
%{user: user, conn: conn} = oauth_access(["read:lists"])
|
%{user: user, conn: conn} = oauth_access(["read:lists"])
|
||||||
|
|
|
@ -370,6 +370,26 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "updates birth date", %{conn: conn, user: user} do
|
||||||
|
res =
|
||||||
|
patch(conn, "/api/v1/accounts/update_credentials", %{
|
||||||
|
"birth_date" => "2001-02-12"
|
||||||
|
})
|
||||||
|
|
||||||
|
assert user_data = json_response_and_validate_schema(res, 200)
|
||||||
|
assert user_data["pleroma"]["birth_date"] == "2001-02-12"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "updates the user's hide_birth_date status", %{conn: conn} do
|
||||||
|
res =
|
||||||
|
patch(conn, "/api/v1/accounts/update_credentials", %{
|
||||||
|
"hide_birth_date" => true
|
||||||
|
})
|
||||||
|
|
||||||
|
assert user_data = json_response_and_validate_schema(res, 200)
|
||||||
|
assert user_data["pleroma"]["hide_birth_date"] == true
|
||||||
|
end
|
||||||
|
|
||||||
test "emojis in fields labels", %{conn: conn} do
|
test "emojis in fields labels", %{conn: conn} do
|
||||||
fields = [
|
fields = [
|
||||||
%{"name" => ":firefox:", "value" => "is best 2hu"},
|
%{"name" => ":firefox:", "value" => "is best 2hu"},
|
||||||
|
|
|
@ -304,4 +304,57 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
|
||||||
assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"}
|
assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "birthday reminders" do
|
||||||
|
test "returns a list of friends having birthday on specified day" do
|
||||||
|
%{user: user, conn: conn} = oauth_access(["read:accounts"])
|
||||||
|
|
||||||
|
%{id: id1} =
|
||||||
|
user1 =
|
||||||
|
insert(:user, %{
|
||||||
|
birth_date: "2001-02-12"
|
||||||
|
})
|
||||||
|
|
||||||
|
user2 =
|
||||||
|
insert(:user, %{
|
||||||
|
birth_date: "2001-02-14"
|
||||||
|
})
|
||||||
|
|
||||||
|
user3 = insert(:user)
|
||||||
|
|
||||||
|
CommonAPI.follow(user, user1)
|
||||||
|
CommonAPI.follow(user, user2)
|
||||||
|
CommonAPI.follow(user, user3)
|
||||||
|
|
||||||
|
[%{"id" => ^id1}] =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/pleroma/birthday_reminders?day=12&month=2")
|
||||||
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "the list doesn't list friends with hidden birth date" do
|
||||||
|
%{user: user, conn: conn} = oauth_access(["read:accounts"])
|
||||||
|
|
||||||
|
user1 =
|
||||||
|
insert(:user, %{
|
||||||
|
birth_date: "2001-02-12",
|
||||||
|
hide_birth_date: true
|
||||||
|
})
|
||||||
|
|
||||||
|
%{id: id2} =
|
||||||
|
user2 =
|
||||||
|
insert(:user, %{
|
||||||
|
birth_date: "2001-02-12",
|
||||||
|
hide_birth_date: false
|
||||||
|
})
|
||||||
|
|
||||||
|
CommonAPI.follow(user, user1)
|
||||||
|
CommonAPI.follow(user, user2)
|
||||||
|
|
||||||
|
[%{"id" => ^id2}] =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/pleroma/birthday_reminders?day=12&month=2")
|
||||||
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue