You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-10 11:43:01 +03:00
* update workflows & README * add .deepsource.toml * fix client.quit, add error events on cluster, fix some "deepsource.io" warnings * Release 4.0.0-rc.1 * add cluster.duplicate, add some tests * fix #1650 - add support for Buffer in some commands, add GET_BUFFER command * fix GET and GET_BUFFER return type * update FAQ * Update invalid code example in README.md (#1654) * Update invalid code example in README.md * Update README.md Co-authored-by: Leibale Eidelman <leibale1998@gmail.com> * fix #1652 * ref #1653 - better types * better types * fix54124793ad
* Update GEOSEARCHSTORE.spec.ts * fix #1660 - add support for client.HSET('key', 'field', 'value') * upgrade dependencies, update README * fix #1659 - add support for db-number in client options url * fix README, remove unused import, downgrade typedoc & typedoc-plugin-markdown * update client-configurations.md * fix README * add CLUSTER_SLOTS, add some tests * fix "createClient with url" test with redis 5 * remove unused imports * Release 4.0.0-rc.2 * add missing semicolon * replace empty "transformReply" functions with typescript "declare" * fix EVAL & EVALSHA, add some tests, npm update * fix #1665 - add ZRANGEBYLEX, ZRANGEBYSCORE, ZRANGEBYSCORE_WITHSCORES * new issue templates * add all COMMAND commands * run COMMAND & COMMAND INFO tests only on redis >6 * Create SECURITY.md * fix #1671 - add support for all client configurations in cluster * ref #1671 - add support for defaults * remove some commands from cluster, npm update, clean code, * lock benny version * fix #1674 - remove `isolationPoolOptions` when creating isolated connection * increase test coverage * update .npmignore * Release 4.0.0-rc.3 * fix README * remove whitespace from LICENSE * use "export { x as y }" instead of import & const * move from "NodeRedis" to "Redis" * fix #1676 * update comments * Auth before select database (#1679) * Auth before select database * fix #1681 Co-authored-by: leibale <leibale1998@gmail.com> * Adds connect-as-acl-user example. (#1684) * Adds connect-as-acl-user example. * Adds blank line at end. * Set to private. * Adds examples folder to npmignore. * Adds Apple .DS_Store file to .gitignore (#1685) * Adds Apple .DS_Store file. * Add .DS_Store to .npmignore too Co-authored-by: Leibale Eidelman <leibale1998@gmail.com> * move examples * clean some tests * clean code * Adds examples table of contents and contribution guidelines. (#1686) * Updated examples to use named functions. (#1687) * Updated examples to user named functions. * Update README.md Co-authored-by: Leibale Eidelman <leibale1998@gmail.com> * update docs, add 6.0.x to the tests matrix, add eslint, npm update, fix some commands, fix some types Co-authored-by: Simon Prickett <simon@crudworks.org> * fix tests with redis 6.0.x * fix ACL GETUSER test * fix client.quit and client.disconnect * fix ACL GETUSER * Adds TypeScript note and corrects a typo. * Fixes a bug in the Scan Iterator section. (#1694) * Made examples use local version. * Add `lua-multi-incr.js` example (#1692) Also fix syntax error in the lua example in the README Closes #1689. * Add(examples): Create an example for blPop & lPush (#1696) * Add(examples): Create an example for blPop & lPush Signed-off-by: Aditya Rastogi <adit.rastogi2014@gmail.com> * Update(examples): fix case, add timeout, update readme Signed-off-by: Aditya Rastogi <adit.rastogi2014@gmail.com> Closes #1693. * Add command-with-modifiers.js example (#1695) * Adds TypeScript note and corrects a typo. * Adds command-with-modifiers example. (redis#1688) * Adds command-with-modifiers example. (redis#1688) * Adds command-with-modifiers example. (redis#1688) * Removed callbacks. Co-authored-by: Simon Prickett <simon@redislabs.com> Closes #1688. * Issue # 1697 FIX - creates an example script that shows how to use the SSCAN iterator (#1699) * #1697 fix for set scan example * adds the js file * adds comment * Minor layout and comment adjustment. Co-authored-by: srawat2 <shashank19aug> Co-authored-by: Simon Prickett <simon@redislabs.com> Closes #1697. * fix #1706 - HSET return type should be number * use dockers for tests, fix some bugs * increase dockers timeout to 30s * release drafter (#1683) * release drafter * fixing contributors * use dockers for tests, use npm workspaces, add rejson & redisearch modules, fix some bugs * fix #1712 - fix LINDEX return type * uncomment TIME tests * use codecov * fix tests.yml * uncomment "should handle live resharding" test * fix #1714 - update README(s) * add package-lock.json * update CONTRIBUTING.md * update examples * uncomment some tests * fix test-utils * move "all-in-one" to root folder * fix tests workflow * fix bug in cluster slots, enhance live resharding test * fix live resharding test * fix #1707 - handle number arguments in legacy mode * Add rejectedUnauthorized and other TLS options (#1708) * Update socket.ts * fix #1716 - decode username and password from url * fix some Z (sorted list) commands, increase commands test coverage * remove empty lines * fix 'Scenario' typo (#1720) * update readmes, add createCluster to the `redis` package * add .release-it.json files, update some md files * run tests on pull requests too * Support esModuleInterop set to false. (#1717) * Support esModuleInterop set to false. When testing the upcoming 4.x release, we got a bunch of typescript errors emitted from this project. We quickly realized this is because the library uses the esModuleInterop flag. This makes some imports _slightly_ easier to write, but it comes at a cost: it forces any application or library using this library to *also* have esModuleInterop on. The `esModuleInterop` flag is a bit of a holdover from an earlier time, and I would not recommend using it in libraries. The main issue is that if it's set to true, you are forcing any users of the library to also have `esModuleInterop`, where if you keep have it set to `false` (the default), you leave the decision to the user. This change should have no rammifications to users with `esModuleInterop` on, but it will enable support for those that have it off. This is especially good for library authors such as myself, because I would also like to keep this flag off to not force *my* users into this feature. * All tests now pass! * Move @types/redis-parser into client sub-package and removed a comma * npm update, remove html from readme * add tests and licence badges * update changelog.md * update .npmignore and .release-it.json * update .release-it.json * Release client@1.0.0-rc.0 * revertd32f1edf8a
* fix .npmignore * replace @redis with @node-redis * Release client@1.0.0-rc.0 * update json & search version * Release json@1.0.0-rc.0 * Release search@1.0.0-rc.0 * update dependencies * Release redis@4.0.0-rc.4 Co-authored-by: Richard Samuelsson <noobtoothfairy@gmail.com> Co-authored-by: mustard <mhqnwt@gmail.com> Co-authored-by: Simon Prickett <simon@redislabs.com> Co-authored-by: Simon Prickett <simon@crudworks.org> Co-authored-by: Suze Shardlow <SuzeShardlow@users.noreply.github.com> Co-authored-by: Joshua T <buildingsomethingfun@gmail.com> Co-authored-by: Aditya Rastogi <adit.rastogi2014@gmail.com> Co-authored-by: Rohan Kumar <rohan.kr20@gmail.com> Co-authored-by: Kalki <shashank.kviit@gmail.com> Co-authored-by: Chayim <chayim@users.noreply.github.com> Co-authored-by: Da-Jin Chu <dajinchu@gmail.com> Co-authored-by: Henrique Corrêa <75134774+HeCorr@users.noreply.github.com> Co-authored-by: Evert Pot <me@evertpot.com>
673 lines
18 KiB
TypeScript
673 lines
18 KiB
TypeScript
import { strict as assert } from 'assert';
|
|
import {
|
|
transformReplyBoolean,
|
|
transformReplyBooleanArray,
|
|
pushScanArguments,
|
|
transformReplyNumberInfinity,
|
|
transformReplyNumberInfinityArray,
|
|
transformReplyNumberInfinityNull,
|
|
transformArgumentNumberInfinity,
|
|
transformArgumentStringNumberInfinity,
|
|
transformReplyTuples,
|
|
transformReplyStreamMessages,
|
|
transformReplyStreamsMessages,
|
|
transformReplySortedSetWithScores,
|
|
pushGeoCountArgument,
|
|
pushGeoSearchArguments,
|
|
GeoReplyWith,
|
|
transformGeoMembersWithReply,
|
|
transformEXAT,
|
|
transformPXAT,
|
|
pushEvalArguments,
|
|
pushStringTuplesArguments,
|
|
pushVerdictArguments,
|
|
pushVerdictArgument,
|
|
pushOptionalVerdictArgument,
|
|
transformCommandReply,
|
|
CommandFlags,
|
|
CommandCategories
|
|
} from './generic-transformers';
|
|
|
|
describe('Generic Transformers', () => {
|
|
describe('transformReplyBoolean', () => {
|
|
it('0', () => {
|
|
assert.equal(
|
|
transformReplyBoolean(0),
|
|
false
|
|
);
|
|
});
|
|
|
|
it('1', () => {
|
|
assert.equal(
|
|
transformReplyBoolean(1),
|
|
true
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformReplyBooleanArray', () => {
|
|
it('empty array', () => {
|
|
assert.deepEqual(
|
|
transformReplyBooleanArray([]),
|
|
[]
|
|
);
|
|
});
|
|
|
|
it('0, 1', () => {
|
|
assert.deepEqual(
|
|
transformReplyBooleanArray([0, 1]),
|
|
[false, true]
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('pushScanArguments', () => {
|
|
it('cusror only', () => {
|
|
assert.deepEqual(
|
|
pushScanArguments([], 0),
|
|
['0']
|
|
);
|
|
});
|
|
|
|
it('with MATCH', () => {
|
|
assert.deepEqual(
|
|
pushScanArguments([], 0, {
|
|
MATCH: 'pattern'
|
|
}),
|
|
['0', 'MATCH', 'pattern']
|
|
);
|
|
});
|
|
|
|
it('with COUNT', () => {
|
|
assert.deepEqual(
|
|
pushScanArguments([], 0, {
|
|
COUNT: 1
|
|
}),
|
|
['0', 'COUNT', '1']
|
|
);
|
|
});
|
|
|
|
it('with MATCH & COUNT', () => {
|
|
assert.deepEqual(
|
|
pushScanArguments([], 0, {
|
|
MATCH: 'pattern',
|
|
COUNT: 1
|
|
}),
|
|
['0', 'MATCH', 'pattern', 'COUNT', '1']
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformReplyNumberInfinity', () => {
|
|
it('0.5', () => {
|
|
assert.equal(
|
|
transformReplyNumberInfinity('0.5'),
|
|
0.5
|
|
);
|
|
});
|
|
|
|
it('+inf', () => {
|
|
assert.equal(
|
|
transformReplyNumberInfinity('+inf'),
|
|
Infinity
|
|
);
|
|
});
|
|
|
|
it('-inf', () => {
|
|
assert.equal(
|
|
transformReplyNumberInfinity('-inf'),
|
|
-Infinity
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformReplyNumberInfinityArray', () => {
|
|
it('empty array', () => {
|
|
assert.deepEqual(
|
|
transformReplyNumberInfinityArray([]),
|
|
[]
|
|
);
|
|
});
|
|
|
|
it('0.5, +inf, -inf', () => {
|
|
assert.deepEqual(
|
|
transformReplyNumberInfinityArray(['0.5', '+inf', '-inf']),
|
|
[0.5, Infinity, -Infinity]
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformReplyNumberInfinityNull', () => {
|
|
it('null', () => {
|
|
assert.equal(
|
|
transformReplyNumberInfinityNull(null),
|
|
null
|
|
);
|
|
});
|
|
|
|
it('1', () => {
|
|
assert.equal(
|
|
transformReplyNumberInfinityNull('1'),
|
|
1
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformArgumentNumberInfinity', () => {
|
|
it('0.5', () => {
|
|
assert.equal(
|
|
transformArgumentNumberInfinity(0.5),
|
|
'0.5'
|
|
);
|
|
});
|
|
|
|
it('Infinity', () => {
|
|
assert.equal(
|
|
transformArgumentNumberInfinity(Infinity),
|
|
'+inf'
|
|
);
|
|
});
|
|
|
|
it('-Infinity', () => {
|
|
assert.equal(
|
|
transformArgumentNumberInfinity(-Infinity),
|
|
'-inf'
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformArgumentStringNumberInfinity', () => {
|
|
it("'0.5'", () => {
|
|
assert.equal(
|
|
transformArgumentStringNumberInfinity('0.5'),
|
|
'0.5'
|
|
);
|
|
});
|
|
|
|
it('0.5', () => {
|
|
assert.equal(
|
|
transformArgumentStringNumberInfinity(0.5),
|
|
'0.5'
|
|
);
|
|
});
|
|
});
|
|
|
|
it('transformReplyTuples', () => {
|
|
assert.deepEqual(
|
|
transformReplyTuples(['key1', 'value1', 'key2', 'value2']),
|
|
Object.create(null, {
|
|
key1: {
|
|
value: 'value1',
|
|
configurable: true,
|
|
enumerable: true
|
|
},
|
|
key2: {
|
|
value: 'value2',
|
|
configurable: true,
|
|
enumerable: true
|
|
}
|
|
})
|
|
);
|
|
});
|
|
|
|
it('transformReplyStreamMessages', () => {
|
|
assert.deepEqual(
|
|
transformReplyStreamMessages([['0-0', ['0key', '0value']], ['1-0', ['1key', '1value']]]),
|
|
[{
|
|
id: '0-0',
|
|
message: Object.create(null, {
|
|
'0key': {
|
|
value: '0value',
|
|
configurable: true,
|
|
enumerable: true
|
|
}
|
|
})
|
|
}, {
|
|
id: '1-0',
|
|
message: Object.create(null, {
|
|
'1key': {
|
|
value: '1value',
|
|
configurable: true,
|
|
enumerable: true
|
|
}
|
|
})
|
|
}]
|
|
);
|
|
});
|
|
|
|
describe('transformReplyStreamsMessages', () => {
|
|
it('null', () => {
|
|
assert.equal(
|
|
transformReplyStreamsMessages(null),
|
|
null
|
|
);
|
|
});
|
|
|
|
it('with messages', () => {
|
|
assert.deepEqual(
|
|
transformReplyStreamsMessages([['stream1', [['0-1', ['11key', '11value']], ['1-1', ['12key', '12value']]]], ['stream2', [['0-2', ['2key1', '2value1', '2key2', '2value2']]]]]),
|
|
[{
|
|
name: 'stream1',
|
|
messages: [{
|
|
id: '0-1',
|
|
message: Object.create(null, {
|
|
'11key': {
|
|
value: '11value',
|
|
configurable: true,
|
|
enumerable: true
|
|
}
|
|
})
|
|
}, {
|
|
id: '1-1',
|
|
message: Object.create(null, {
|
|
'12key': {
|
|
value: '12value',
|
|
configurable: true,
|
|
enumerable: true
|
|
}
|
|
})
|
|
}]
|
|
}, {
|
|
name: 'stream2',
|
|
messages: [{
|
|
id: '0-2',
|
|
message: Object.create(null, {
|
|
'2key1': {
|
|
value: '2value1',
|
|
configurable: true,
|
|
enumerable: true
|
|
},
|
|
'2key2': {
|
|
value: '2value2',
|
|
configurable: true,
|
|
enumerable: true
|
|
}
|
|
})
|
|
}]
|
|
}]
|
|
);
|
|
});
|
|
});
|
|
|
|
it('transformReplySortedSetWithScores', () => {
|
|
assert.deepEqual(
|
|
transformReplySortedSetWithScores(['member1', '0.5', 'member2', '+inf', 'member3', '-inf']),
|
|
[{
|
|
value: 'member1',
|
|
score: 0.5
|
|
}, {
|
|
value: 'member2',
|
|
score: Infinity
|
|
}, {
|
|
value: 'member3',
|
|
score: -Infinity
|
|
}]
|
|
);
|
|
});
|
|
|
|
describe('pushGeoCountArgument', () => {
|
|
it('undefined', () => {
|
|
assert.deepEqual(
|
|
pushGeoCountArgument([], undefined),
|
|
[]
|
|
);
|
|
});
|
|
|
|
it('number', () => {
|
|
assert.deepEqual(
|
|
pushGeoCountArgument([], 1),
|
|
['COUNT', '1']
|
|
);
|
|
});
|
|
|
|
it('with COUNT', () => {
|
|
assert.deepEqual(
|
|
pushGeoCountArgument([], 1),
|
|
['COUNT', '1']
|
|
);
|
|
});
|
|
|
|
it('with ANY', () => {
|
|
assert.deepEqual(
|
|
pushGeoCountArgument([], {
|
|
value: 1,
|
|
ANY: true
|
|
}),
|
|
['COUNT', '1', 'ANY']
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('pushGeoSearchArguments', () => {
|
|
it('FROMMEMBER, BYRADIUS', () => {
|
|
assert.deepEqual(
|
|
pushGeoSearchArguments([], 'key', 'member', {
|
|
radius: 1,
|
|
unit: 'm'
|
|
}),
|
|
['key', 'FROMMEMBER', 'member', 'BYRADIUS', '1', 'm']
|
|
);
|
|
});
|
|
|
|
it('FROMLONLAT, BYBOX', () => {
|
|
assert.deepEqual(
|
|
pushGeoSearchArguments([], 'key', {
|
|
longitude: 1,
|
|
latitude: 2
|
|
}, {
|
|
width: 1,
|
|
height: 2,
|
|
unit: 'm'
|
|
}),
|
|
['key', 'FROMLONLAT', '1', '2', 'BYBOX', '1', '2', 'm']
|
|
);
|
|
});
|
|
|
|
it('with SORT', () => {
|
|
assert.deepEqual(
|
|
pushGeoSearchArguments([], 'key', 'member', {
|
|
radius: 1,
|
|
unit: 'm'
|
|
}, {
|
|
SORT: 'ASC'
|
|
}),
|
|
['key', 'FROMMEMBER', 'member', 'BYRADIUS', '1', 'm', 'ASC']
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformGeoMembersWithReply', () => {
|
|
it('DISTANCE', () => {
|
|
assert.deepEqual(
|
|
transformGeoMembersWithReply([
|
|
[
|
|
'1',
|
|
'2'
|
|
],
|
|
[
|
|
'3',
|
|
'4'
|
|
]
|
|
], [GeoReplyWith.DISTANCE]),
|
|
[{
|
|
member: '1',
|
|
distance: '2'
|
|
}, {
|
|
member: '3',
|
|
distance: '4'
|
|
}]
|
|
);
|
|
});
|
|
|
|
it('HASH', () => {
|
|
assert.deepEqual(
|
|
transformGeoMembersWithReply([
|
|
[
|
|
'1',
|
|
2
|
|
],
|
|
[
|
|
'3',
|
|
4
|
|
]
|
|
], [GeoReplyWith.HASH]),
|
|
[{
|
|
member: '1',
|
|
hash: 2
|
|
}, {
|
|
member: '3',
|
|
hash: 4
|
|
}]
|
|
);
|
|
});
|
|
|
|
it('COORDINATES', () => {
|
|
assert.deepEqual(
|
|
transformGeoMembersWithReply([
|
|
[
|
|
'1',
|
|
[
|
|
'2',
|
|
'3'
|
|
]
|
|
],
|
|
[
|
|
'4',
|
|
[
|
|
'5',
|
|
'6'
|
|
]
|
|
]
|
|
], [GeoReplyWith.COORDINATES]),
|
|
[{
|
|
member: '1',
|
|
coordinates: {
|
|
longitude: '2',
|
|
latitude: '3'
|
|
}
|
|
}, {
|
|
member: '4',
|
|
coordinates: {
|
|
longitude: '5',
|
|
latitude: '6'
|
|
}
|
|
}]
|
|
);
|
|
});
|
|
|
|
it('DISTANCE, HASH, COORDINATES', () => {
|
|
assert.deepEqual(
|
|
transformGeoMembersWithReply([
|
|
[
|
|
'1',
|
|
'2',
|
|
3,
|
|
[
|
|
'4',
|
|
'5'
|
|
]
|
|
],
|
|
[
|
|
'6',
|
|
'7',
|
|
8,
|
|
[
|
|
'9',
|
|
'10'
|
|
]
|
|
]
|
|
], [GeoReplyWith.DISTANCE, GeoReplyWith.HASH, GeoReplyWith.COORDINATES]),
|
|
[{
|
|
member: '1',
|
|
distance: '2',
|
|
hash: 3,
|
|
coordinates: {
|
|
longitude: '4',
|
|
latitude: '5'
|
|
}
|
|
}, {
|
|
member: '6',
|
|
distance: '7',
|
|
hash: 8,
|
|
coordinates: {
|
|
longitude: '9',
|
|
latitude: '10'
|
|
}
|
|
}]
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformEXAT', () => {
|
|
it('number', () => {
|
|
assert.equal(
|
|
transformEXAT(1),
|
|
'1'
|
|
);
|
|
});
|
|
|
|
it('date', () => {
|
|
const d = new Date();
|
|
assert.equal(
|
|
transformEXAT(d),
|
|
Math.floor(d.getTime() / 1000).toString()
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('transformPXAT', () => {
|
|
it('number', () => {
|
|
assert.equal(
|
|
transformPXAT(1),
|
|
'1'
|
|
);
|
|
});
|
|
|
|
it('date', () => {
|
|
const d = new Date();
|
|
assert.equal(
|
|
transformPXAT(d),
|
|
d.getTime().toString()
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('pushEvalArguments', () => {
|
|
it('empty', () => {
|
|
assert.deepEqual(
|
|
pushEvalArguments([]),
|
|
['0']
|
|
);
|
|
});
|
|
|
|
it('with keys', () => {
|
|
assert.deepEqual(
|
|
pushEvalArguments([], {
|
|
keys: ['key']
|
|
}),
|
|
['1', 'key']
|
|
);
|
|
});
|
|
|
|
it('with arguments', () => {
|
|
assert.deepEqual(
|
|
pushEvalArguments([], {
|
|
arguments: ['argument']
|
|
}),
|
|
['0', 'argument']
|
|
);
|
|
});
|
|
|
|
it('with keys and arguments', () => {
|
|
assert.deepEqual(
|
|
pushEvalArguments([], {
|
|
keys: ['key'],
|
|
arguments: ['argument']
|
|
}),
|
|
['1', 'key', 'argument']
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('pushStringTuplesArguments', () => {
|
|
it("['key1', 'value1', 'key2', 'value2']", () => {
|
|
assert.deepEqual(
|
|
pushStringTuplesArguments([], ['key1', 'value1', 'key2', 'value2']),
|
|
['key1', 'value1', 'key2', 'value2']
|
|
);
|
|
});
|
|
|
|
it("[['key1', 'value1'], ['key2', 'value2']]", () => {
|
|
assert.deepEqual(
|
|
pushStringTuplesArguments([], [['key1', 'value1'], ['key2', 'value2']]),
|
|
['key1', 'value1', 'key2', 'value2']
|
|
);
|
|
});
|
|
|
|
it("{key1: 'value1'. key2: 'value2'}", () => {
|
|
assert.deepEqual(
|
|
pushStringTuplesArguments([], { key1: 'value1', key2: 'value2' }),
|
|
['key1', 'value1', 'key2', 'value2']
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('pushVerdictArguments', () => {
|
|
it('string', () => {
|
|
assert.deepEqual(
|
|
pushVerdictArguments([], 'string'),
|
|
['string']
|
|
);
|
|
});
|
|
|
|
it('array', () => {
|
|
assert.deepEqual(
|
|
pushVerdictArguments([], ['1', '2']),
|
|
['1', '2']
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('pushVerdictArgument', () => {
|
|
it('string', () => {
|
|
assert.deepEqual(
|
|
pushVerdictArgument([], 'string'),
|
|
['1', 'string']
|
|
);
|
|
});
|
|
|
|
it('array', () => {
|
|
assert.deepEqual(
|
|
pushVerdictArgument([], ['1', '2']),
|
|
['2', '1', '2']
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('pushOptionalVerdictArgument', () => {
|
|
it('undefined', () => {
|
|
assert.deepEqual(
|
|
pushOptionalVerdictArgument([], 'name', undefined),
|
|
[]
|
|
);
|
|
});
|
|
|
|
it('string', () => {
|
|
assert.deepEqual(
|
|
pushOptionalVerdictArgument([], 'name', 'string'),
|
|
['name', '1', 'string']
|
|
);
|
|
});
|
|
|
|
it('array', () => {
|
|
assert.deepEqual(
|
|
pushOptionalVerdictArgument([], 'name', ['1', '2']),
|
|
['name', '2', '1', '2']
|
|
);
|
|
});
|
|
});
|
|
|
|
it('transformCommandReply', () => {
|
|
assert.deepEqual(
|
|
transformCommandReply([
|
|
'ping',
|
|
-1,
|
|
[CommandFlags.STALE, CommandFlags.FAST],
|
|
0,
|
|
0,
|
|
0,
|
|
[CommandCategories.FAST, CommandCategories.CONNECTION]
|
|
]),
|
|
{
|
|
name: 'ping',
|
|
arity: -1,
|
|
flags: new Set([CommandFlags.STALE, CommandFlags.FAST]),
|
|
firstKeyIndex: 0,
|
|
lastKeyIndex: 0,
|
|
step: 0,
|
|
categories: new Set([CommandCategories.FAST, CommandCategories.CONNECTION])
|
|
}
|
|
);
|
|
});
|
|
});
|