summaryrefslogtreecommitdiff
path: root/test/elixir/lib/utils.ex
diff options
context:
space:
mode:
Diffstat (limited to 'test/elixir/lib/utils.ex')
-rw-r--r--test/elixir/lib/utils.ex61
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