test/support/test_db_utils.ex

defmodule ExshomeTest.TestDbUtils do
  @moduledoc """
  Starts own database instance for each test.
  """

  def start_test_db do
    new_db_file = copy_database_to_test_folder()

    db_config =
      Application.get_env(:exshome, Exshome.Repo)
      |> Keyword.merge(database: new_db_file, name: nil)

    {:ok, repo} = Exshome.Repo.start_link(db_config)
    Exshome.Repo.put_dynamic_repo(repo)
  end

  @spec copy_database_to_test_folder() :: String.t()
  defp copy_database_to_test_folder do
    root_folder = Application.get_env(:exshome, :root_folder)
    source_db = Application.get_env(:exshome, Exshome.Repo) |> Keyword.fetch!(:database)

    destination_db =
      Path.join([
        ExshomeTest.TestFileUtils.get_test_folder(),
        Path.relative_to(source_db, root_folder)
      ])

    source_db_folder = Path.dirname(source_db)
    destination_db_folder = Path.dirname(destination_db)
    File.mkdir_p!(destination_db_folder)

    for file <- Path.wildcard("#{source_db}*") do
      file_name = Path.relative_to(file, source_db_folder)
      destination = Path.join(destination_db_folder, file_name)
      File.copy!(file, destination)
    end

    destination_db
  end
end