Birthdays: birth_date --> birthday

This commit is contained in:
Alex Gleason 2022-01-22 13:21:55 -06:00
parent 74cf0f0355
commit 66e8c6f90f
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
19 changed files with 92 additions and 92 deletions

View File

@ -25,8 +25,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Ability to log slow Ecto queries by configuring `:pleroma, :telemetry, :slow_queries_logging` - Ability to log slow Ecto queries by configuring `:pleroma, :telemetry, :slow_queries_logging`
- Added Phoenix LiveDashboard at `/phoenix/live_dashboard` - Added Phoenix LiveDashboard at `/phoenix/live_dashboard`
- Added `/manifest.json` for progressive web apps. - Added `/manifest.json` for progressive web apps.
- MastoAPI: Support for `birth_date` and `show_birth_date` field in `/api/v1/accounts/update_credentials`. - MastoAPI: Support for `birthday` and `show_birthday` field in `/api/v1/accounts/update_credentials`.
- Configuration: Add `birth_date_required` and `birth_date_min_age` settings to provide a way to require users to enter their birth date. - Configuration: Add `birthday_required` and `birthday_min_age` settings to provide a way to require users to enter their birth date.
- PleromaAPI: Add `GET /api/v1/pleroma/birthday_reminders` API endpoint - PleromaAPI: Add `GET /api/v1/pleroma/birthday_reminders` API endpoint
### Fixed ### Fixed

View File

@ -260,8 +260,8 @@
profile_directory: true, profile_directory: true,
privileged_staff: false, privileged_staff: false,
max_endorsed_users: 20, max_endorsed_users: 20,
birth_date_required: false, birthday_required: false,
birth_date_min_age: 0 birthday_min_age: 0
config :pleroma, :welcome, config :pleroma, :welcome,
direct_message: [ direct_message: [

View File

@ -959,12 +959,12 @@
"Let moderators access sensitive data (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)" "Let moderators access sensitive data (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
}, },
%{ %{
key: :birth_date_required, key: :birthday_required,
type: :boolean, type: :boolean,
description: "Require users to provide birth day." description: "Require users to provide birth day."
}, },
%{ %{
key: :birth_date_min_age, key: :birthday_min_age,
type: :integer, type: :integer,
description: description:
"Min age for users to create account. Only makes sense if birth date is required." "Min age for users to create account. Only makes sense if birth date is required."

View File

@ -154,8 +154,8 @@ defmodule Pleroma.User do
field(:pinned_objects, :map, default: %{}) field(:pinned_objects, :map, default: %{})
field(:is_suggested, :boolean, default: false) field(:is_suggested, :boolean, default: false)
field(:last_status_at, :naive_datetime) field(:last_status_at, :naive_datetime)
field(:birth_date, :date) field(:birthday, :date)
field(:hide_birth_date, :boolean, default: false) field(:hide_birthday, :boolean, default: false)
embeds_one( embeds_one(
:notification_settings, :notification_settings,
@ -473,7 +473,7 @@ def remote_user_changeset(struct \\ %User{local: false}, params) do
:also_known_as, :also_known_as,
:accepts_chat_messages, :accepts_chat_messages,
:pinned_objects, :pinned_objects,
:birth_date :birthday
] ]
) )
|> cast(params, [:name], empty_values: []) |> cast(params, [:name], empty_values: [])
@ -535,8 +535,8 @@ def update_changeset(struct, params \\ %{}) do
:actor_type, :actor_type,
:accepts_chat_messages, :accepts_chat_messages,
:disclose_client, :disclose_client,
:birth_date, :birthday,
:hide_birth_date :hide_birthday
] ]
) )
|> validate_min_age() |> validate_min_age()
@ -745,7 +745,7 @@ def register_changeset(struct, params \\ %{}, opts \\ []) do
:emoji, :emoji,
:accepts_chat_messages, :accepts_chat_messages,
:registration_reason, :registration_reason,
:birth_date :birthday
]) ])
|> validate_required([:name, :nickname, :password, :password_confirmation]) |> validate_required([:name, :nickname, :password, :password_confirmation])
|> validate_confirmation(:password) |> validate_confirmation(:password)
@ -767,7 +767,7 @@ def register_changeset(struct, params \\ %{}, opts \\ []) do
|> validate_length(:name, min: 1, max: name_limit) |> validate_length(:name, min: 1, max: name_limit)
|> validate_length(:registration_reason, max: reason_limit) |> validate_length(:registration_reason, max: reason_limit)
|> maybe_validate_required_email(opts[:external]) |> maybe_validate_required_email(opts[:external])
|> maybe_validate_required_birth_date |> maybe_validate_required_birthday
|> validate_min_age() |> validate_min_age()
|> put_password_hash |> put_password_hash
|> put_ap_id() |> put_ap_id()
@ -785,9 +785,9 @@ def maybe_validate_required_email(changeset, _) do
end end
end end
defp maybe_validate_required_birth_date(changeset) do defp maybe_validate_required_birthday(changeset) do
if Config.get([:instance, :birth_date_required]) do if Config.get([:instance, :birthday_required]) do
validate_required(changeset, [:birth_date]) validate_required(changeset, [:birthday])
else else
changeset changeset
end end
@ -795,13 +795,13 @@ defp maybe_validate_required_birth_date(changeset) do
defp validate_min_age(changeset) do defp validate_min_age(changeset) do
changeset changeset
|> validate_change(:birth_date, fn :birth_date, birth_date -> |> validate_change(:birthday, fn :birthday, birthday ->
valid? = valid? =
Date.utc_today() Date.utc_today()
|> Date.diff(birth_date) >= |> Date.diff(birthday) >=
Config.get([:instance, :birth_date_min_age]) Config.get([:instance, :birthday_min_age])
if valid?, do: [], else: [birth_date: "Invalid birth date"] if valid?, do: [], else: [birthday: "Invalid age"]
end) end)
end end
@ -2589,8 +2589,8 @@ def get_friends_birthdays_query(%User{} = user, day, month) do
User.Query.build(%{ User.Query.build(%{
friends: user, friends: user,
deactivated: false, deactivated: false,
birth_day: day, birthday_day: day,
birth_month: month birthday_month: month
}) })
end end
end end

