blob: bb9369b80653db8892f192b74fa85f9be185fc85 [file] [log] [blame]
defmodule UUIDsTest do
use CouchTestCase
@moduledoc """
Test CouchDB UUIDs API
This is a port of the uuids.js suite
"""
test "cache busting headers are set" do
resp = Couch.get("/_uuids")
assert resp.status_code == 200
assert Regex.match?(~r/no-cache/, resp.headers["Cache-Control"])
assert resp.headers["Pragma"] == "no-cache"
assert String.length(resp.headers["ETag"]) > 0
end
test "can return single uuid" do
resp = Couch.get("/_uuids")
assert resp.status_code == 200
[uuid1] = resp.body["uuids"]
resp = Couch.get("/_uuids", query: %{:count => 1})
assert resp.status_code == 200
[uuid2] = resp.body["uuids"]
assert uuid1 != uuid2
end
test "no duplicates in 1,000 UUIDs" do
resp = Couch.get("/_uuids", query: %{:count => 1000})
assert resp.status_code == 200
uuids = resp.body["uuids"]
assert length(Enum.uniq(uuids)) == length(uuids)
end
test "Method Not Allowed error on POST" do
resp = Couch.post("/_uuids", query: %{:count => 1000})
assert resp.status_code == 405
end
test "Bad Request error when exceeding max UUID count" do
resp = Couch.get("/_uuids", query: %{:count => 1001})
assert resp.status_code == 400
end
@tag config: [
{"uuids", "algorithm", "sequential"}
]
test "sequential uuids are sequential" do
resp = Couch.get("/_uuids", query: %{:count => 1000})
assert resp.status_code == 200
Enum.reduce(resp.body["uuids"], fn curr, acc ->
assert String.length(curr) == 32
assert acc < curr
curr
end)
end
@tag config: [
{"uuids", "algorithm", "utc_random"}
]
test "utc_random uuids are roughly random" do
resp = Couch.get("/_uuids", query: %{:count => 1000})
assert resp.status_code == 200
uuids = resp.body["uuids"]
assert String.length(Enum.at(uuids, 1)) == 32
# Assert no collisions
assert length(Enum.uniq(uuids)) == length(uuids)
# Assert rough ordering of UUIDs
u1 = String.slice(Enum.at(uuids, 1), 0..13)
u2 = String.slice(Enum.at(uuids, -1), 0..13)
assert u1 < u2
end
@utc_id_suffix "frog"
@tag config: [
{"uuids", "algorithm", "utc_id"},
{"uuids", "utc_id_suffix", @utc_id_suffix}
]
test "utc_id uuids are correct" do
resp = Couch.get("/_uuids", query: %{:count => 10})
assert resp.status_code == 200
Enum.reduce(resp.body["uuids"], fn curr, acc ->
assert String.length(curr) == 14 + String.length(@utc_id_suffix)
assert String.slice(curr, 14..-1) == @utc_id_suffix
assert curr > acc
curr
end)
end
end