You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-07 13:22:56 +03:00
refactor!: redis 8 compatibility improvements and test infrastructure updates (#2893)
* churn(test): use redislabs/client-libs-test for testing This switches our testing infrastructure from redis/redis-stack to redislabs/client-libs-test Docker image across all packages. This change also updates the default Docker version from 7.4.0-v1 to 8.0-M04-pre. * churn(test): verify CONFIG SET / GET compatibility with Redis 8 - Add tests for Redis 8 search configuration settings - Deprecate Redis Search CONFIG commands in favor of standard CONFIG - Test read-only config restrictions for Redis 8 * churn(test): handle Redis 8 coordinate precision in GEOPOS - Update GEOPOS tests to handle increased precision in Redis 8 (17 decimal places vs 14) - Add precision-aware coordinate comparison helper - Add comprehensive test suite for coordinate comparison function * test(search): adapt SUGGET tests for Redis 8 empty results - Update tests to expect empty array ([]) instead of null for SUGGET variants - Affects sugGet, sugGetWithPayloads, sugGetWithScores, and sugGetWithScoresWithPayloads * test(search): support Redis 8 INFO indexes_all field - Add indexes_all field introduced in Redis 8 to index definition test * refactor!(search): simplify PROFILE commands to return raw response - BREAKING CHANGE: FT.PROFILE now returns raw response, letting users implement their own parsing * test: improve version-specific test coverage - Add `testWithClientIfVersionWithinRange` method to run tests for specific Redis versions - Refactor TestUtils to handle version comparisons more accurately - Update test utilities across Redis modules to run tests against multiple versions, and not against latest only
This commit is contained in:
@@ -5,105 +5,305 @@ import { SCHEMA_FIELD_TYPE } from './CREATE';
|
||||
import { parseArgs } from '@redis/client/lib/commands/generic-transformers';
|
||||
|
||||
describe('INFO', () => {
|
||||
it('transformArguments', () => {
|
||||
assert.deepEqual(
|
||||
parseArgs(INFO, 'index'),
|
||||
['FT.INFO', 'index']
|
||||
);
|
||||
it('transformArguments', () => {
|
||||
assert.deepEqual(
|
||||
parseArgs(INFO, 'index'),
|
||||
['FT.INFO', 'index']
|
||||
);
|
||||
});
|
||||
|
||||
testUtils.testWithClientIfVersionWithinRange([[8], 'LATEST'], 'client.ft.info', async client => {
|
||||
|
||||
await client.ft.create('index', {
|
||||
field: SCHEMA_FIELD_TYPE.TEXT
|
||||
});
|
||||
const ret = await client.ft.info('index');
|
||||
// effectively testing that stopwords_list is not in ret
|
||||
assert.deepEqual(
|
||||
ret,
|
||||
{
|
||||
index_name: 'index',
|
||||
index_options: [],
|
||||
index_definition: Object.create(null, {
|
||||
|
||||
testUtils.testWithClient('client.ft.info', async client => {
|
||||
await client.ft.create('index', {
|
||||
field: SCHEMA_FIELD_TYPE.TEXT
|
||||
});
|
||||
const ret = await client.ft.info('index');
|
||||
// effectively testing that stopwords_list is not in ret
|
||||
assert.deepEqual(
|
||||
ret,
|
||||
{
|
||||
index_name: 'index',
|
||||
index_options: [],
|
||||
index_definition: Object.create(null, {
|
||||
default_score: {
|
||||
value: '1',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
key_type: {
|
||||
value: 'HASH',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
prefixes: {
|
||||
value: [''],
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
}),
|
||||
attributes: [Object.create(null, {
|
||||
identifier: {
|
||||
value: 'field',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
attribute: {
|
||||
value: 'field',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
type: {
|
||||
value: 'TEXT',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
WEIGHT: {
|
||||
value: '1',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
})],
|
||||
num_docs: 0,
|
||||
max_doc_id: 0,
|
||||
num_terms: 0,
|
||||
num_records: 0,
|
||||
inverted_sz_mb: 0,
|
||||
vector_index_sz_mb: 0,
|
||||
total_inverted_index_blocks: 0,
|
||||
offset_vectors_sz_mb: 0,
|
||||
doc_table_size_mb: 0,
|
||||
sortable_values_size_mb: 0,
|
||||
key_table_size_mb: 0,
|
||||
records_per_doc_avg: NaN,
|
||||
bytes_per_record_avg: NaN,
|
||||
cleaning: 0,
|
||||
offsets_per_term_avg: NaN,
|
||||
offset_bits_per_record_avg: NaN,
|
||||
geoshapes_sz_mb: 0,
|
||||
hash_indexing_failures: 0,
|
||||
indexing: 0,
|
||||
percent_indexed: 1,
|
||||
number_of_uses: 1,
|
||||
tag_overhead_sz_mb: 0,
|
||||
text_overhead_sz_mb: 0,
|
||||
total_index_memory_sz_mb: 0,
|
||||
total_indexing_time: 0,
|
||||
gc_stats: {
|
||||
bytes_collected: 0,
|
||||
total_ms_run: 0,
|
||||
total_cycles: 0,
|
||||
average_cycle_time_ms: NaN,
|
||||
last_run_time_ms: 0,
|
||||
gc_numeric_trees_missed: 0,
|
||||
gc_blocks_denied: 0
|
||||
},
|
||||
cursor_stats: {
|
||||
global_idle: 0,
|
||||
global_total: 0,
|
||||
index_capacity: 128,
|
||||
index_total: 0
|
||||
},
|
||||
}
|
||||
);
|
||||
indexes_all: {
|
||||
value: 'false',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
|
||||
}, GLOBAL.SERVERS.OPEN);
|
||||
default_score: {
|
||||
value: '1',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
key_type: {
|
||||
value: 'HASH',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
prefixes: {
|
||||
value: [''],
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
}),
|
||||
attributes: [Object.create(null, {
|
||||
identifier: {
|
||||
value: 'field',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
attribute: {
|
||||
value: 'field',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
type: {
|
||||
value: 'TEXT',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
WEIGHT: {
|
||||
value: '1',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
})],
|
||||
num_docs: 0,
|
||||
max_doc_id: 0,
|
||||
num_terms: 0,
|
||||
num_records: 0,
|
||||
inverted_sz_mb: 0,
|
||||
vector_index_sz_mb: 0,
|
||||
total_inverted_index_blocks: 0,
|
||||
offset_vectors_sz_mb: 0,
|
||||
doc_table_size_mb: 0,
|
||||
sortable_values_size_mb: 0,
|
||||
key_table_size_mb: 0,
|
||||
records_per_doc_avg: NaN,
|
||||
bytes_per_record_avg: NaN,
|
||||
cleaning: 0,
|
||||
offsets_per_term_avg: NaN,
|
||||
offset_bits_per_record_avg: NaN,
|
||||
geoshapes_sz_mb: 0,
|
||||
hash_indexing_failures: 0,
|
||||
indexing: 0,
|
||||
percent_indexed: 1,
|
||||
number_of_uses: 1,
|
||||
tag_overhead_sz_mb: 0,
|
||||
text_overhead_sz_mb: 0,
|
||||
total_index_memory_sz_mb: 0,
|
||||
total_indexing_time: 0,
|
||||
gc_stats: {
|
||||
bytes_collected: 0,
|
||||
total_ms_run: 0,
|
||||
total_cycles: 0,
|
||||
average_cycle_time_ms: NaN,
|
||||
last_run_time_ms: 0,
|
||||
gc_numeric_trees_missed: 0,
|
||||
gc_blocks_denied: 0
|
||||
},
|
||||
cursor_stats: {
|
||||
global_idle: 0,
|
||||
global_total: 0,
|
||||
index_capacity: 128,
|
||||
index_total: 0
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
}, GLOBAL.SERVERS.OPEN);
|
||||
|
||||
testUtils.testWithClientIfVersionWithinRange([[7, 4, 2], [7, 4, 2]], 'client.ft.info', async client => {
|
||||
|
||||
await client.ft.create('index', {
|
||||
field: SCHEMA_FIELD_TYPE.TEXT
|
||||
});
|
||||
const ret = await client.ft.info('index');
|
||||
// effectively testing that stopwords_list is not in ret
|
||||
assert.deepEqual(
|
||||
ret,
|
||||
{
|
||||
index_name: 'index',
|
||||
index_options: [],
|
||||
index_definition: Object.create(null, {
|
||||
default_score: {
|
||||
value: '1',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
key_type: {
|
||||
value: 'HASH',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
prefixes: {
|
||||
value: [''],
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
}),
|
||||
attributes: [Object.create(null, {
|
||||
identifier: {
|
||||
value: 'field',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
attribute: {
|
||||
value: 'field',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
type: {
|
||||
value: 'TEXT',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
WEIGHT: {
|
||||
value: '1',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
})],
|
||||
num_docs: 0,
|
||||
max_doc_id: 0,
|
||||
num_terms: 0,
|
||||
num_records: 0,
|
||||
inverted_sz_mb: 0,
|
||||
vector_index_sz_mb: 0,
|
||||
total_inverted_index_blocks: 0,
|
||||
offset_vectors_sz_mb: 0,
|
||||
doc_table_size_mb: 0,
|
||||
sortable_values_size_mb: 0,
|
||||
key_table_size_mb: 0,
|
||||
records_per_doc_avg: NaN,
|
||||
bytes_per_record_avg: NaN,
|
||||
cleaning: 0,
|
||||
offsets_per_term_avg: NaN,
|
||||
offset_bits_per_record_avg: NaN,
|
||||
geoshapes_sz_mb: 0,
|
||||
hash_indexing_failures: 0,
|
||||
indexing: 0,
|
||||
percent_indexed: 1,
|
||||
number_of_uses: 1,
|
||||
tag_overhead_sz_mb: 0,
|
||||
text_overhead_sz_mb: 0,
|
||||
total_index_memory_sz_mb: 0,
|
||||
total_indexing_time: 0,
|
||||
gc_stats: {
|
||||
bytes_collected: 0,
|
||||
total_ms_run: 0,
|
||||
total_cycles: 0,
|
||||
average_cycle_time_ms: NaN,
|
||||
last_run_time_ms: 0,
|
||||
gc_numeric_trees_missed: 0,
|
||||
gc_blocks_denied: 0
|
||||
},
|
||||
cursor_stats: {
|
||||
global_idle: 0,
|
||||
global_total: 0,
|
||||
index_capacity: 128,
|
||||
index_total: 0
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
}, GLOBAL.SERVERS.OPEN);
|
||||
|
||||
testUtils.testWithClientIfVersionWithinRange([[7, 2, 0], [7, 2, 0]], 'client.ft.info', async client => {
|
||||
|
||||
await client.ft.create('index', {
|
||||
field: SCHEMA_FIELD_TYPE.TEXT
|
||||
});
|
||||
const ret = await client.ft.info('index');
|
||||
// effectively testing that stopwords_list is not in ret
|
||||
assert.deepEqual(
|
||||
ret,
|
||||
{
|
||||
index_name: 'index',
|
||||
index_options: [],
|
||||
index_definition: Object.create(null, {
|
||||
default_score: {
|
||||
value: '1',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
key_type: {
|
||||
value: 'HASH',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
prefixes: {
|
||||
value: [''],
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
}),
|
||||
attributes: [Object.create(null, {
|
||||
identifier: {
|
||||
value: 'field',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
attribute: {
|
||||
value: 'field',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
type: {
|
||||
value: 'TEXT',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
WEIGHT: {
|
||||
value: '1',
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
})],
|
||||
num_docs: "0",
|
||||
max_doc_id: "0",
|
||||
num_terms: "0",
|
||||
num_records: "0",
|
||||
inverted_sz_mb: 0,
|
||||
vector_index_sz_mb: 0,
|
||||
total_inverted_index_blocks: "0",
|
||||
offset_vectors_sz_mb: 0,
|
||||
doc_table_size_mb: 0,
|
||||
sortable_values_size_mb: 0,
|
||||
key_table_size_mb: 0,
|
||||
records_per_doc_avg: NaN,
|
||||
bytes_per_record_avg: NaN,
|
||||
cleaning: 0,
|
||||
offsets_per_term_avg: NaN,
|
||||
offset_bits_per_record_avg: NaN,
|
||||
geoshapes_sz_mb: 0,
|
||||
hash_indexing_failures: "0",
|
||||
indexing: "0",
|
||||
percent_indexed: 1,
|
||||
number_of_uses: 1,
|
||||
tag_overhead_sz_mb: 0,
|
||||
text_overhead_sz_mb: 0,
|
||||
total_index_memory_sz_mb: 0,
|
||||
total_indexing_time: 0,
|
||||
gc_stats: {
|
||||
bytes_collected: 0,
|
||||
total_ms_run: 0,
|
||||
total_cycles: 0,
|
||||
average_cycle_time_ms: NaN,
|
||||
last_run_time_ms: 0,
|
||||
gc_numeric_trees_missed: 0,
|
||||
gc_blocks_denied: 0
|
||||
},
|
||||
cursor_stats: {
|
||||
global_idle: 0,
|
||||
global_total: 0,
|
||||
index_capacity: 128,
|
||||
index_total: 0
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
}, GLOBAL.SERVERS.OPEN);
|
||||
});
|
||||
|
Reference in New Issue
Block a user