1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
|