import * as asserts from '@std/assert'; import * as fsdb from '../fsdb.ts'; import { FSDB_INDEXER_SYMLINKS } from '../indexers/symlinks.ts'; import { get_data_dir, random_email_address, random_phone_number } from './helpers.ts'; import lurid from '@andyburke/lurid'; import by_email from '../organizers/by_email.ts'; import by_character from '../organizers/by_character.ts'; import by_phone from '../organizers/by_phone.ts'; import { sentence } from 'jsr:@ndaidong/txtgen'; Deno.test({ name: 'index some items', permissions: { env: true, // https://github.com/denoland/deno/discussions/17258 read: true, write: true }, fn: async () => { type ITEM = { id: string; email: string; phone: string; value: string; }; const item_collection: fsdb.FSDB_COLLECTION = new fsdb.FSDB_COLLECTION({ name: 'test-03-items', root: get_data_dir() + '/test-03-items', indexers: { email: new FSDB_INDEXER_SYMLINKS({ name: 'email', field: 'email', organize: by_email }), phone: new FSDB_INDEXER_SYMLINKS({ name: 'phone', field: 'phone', organize: by_phone }), by_character_test: new FSDB_INDEXER_SYMLINKS({ name: 'by_character_test', organize: by_character, get_values_to_index: (item: ITEM) => item.value.split(/\W/).filter((word) => word.length > 3), to_many: true }) } }); asserts.assert(item_collection); const items: ITEM[] = []; for (let i = 0; i < 10; ++i) { const item = { id: lurid(), email: random_email_address(), phone: random_phone_number(), value: sentence() }; items.push(item); const stored_item: ITEM = await item_collection.create(item); asserts.assertObjectMatch(stored_item, item); } for (const item of items) { const fetched_by_email: ITEM[] = await item_collection.find({ email: item.email }); asserts.assertLess(fetched_by_email.length, items.length); asserts.assertGreater(fetched_by_email.length, 0); asserts.assert(fetched_by_email.find((email_item) => email_item.id === item.id)); const fetched_by_phone: ITEM[] = await item_collection.find({ phone: item.phone }); asserts.assertLess(fetched_by_phone.length, items.length); asserts.assertGreater(fetched_by_phone.length, 0); asserts.assert(fetched_by_phone.find((phone_item) => phone_item.id === item.id)); const words_in_value: string[] = item.value.split(/\W/).filter((word) => word.length > 3); const random_word_in_value: string = words_in_value[Math.floor(Math.random() * words_in_value.length)]; const fetched_by_word_in_value: ITEM[] = await item_collection.find({ by_character_test: random_word_in_value }); asserts.assertLess(fetched_by_word_in_value.length, items.length); asserts.assertGreater(fetched_by_word_in_value.length, 0); asserts.assert(fetched_by_word_in_value.find((word_in_value_item) => word_in_value_item.id === item.id)); } } });