View File

@ -60,8 +60,8 @@ defmodule Pleroma.User.Query do
select: term(), select: term(),
limit: pos_integer(), limit: pos_integer(),
actor_types: [String.t()], actor_types: [String.t()],
birth_day: pos_integer(), birthday_day: pos_integer(),
birth_month: pos_integer() birthday_month: pos_integer()
} }
| map() | map()
@ -232,18 +232,18 @@ defp compose_query({:internal, false}, query) do
|> where([u], not like(u.nickname, "internal.%")) |> where([u], not like(u.nickname, "internal.%"))
end end
defp compose_query({:birth_day, day}, query) do defp compose_query({:birthday_day, day}, query) do
query query
|> where([u], u.hide_birth_date == false) |> where([u], u.hide_birthday == false)
|> where([u], not is_nil(u.birth_date)) |> where([u], not is_nil(u.birthday))
|> where([u], fragment("date_part('day', ?)", u.birth_date) == ^day) |> where([u], fragment("date_part('day', ?)", u.birthday) == ^day)
end end
defp compose_query({:birth_month, month}, query) do defp compose_query({:birthday_month, month}, query) do
query query
|> where([u], u.hide_birth_date == false) |> where([u], u.hide_birthday == false)
|> where([u], not is_nil(u.birth_date)) |> where([u], not is_nil(u.birthday))
|> where([u], fragment("date_part('month', ?)", u.birth_date) == ^month) |> where([u], fragment("date_part('month', ?)", u.birthday) == ^month)
end end
defp compose_query(_unsupported_param, query), do: query defp compose_query(_unsupported_param, query), do: query

View File

@ -1501,8 +1501,8 @@ defp object_to_user_data(data) do
nil nil
end end
birth_date = birthday =
if data["vcard:bday"] do if is_binary(data["vcard:bday"]) do
case Date.from_iso8601(data["vcard:bday"]) do case Date.from_iso8601(data["vcard:bday"]) do
{:ok, date} -> date {:ok, date} -> date
{:error, _} -> nil {:error, _} -> nil
@ -1534,7 +1534,7 @@ defp object_to_user_data(data) do
shared_inbox: shared_inbox, shared_inbox: shared_inbox,
accepts_chat_messages: accepts_chat_messages, accepts_chat_messages: accepts_chat_messages,
pinned_objects: pinned_objects, pinned_objects: pinned_objects,
birth_date: birth_date birthday: birthday
} }
# nickname can be nil because of virtual actors # nickname can be nil because of virtual actors

View File

@ -92,9 +92,9 @@ def render("user.json", %{user: user}) do
%{} %{}
end end
birth_date = birthday =
if !user.hide_birth_date, if !user.hide_birthday,
do: user.birth_date, do: user.birthday,
else: nil else: nil
%{ %{
@ -122,7 +122,7 @@ def render("user.json", %{user: user}) do
"discoverable" => user.is_discoverable, "discoverable" => user.is_discoverable,
"capabilities" => capabilities, "capabilities" => capabilities,
"alsoKnownAs" => user.also_known_as, "alsoKnownAs" => user.also_known_as,
"vcard:bday" => birth_date "vcard:bday" => birthday
} }
|> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user)) |> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user))
|> Map.merge(maybe_make_image(&User.banner_url/2, "image", user)) |> Map.merge(maybe_make_image(&User.banner_url/2, "image", user))

View File

@ -544,10 +544,10 @@ defp create_request do
nullable: true, nullable: true,
description: "Invite token required when the registrations aren't public" description: "Invite token required when the registrations aren't public"
}, },
birth_date: %Schema{ birthday: %Schema{
type: :string, type: :string,
nullable: true, nullable: true,
description: "User's birth date", description: "User's birthday",
format: :date format: :date
} }
}, },
@ -727,16 +727,16 @@ defp update_credentials_request do
"Discovery (listing, indexing) of this account by external services (search bots etc.) is allowed." "Discovery (listing, indexing) of this account by external services (search bots etc.) is allowed."
}, },
actor_type: ActorType, actor_type: ActorType,
birth_date: %Schema{ birthday: %Schema{
type: :string, type: :string,
nullable: true, nullable: true,
description: "User's birth date", description: "User's birthday",
format: :date format: :date
}, },
hide_birth_date: %Schema{ hide_birthday: %Schema{
allOf: [BooleanLike], allOf: [BooleanLike],
nullable: true, nullable: true,
description: "User's birth date will be hidden" description: "User's birthday will be hidden"
} }
}, },
example: %{ example: %{
@ -758,8 +758,8 @@ defp update_credentials_request do
also_known_as: ["https://foo.bar/users/foo"], also_known_as: ["https://foo.bar/users/foo"],
discoverable: false, discoverable: false,
actor_type: "Person", actor_type: "Person",
hide_birth_date: true, hide_birthday: true,
birth_date: "2001-02-12" birthday: "2001-02-12"
} }
} }
end end

View File

