It does seem to be an issue in our test setup, as it looks like you were suggesting, since if I run the same code outside of the test environment it returns correctly, and the message from IO.puts("after")
following the call to the Ecto.Repo.get
callback shows up.
I suspect you’re right that the issue is outside of what I’ve shared, but I’m uncertain where to look next.
The test file looks roughly (modified to preserve confidentiality) like:
defmodule Project.ModuleTest do
use Project.ModelCase
alias Project.{Module, Factory, TestHelpers}
@moduletag :module_tag
setup do
variables = values
%{
more_variables: more values,
cleanup_func: cleanup_func
} = TestHelpers.setup_stuff_we_need(variable, other_variable)
on_exit(cleanup_func)
built_variables = Factory.build(variables)
%{
names: some_variables
}
end
describe "#description" do
test "test description", %{
names: some_variables
} do
assert {:ok, %{
specific_thing_we_need_to_check: false,
id: result_id
}} = Module.function(thing_id, and, some, values)
# wait for a different second so records that only have 1 second resolution don't collide
Process.sleep(2000)
assert {:ok, %{
specific_thing_we_need_to_check: true,
something: ^specific_value,
thing_id: ^thing_id
}} = Module.function_that_calls_my_func(thing_id, and, some, values) # <--- the line that actually creates the issue
end
end
end
And the file that defines Project.ModelCase
looks like
defmodule Project.ModelCase do
use ExUnit.CaseTemplate
using do
quote do
alias Project.Repo
import Ecto
import Ecto.Query, only: [from: 2]
import Project.ModelCase
end
end
setup tags do
:ok = Ecto.Adapters.SQL.Sandbox.checkout(Project.Repo)
unless tags[:async] do
Ecto.Adapters.SQL.Sandbox.mode(Project.Repo, {:shared, self()})
end
:ok
end
def errors_on(changeset) do
Ecto.Changeset.traverse_errors(changeset, fn {message, opts} ->
Enum.reduce(opts, message, fn {key, value}, acc ->
String.replace(acc, "%{#{key}}", to_string(value))
end)
end)
end
end
We’ve also got some stuff in config/test.exs
, and taking some guesses as to what might be relevant we’ve got
use Mix.Config
config :project, Project.Repo
adapter: Ecto.Adapters.Postgres,
username: System.get_env("TEST_USERNAME"),
password: System.get_env("TEST_PASSWORD") ,
database: System.get_env("TEST_DATABASE"),
pool_size: 3,
pool: Ecto.Adapters.SQL.Sandbox,
types: Project.PostgresTypes,
ownership_timeout: 10 * 60 * 1000