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