feat: add server cache

This commit is contained in:
Moritz Böhme 2024-08-04 13:56:50 +02:00
parent c174e5b703
commit 8355f30948
Signed by: moritz
GPG key ID: 970C6E89EB0547A9
2 changed files with 67 additions and 0 deletions

31
lib/todo/cache.ex Normal file
View file

@ -0,0 +1,31 @@
defmodule Todo.Cache do
use GenServer
@impl GenServer
def init(_init_args) do
{:ok, %{}}
end
@impl GenServer
def handle_call({:server_process, name}, _from, state) do
case Map.fetch(state, name) do
{:ok, process} ->
{:reply, process, state}
:error ->
new_process = Todo.Server.start()
new_state = Map.put(state, name, new_process)
{:reply, new_process, new_state}
end
end
def start() do
GenServer.start(__MODULE__, nil)
end
def server_process(pid, name) do
GenServer.call(pid, {:server_process, name})
end
end

36
test/todo/cache_test.exs Normal file
View file

@ -0,0 +1,36 @@
defmodule Todo.TestCache do
use ExUnit.Case
alias Todo.Cache
alias Todo.Server
test "different names get different servers" do
{:ok, pid} = Cache.start()
{:ok, alice_server} = Cache.server_process(pid, "Alice")
{:ok, bob_server} = Cache.server_process(pid, "Bob")
assert alice_server != bob_server
end
test "same name gets same server" do
{:ok, pid} = Cache.start()
{:ok, alice_server} = Cache.server_process(pid, "Alice")
{:ok, alice_server2} = Cache.server_process(pid, "Alice")
assert alice_server == alice_server2
end
test "simple usage" do
{:ok, pid} = Cache.start()
{:ok, alice_server} = Cache.server_process(pid, "Alice")
Server.add(alice_server, %{date: ~D[2024-08-04], title: "Learn Elixir"})
assert [%{date: ~D[2024-08-04], title: "Learn Elixir"}] =
Server.entries(alice_server, ~D[2024-08-04])
end
end