Skip to content

Commit 657ad2e

Browse files
committed
use temporary slots and storage in test
Fixes #3
1 parent bcd071e commit 657ad2e

File tree

1 file changed

+73
-15
lines changed

1 file changed

+73
-15
lines changed

lib/phoenix/sync/electric.ex

Lines changed: 73 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,10 @@ defmodule Phoenix.Sync.Electric do
140140
@doc false
141141
@impl Phoenix.Sync.Adapter
142142
def children(env, opts) do
143-
{mode, electric_opts} = electric_opts(env, opts)
143+
{mode, electric_opts} =
144+
opts
145+
|> set_environment_defaults(env)
146+
|> electric_opts(env)
144147

145148
case mode do
146149
:disabled ->
@@ -158,7 +161,11 @@ defmodule Phoenix.Sync.Electric do
158161
@doc false
159162
@impl Phoenix.Sync.Adapter
160163
def plug_opts(env, opts) do
161-
{mode, electric_opts} = electric_opts(env, opts)
164+
{mode, electric_opts} =
165+
opts
166+
|> set_environment_defaults(env)
167+
|> electric_opts(env)
168+
162169
# don't need to validate the mode here -- it will have already been
163170
# validated by children/0 which is run at phoenix_sync startup before the
164171
# plug opts call even comes through
@@ -179,7 +186,10 @@ defmodule Phoenix.Sync.Electric do
179186
@doc false
180187
@impl Phoenix.Sync.Adapter
181188
def client(env, opts) do
182-
{mode, electric_opts} = electric_opts(env, opts)
189+
{mode, electric_opts} =
190+
opts
191+
|> set_environment_defaults(env)
192+
|> electric_opts(env)
183193

184194
case mode do
185195
mode when mode in @client_valid_modes ->
@@ -192,12 +202,52 @@ defmodule Phoenix.Sync.Electric do
192202
end
193203
end
194204

205+
# if we want to set up per-run configuration, and avoid weird state errors in
206+
# dev and test, then we have to write them to the application config, because
207+
# `children/2`, `client/2` and `plug_opts/2` need to have consistent
208+
# configuration values.
209+
defp set_environment_defaults(opts, :test) do
210+
opts
211+
|> set_persistent_config(:stack_id, fn ->
212+
"electric-stack#{System.monotonic_time()}"
213+
end)
214+
|> set_persistent_config(:replication_stream_id, fn ->
215+
String.replace("phoenix_sync#{System.monotonic_time()}", "-", "_")
216+
end)
217+
|> set_persistent_config(:replication_slot_temporary?, true)
218+
end
219+
220+
defp set_environment_defaults(opts, :dev) do
221+
opts
222+
|> set_environment_defaults(:prod)
223+
|> set_persistent_config(:storage_dir, fn ->
224+
Path.join([System.tmp_dir!(), "phoenix-sync#{System.monotonic_time()}"])
225+
end)
226+
end
227+
228+
defp set_environment_defaults(opts, _env) do
229+
opts
230+
|> set_persistent_config(:stack_id, "electric-embedded")
231+
end
232+
233+
defp set_persistent_config(opts, key, value_fun) when is_function(value_fun) do
234+
Keyword.put_new_lazy(opts, key, fn ->
235+
value = value_fun.()
236+
Application.put_env(:phoenix_sync, key, value)
237+
value
238+
end)
239+
end
240+
241+
defp set_persistent_config(opts, key, value) do
242+
set_persistent_config(opts, key, fn -> value end)
243+
end
244+
195245
@doc false
196246
def electric_available? do
197247
@electric_available?
198248
end
199249

200-
defp electric_opts(env, opts) do
250+
defp electric_opts(opts, env) do
201251
Keyword.pop_lazy(opts, :mode, fn ->
202252
default_mode(env)
203253
end)
@@ -258,6 +308,14 @@ defmodule Phoenix.Sync.Electric do
258308
electric_children(env, mode, opts)
259309
end
260310

311+
# don't start embedded electric in :test env because electric
312+
# creates replication slots and doesn't play well with
313+
# async tests
314+
# defp electric_children(:test, :embedded, _opts) do
315+
# Logger.info("Not starting embedded electric in test mode")
316+
# {:ok, []}
317+
# end
318+
261319
defp electric_children(env, mode, opts) do
262320
case validate_database_config(env, mode, opts) do
263321
{:start, db_config_fun, message} ->
@@ -336,8 +394,8 @@ defmodule Phoenix.Sync.Electric do
336394
defp core_configuration(env, opts) do
337395
opts
338396
|> env_defaults(env)
339-
|> overrides()
340397
|> stack_id()
398+
|> overrides()
341399
end
342400

343401
defp env_defaults(opts, :dev) do
@@ -351,20 +409,20 @@ defmodule Phoenix.Sync.Electric do
351409
# :storage_dir,
352410
# Path.join(System.tmp_dir!(), "electric/shape-data#{System.monotonic_time()}")
353411
# )
354-
|> Keyword.put_new(
355-
:storage,
356-
{Electric.ShapeCache.InMemoryStorage,
357-
table_base_name: :"electric-storage#{opts[:stack_id]}", stack_id: opts[:stack_id]}
358-
)
359-
|> Keyword.put_new(
360-
:persistent_kv,
361-
{Electric.PersistentKV.Memory, :new!, []}
362-
)
412+
# |> Keyword.put_new(
413+
# :storage,
414+
# {Electric.ShapeCache.InMemoryStorage,
415+
# table_base_name: :"electric-storage#{opts[:stack_id]}", stack_id: opts[:stack_id]}
416+
# )
417+
# |> Keyword.put_new(
418+
# :persistent_kv,
419+
# {Electric.PersistentKV.Memory, :new!, []}
420+
# )
363421
|> Keyword.put_new(:send_cache_headers?, false)
364422
end
365423

366424
defp env_defaults(opts, :test) do
367-
stack_id = "electric-stack#{System.monotonic_time()}"
425+
stack_id = "electric-stack"
368426

369427
opts = Keyword.put_new(opts, :stack_id, stack_id)
370428

0 commit comments

Comments
 (0)