Files
Claper/test/claper/admin_test.exs
2026-04-08 17:36:15 +02:00

125 lines
3.7 KiB
Elixir

defmodule Claper.AdminTest do
use Claper.DataCase
alias Claper.Admin
alias Claper.Accounts.User
alias Claper.Repo
import Claper.AccountsFixtures
import Claper.EventsFixtures
describe "list_users_paginated/1" do
test "returns paginated users" do
search = "admin-pagination-user"
users =
for index <- 1..21 do
user_fixture(%{email: "#{search}-#{index}@example.com"})
end
{page_1_users, meta_1} =
Admin.list_users_paginated(%{
"page" => 1,
"page_size" => 20,
"order_by" => ["email"],
"order_directions" => ["asc"],
"filters" => [%{"field" => "email", "op" => "ilike_or", "value" => search}]
})
{page_2_users, meta_2} =
Admin.list_users_paginated(%{
"page" => 2,
"page_size" => 20,
"order_by" => ["email"],
"order_directions" => ["asc"],
"filters" => [%{"field" => "email", "op" => "ilike_or", "value" => search}]
})
assert meta_1.total_count == 21
assert meta_1.total_pages == 2
assert meta_2.total_count == 21
assert meta_2.total_pages == 2
assert length(page_1_users) == 20
assert length(page_2_users) == 1
expected_user_ids =
users
|> Enum.sort_by(& &1.email, :asc)
|> Enum.map(& &1.id)
assert Enum.map(page_1_users ++ page_2_users, & &1.id) == expected_user_ids
end
end
describe "list_events_paginated/1" do
test "returns paginated events" do
search = "admin-pagination-event"
events =
for index <- 1..21 do
event_fixture(%{
name: "#{search} #{index}",
started_at: NaiveDateTime.add(~N[2026-01-01 00:00:00], index, :second)
})
end
{page_1_events, meta_1} =
Admin.list_events_paginated(%{
"page" => 1,
"page_size" => 20,
"filters" => [%{"field" => "name", "op" => "ilike_or", "value" => search}]
})
{page_2_events, meta_2} =
Admin.list_events_paginated(%{
"page" => 2,
"page_size" => 20,
"filters" => [%{"field" => "name", "op" => "ilike_or", "value" => search}]
})
assert meta_1.total_count == 21
assert meta_1.total_pages == 2
assert meta_2.total_count == 21
assert meta_2.total_pages == 2
assert length(page_1_events) == 20
assert length(page_2_events) == 1
expected_event_ids =
events
|> Enum.sort_by(& &1.started_at, {:desc, NaiveDateTime})
|> Enum.map(& &1.id)
assert Enum.map(page_1_events ++ page_2_events, & &1.id) == expected_event_ids
end
end
describe "get_growth_metrics/0" do
test "returns numeric negative growth for users when the current month declines" do
now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
thirty_days_ago = NaiveDateTime.add(now, -(30 * 24 * 60 * 60), :second)
forty_five_days_ago = NaiveDateTime.add(now, -(45 * 24 * 60 * 60), :second)
previous_users =
for index <- 1..2 do
user_fixture(%{email: "growth-previous-#{index}@example.com"})
end
current_user = user_fixture(%{email: "growth-current@example.com"})
Repo.update_all(
from(u in User, where: u.id in ^Enum.map(previous_users, & &1.id)),
set: [inserted_at: forty_five_days_ago, updated_at: forty_five_days_ago]
)
Repo.update_all(
from(u in User, where: u.id == ^current_user.id),
set: [inserted_at: thirty_days_ago, updated_at: thirty_days_ago]
)
assert %{users_growth: users_growth} = Admin.get_growth_metrics()
assert is_float(users_growth)
assert users_growth < 0
end
end
end