fix: make ApiTokens.update_last_used synchronous in test env

The async Task.start pattern was causing DBConnection.Ownership errors
when tests finished before the spawned Task could complete its database
update. By making the update synchronous in test environment, we ensure
the database connection is properly managed within the test process.

In production, we still use the async Task.start to avoid blocking
requests when updating last_used_at timestamps.

Fixes all "owner #PID<...> exited" errors in test suite.
This commit is contained in:
Graham McIntire 2026-01-20 15:30:14 -06:00
parent 5ccda65dd1
commit a32a50a5fd
No known key found for this signature in database

View file

@ -172,20 +172,28 @@ defmodule Towerops.ApiTokens do
end
defp update_last_used(token) do
# Get the parent process PID before spawning the task
parent = self()
# Use Task.start to avoid blocking the request
# We don't care if this fails
Task.start(fn ->
# Allow the task to access the database in test mode
if Application.get_env(:towerops, :sql_sandbox) do
Ecto.Adapters.SQL.Sandbox.allow(Repo, parent, self())
end
# In test mode, update synchronously to avoid ownership issues
# In production, use Task.start to avoid blocking the request
if Application.get_env(:towerops, :env) == :test do
token
|> Ecto.Changeset.change(last_used_at: DateTime.truncate(DateTime.utc_now(), :second))
|> Repo.update()
end)
else
# Get the parent process PID before spawning the task
parent = self()
# Use Task.start to avoid blocking the request
# We don't care if this fails
Task.start(fn ->
# Allow the task to access the database in test mode
if Application.get_env(:towerops, :sql_sandbox) do
Ecto.Adapters.SQL.Sandbox.allow(Repo, parent, self())
end
token
|> Ecto.Changeset.change(last_used_at: DateTime.truncate(DateTime.utc_now(), :second))
|> Repo.update()
end)
end
end
end