Something went wrong. Try again.
An Ecto SQLite3 adapter.
Something went wrong. Try again.
5.0 kB · 160 lines
Elixir
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161Logger.configure(level: :info)
Application.put_env(:ecto, :primary_key_type, :id)Application.put_env(:ecto, :async_integration_tests, false)
ecto = Mix.Project.deps_paths()[:ecto]ecto_sql = Mix.Project.deps_paths()[:ecto_sql]
Code.require_file("#{ecto_sql}/integration_test/support/repo.exs", __DIR__)
alias Ecto.Integration.TestRepo
Application.put_env(:ecto_sqlite3, TestRepo, adapter: Ecto.Adapters.SQLite3, database: "/tmp/exqlite_integration_test.db", pool: Ecto.Adapters.SQL.Sandbox, show_sensitive_data_on_connection_error: true)
# Pool repo for non-async testsalias Ecto.Integration.PoolRepo
Application.put_env(:ecto_sqlite3, PoolRepo, adapter: Ecto.Adapters.SQLite3, database: "/tmp/exqlite_integration_pool_test.db", show_sensitive_data_on_connection_error: true)
# needed since some of the integration tests rely on fetching env from :ecto_sqlApplication.put_env(:ecto_sql, TestRepo, Application.get_env(:ecto_sqlite3, TestRepo))Application.put_env(:ecto_sql, PoolRepo, Application.get_env(:ecto_sqlite3, PoolRepo))
defmodule Ecto.Integration.PoolRepo do use Ecto.Integration.Repo, otp_app: :ecto_sqlite3, adapter: Ecto.Adapters.SQLite3end
Code.require_file "#{ecto}/integration_test/support/schemas.exs", __DIR__Code.require_file "#{ecto_sql}/integration_test/support/migration.exs", __DIR__
defmodule Ecto.Integration.Case do use ExUnit.CaseTemplate
setup do :ok = Ecto.Adapters.SQL.Sandbox.checkout(TestRepo) endend
{:ok, _} = Ecto.Adapters.SQLite3.ensure_all_started(TestRepo.config(), :temporary)
# Load up the repository, start it, and run migrations_ = Ecto.Adapters.SQLite3.storage_down(TestRepo.config()):ok = Ecto.Adapters.SQLite3.storage_up(TestRepo.config())
_ = Ecto.Adapters.SQLite3.storage_down(PoolRepo.config()):ok = Ecto.Adapters.SQLite3.storage_up(PoolRepo.config())
{:ok, _} = TestRepo.start_link(){:ok, _pid} = PoolRepo.start_link()
excludes = [ :delete_with_join, :right_join,
# SQLite does not have an array type :array_type, :transaction_isolation, :insert_cell_wise_defaults, :insert_select,
# sqlite does not support microsecond precision, only millisecond :microsecond_precision,
# sqlite supports FKs, but does not return sufficient data # for ecto to support matching on a given constraint violation name # which is what most of the tests validate :foreign_key_constraint,
# SQLite with DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 # does not support using LIKE on BLOB types :like_match_blob,
# SQLite will return a string for schemaless map types as # Ecto does not have enough information to call the associated loader # that converts the string JSON representation into a map :map_type_schemaless,
# right now in lock_for_migrations() we do effectively nothing, this is because # SQLite is single-writer so there isn't really a need for us to do anything. # ecto assumes all implementing adapters need >=2 connections for migrations # which is not true for SQLite :lock_for_migrations,
# Migration we don't support :prefix, :add_column_if_not_exists, :remove_column_if_exists, :alter_primary_key, :alter_foreign_key, :assigns_id_type, :modify_column, :restrict,
# SQLite3 does not support the concat function :concat,
# SQLite3 does not support placeholders :placeholders,
# SQLite3 stores booleans as integers, causing Ecto's json_extract_path tests to fail :json_extract_path,
# SQLite3 does not support ON DELETE SET DEFAULT :on_delete_default_all,
# SQLite3 doesn't support specifying columns for ON DELETE SET NULL :on_delete_nilify_column_list, :on_delete_default_column_list,
# not sure how to support this yet :bitstring_type,
# sqlite does not have a duration type... yet :duration_type,
# We don't support selected_as :selected_as_with_group_by, :selected_as_with_order_by, :selected_as_with_order_by_expression, :selected_as_with_having,
# SQLite does not support anything except a single column in DISTINCT :multicolumn_distinct,
# :location is not supported in elixir 1.15 and earlier, so we exclude all if Version.match?(System.version(), "~> 1.16") do # Run all with tag values_list, except for the "delete_all" test, # as JOINS are not supported on DELETE statements by SQLite. {:location, {"ecto/integration_test/cases/repo.exs", 2281}} else :values_list end]
ExUnit.configure(exclude: excludes)
# migrate the pool repocase Ecto.Migrator.migrated_versions(PoolRepo) do [] -> :ok = Ecto.Migrator.up(PoolRepo, 0, Ecto.Integration.Migration, log: false)
_ -> :ok = Ecto.Migrator.down(PoolRepo, 0, Ecto.Integration.Migration, log: false) :ok = Ecto.Migrator.up(PoolRepo, 0, Ecto.Integration.Migration, log: false)end
:ok = Ecto.Migrator.up(TestRepo, 0, Ecto.Integration.Migration, log: false)Ecto.Adapters.SQL.Sandbox.mode(TestRepo, :manual)Process.flag(:trap_exit, true)
ExUnit.start()