def start(_type, _args) do
# List all child processes to be supervised
children = [
Nuvemx.Repo,
Nuvemx.RabbitMQ,
NuvemxWeb.Endpoint,
Nuvemx.RecommenderSystems.SimilarityServer,
{Task.Supervisor, name: Nuvemx.TaskSupervisor},
Guardian.DB.Token.SweeperServer
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Nuvemx.Supervisor]
Supervisor.start_link(children, opts)
end```
defmodule Nuvemx.RecommenderSystems.SimilarityServer do
use GenServer
alias Nuvemx.RecommenderSystems
alias Nuvemx.RabbitMQ
@exchange_name “similarities”
def start_link(_) do
GenServer.start_link(MODULE, [], name: MODULE)
end
@impl true
def init(state) do
{:ok, state}
end
@impl true
def handle_info({:similarities, similarities}, state) do
IO.inspect "callers.."
Process.get(:"$callers") |> IO.inspect
RecommenderSystems.update_similarities(similarities)
{:noreply, state}
end
defp build_similarity(%Item{}, user_id, caller) do
SimilarityServer.execute(“items”, get_items(user_id), consume(caller))
end
defp build_similarity(%Client{}, user_id, caller) do
SimilarityServer.execute(“clients”, get_clients(user_id), consume(caller))
end
defp consume(caller) do
fn payload, _meta ->
similarities = Jason.decode!(payload)
send(caller, {:similarities, similarities})
send(caller, :done)
Ecto.Adapters.SQL.Sandbox.allow(Nuvemx.Repo, caller, SimilarityServer)
send(SimilarityServer, {:similarities, similarities})
end
end
My test is calling the last block... caller = Test's pid... so I am able to allow directly.. but it does not work..
Async: true.
I want to run my tests with async: true.. isn't possible for this scenario?
This line bellow is using database and does not work just because is in another process.
RecommenderSystems.update_similarities(similarities)