feat: add server cache
parent
c174e5b703
commit
8355f30948
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue