test(collections): add list, hash, and set command tests

This commit is contained in:
dualfroz committed 2026-08-28 11:17:00 +02:00
1 parent b0f3e152c7
commit 44d3954629
3 files changed
+136

No files matched your search

+37
View File
@@ -0,0 +1,37 @@
defmodule Excache.HashTest do
use Excache.Test.ServerCase, async: false
test "hash operations", %{conn: conn} do
assert {2, conn} = Client.command(conn, ["HSET", "profile", "name", "ann", "age", "30"])
assert {"ann", conn} = Client.command(conn, ["HGET", "profile", "name"])
assert {2, conn} = Client.command(conn, ["HLEN", "profile"])
{keys, conn} = Client.command(conn, ["HKEYS", "profile"])
assert Enum.sort(keys) == ["age", "name"]
{all, conn} = Client.command(conn, ["HGETALL", "profile"])
assert Enum.sort(all) == ["30", "age", "ann", "name"]
assert {1, conn} = Client.command(conn, ["HDEL", "profile", "age"])
assert {nil, _conn} = Client.command(conn, ["HGET", "profile", "age"])
end
test "HEXISTS reports field presence", %{conn: conn} do
assert {1, conn} = Client.command(conn, ["HSET", "profile", "name", "ben"])
assert {1, conn} = Client.command(conn, ["HEXISTS", "profile", "name"])
assert {0, conn} = Client.command(conn, ["HEXISTS", "profile", "missing"])
assert {0, _conn} = Client.command(conn, ["HEXISTS", "no-such-key", "name"])
end
test "HINCRBY increments a numeric field and creates missing ones", %{conn: conn} do
assert {5, conn} = Client.command(conn, ["HINCRBY", "counters", "hits", "5"])
assert {8, conn} = Client.command(conn, ["HINCRBY", "counters", "hits", "3"])
assert {2, conn} = Client.command(conn, ["HINCRBY", "counters", "misses", "2"])
assert {-1, conn} = Client.command(conn, ["HINCRBY", "counters", "hits", "-9"])
assert {1, conn} = Client.command(conn, ["HSET", "wrong", "field", "abc"])
assert {{:error, "ERR value is not an integer or out of range"}, _conn} =
Client.command(conn, ["HINCRBY", "wrong", "field", "1"])
end
end
+36
View File
@@ -0,0 +1,36 @@
defmodule Excache.ListTest do
use Excache.Test.ServerCase, async: false
test "list operations", %{conn: conn} do
assert {3, conn} = Client.command(conn, ["RPUSH", "queue", "a", "b", "c"])
assert {4, conn} = Client.command(conn, ["LPUSH", "queue", "z"])
assert {4, conn} = Client.command(conn, ["LLEN", "queue"])
{range, conn} = Client.command(conn, ["LRANGE", "queue", "0", "-1"])
assert range == ["z", "a", "b", "c"]
assert {"z", conn} = Client.command(conn, ["LPOP", "queue"])
assert {"c", conn} = Client.command(conn, ["RPOP", "queue"])
assert {"a", conn} = Client.command(conn, ["LINDEX", "queue", "0"])
assert {nil, _conn} = Client.command(conn, ["LINDEX", "queue", "9"])
end
test "LPOP and RPOP with an explicit count", %{conn: conn} do
assert {5, conn} = Client.command(conn, ["RPUSH", "letters", "a", "b", "c", "d", "e"])
assert {["a", "b"], conn} = Client.command(conn, ["LPOP", "letters", "2"])
assert {["e", "d"], conn} = Client.command(conn, ["RPOP", "letters", "2"])
assert {1, conn} = Client.command(conn, ["LLEN", "letters"])
assert {nil, _conn} = Client.command(conn, ["LPOP", "missing-key", "3"])
end
test "LPUSH on an existing non-list key returns WRONGTYPE", %{conn: conn} do
assert {{:simple, "OK"}, conn} = Client.command(conn, ["SET", "notalist", "v"])
assert {{:error, "WRONGTYPE" <> _}, _conn} = Client.command(conn, ["LPUSH", "notalist", "x"])
end
test "popping a list to empty deletes the key", %{conn: conn} do
assert {1, conn} = Client.command(conn, ["RPUSH", "single", "only"])
assert {"only", conn} = Client.command(conn, ["LPOP", "single"])
assert {0, _conn} = Client.command(conn, ["EXISTS", "single"])
end
end
+63
View File
@@ -0,0 +1,63 @@
defmodule Excache.SetTest do
use Excache.Test.ServerCase, async: false
test "set operations", %{conn: conn} do
assert {3, conn} = Client.command(conn, ["SADD", "tags", "x", "y", "z"])
assert {0, conn} = Client.command(conn, ["SADD", "tags", "x"])
assert {3, conn} = Client.command(conn, ["SCARD", "tags"])
assert {1, conn} = Client.command(conn, ["SISMEMBER", "tags", "y"])
assert {0, conn} = Client.command(conn, ["SISMEMBER", "tags", "nope"])
{members, conn} = Client.command(conn, ["SMEMBERS", "tags"])
assert Enum.sort(members) == ["x", "y", "z"]
assert {1, _conn} = Client.command(conn, ["SREM", "tags", "y"])
end
test "SINTER, SUNION and SDIFF across multiple sets", %{conn: conn} do
assert {3, conn} = Client.command(conn, ["SADD", "a", "1", "2", "3"])
assert {3, conn} = Client.command(conn, ["SADD", "b", "2", "3", "4"])
{inter, conn} = Client.command(conn, ["SINTER", "a", "b"])
assert Enum.sort(inter) == ["2", "3"]
{union, conn} = Client.command(conn, ["SUNION", "a", "b"])
assert Enum.sort(union) == ["1", "2", "3", "4"]
{diff, conn} = Client.command(conn, ["SDIFF", "a", "b"])
assert diff == ["1"]
{diff_missing, conn} = Client.command(conn, ["SDIFF", "a", "missing-set"])
assert Enum.sort(diff_missing) == ["1", "2", "3"]
assert {{:simple, "OK"}, conn} = Client.command(conn, ["SET", "notaset", "v"])
assert {{:error, "WRONGTYPE" <> _}, _conn} = Client.command(conn, ["SINTER", "a", "notaset"])
end
test "SINTERSTORE, SUNIONSTORE and SDIFFSTORE persist the computed set", %{conn: conn} do
assert {3, conn} = Client.command(conn, ["SADD", "src-a", "1", "2", "3"])
assert {3, conn} = Client.command(conn, ["SADD", "src-b", "2", "3", "4"])
assert {2, conn} = Client.command(conn, ["SINTERSTORE", "dest-inter", "src-a", "src-b"])
{inter, conn} = Client.command(conn, ["SMEMBERS", "dest-inter"])
assert Enum.sort(inter) == ["2", "3"]
assert {4, conn} = Client.command(conn, ["SUNIONSTORE", "dest-union", "src-a", "src-b"])
{union, conn} = Client.command(conn, ["SMEMBERS", "dest-union"])
assert Enum.sort(union) == ["1", "2", "3", "4"]
assert {1, conn} = Client.command(conn, ["SDIFFSTORE", "dest-diff", "src-a", "src-b"])
assert {["1"], conn} = Client.command(conn, ["SMEMBERS", "dest-diff"])
assert {0, conn} = Client.command(conn, ["SDIFFSTORE", "dest-empty", "src-a", "src-a"])
assert {0, _conn} = Client.command(conn, ["EXISTS", "dest-empty"])
end
test "SINTERSTORE overwrites any prior value at the destination key", %{conn: conn} do
assert {{:simple, "OK"}, conn} = Client.command(conn, ["SET", "dest", "stale"])
assert {2, conn} = Client.command(conn, ["SADD", "src-a", "x", "y"])
assert {1, conn} = Client.command(conn, ["SADD", "src-b", "x"])
assert {1, conn} = Client.command(conn, ["SINTERSTORE", "dest", "src-a", "src-b"])
assert {["x"], _conn} = Client.command(conn, ["SMEMBERS", "dest"])
end
end