diff options
Diffstat (limited to 'test/elixir/lib/utils.ex')
-rw-r--r-- | test/elixir/lib/utils.ex | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/test/elixir/lib/utils.ex b/test/elixir/lib/utils.ex new file mode 100644 index 000000000..3ecf878e7 --- /dev/null +++ b/test/elixir/lib/utils.ex @@ -0,0 +1,61 @@ +defmodule Couch.Test.Utils do + require Record + @moduledoc "Helper functions for testing" + @project_root "#{__DIR__}/../../../" + Record.defrecord :user_ctx, Record.extract( + :user_ctx, from: "#{@project_root}/src/couch/include/couch_db.hrl") + + Record.defrecord :doc_info, Record.extract( + :doc_info, from: "#{@project_root}/src/couch/include/couch_db.hrl") + + def random_name(prefix) do + time = :erlang.monotonic_time() + umi = :erlang.unique_integer([:monotonic]) + "#{prefix}-#{time}-#{umi}" + end + + def random_password() do + rand_bytes = :crypto.strong_rand_bytes(16) + rand_bytes + |> :base64.encode() + |> String.slice(0..16) + end + + def db_exists?(db_name) do + try do + :fabric.get_db_info(db_name) + catch + :error, :database_does_not_exist -> false + end + end + + @doc """ + In some cases we need to access record definition at compile time. + We cannot use Record.defrecord in such cases. This helper function + can be used instead. Use it as follows: + ``` + defmodule Foo do + admin_ctx = {:user_ctx, Utils.erlang_record( + :user_ctx, "couch/include/couch_db.hrl", roles: ["_admin"])} + end + ``` + + Longer term we should wrap erlang records as it is done for user_ctx + see beginning of the Utils.ex. In this case we would be able to use + them at compile time in other modules. + ``` + Record.defrecord :user_ctx, Record.extract( + :user_ctx, from_lib: "couch/include/couch_db.hrl") + ``` + """ + def erlang_record(name, from_lib, opts \\ []) do + record_info = Record.extract(name, from_lib: from_lib) + index = [name | Keyword.keys(record_info)] |> Enum.with_index + draft = [name | Keyword.values(record_info)] |> List.to_tuple + opts + |> Enum.reduce(draft, fn + {k, v}, acc -> put_elem(acc, index[k], v) + end) + end + +end
\ No newline at end of file |