@ -47,14 +47,14 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
description: "whether the user allows automatically follow moved following accounts" description: "whether the user allows automatically follow moved following accounts"
}, },
background_image: %Schema{type: :string, nullable: true, format: :uri}, background_image: %Schema{type: :string, nullable: true, format: :uri},
birth_date: %Schema{type: :string, nullable: true, format: :date}, birthday: %Schema{type: :string, nullable: true, format: :date},
chat_token: %Schema{type: :string}, chat_token: %Schema{type: :string},
is_confirmed: %Schema{ is_confirmed: %Schema{
type: :boolean, type: :boolean,
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, nullable: true}, hide_birthday: %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,
@ -205,7 +205,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
"settings_store" => %{ "settings_store" => %{
"pleroma-fe" => %{} "pleroma-fe" => %{}
}, },
"birth_date" => "2001-02-12" "birthday" => "2001-02-12"
}, },
"source" => %{ "source" => %{
"fields" => [], "fields" => [],

View File

@ -192,7 +192,7 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p
:allow_following_move, :allow_following_move,
:also_known_as, :also_known_as,
:accepts_chat_messages, :accepts_chat_messages,
:hide_birth_date :hide_birthday
] ]
|> Enum.reduce(%{}, fn key, acc -> |> Enum.reduce(%{}, fn key, acc ->
Maps.put_if_present(acc, key, params[key], &{:ok, Params.truthy_param?(&1)}) Maps.put_if_present(acc, key, params[key], &{:ok, Params.truthy_param?(&1)})
@ -220,7 +220,7 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p
|> Maps.put_if_present(:is_locked, params[:locked]) |> Maps.put_if_present(:is_locked, params[:locked])
# Note: param name is indeed :discoverable (not an error) # Note: param name is indeed :discoverable (not an error)
|> Maps.put_if_present(:is_discoverable, params[:discoverable]) |> Maps.put_if_present(:is_discoverable, params[:discoverable])
|> Maps.put_if_present(:birth_date, params[:birth_date]) |> Maps.put_if_present(:birthday, params[:birthday])
# What happens here: # What happens here:
# #

View File

@ -298,8 +298,8 @@ defp do_render("show.json", %{user: user} = opts) 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: user.birth_date, birthday: user.birthday,
hide_birth_date: user.hide_birth_date hide_birthday: user.hide_birthday
} }
} }
|> maybe_put_role(user, opts[:for]) |> maybe_put_role(user, opts[:for])
@ -313,7 +313,7 @@ defp do_render("show.json", %{user: user} = opts) 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]) |> maybe_hide_birthday(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
@ -435,21 +435,21 @@ defp maybe_put_email_address(data, %User{id: user_id}, %User{id: user_id} = user
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 defp maybe_hide_birthday(data, %User{id: user_id}, %User{id: user_id}) do
data data
end end
defp maybe_hide_birth_date(data, %User{hide_birth_date: true}, _) do defp maybe_hide_birthday(data, %User{hide_birthday: true}, _) do
data data
|> Kernel.pop_in([:pleroma, :birth_date]) |> Kernel.pop_in([:pleroma, :birthday])
|> elem(1) |> elem(1)
|> Kernel.pop_in([:pleroma, :hide_birth_date]) |> Kernel.pop_in([:pleroma, :hide_birthday])
|> elem(1) |> elem(1)
end end
defp maybe_hide_birth_date(data, _, _) do defp maybe_hide_birthday(data, _, _) do
data data
|> Kernel.pop_in([:pleroma, :hide_birth_date]) |> Kernel.pop_in([:pleroma, :hide_birthday])
|> elem(1) |> elem(1)
end end

View File

@ -47,8 +47,8 @@ def render("show.json", _) do
fields_limits: fields_limits(), fields_limits: fields_limits(),
post_formats: Config.get([:instance, :allowed_post_formats]), post_formats: Config.get([:instance, :allowed_post_formats]),
privileged_staff: Config.get([:instance, :privileged_staff]), privileged_staff: Config.get([:instance, :privileged_staff]),
birth_date_required: Config.get([:instance, :birth_date_required]), birthday_required: Config.get([:instance, :birthday_required]),
birth_date_min_age: Config.get([:instance, :birth_date_min_age]) birthday_min_age: Config.get([:instance, :birthday_min_age])
}, },
stats: %{mau: Pleroma.User.active_user_count()}, stats: %{mau: Pleroma.User.active_user_count()},
vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key) vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)

View File

