import { afterAll, assertEquals, assertRejects, beforeAll, beforeEach, delay, it,} from "./deps.ts";import { type Command, type Reply, sendCommand } from "./mod.ts";
let conn: Deno.Conn;let serverProcess: Deno.Process;
beforeAll(async () => { serverProcess = Deno.run({ cmd: ["redis-server"], stdin: "null", stdout: "null", }); await delay(1_000); conn = await Deno.connect({ port: 6379 });});
afterAll(() => { conn.close(); serverProcess.close();});
beforeEach(async () => { await sendCommand(conn, ["FLUSHDB"]);});
async function assertReplyEquals( command: Command, expected: Reply,): Promise<void> { await assertEquals(await sendCommand(conn, command), expected);}
it("APPEND", async () => { await assertReplyEquals(["EXISTS", "mykey"], 0); await assertReplyEquals(["APPEND", "mykey", "Hello"], 5); await assertReplyEquals(["APPEND", "mykey", " World"], 11); await assertReplyEquals(["GET", "mykey"], "Hello World");
await assertReplyEquals(["APPEND", "ts", "0043"], 4); await assertReplyEquals(["APPEND", "ts", "0035"], 8); await assertReplyEquals(["GETRANGE", "ts", 0, 3], "0043"); await assertReplyEquals(["GETRANGE", "ts", 4, 7], "0035");});
it("DECR", async () => { await assertReplyEquals(["SET", "mykey", "10"], "OK"); await assertReplyEquals(["DECR", "mykey"], 9); await assertReplyEquals( ["SET", "mykey", "234293482390480948029348230948"], "OK", ); assertRejects(async () => await sendCommand(conn, ["DECR", "mykey"]));});
it("DECRBY", async () => { await assertReplyEquals(["SET", "mykey", "10"], "OK"); await assertReplyEquals(["DECRBY", "mykey", 3], 7);});
it("GET", async () => { await assertReplyEquals(["GET", "nonexisting"], null); await assertReplyEquals(["SET", "mykey", "Hello"], "OK"); await assertReplyEquals(["GET", "mykey"], "Hello");});
it("GETDEL", async () => { await assertReplyEquals(["SET", "mykey", "Hello"], "OK"); await assertReplyEquals(["GETDEL", "mykey"], "Hello"); await assertReplyEquals(["GET", "mykey"], null);});
it("GETEX", async () => { await assertReplyEquals(["SET", "mykey", "Hello"], "OK"); await assertReplyEquals(["GETEX", "mykey"], "Hello"); await assertReplyEquals(["TTL", "mykey"], -1); await assertReplyEquals(["GETEX", "mykey", "EX", 60], "Hello"); await assertReplyEquals(["TTL", "mykey"], 60);});
it("GETRANGE", async () => { await assertReplyEquals(["SET", "mykey", "This is a string"], "OK"); await assertReplyEquals(["GETRANGE", "mykey", 0, 3], "This"); await assertReplyEquals(["GETRANGE", "mykey", -3, -1], "ing"); await assertReplyEquals(["GETRANGE", "mykey", 0, -1], "This is a string"); await assertReplyEquals(["GETRANGE", "mykey", 10, 100], "string");});
it("GETSET", async () => { await assertReplyEquals(["INCR", "mycounter"], 1); await assertReplyEquals(["GETSET", "mycounter", "0"], "1"); await assertReplyEquals(["GET", "mycounter"], "0");
await assertReplyEquals(["SET", "mykey", "Hello"], "OK"); await assertReplyEquals(["GETSET", "mykey", "World"], "Hello"); await assertReplyEquals(["GET", "mykey"], "World");});
it("INCR", async () => { await assertReplyEquals(["SET", "mykey", "10"], "OK"); await assertReplyEquals(["INCR", "mykey"], 11); await assertReplyEquals(["GET", "mykey"], "11");});
it("INCRBY", async () => { await assertReplyEquals(["SET", "mykey", "10"], "OK"); await assertReplyEquals(["INCRBY", "mykey", 5], 15);});
it("INCRBYFLOAT", async () => { await assertReplyEquals(["SET", "mykey", 10.50], "OK"); await assertReplyEquals(["INCRBYFLOAT", "mykey", 0.1], "10.6"); await assertReplyEquals(["INCRBYFLOAT", "mykey", -5], "5.6"); await assertReplyEquals(["SET", "mykey", 5.0e3], "OK"); await assertReplyEquals(["INCRBYFLOAT", "mykey", 2.0e2], "5200");});
it("MGET", async () => { await assertReplyEquals(["SET", "key1", "Hello"], "OK"); await assertReplyEquals(["SET", "key2", "World"], "OK"); await assertReplyEquals(["MGET", "key1", "key2", "nonexisting"], [ "Hello", "World", null, ]);});
it("MSET", async () => { await assertReplyEquals(["MSET", "key1", "Hello", "key2", "World"], "OK"); await assertReplyEquals(["GET", "key1"], "Hello"); await assertReplyEquals(["GET", "key2"], "World");});
it("MSETNX", async () => { await assertReplyEquals(["MSETNX", "key1", "Hello", "key2", "there"], 1); await assertReplyEquals(["MSETNX", "key2", "new", "key3", "world"], 0); await assertReplyEquals(["MGET", "key1", "key2", "key3"], [ "Hello", "there", null, ]);});
it("SET", async () => { await assertReplyEquals(["SET", "mykey", "Hello"], "OK"); await assertReplyEquals(["GET", "mykey"], "Hello"); await assertReplyEquals( ["SET", "anotherkey", "will expire in a minute", "EX", 60], "OK", );});
it("SETEX", async () => { await assertReplyEquals(["SETEX", "mykey", 10, "Hello"], "OK"); await assertReplyEquals(["TTL", "mykey"], 10); await assertReplyEquals(["GET", "mykey"], "Hello");});
it("SETNX", async () => { await assertReplyEquals(["SETNX", "mykey", "Hello"], 1); await assertReplyEquals(["SETNX", "mykey", "World"], 0); await assertReplyEquals(["GET", "mykey"], "Hello");});
it("SETRANGE", async () => { await assertReplyEquals(["SET", "key1", "Hello World"], "OK"); await assertReplyEquals(["SETRANGE", "key1", 6, "Redis"], 11); await assertReplyEquals(["GET", "key1"], "Hello Redis");
});
it("STRLEN", async () => { await assertReplyEquals(["SET", "mykey", "Hello world"], "OK"); await assertReplyEquals(["STRLEN", "mykey"], 11); await assertReplyEquals(["STRLEN", "nonexisting"], 0);});
it("SUBSTR", async () => { await assertReplyEquals(["SET", "mykey", "This is a string"], "OK"); await assertReplyEquals(["GETRANGE", "mykey", 0, 3], "This"); await assertReplyEquals(["GETRANGE", "mykey", -3, -1], "ing"); await assertReplyEquals(["GETRANGE", "mykey", 0, -1], "This is a string"); await assertReplyEquals(["GETRANGE", "mykey", 10, 100], "string");});
it("HSET", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "foo"], 1); await assertReplyEquals(["HDEL", "myhash", "field1"], 1); await assertReplyEquals(["HDEL", "myhash", "field2"], 0);});
it("HEXISTS", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "foo"], 1); await assertReplyEquals(["HEXISTS", "myhash", "field1"], 1); await assertReplyEquals(["HEXISTS", "myhash", "field2"], 0);});
it("HGET", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "foo"], 1); await assertReplyEquals(["HGET", "myhash", "field1"], "foo"); await assertReplyEquals(["HGET", "myhash", "field2"], null);});
it("HGETALL", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "Hello"], 1); await assertReplyEquals(["HSET", "myhash", "field2", "World"], 1); await assertReplyEquals(["HGETALL", "myhash"], [ "field1", "Hello", "field2", "World", ]);});
it("HINCRBY", async () => { await assertReplyEquals(["HSET", "myhash", "field", 5], 1); await assertReplyEquals(["HINCRBY", "myhash", "field", 1], 6); await assertReplyEquals(["HINCRBY", "myhash", "field", -1], 5); await assertReplyEquals(["HINCRBY", "myhash", "field", -10], -5);});
it("HINCRBYFLOAT", async () => { await assertReplyEquals(["HSET", "myhash", "field", 10.50], 1); await assertReplyEquals(["HINCRBYFLOAT", "myhash", "field", 0.1], "10.6"); await assertReplyEquals(["HSET", "myhash", "field", 5.0e3], 0); await assertReplyEquals(["HINCRBYFLOAT", "myhash", "field", 2.0e2], "5200");});
it("HKEYS", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "Hello"], 1); await assertReplyEquals(["HSET", "myhash", "field2", "World"], 1); await assertReplyEquals(["HKEYS", "myhash"], ["field1", "field2"]);});
it("HLEN", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "Hello"], 1); await assertReplyEquals(["HSET", "myhash", "field2", "World"], 1); await assertReplyEquals(["HLEN", "myhash"], 2);});
it("HMGET", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "Hello"], 1); await assertReplyEquals(["HSET", "myhash", "field2", "World"], 1); await assertReplyEquals(["HMGET", "myhash", "field1", "field2", "nofield"], [ "Hello", "World", null, ]);});
it("HMSET", async () => { await assertReplyEquals([ "HMSET", "myhash", "field1", "Hello", "field2", "World", ], "OK"); await assertReplyEquals(["HGET", "myhash", "field1"], "Hello"); await assertReplyEquals(["HGET", "myhash", "field2"], "World");});
it("HSET", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "Hello"], 1); await assertReplyEquals(["HGET", "myhash", "field1"], "Hello");});
it("HSETNX", async () => { await assertReplyEquals(["HSETNX", "myhash", "field", "Hello"], 1); await assertReplyEquals(["HSETNX", "myhash", "field", "World"], 0); await assertReplyEquals(["HGET", "myhash", "field"], "Hello");});
it("HSTRLEN", async () => { await assertReplyEquals([ "HMSET", "myhash", "f1", "HelloWorld", "f2", 99, "f3", -256, ], "OK"); await assertReplyEquals(["HSTRLEN", "myhash", "f1"], 10); await assertReplyEquals(["HSTRLEN", "myhash", "f2"], 2); await assertReplyEquals(["HSTRLEN", "myhash", "f3"], 4);});
it("HVALS", async () => { await assertReplyEquals(["HSET", "myhash", "field1", "Hello"], 1); await assertReplyEquals(["HSET", "myhash", "field2", "World"], 1); await assertReplyEquals(["HVALS", "myhash"], ["Hello", "World"]);});