64 lines
2.9 KiB
Elixir
64 lines
2.9 KiB
Elixir
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
|