Skip to content

Commit 89a0f8c

Browse files
committed
add more tests for vrandmember
1 parent e6046fc commit 89a0f8c

File tree

2 files changed

+170
-12
lines changed

2 files changed

+170
-12
lines changed

packages/client/lib/commands/VRANDMEMBER.spec.ts

Lines changed: 168 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,173 @@ describe('VRANDMEMBER', () => {
2020
});
2121
});
2222

23-
testUtils.testAll('vRandMember', async client => {
24-
await client.vAdd('key', [1.0, 2.0, 3.0], 'element1');
25-
await client.vAdd('key', [4.0, 5.0, 6.0], 'element2');
26-
27-
const result = await client.vRandMember('key', 1);
28-
assert.ok(Array.isArray(result));
29-
assert.equal(result.length, 1);
30-
}, {
31-
client: GLOBAL.SERVERS.OPEN,
32-
cluster: GLOBAL.CLUSTERS.OPEN
23+
describe('RESP2 tests', () => {
24+
testUtils.testAll('vRandMember without count - returns single element as string', async client => {
25+
await client.vAdd('key', [1.0, 2.0, 3.0], 'element1');
26+
await client.vAdd('key', [4.0, 5.0, 6.0], 'element2');
27+
await client.vAdd('key', [7.0, 8.0, 9.0], 'element3');
28+
29+
const result = await client.vRandMember('key');
30+
assert.equal(typeof result, 'string');
31+
assert.ok(['element1', 'element2', 'element3'].includes(result as string));
32+
}, {
33+
client: GLOBAL.SERVERS.OPEN,
34+
cluster: GLOBAL.CLUSTERS.OPEN
35+
});
36+
37+
testUtils.testAll('vRandMember with positive count - returns distinct elements', async client => {
38+
await client.vAdd('key', [1.0, 2.0, 3.0], 'element1');
39+
await client.vAdd('key', [4.0, 5.0, 6.0], 'element2');
40+
await client.vAdd('key', [7.0, 8.0, 9.0], 'element3');
41+
42+
const result = await client.vRandMember('key', 2);
43+
assert.ok(Array.isArray(result));
44+
assert.equal(result.length, 2);
45+
46+
}, {
47+
client: GLOBAL.SERVERS.OPEN,
48+
cluster: GLOBAL.CLUSTERS.OPEN
49+
});
50+
51+
testUtils.testAll('vRandMember with negative count - allows duplicates', async client => {
52+
await client.vAdd('key', [1.0, 2.0, 3.0], 'element1');
53+
await client.vAdd('key', [4.0, 5.0, 6.0], 'element2');
54+
55+
const result = await client.vRandMember('key', -5);
56+
assert.ok(Array.isArray(result));
57+
assert.equal(result.length, 5);
58+
59+
// All elements should be from our set (duplicates allowed)
60+
result.forEach(element => {
61+
assert.ok(['element1', 'element2'].includes(element));
62+
});
63+
}, {
64+
client: GLOBAL.SERVERS.OPEN,
65+
cluster: GLOBAL.CLUSTERS.OPEN
66+
});
67+
68+
testUtils.testAll('vRandMember count exceeds set size - returns entire set', async client => {
69+
await client.vAdd('key', [1.0, 2.0, 3.0], 'element1');
70+
await client.vAdd('key', [4.0, 5.0, 6.0], 'element2');
71+
72+
const result = await client.vRandMember('key', 10);
73+
assert.ok(Array.isArray(result));
74+
assert.equal(result.length, 2); // Only 2 elements exist
75+
76+
// Should contain both elements
77+
assert.ok(result.includes('element1'));
78+
assert.ok(result.includes('element2'));
79+
}, {
80+
client: GLOBAL.SERVERS.OPEN,
81+
cluster: GLOBAL.CLUSTERS.OPEN
82+
});
83+
84+
testUtils.testAll('vRandMember on non-existent key', async client => {
85+
// Without count - should return null
86+
const resultNoCount = await client.vRandMember('nonexistent');
87+
assert.equal(resultNoCount, null);
88+
89+
// With count - should return empty array
90+
const resultWithCount = await client.vRandMember('nonexistent', 5);
91+
assert.ok(Array.isArray(resultWithCount));
92+
assert.equal(resultWithCount.length, 0);
93+
}, {
94+
client: GLOBAL.SERVERS.OPEN,
95+
cluster: GLOBAL.CLUSTERS.OPEN
96+
});
97+
});
98+
99+
describe('RESP3 tests', () => {
100+
testUtils.testWithClient('vRandMember without count - returns single element as string', async client => {
101+
await client.vAdd('resp3-key', [1.0, 2.0, 3.0], 'element1');
102+
await client.vAdd('resp3-key', [4.0, 5.0, 6.0], 'element2');
103+
await client.vAdd('resp3-key', [7.0, 8.0, 9.0], 'element3');
104+
105+
const result = await client.vRandMember('resp3-key');
106+
assert.equal(typeof result, 'string');
107+
assert.ok(['element1', 'element2', 'element3'].includes(result as string));
108+
}, {
109+
...GLOBAL.SERVERS.OPEN,
110+
clientOptions: {
111+
RESP: 3
112+
}
113+
});
114+
115+
testUtils.testWithClient('vRandMember with positive count - returns distinct elements', async client => {
116+
await client.vAdd('resp3-key', [1.0, 2.0, 3.0], 'element1');
117+
await client.vAdd('resp3-key', [4.0, 5.0, 6.0], 'element2');
118+
await client.vAdd('resp3-key', [7.0, 8.0, 9.0], 'element3');
119+
120+
const result = await client.vRandMember('resp3-key', 2);
121+
assert.ok(Array.isArray(result));
122+
assert.equal(result.length, 2);
123+
124+
// Should be distinct elements (no duplicates)
125+
const uniqueElements = new Set(result);
126+
assert.equal(uniqueElements.size, 2);
127+
128+
// All elements should be from our set
129+
result.forEach(element => {
130+
assert.ok(['element1', 'element2', 'element3'].includes(element));
131+
});
132+
}, {
133+
...GLOBAL.SERVERS.OPEN,
134+
clientOptions: {
135+
RESP: 3
136+
}
137+
});
138+
139+
testUtils.testWithClient('vRandMember with negative count - allows duplicates', async client => {
140+
await client.vAdd('resp3-key', [1.0, 2.0, 3.0], 'element1');
141+
await client.vAdd('resp3-key', [4.0, 5.0, 6.0], 'element2');
142+
143+
const result = await client.vRandMember('resp3-key', -5);
144+
assert.ok(Array.isArray(result));
145+
assert.equal(result.length, 5);
146+
147+
// All elements should be from our set (duplicates allowed)
148+
result.forEach(element => {
149+
assert.ok(['element1', 'element2'].includes(element));
150+
});
151+
}, {
152+
...GLOBAL.SERVERS.OPEN,
153+
clientOptions: {
154+
RESP: 3
155+
}
156+
});
157+
158+
testUtils.testWithClient('vRandMember count exceeds set size - returns entire set', async client => {
159+
await client.vAdd('resp3-key', [1.0, 2.0, 3.0], 'element1');
160+
await client.vAdd('resp3-key', [4.0, 5.0, 6.0], 'element2');
161+
162+
const result = await client.vRandMember('resp3-key', 10);
163+
assert.ok(Array.isArray(result));
164+
assert.equal(result.length, 2); // Only 2 elements exist
165+
166+
// Should contain both elements
167+
assert.ok(result.includes('element1'));
168+
assert.ok(result.includes('element2'));
169+
}, {
170+
...GLOBAL.SERVERS.OPEN,
171+
clientOptions: {
172+
RESP: 3
173+
}
174+
});
175+
176+
testUtils.testWithClient('vRandMember on non-existent key', async client => {
177+
// Without count - should return null
178+
const resultNoCount = await client.vRandMember('resp3-nonexistent');
179+
assert.equal(resultNoCount, null);
180+
181+
// With count - should return empty array
182+
const resultWithCount = await client.vRandMember('resp3-nonexistent', 5);
183+
assert.ok(Array.isArray(resultWithCount));
184+
assert.equal(resultWithCount.length, 0);
185+
}, {
186+
...GLOBAL.SERVERS.OPEN,
187+
clientOptions: {
188+
RESP: 3
189+
}
190+
});
33191
});
34192
});

packages/client/lib/commands/VRANDMEMBER.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CommandParser } from '../client/parser';
2-
import { RedisArgument, BlobStringReply, ArrayReply, Command } from '../RESP/types';
2+
import { RedisArgument, BlobStringReply, ArrayReply, Command, NullReply } from '../RESP/types';
33

44
export default {
55
IS_READ_ONLY: true,
@@ -19,5 +19,5 @@ export default {
1919
parser.push(count.toString());
2020
}
2121
},
22-
transformReply: undefined as unknown as () => BlobStringReply | ArrayReply<BlobStringReply>
22+
transformReply: undefined as unknown as () => BlobStringReply | ArrayReply<BlobStringReply> | NullReply
2323
} as const satisfies Command;

0 commit comments

Comments
 (0)