@ -20,7 +20,7 @@ def register_user(params, opts \\ []) do
|> Map.put(:name, Map.get(params, :fullname, params[:username])) |> Map.put(:name, Map.get(params, :fullname, params[:username]))
|> Map.put(:password_confirmation, params[:password]) |> Map.put(:password_confirmation, params[:password])
|> Map.put(:registration_reason, params[:reason]) |> Map.put(:registration_reason, params[:reason])
|> Map.put(:birth_date, params[:birth_date]) |> Map.put(:birthday, params[:birthday])
if Pleroma.Config.get([:instance, :registrations_open]) do if Pleroma.Config.get([:instance, :registrations_open]) do
create_user(params, opts) create_user(params, opts)

View File

@ -3,8 +3,8 @@ defmodule Pleroma.Repo.Migrations.AddBirthDateToUsers do
def change do def change do
alter table(:users) do alter table(:users) do
add_if_not_exists(:birth_date, :date) add_if_not_exists(:birthday, :date)
add_if_not_exists(:hide_birth_date, :boolean, default: false, null: false) add_if_not_exists(:hide_birthday, :boolean, default: false, null: false)
end end
end end
end end

View File

@ -755,7 +755,7 @@ test "it restricts length of registration reason" do
end end
end end
describe "user registration, with :birth_date_required and :birth_date_min_age" do describe "user registration, with :birthday_required and :birthday_min_age" do
@full_user_data %{ @full_user_data %{
bio: "A guy", bio: "A guy",
name: "my name", name: "my name",
@ -766,17 +766,17 @@ test "it restricts length of registration reason" do
} }
setup do setup do
clear_config([:instance, :birth_date_required], true) clear_config([:instance, :birthday_required], true)
clear_config([:instance, :birth_date_min_age], 18 * 365) clear_config([:instance, :birthday_min_age], 18 * 365)
end end
test "it passes when correct birth date is provided" do test "it passes when correct birth date is provided" do
today = Date.utc_today() today = Date.utc_today()
birth_date = Date.add(today, -19 * 365) birthday = Date.add(today, -19 * 365)
params = params =
@full_user_data @full_user_data
|> Map.put(:birth_date, birth_date) |> Map.put(:birthday, birthday)
changeset = User.register_changeset(%User{}, params) changeset = User.register_changeset(%User{}, params)
@ -791,11 +791,11 @@ test "it fails when birth date is not provided" do
test "it fails when provided invalid birth date" do test "it fails when provided invalid birth date" do
today = Date.utc_today() today = Date.utc_today()
birth_date = Date.add(today, -17 * 365) birthday = Date.add(today, -17 * 365)
params = params =
@full_user_data @full_user_data
|> Map.put(:birth_date, birth_date) |> Map.put(:birthday, birthday)
changeset = User.register_changeset(%User{}, params) changeset = User.register_changeset(%User{}, params)

View File

@ -1588,8 +1588,8 @@ test "returns an error if captcha is invalid", %{conn: conn} do
describe "create account with required birth date" do describe "create account with required birth date" do
setup %{conn: conn} do setup %{conn: conn} do
clear_config([:instance, :birth_date_required], true) clear_config([:instance, :birthday_required], true)
clear_config([:instance, :birth_date_min_age], 18 * 365) clear_config([:instance, :birthday_min_age], 18 * 365)
app_token = insert(:oauth_token, user: nil) app_token = insert(:oauth_token, user: nil)
@ -1602,7 +1602,7 @@ test "returns an error if captcha is invalid", %{conn: conn} do
end end
test "creates an account if provided valid birth date", %{conn: conn} do test "creates an account if provided valid birth date", %{conn: conn} do
birth_date = birthday =
Date.utc_today() Date.utc_today()
|> Date.add(-19 * 365) |> Date.add(-19 * 365)
|> Date.to_string() |> Date.to_string()
@ -1612,7 +1612,7 @@ test "creates an account if provided valid birth date", %{conn: conn} do
email: "mkljczk@example.org", email: "mkljczk@example.org",
password: "dupa.8", password: "dupa.8",
agreement: true, agreement: true,
birth_date: birth_date birthday: birthday
} }
res = res =
@ -1635,7 +1635,7 @@ test "returns an error if missing birth date", %{conn: conn} do
|> post("/api/v1/accounts", params) |> post("/api/v1/accounts", params)
assert json_response_and_validate_schema(res, 400) == %{ assert json_response_and_validate_schema(res, 400) == %{
"error" => "{\"birth_date\":[\"can't be blank\"]}" "error" => "{\"birthday\":[\"can't be blank\"]}"
} }
end end
end end

