gitoriaLog in with ident

mpackdb

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Main branchmaster87888725release 1.0.7caramboleyomaster/tests/index-path-guard.test.js

2.9 KB

  1. import assert from 'node:assert/strict';
  2. import MPackDB from '../src/MPackDB.js';
  3. import { rm } from 'fs/promises';
  4. const TEST_DB_PATH = 'db/index-path-guard';
  5. console.log('--- Index Path Guard Test ---');
  6. console.log('Declared indexes must recover missing path slots; unknown hints must fail clearly.\n');
  7. await rm(TEST_DB_PATH, { recursive: true, force: true });
  8. const writer = new MPackDB(`${TEST_DB_PATH}/records`, {
  9. primaryKey: '*id',
  10. indexes: ['url', 'name'],
  11. compact: false,
  12. indexPersistInterval: 0,
  13. });
  14. await writer.insert({ url: 'https://example.test/a', name: 'A' });
  15. await writer.close();
  16. const db = new MPackDB(`${TEST_DB_PATH}/records`, {
  17. primaryKey: '*id',
  18. indexes: ['url', 'name'],
  19. compact: false,
  20. indexPersistInterval: 0,
  21. });
  22. await db.init();
  23. const expectedUrlPath = db._indexManager._indexPaths.url;
  24. // Reproduce the reported failure condition directly: a declared field whose
  25. // path slot is unexpectedly absent. Both lookup paths must reconstruct it.
  26. delete db._indexManager._indexPaths.url;
  27. const exact = await db.find(r => r.url === 'https://example.test/a', {
  28. index: { field: 'url', value: 'https://example.test/a' },
  29. });
  30. assert.equal(exact.length, 1);
  31. assert.equal(db._indexManager._indexPaths.url, expectedUrlPath);
  32. delete db._indexManager._indexPaths.url;
  33. const ranged = await db.find(null, {
  34. index: { field: 'url', from: 'https://example.test/a', to: 'https://example.test/z' },
  35. });
  36. assert.equal(ranged.length, 1);
  37. assert.equal(db._indexManager._indexPaths.url, expectedUrlPath);
  38. const assertUnknownIndex = error => {
  39. assert.equal(error.code, 'INDEX_NOT_FOUND');
  40. assert.equal(error.field, 'unknown');
  41. assert.deepEqual(error.indexes, ['id', 'url', 'name']);
  42. assert.match(error.message, /No index configured for field "unknown"/);
  43. return true;
  44. };
  45. await assert.rejects(
  46. () => db.find(() => true, { index: { field: 'unknown', value: 'x' } }).toArray(),
  47. assertUnknownIndex,
  48. );
  49. await assert.rejects(
  50. () => db.find(null, { index: { field: 'unknown', from: 'a', to: 'z' } }).toArray(),
  51. assertUnknownIndex,
  52. );
  53. // Exercise the report's suspected trigger: another attached instance replaces
  54. // the data file through compaction, then this instance refreshes and queries.
  55. const compactor = new MPackDB(`${TEST_DB_PATH}/records`, {
  56. primaryKey: '*id',
  57. indexes: ['url', 'name'],
  58. compact: false,
  59. indexPersistInterval: 0,
  60. });
  61. await compactor.init();
  62. const pathsBeforeReplace = { ...db._indexManager._indexPaths };
  63. await compactor.compact();
  64. await db.refresh();
  65. assert.deepEqual(db._indexManager._indexPaths, pathsBeforeReplace);
  66. const afterReplace = await db.find(r => r.url === 'https://example.test/a', {
  67. index: { field: 'url', value: 'https://example.test/a' },
  68. });
  69. assert.equal(afterReplace.length, 1);
  70. await compactor.close();
  71. await db.close();
  72. console.log('✓ Missing declared paths recovered for exact and range lookups');
  73. console.log('✓ Unknown exact and range hints return INDEX_NOT_FOUND');
  74. console.log('✓ Declared paths and lookups survive external replacement');

Branches

Latest commits

  • 87888725release 1.0.7caramboleyo
  • c4cdb9b6node: import prefixes (Deno compat) + pre-existing index-state WIPcaramboleyo
  • 0afb8f4bupdate now must be a callbackcaramboleyo
  • cde73eb4release 1.0.6caramboleyo
  • d01dda02add index hints, intersection, boundingBox; remove findByIndexcaramboleyo
  • b8ffc1a0release 1.0.5caramboleyo
  • d47876a1reimplemented lost features like indexed find and more testscaramboleyo
  • 7f08da9afixed insert ignoring model definitioncaramboleyo
  • 705774a9added flush before findcaramboleyo
  • b4db6391initial commitcaramboleyo