ollien

ollien

I run my unit tests with mix test --no-start, as I don’t want my application to start when I run my unit tests. However, I also want to test some code that uses Timex for a calculation. If I naively attempt to use Timex in my test, I get the following

    test "can get next instance of time in a trivial instance" do
      next_occurrence =
        Util.Time.get_next_occurrence_of_time(~D[2022-01-01], ~T[13:37:00], "America/New_York")

      assert next_occurrence == Timex.to_datetime({{2022, 1, 1}, {13, 37, 0}}, "America/New_York")
    end
  1) test get_next_occurrence_of_time can get next instance of time in a trivial instance (PillminderTest.Util.Time)
     test/pillminder/util/time_test.exs:8
     ** (ArgumentError) errors were found at the given arguments:
     
       * 1st argument: the table identifier does not refer to an existing ETS table
     
     code: assert next_occurrence == Timex.to_datetime({{2022, 1, 1}, {13, 37, 0}}, "America/New_York")
     stacktrace:
       (stdlib 3.17.2.1) :ets.lookup(:tzdata_current_release, :release_version)
       (tzdata 1.1.1) lib/tzdata/release_reader.ex:74: Tzdata.ReleaseReader.current_release_from_table/0
       (tzdata 1.1.1) lib/tzdata/release_reader.ex:17: Tzdata.ReleaseReader.simple_lookup/1
       (tzdata 1.1.1) lib/tzdata/release_reader.ex:9: Tzdata.ReleaseReader.zone_and_link_list/0
       (tzdata 1.1.1) lib/tzdata.ex:61: Tzdata.zone_exists?/1
       (timex 3.7.9) lib/timezone/timezone.ex:230: Timex.Timezone.name_of/1
       (timex 3.7.9) lib/timezone/timezone.ex:262: Timex.Timezone.get/2
       (timex 3.7.9) lib/timezone/timezone.ex:585: Timex.Timezone.convert/2
       (timex 3.7.9) lib/datetime/erlang.ex:46: Timex.Protocol.Tuple.to_datetime/2
       test/pillminder/util/time_test.exs:12: (test)

I can understand why this might be; tzdata likely needs to be started in order to read from this ETS table. I’m not sure the best way to fix this, because

  1. If I remove --no-start, my application will start, which has side effects I don’t want to produce just by running my unit tests.
  2. Even if I somehow prevent my application from running (is there a way?), but allow Timex to run tzdata, I’m still going to have side effects in my tests, Timex will need to update the timezone database before running my tests; I try to keep my unit tests free of network calls wherever I can.

How can I best deal with this? Is perhaps there some way I can “mock” the tzdata, or somehow pre-seed it for my unit tests?

Thanks!

Showing Posts 1 to 3

trisolaran

trisolaran

Hi @ollien and welcome!

You should be able to turn off tzdata automatic updates in your tests by setting:

config :tzdata, :autoupdate, :disabled

in your test.exs config (GitHub - lau/tzdata: tzdata for Elixir. Born from the Calendar library. · GitHub)

Btw: you can now do time zone conversions directly in Elixir with the tzdata library without Timex: GitHub - lau/tzdata: tzdata for Elixir. Born from the Calendar library. · GitHub

Marcus

Marcus

Welcome @ollien

You could try to start timex in your test/test_helper.exs with Application.ensure_all_started(:timex).

ollien

ollien OP

Thanks for the suggestions! Looking at the tzdata docs it turns out you can also store the ets table locally, so I checked that into a testdata directory (originally in ./deps/tzdata/priv) and then added the following to test.exs

import Config

config :tzdata,
  data_dir: "./test/testdata/tzdata",
  autoupdate: :disabled,
  # Definitely a hack, but tzdata uses this key to determine which http client it uses, so if it
  # actually tries to use hackney, it will get an error
  http_client: nil

and made added Application.ensure_all_started(:tzdata) to my test setup.

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

Latest on Elixir Forum

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews