You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-17 19:41:06 +03:00
add tests
This commit is contained in:
@@ -14,7 +14,7 @@ export interface RedisClientOptions<M = RedisModules, S = RedisLuaScripts> {
|
|||||||
modules?: M;
|
modules?: M;
|
||||||
scripts?: S;
|
scripts?: S;
|
||||||
commandsQueueMaxLength?: number;
|
commandsQueueMaxLength?: number;
|
||||||
readOnly?: boolean;
|
readonly?: boolean;
|
||||||
legacyMode?: boolean;
|
legacyMode?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,8 +102,8 @@ export default class RedisClient<M extends RedisModules = RedisModules, S extend
|
|||||||
promises.push((this as any).select(RedisClient.commandOptions({ asap: true }), this.#selectedDB));
|
promises.push((this as any).select(RedisClient.commandOptions({ asap: true }), this.#selectedDB));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.#options?.readOnly) {
|
if (this.#options?.readonly) {
|
||||||
promises.push((this as any).readOnly(RedisClient.commandOptions({ asap: true })));
|
promises.push((this as any).readonly(RedisClient.commandOptions({ asap: true })));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.#options?.socket?.password) {
|
if (this.#options?.socket?.password) {
|
||||||
|
@@ -91,7 +91,7 @@ export default class RedisClusterSlots {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#initiateClientForNode(node: RedisClusterMasterNode | RedisClusterReplicaNode, readOnly: boolean, clientsInUse: Set<string>, promises: Array<Promise<void>>): RedisClient {
|
#initiateClientForNode(node: RedisClusterMasterNode | RedisClusterReplicaNode, readonly: boolean, clientsInUse: Set<string>, promises: Array<Promise<void>>): RedisClient {
|
||||||
clientsInUse.add(node.url);
|
clientsInUse.add(node.url);
|
||||||
|
|
||||||
let client = this.#clientByKey.get(node.url);
|
let client = this.#clientByKey.get(node.url);
|
||||||
@@ -101,7 +101,7 @@ export default class RedisClusterSlots {
|
|||||||
host: node.host,
|
host: node.host,
|
||||||
port: node.port
|
port: node.port
|
||||||
},
|
},
|
||||||
readOnly
|
readonly
|
||||||
});
|
});
|
||||||
promises.push(client.connect());
|
promises.push(client.connect());
|
||||||
this.#clientByKey.set(node.url, client);
|
this.#clientByKey.set(node.url, client);
|
||||||
@@ -158,13 +158,13 @@ export default class RedisClusterSlots {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
getClient(firstKey?: string, isReadOnly?: boolean): RedisClient {
|
getClient(firstKey?: string, isReadonly?: boolean): RedisClient {
|
||||||
if (!firstKey) {
|
if (!firstKey) {
|
||||||
return this.#getRandomClient();
|
return this.#getRandomClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
const slot = calculateSlot(firstKey);
|
const slot = calculateSlot(firstKey);
|
||||||
if (!isReadOnly || !this.#options.useReplicas) {
|
if (!isReadonly || !this.#options.useReplicas) {
|
||||||
return this.#getSlotMaster(slot);
|
return this.#getSlotMaster(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -51,9 +51,9 @@ export default class RedisCluster {
|
|||||||
return this.#slots.connect();
|
return this.#slots.connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
async sendCommand<T = unknown>(args: Array<string>, firstKeyIndex?: number, isReadOnly?: boolean, redirections: number = 0): Promise<T> {
|
async sendCommand<T = unknown>(args: Array<string>, firstKeyIndex?: number, isReadonly?: boolean, redirections: number = 0): Promise<T> {
|
||||||
const firstKey = firstKeyIndex ? args[firstKeyIndex] : undefined,
|
const firstKey = firstKeyIndex ? args[firstKeyIndex] : undefined,
|
||||||
client = this.#slots.getClient(firstKey, isReadOnly);
|
client = this.#slots.getClient(firstKey, isReadonly);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return await client.sendCommand(args);
|
return await client.sendCommand(args);
|
||||||
@@ -64,7 +64,7 @@ export default class RedisCluster {
|
|||||||
await this.#slots.discover();
|
await this.#slots.discover();
|
||||||
|
|
||||||
if (redirections < (this.#options.maxCommandRedirections ?? 16)) {
|
if (redirections < (this.#options.maxCommandRedirections ?? 16)) {
|
||||||
return this.sendCommand(args, firstKeyIndex, isReadOnly, redirections + 1);
|
return this.sendCommand(args, firstKeyIndex, isReadonly, redirections + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
28
lib/commands/HDEL.spec.ts
Normal file
28
lib/commands/HDEL.spec.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HDEL';
|
||||||
|
|
||||||
|
describe('HDEL', () => {
|
||||||
|
describe('transformArguments', () => {
|
||||||
|
it('string', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 'field'),
|
||||||
|
['HDEL', 'key', 'field']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('array', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', ['1', '2']),
|
||||||
|
['HDEL', 'key', '1', '2']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hDel', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.hDel('key', 'field'),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@@ -2,12 +2,16 @@ import { transformReplyNumber } from './generic-transformers';
|
|||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
export function transformArguments(key: string, ...fields: Array<string>): Array<string> {
|
export function transformArguments(key: string, field: string | Array<string>): Array<string> {
|
||||||
return [
|
const args = ['HDEL', key];
|
||||||
'HDEL',
|
|
||||||
key,
|
if (typeof field === 'string') {
|
||||||
...fields
|
args.push(field);
|
||||||
];
|
} else {
|
||||||
|
args.push(...field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const transformReply = transformReplyNumber;
|
export const transformReply = transformReplyNumber;
|
||||||
|
19
lib/commands/HEXISTS.spec.ts
Normal file
19
lib/commands/HEXISTS.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HEXISTS';
|
||||||
|
|
||||||
|
describe('HEXISTS', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 'field'),
|
||||||
|
['HEXISTS', 'key', 'field']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hExists', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.hExists('key', 'field'),
|
||||||
|
false
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
19
lib/commands/HGET.spec.ts
Normal file
19
lib/commands/HGET.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HGET';
|
||||||
|
|
||||||
|
describe('HGET', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 'field'),
|
||||||
|
['HGET', 'key', 'field']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hGet', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.hGet('key', 'field'),
|
||||||
|
null
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@@ -1,4 +1,5 @@
|
|||||||
import { strict as assert } from 'assert';
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
import { transformReply } from './HGETALL';
|
import { transformReply } from './HGETALL';
|
||||||
|
|
||||||
describe('HGETALL', () => {
|
describe('HGETALL', () => {
|
||||||
@@ -30,4 +31,11 @@ describe('HGETALL', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hGetAll', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.hGetAll('key'),
|
||||||
|
Object.create(null)
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
19
lib/commands/HINCRBY.spec.ts
Normal file
19
lib/commands/HINCRBY.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HINCRBY';
|
||||||
|
|
||||||
|
describe('HINCRBY', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 'field', 1),
|
||||||
|
['HINCRBY', 'key', 'field', '1']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hIncrBy', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.hIncrBy('key', 'field', 1),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
19
lib/commands/HINCRBYFLOAT.spec.ts
Normal file
19
lib/commands/HINCRBYFLOAT.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HINCRBYFLOAT';
|
||||||
|
|
||||||
|
describe('HINCRBYFLOAT', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 'field', 1.5),
|
||||||
|
['HINCRBYFLOAT', 'key', 'field', '1.5']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hIncrByFloat', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.hIncrByFloat('key', 'field', 1.5),
|
||||||
|
'1.5'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
19
lib/commands/HKEYS.spec.ts
Normal file
19
lib/commands/HKEYS.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HKEYS';
|
||||||
|
|
||||||
|
describe('HKEYS', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key'),
|
||||||
|
['HKEYS', 'key']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hKeys', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.hKeys('key'),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
19
lib/commands/HLEN.spec.ts
Normal file
19
lib/commands/HLEN.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HLEN';
|
||||||
|
|
||||||
|
describe('HLEN', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key'),
|
||||||
|
['HLEN', 'key']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hLen', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.hLen('key'),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
19
lib/commands/INCR.spec.ts
Normal file
19
lib/commands/INCR.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './INCR';
|
||||||
|
|
||||||
|
describe('INCR', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key'),
|
||||||
|
['INCR', 'key']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.incr', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.incr('key'),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
19
lib/commands/INCRBY.spec.ts
Normal file
19
lib/commands/INCRBY.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './INCRBY';
|
||||||
|
|
||||||
|
describe('INCR', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1),
|
||||||
|
['INCRBY', 'key', '1']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.incrBy', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.incrBy('key', 1),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
19
lib/commands/INCRBYFLOAT.spec.ts
Normal file
19
lib/commands/INCRBYFLOAT.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './INCRBYFLOAT';
|
||||||
|
|
||||||
|
describe('INCRBYFLOAT', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1.5),
|
||||||
|
['INCRBYFLOAT', 'key', '1.5']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.incrByFloat', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.incrByFloat('key', 1.5),
|
||||||
|
'1.5'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@@ -1,4 +1,4 @@
|
|||||||
import { transformReplyNumber } from './generic-transformers';
|
import { transformReplyString } from './generic-transformers';
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
@@ -6,4 +6,4 @@ export function transformArguments(key: string, increment: number): Array<string
|
|||||||
return ['INCRBYFLOAT', key, increment.toString()];
|
return ['INCRBYFLOAT', key, increment.toString()];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const transformReply = transformReplyNumber;
|
export const transformReply = transformReplyString;
|
||||||
|
28
lib/commands/LPUSH.spec.ts
Normal file
28
lib/commands/LPUSH.spec.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './LPUSH';
|
||||||
|
|
||||||
|
describe('LPUSH', () => {
|
||||||
|
describe('transformArguments', () => {
|
||||||
|
it('string', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 'field'),
|
||||||
|
['LPUSH', 'key', 'field']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('array', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', ['1', '2']),
|
||||||
|
['LPUSH', 'key', '1', '2']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.lPush', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.lPush('key', 'field'),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
12
lib/commands/READONLY.spec.ts
Normal file
12
lib/commands/READONLY.spec.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './READONLY';
|
||||||
|
|
||||||
|
describe('READONLY', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments(),
|
||||||
|
['READONLY']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@@ -166,7 +166,7 @@ export default {
|
|||||||
RANDOMKEY,
|
RANDOMKEY,
|
||||||
randomKey: RANDOMKEY,
|
randomKey: RANDOMKEY,
|
||||||
READONLY,
|
READONLY,
|
||||||
readOnly: READONLY,
|
readonly: READONLY,
|
||||||
RENAME,
|
RENAME,
|
||||||
rename: RENAME,
|
rename: RENAME,
|
||||||
RENAMENX,
|
RENAMENX,
|
||||||
|
Reference in New Issue
Block a user