View File

@ -370,24 +370,24 @@ test "update fields", %{conn: conn} do
] ]
end end
test "updates birth date", %{conn: conn, user: user} do test "updates birth date", %{conn: conn} do
res = res =
patch(conn, "/api/v1/accounts/update_credentials", %{ patch(conn, "/api/v1/accounts/update_credentials", %{
"birth_date" => "2001-02-12" "birthday" => "2001-02-12"
}) })
assert user_data = json_response_and_validate_schema(res, 200) assert user_data = json_response_and_validate_schema(res, 200)
assert user_data["pleroma"]["birth_date"] == "2001-02-12" assert user_data["pleroma"]["birthday"] == "2001-02-12"
end end
test "updates the user's hide_birth_date status", %{conn: conn} do test "updates the user's hide_birthday status", %{conn: conn} do
res = res =
patch(conn, "/api/v1/accounts/update_credentials", %{ patch(conn, "/api/v1/accounts/update_credentials", %{
"hide_birth_date" => true "hide_birthday" => true
}) })
assert user_data = json_response_and_validate_schema(res, 200) assert user_data = json_response_and_validate_schema(res, 200)
assert user_data["pleroma"]["hide_birth_date"] == true assert user_data["pleroma"]["hide_birthday"] == true
end end
test "emojis in fields labels", %{conn: conn} do test "emojis in fields labels", %{conn: conn} do

View File

@ -79,7 +79,7 @@ test "Represent a user account" do
ap_id: user.ap_id, ap_id: user.ap_id,
also_known_as: ["https://shitposter.zone/users/shp"], also_known_as: ["https://shitposter.zone/users/shp"],
background_image: "https://example.com/images/asuka_hospital.png", background_image: "https://example.com/images/asuka_hospital.png",
birth_date: nil, birthday: nil,
favicon: nil, favicon: nil,
is_confirmed: true, is_confirmed: true,
tags: [], tags: [],
@ -182,7 +182,7 @@ test "Represent a Service(bot) account" do
ap_id: user.ap_id, ap_id: user.ap_id,
also_known_as: [], also_known_as: [],
background_image: nil, background_image: nil,
birth_date: nil, birthday: nil,
favicon: nil, favicon: nil,
is_confirmed: true, is_confirmed: true,
tags: [], tags: [],

View File

@ -312,12 +312,12 @@ test "returns a list of friends having birthday on specified day" do
%{id: id1} = %{id: id1} =
user1 = user1 =
insert(:user, %{ insert(:user, %{
birth_date: "2001-02-12" birthday: "2001-02-12"
}) })
user2 = user2 =
insert(:user, %{ insert(:user, %{
birth_date: "2001-02-14" birthday: "2001-02-14"
}) })
user3 = insert(:user) user3 = insert(:user)
@ -337,15 +337,15 @@ test "the list doesn't list friends with hidden birth date" do
user1 = user1 =
insert(:user, %{ insert(:user, %{
birth_date: "2001-02-12", birthday: "2001-02-12",
hide_birth_date: true hide_birthday: true
}) })
%{id: id2} = %{id: id2} =
user2 = user2 =
insert(:user, %{ insert(:user, %{
birth_date: "2001-02-12", birthday: "2001-02-12",
hide_birth_date: false hide_birthday: false
}) })
CommonAPI.follow(user, user1) CommonAPI.follow(user, user1)