| 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 |