> But as an alternative approach for your use case: you could implement a
simple wrapper function around `System.get_env` (etc.) that reads/writes to
a special key in the process dictionary, falling through to calling the
`System` APIs if the process dictionary doesn't have the `:env` key (or
whatever you want to call it).
>
> Then, all you need to do in your tests, is store the env vars you want in
the process dictionary of the test, and those will override the global
`System` values.

FYI there's a library that does basically exactly this. Maybe it's worth
checking out for anyone interested in this approach
https://github.com/jbsf2/process-tree

-Jason

On Fri, Mar 29, 2024 at 6:17 AM Paul Schoenfelder <
paulschoenfel...@fastmail.com> wrote:

> Ideally, your system pushes this kind of "global" configuration down from
> the top of the supervision tree, rather than reading global state like this
> in a bunch of places. I would definitely encourage you to try and build
> your system with that in mind. Then, all of your tests can pass specific
> configuration to the part of the system under test, rather than relying on
> global state.
>
> But as an alternative approach for your use case: you could implement a
> simple wrapper function around `System.get_env` (etc.) that reads/writes to
> a special key in the process dictionary, falling through to calling the
> `System` APIs if the process dictionary doesn't have the `:env` key (or
> whatever you want to call it).
>
> Then, all you need to do in your tests, is store the env vars you want in
> the process dictionary of the test, and those will override the global
> `System` values.
>
> Things get a bit trickier when spawning processes is involved, but there
> are various approaches for this (I believe ExUnit abuses these pretty
> heavily itself IIRC). One of them is to look at the ancestors of the
> current process until you either reach the root process, or you find one
> with the specified key in the process dictionary.
>
> The reason why implementing this in ExUnit itself is likely to see
> pushback, is because there are just so many ways for this kind of global
> state to find its way into a program, and ExUnit cannot handle them all.
> Furthermore, I believe José wants to encourage good system design by making
> it harder to do things in a not-recommended way, i.e. in this case, not
> relying on global configuration deep inside your system. As a practical
> matter, it would also require adding the sort of wrapper code I mentioned
> to `System.get_env`, which isn't particularly palatable I would imagine.
>
> Anyway, hope that helps/gives you some ideas!
>
> Paul
>
> On Wed, Mar 27, 2024, at 11:14 AM, Daniel Kukula wrote:
>
> Currently, tests that use env variables can't be run async because the
> environment is shared. My proposal is to introduce a with_env function that
> will accept a function to execute and a mapping of params that the
> functions in System will accept as env variables:
> Now: System.put_env("PORT", "4000")
> assert some logic
> System.delete_env("PORT")
>
> after
>
> with_env(%{"PORT" => "4000}, fn ->
> assert some logic
> end)
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to elixir-lang-core+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/3e7dcf24-ae69-47b0-a7b5-281055c70726n%40googlegroups.com
> <https://groups.google.com/d/msgid/elixir-lang-core/3e7dcf24-ae69-47b0-a7b5-281055c70726n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to elixir-lang-core+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/1392a7b4-dc96-4593-a2f5-3307ff66a5cd%40app.fastmail.com
> <https://groups.google.com/d/msgid/elixir-lang-core/1392a7b4-dc96-4593-a2f5-3307ff66a5cd%40app.fastmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAHMz6kxrg7qT-4uweiLFXytDAfhErmwLAMKJbSt3xu-aLiHqCg%40mail.gmail.com.

Reply via email to