@joystick.js/db-canary 0.0.0-canary.2209
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.build/getFilesToBuild.js +26 -0
- package/.build/getPlatformSafeFilePath.js +6 -0
- package/.build/getPlatformSafePath.js +6 -0
- package/.build/index.js +88 -0
- package/.build/isWindows.js +3 -0
- package/API_KEY +1 -0
- package/README.md +1821 -0
- package/data/data.mdb +0 -0
- package/data/lock.mdb +0 -0
- package/dist/client/database.js +1 -0
- package/dist/client/index.js +1 -0
- package/dist/server/cluster/index.js +1 -0
- package/dist/server/cluster/master.js +20 -0
- package/dist/server/cluster/worker.js +1 -0
- package/dist/server/index.js +1 -0
- package/dist/server/lib/api_key_manager.js +9 -0
- package/dist/server/lib/auth_manager.js +1 -0
- package/dist/server/lib/auto_index_manager.js +1 -0
- package/dist/server/lib/backup_manager.js +1 -0
- package/dist/server/lib/connection_manager.js +1 -0
- package/dist/server/lib/disk_utils.js +2 -0
- package/dist/server/lib/http_server.js +405 -0
- package/dist/server/lib/index_manager.js +1 -0
- package/dist/server/lib/load_settings.js +1 -0
- package/dist/server/lib/logger.js +1 -0
- package/dist/server/lib/op_types.js +1 -0
- package/dist/server/lib/operation_dispatcher.js +1 -0
- package/dist/server/lib/operations/admin.js +1 -0
- package/dist/server/lib/operations/bulk_write.js +1 -0
- package/dist/server/lib/operations/create_index.js +1 -0
- package/dist/server/lib/operations/delete_one.js +1 -0
- package/dist/server/lib/operations/drop_index.js +1 -0
- package/dist/server/lib/operations/find.js +1 -0
- package/dist/server/lib/operations/find_one.js +1 -0
- package/dist/server/lib/operations/get_indexes.js +1 -0
- package/dist/server/lib/operations/insert_one.js +1 -0
- package/dist/server/lib/operations/update_one.js +1 -0
- package/dist/server/lib/performance_monitor.js +1 -0
- package/dist/server/lib/query_engine.js +1 -0
- package/dist/server/lib/recovery_manager.js +1 -0
- package/dist/server/lib/replication_manager.js +1 -0
- package/dist/server/lib/safe_json_parse.js +1 -0
- package/dist/server/lib/send_response.js +1 -0
- package/dist/server/lib/tcp_protocol.js +1 -0
- package/dist/server/lib/write_forwarder.js +1 -0
- package/dist/server/lib/write_queue.js +1 -0
- package/increment_version.js +3 -0
- package/logs/.013e15b54597d05db4b4b53ecc37b10c92a72927-audit.json +20 -0
- package/logs/.02de550a67ea0f5961faa2dfd458a4d06f59ebd1-audit.json +20 -0
- package/logs/.03494ba24eb3c72214b4068a77d54b8993bee651-audit.json +20 -0
- package/logs/.06309ec60b339be1259a7993dd09c732f8907fbc-audit.json +20 -0
- package/logs/.0663a04dcfa17285661e5e1b8cfa51f41523b210-audit.json +20 -0
- package/logs/.0f06e6c4c9b824622729e13927587479e5060391-audit.json +20 -0
- package/logs/.16ccf58682ecb22b3e3ec63f0da1b7fe9be56528-audit.json +20 -0
- package/logs/.1fa1a5d02f496474b1ab473524c65c984146a9ad-audit.json +20 -0
- package/logs/.2223c0ae3bea6f0d62c62b1d319cc8634856abb7-audit.json +20 -0
- package/logs/.23dc79ffda3e083665e6f5993f59397adcbf4a46-audit.json +20 -0
- package/logs/.28104f49b03906b189eefd1cd462cb46c3c0af22-audit.json +20 -0
- package/logs/.29cdbf13808abe6a0ce70ee2f2efdd680ce3fd8e-audit.json +20 -0
- package/logs/.2a9889afd071f77f41f5170d08703a0afca866b7-audit.json +20 -0
- package/logs/.2acec3d1940a2bbed487528b703ee5948959a599-audit.json +20 -0
- package/logs/.2fb60ff326338c02bfedbcd0e936444e4a216750-audit.json +20 -0
- package/logs/.318fc7a19530d76a345f030f7cad00dda15300e7-audit.json +20 -0
- package/logs/.3cf27043e19085f908cedc7701e6d013463208ee-audit.json +25 -0
- package/logs/.3d90d785415817fc443402843b7c95f8371adc9b-audit.json +20 -0
- package/logs/.4074bca620375f72966fc52dfd439577727671e5-audit.json +20 -0
- package/logs/.40eecf018417ea80a70ea8ec7a3cc9406bc6334b-audit.json +20 -0
- package/logs/.50e974f1ef7c365fca6a1251b2e2c2252914cb5e-audit.json +20 -0
- package/logs/.52cb7d9e4223cf26ba36006ac26b949a97c7923c-audit.json +20 -0
- package/logs/.54befcdb84c15aad980705a31bcc9f555c3577ab-audit.json +20 -0
- package/logs/.57dfb70e22eddb84db2e3c0ceeefac5c0b9baffa-audit.json +20 -0
- package/logs/.5f0b24705a1eaad4eca4968f2d86f91b3f9be683-audit.json +20 -0
- package/logs/.61ba98fdda7db58576b382fee07904e5db1169d6-audit.json +20 -0
- package/logs/.6235017727ef6b199d569a99d6aa8c8e80a1b475-audit.json +20 -0
- package/logs/.63db16193699219489d218a1ddea5dde3750cae4-audit.json +20 -0
- package/logs/.64fb67dfe14149c9eef728d79bf30a54da809c60-audit.json +20 -0
- package/logs/.669137453368987c1f311b5345342527afb54e50-audit.json +20 -0
- package/logs/.7a71f8c89ea28ae266d356aeff6306e876a30fbb-audit.json +20 -0
- package/logs/.7afbaa90fe9dc3a7d682676f9bb79f9a1b1fd9a6-audit.json +20 -0
- package/logs/.7ca29e322cd05327035de850099e7610864f2347-audit.json +20 -0
- package/logs/.83335ab3347e449dae03455a110aaf7f120d4802-audit.json +20 -0
- package/logs/.8c2487b5fd445d2c8e5c483c80b9fa99bbf1ca58-audit.json +20 -0
- package/logs/.8c8b9dc386922c9f3b4c13251af7052aac1d24c0-audit.json +20 -0
- package/logs/.8d6155d94640c4863301ae0fee5e4e7372a21446-audit.json +20 -0
- package/logs/.944a3119a243deea7c8270d5d9e582bb1d0eaa10-audit.json +20 -0
- package/logs/.9816a845c30fb2909f3b26a23eeb3538ebcad5db-audit.json +20 -0
- package/logs/.9dc08784e38b865488177c26d4af5934555e0323-audit.json +20 -0
- package/logs/.9dd27d2e0e454ac0a37600206d1cac5493b0d7ee-audit.json +20 -0
- package/logs/.a3d486feeac7654c59b547de96600e8849a06d4f-audit.json +20 -0
- package/logs/.a5b811f4def22250f86cc18870d7c4573625df22-audit.json +20 -0
- package/logs/.a61648eb5f830e0b6f508ac35e4f8f629d2ad4c7-audit.json +20 -0
- package/logs/.a89016d507045771b4b5a65656944a9c0f1e528b-audit.json +20 -0
- package/logs/.a99bee160a1c590be959af46bacc02724803f691-audit.json +20 -0
- package/logs/.ada7906d6243fd7da802f03d86c4ae5dd9df6236-audit.json +20 -0
- package/logs/.b518339ee942143b6af983af167f5bbb6983b4de-audit.json +20 -0
- package/logs/.b51b124b166d53c9519017856ea610d61d65fabe-audit.json +20 -0
- package/logs/.b7a6aee19f58e55633d5e4a3709041c47dfff975-audit.json +20 -0
- package/logs/.bd7a8a6ba9c55d557a4867ab53f02e3ec2e1553d-audit.json +20 -0
- package/logs/.c1435dafe453b169d6392b25065f3cf4ab6fbb21-audit.json +20 -0
- package/logs/.c17e1ce043109f77dc2f0e2aa290a9d1ed842c03-audit.json +20 -0
- package/logs/.ca62637ce9540e5a38a2fbedb2115febb6ad308a-audit.json +15 -0
- package/logs/.ccee67b9c176967f8977071409a41f5cb5cd6ad4-audit.json +20 -0
- package/logs/.db24043417ea79a6f14cd947476399e53930b48d-audit.json +20 -0
- package/logs/.e0f12acccb57829f5f33712bb2e2607ecd808147-audit.json +20 -0
- package/logs/.e9b6cc33d0bbd2e644c4e2bf44d177f850016557-audit.json +20 -0
- package/logs/.f15291d434808e3bdca7963ccd2e73893be027e6-audit.json +20 -0
- package/logs/.f4bdf9e21ef84f8a3fae3ffb32bbc39275991351-audit.json +15 -0
- package/logs/.fbac3aefac1e81b4230df5aa50667cb90d51024f-audit.json +20 -0
- package/logs/.fcfd495c0a9169db243f4a4f21878ee02b76413c-audit.json +20 -0
- package/logs/admin-2025-09-12.log +580 -0
- package/logs/admin-2025-09-15.log +283 -0
- package/logs/admin-error-2025-09-12.log +22 -0
- package/logs/admin-error-2025-09-15.log +10 -0
- package/logs/api_key_manager-2025-09-12.log +658 -0
- package/logs/api_key_manager-2025-09-15.log +295 -0
- package/logs/api_key_manager-error-2025-09-12.log +0 -0
- package/logs/api_key_manager-error-2025-09-15.log +0 -0
- package/logs/auth_manager-2025-09-12.log +4432 -0
- package/logs/auth_manager-2025-09-15.log +2000 -0
- package/logs/auth_manager-error-2025-09-12.log +11 -0
- package/logs/auth_manager-error-2025-09-15.log +5 -0
- package/logs/auto_index_manager-2025-09-12.log +84 -0
- package/logs/auto_index_manager-2025-09-15.log +45 -0
- package/logs/auto_index_manager-error-2025-09-12.log +6 -0
- package/logs/auto_index_manager-error-2025-09-15.log +0 -0
- package/logs/backup_manager-2025-09-12.log +198 -0
- package/logs/backup_manager-2025-09-15.log +90 -0
- package/logs/backup_manager-error-2025-09-12.log +198 -0
- package/logs/backup_manager-error-2025-09-15.log +90 -0
- package/logs/bulk_write-2025-09-12.log +66 -0
- package/logs/bulk_write-2025-09-15.log +38 -0
- package/logs/bulk_write-error-2025-09-12.log +0 -0
- package/logs/bulk_write-error-2025-09-15.log +0 -0
- package/logs/connection_manager-2025-09-12.log +2412 -0
- package/logs/connection_manager-2025-09-15.log +1132 -0
- package/logs/connection_manager-error-2025-09-12.log +0 -0
- package/logs/connection_manager-error-2025-09-15.log +0 -0
- package/logs/create_index-2025-09-12.log +302 -0
- package/logs/create_index-2025-09-15.log +158 -0
- package/logs/create_index-error-2025-09-12.log +30 -0
- package/logs/create_index-error-2025-09-15.log +13 -0
- package/logs/delete_one-2025-09-12.log +73 -0
- package/logs/delete_one-2025-09-15.log +43 -0
- package/logs/delete_one-error-2025-09-12.log +0 -0
- package/logs/delete_one-error-2025-09-15.log +0 -0
- package/logs/disk_utils-2025-09-12.log +4954 -0
- package/logs/disk_utils-2025-09-15.log +2446 -0
- package/logs/disk_utils-error-2025-09-12.log +0 -0
- package/logs/disk_utils-error-2025-09-15.log +0 -0
- package/logs/drop_index-2025-09-12.log +41 -0
- package/logs/drop_index-2025-09-15.log +23 -0
- package/logs/drop_index-error-2025-09-12.log +11 -0
- package/logs/drop_index-error-2025-09-15.log +5 -0
- package/logs/find-2025-09-12.log +1050 -0
- package/logs/find-2025-09-15.log +592 -0
- package/logs/find-error-2025-09-12.log +1 -0
- package/logs/find-error-2025-09-15.log +0 -0
- package/logs/find_one-2025-09-12.log +425 -0
- package/logs/find_one-2025-09-15.log +264 -0
- package/logs/find_one-error-2025-09-12.log +5 -0
- package/logs/find_one-error-2025-09-15.log +0 -0
- package/logs/get_indexes-2025-09-12.log +84 -0
- package/logs/get_indexes-2025-09-15.log +56 -0
- package/logs/get_indexes-error-2025-09-12.log +6 -0
- package/logs/get_indexes-error-2025-09-15.log +0 -0
- package/logs/http_server-2025-09-12.log +2772 -0
- package/logs/http_server-2025-09-15.log +1276 -0
- package/logs/http_server-error-2025-09-12.log +212 -0
- package/logs/http_server-error-2025-09-15.log +44 -0
- package/logs/index_manager-2025-09-12.log +5031 -0
- package/logs/index_manager-2025-09-15.log +2909 -0
- package/logs/index_manager-error-2025-09-12.log +80 -0
- package/logs/index_manager-error-2025-09-15.log +38 -0
- package/logs/insert_one-2025-09-12.log +2181 -0
- package/logs/insert_one-2025-09-15.log +1293 -0
- package/logs/insert_one-error-2025-09-12.log +0 -0
- package/logs/insert_one-error-2025-09-15.log +0 -0
- package/logs/master-2025-09-12.log +1882 -0
- package/logs/master-2025-09-15.log +910 -0
- package/logs/master-error-2025-09-12.log +80 -0
- package/logs/master-error-2025-09-15.log +0 -0
- package/logs/operation_dispatcher-2025-09-12.log +751 -0
- package/logs/operation_dispatcher-2025-09-15.log +359 -0
- package/logs/operation_dispatcher-error-2025-09-12.log +33 -0
- package/logs/operation_dispatcher-error-2025-09-15.log +11 -0
- package/logs/performance_monitor-2025-09-12.log +14889 -0
- package/logs/performance_monitor-2025-09-15.log +6803 -0
- package/logs/performance_monitor-error-2025-09-12.log +0 -0
- package/logs/performance_monitor-error-2025-09-15.log +0 -0
- package/logs/query_engine-2025-09-12.log +5310 -0
- package/logs/query_engine-2025-09-15.log +2639 -0
- package/logs/query_engine-error-2025-09-12.log +0 -0
- package/logs/query_engine-error-2025-09-15.log +0 -0
- package/logs/recovery_manager-2025-09-12.log +462 -0
- package/logs/recovery_manager-2025-09-15.log +210 -0
- package/logs/recovery_manager-error-2025-09-12.log +22 -0
- package/logs/recovery_manager-error-2025-09-15.log +10 -0
- package/logs/replication-2025-09-12.log +1923 -0
- package/logs/replication-2025-09-15.log +917 -0
- package/logs/replication-error-2025-09-12.log +33 -0
- package/logs/replication-error-2025-09-15.log +15 -0
- package/logs/server-2025-09-12.log +2601 -0
- package/logs/server-2025-09-15.log +1191 -0
- package/logs/server-error-2025-09-12.log +0 -0
- package/logs/server-error-2025-09-15.log +0 -0
- package/logs/tcp_protocol-2025-09-12.log +22 -0
- package/logs/tcp_protocol-2025-09-15.log +10 -0
- package/logs/tcp_protocol-error-2025-09-12.log +22 -0
- package/logs/tcp_protocol-error-2025-09-15.log +10 -0
- package/logs/test-2025-09-12.log +0 -0
- package/logs/test-2025-09-15.log +0 -0
- package/logs/test-error-2025-09-12.log +0 -0
- package/logs/test-error-2025-09-15.log +0 -0
- package/logs/update_one-2025-09-12.log +173 -0
- package/logs/update_one-2025-09-15.log +118 -0
- package/logs/update_one-error-2025-09-12.log +0 -0
- package/logs/update_one-error-2025-09-15.log +0 -0
- package/logs/worker-2025-09-12.log +1457 -0
- package/logs/worker-2025-09-15.log +695 -0
- package/logs/worker-error-2025-09-12.log +0 -0
- package/logs/worker-error-2025-09-15.log +0 -0
- package/logs/write_forwarder-2025-09-12.log +1956 -0
- package/logs/write_forwarder-2025-09-15.log +932 -0
- package/logs/write_forwarder-error-2025-09-12.log +66 -0
- package/logs/write_forwarder-error-2025-09-15.log +30 -0
- package/logs/write_queue-2025-09-12.log +612 -0
- package/logs/write_queue-2025-09-15.log +301 -0
- package/logs/write_queue-error-2025-09-12.log +184 -0
- package/logs/write_queue-error-2025-09-15.log +83 -0
- package/package.json +48 -0
- package/prompts/01-core-infrastructure.md +56 -0
- package/prompts/02-secondary-indexing.md +65 -0
- package/prompts/03-write-serialization.md +63 -0
- package/prompts/04-enhanced-authentication.md +75 -0
- package/prompts/05-comprehensive-admin-operations.md +75 -0
- package/prompts/06-backup-and-restore-system.md +106 -0
- package/prompts/07-production-safety-features.md +107 -0
- package/prompts/08-tcp-client-library.md +121 -0
- package/prompts/09-api-method-chaining.md +134 -0
- package/prompts/10-automatic-index-creation.md +223 -0
- package/prompts/11-operation-naming-consistency.md +268 -0
- package/prompts/12-tcp-replication-system.md +333 -0
- package/prompts/13-master-read-write-operations.md +57 -0
- package/prompts/14-index-upsert-operations.md +68 -0
- package/prompts/15-client-api-return-types.md +81 -0
- package/prompts/16-server-setup-ui.md +97 -0
- package/prompts/17-emergency-password-change.md +108 -0
- package/prompts/18-joystick-framework-integration.md +116 -0
- package/prompts/19-api-key-authentication-system.md +137 -0
- package/prompts/20-configurable-server-port.md +105 -0
- package/prompts/21-multi-database-support.md +161 -0
- package/prompts/FULL_TEXT_SEARCH.md +293 -0
- package/prompts/PROMPTS.md +158 -0
- package/prompts/README.md +221 -0
- package/prompts/TYPESCRIPT_GENERATION.md +179 -0
- package/src/client/database.js +166 -0
- package/src/client/index.js +752 -0
- package/src/server/cluster/index.js +53 -0
- package/src/server/cluster/master.js +774 -0
- package/src/server/cluster/worker.js +537 -0
- package/src/server/index.js +540 -0
- package/src/server/lib/api_key_manager.js +473 -0
- package/src/server/lib/auth_manager.js +375 -0
- package/src/server/lib/auto_index_manager.js +681 -0
- package/src/server/lib/backup_manager.js +650 -0
- package/src/server/lib/connection_manager.js +218 -0
- package/src/server/lib/disk_utils.js +118 -0
- package/src/server/lib/http_server.js +1165 -0
- package/src/server/lib/index_manager.js +756 -0
- package/src/server/lib/load_settings.js +143 -0
- package/src/server/lib/logger.js +135 -0
- package/src/server/lib/op_types.js +29 -0
- package/src/server/lib/operation_dispatcher.js +268 -0
- package/src/server/lib/operations/admin.js +808 -0
- package/src/server/lib/operations/bulk_write.js +367 -0
- package/src/server/lib/operations/create_index.js +68 -0
- package/src/server/lib/operations/delete_one.js +114 -0
- package/src/server/lib/operations/drop_index.js +58 -0
- package/src/server/lib/operations/find.js +340 -0
- package/src/server/lib/operations/find_one.js +319 -0
- package/src/server/lib/operations/get_indexes.js +52 -0
- package/src/server/lib/operations/insert_one.js +113 -0
- package/src/server/lib/operations/update_one.js +225 -0
- package/src/server/lib/performance_monitor.js +313 -0
- package/src/server/lib/query_engine.js +243 -0
- package/src/server/lib/recovery_manager.js +388 -0
- package/src/server/lib/replication_manager.js +727 -0
- package/src/server/lib/safe_json_parse.js +21 -0
- package/src/server/lib/send_response.js +47 -0
- package/src/server/lib/tcp_protocol.js +130 -0
- package/src/server/lib/write_forwarder.js +636 -0
- package/src/server/lib/write_queue.js +335 -0
- package/test_data/data.mdb +0 -0
- package/test_data/lock.mdb +0 -0
- package/tests/client/index.test.js +1232 -0
- package/tests/server/cluster/cluster.test.js +248 -0
- package/tests/server/cluster/master_read_write_operations.test.js +577 -0
- package/tests/server/index.test.js +651 -0
- package/tests/server/integration/authentication_integration.test.js +294 -0
- package/tests/server/integration/auto_indexing_integration.test.js +268 -0
- package/tests/server/integration/backup_integration.test.js +513 -0
- package/tests/server/integration/indexing_integration.test.js +126 -0
- package/tests/server/integration/production_safety_integration.test.js +358 -0
- package/tests/server/integration/replication_integration.test.js +227 -0
- package/tests/server/integration/write_serialization_integration.test.js +246 -0
- package/tests/server/lib/api_key_manager.test.js +516 -0
- package/tests/server/lib/auth_manager.test.js +317 -0
- package/tests/server/lib/auto_index_manager.test.js +275 -0
- package/tests/server/lib/backup_manager.test.js +238 -0
- package/tests/server/lib/connection_manager.test.js +221 -0
- package/tests/server/lib/disk_utils.test.js +63 -0
- package/tests/server/lib/http_server.test.js +389 -0
- package/tests/server/lib/index_manager.test.js +301 -0
- package/tests/server/lib/load_settings.test.js +107 -0
- package/tests/server/lib/load_settings_port_config.test.js +243 -0
- package/tests/server/lib/logger.test.js +282 -0
- package/tests/server/lib/operations/admin.test.js +638 -0
- package/tests/server/lib/operations/bulk_write.test.js +128 -0
- package/tests/server/lib/operations/create_index.test.js +138 -0
- package/tests/server/lib/operations/delete_one.test.js +52 -0
- package/tests/server/lib/operations/drop_index.test.js +72 -0
- package/tests/server/lib/operations/find.test.js +93 -0
- package/tests/server/lib/operations/find_one.test.js +91 -0
- package/tests/server/lib/operations/get_indexes.test.js +87 -0
- package/tests/server/lib/operations/insert_one.test.js +42 -0
- package/tests/server/lib/operations/update_one.test.js +89 -0
- package/tests/server/lib/performance_monitor.test.js +185 -0
- package/tests/server/lib/query_engine.test.js +46 -0
- package/tests/server/lib/recovery_manager.test.js +414 -0
- package/tests/server/lib/replication_manager.test.js +202 -0
- package/tests/server/lib/safe_json_parse.test.js +45 -0
- package/tests/server/lib/send_response.test.js +155 -0
- package/tests/server/lib/tcp_protocol.test.js +169 -0
- package/tests/server/lib/write_forwarder.test.js +258 -0
- package/tests/server/lib/write_queue.test.js +255 -0
- package/tsconfig.json +30 -0
- package/types/client/index.d.ts +447 -0
- package/types/server/cluster/index.d.ts +28 -0
- package/types/server/cluster/master.d.ts +115 -0
- package/types/server/cluster/worker.d.ts +1 -0
- package/types/server/lib/auth_manager.d.ts +13 -0
- package/types/server/lib/backup_manager.d.ts +43 -0
- package/types/server/lib/connection_manager.d.ts +15 -0
- package/types/server/lib/disk_utils.d.ts +3 -0
- package/types/server/lib/index_manager.d.ts +24 -0
- package/types/server/lib/load_settings.d.ts +4 -0
- package/types/server/lib/logger.d.ts +44 -0
- package/types/server/lib/op_types.d.ts +6 -0
- package/types/server/lib/performance_monitor.d.ts +68 -0
- package/types/server/lib/query_engine.d.ts +10 -0
- package/types/server/lib/safe_json_parse.d.ts +7 -0
- package/types/server/lib/send_response.d.ts +3 -0
- package/types/server/lib/tcp_protocol.d.ts +12 -0
- package/types/server/lib/write_queue.d.ts +2 -0
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import net from 'net';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import { encode as encode_messagepack, decode as decode_messagepack } from 'msgpackr';
|
|
5
|
+
import { create_server } from '../../../../src/server/index.js';
|
|
6
|
+
import { initialize_database, get_database, cleanup_database } from '../../../../src/server/lib/query_engine.js';
|
|
7
|
+
import { reset_auth_state } from '../../../../src/server/lib/auth_manager.js';
|
|
8
|
+
|
|
9
|
+
// Dynamic port allocation
|
|
10
|
+
let current_port = 4000;
|
|
11
|
+
const get_next_port = () => {
|
|
12
|
+
return ++current_port;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
let server;
|
|
16
|
+
let port;
|
|
17
|
+
|
|
18
|
+
test.beforeEach(async () => {
|
|
19
|
+
// Reset auth state
|
|
20
|
+
reset_auth_state();
|
|
21
|
+
|
|
22
|
+
// Initialize test database and clear it for clean state between tests
|
|
23
|
+
initialize_database('./test_data');
|
|
24
|
+
try {
|
|
25
|
+
const db = get_database();
|
|
26
|
+
db.clearSync();
|
|
27
|
+
} catch (error) {
|
|
28
|
+
// Ignore errors during cleanup
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Create server with dynamic port
|
|
32
|
+
const test_port = get_next_port();
|
|
33
|
+
server = await create_server();
|
|
34
|
+
|
|
35
|
+
// Start server on specific port
|
|
36
|
+
await new Promise((resolve) => {
|
|
37
|
+
server.listen(test_port, () => {
|
|
38
|
+
port = test_port;
|
|
39
|
+
setTimeout(resolve, 100);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test.afterEach(async () => {
|
|
45
|
+
if (server) {
|
|
46
|
+
await server.cleanup();
|
|
47
|
+
server.close();
|
|
48
|
+
server = null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Clean up auth state after each test
|
|
52
|
+
reset_auth_state();
|
|
53
|
+
|
|
54
|
+
// Clean up database
|
|
55
|
+
await cleanup_database();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const create_client = () => {
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
const client = net.createConnection(port, 'localhost');
|
|
61
|
+
|
|
62
|
+
client.on('connect', () => {
|
|
63
|
+
resolve(client);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
client.on('error', reject);
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const send_message = (client, message) => {
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
// Encode the message object directly (not as JSON string first)
|
|
73
|
+
const encoded_message = encode_messagepack(message);
|
|
74
|
+
const length_buffer = Buffer.alloc(4);
|
|
75
|
+
length_buffer.writeUInt32BE(encoded_message.length, 0);
|
|
76
|
+
|
|
77
|
+
let response_data = Buffer.alloc(0);
|
|
78
|
+
let expected_length = null;
|
|
79
|
+
let header_received = false;
|
|
80
|
+
|
|
81
|
+
const handle_data = (data) => {
|
|
82
|
+
response_data = Buffer.concat([response_data, data]);
|
|
83
|
+
|
|
84
|
+
if (!header_received && response_data.length >= 4) {
|
|
85
|
+
expected_length = response_data.readUInt32BE(0);
|
|
86
|
+
header_received = true;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (header_received && response_data.length >= expected_length + 4) {
|
|
90
|
+
client.removeListener('data', handle_data);
|
|
91
|
+
const message_data = response_data.slice(4, expected_length + 4);
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
const response = decode_messagepack(message_data);
|
|
95
|
+
resolve(response);
|
|
96
|
+
} catch (error) {
|
|
97
|
+
reject(new Error(`Failed to parse response: ${error.message}`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
client.on('data', handle_data);
|
|
103
|
+
client.write(Buffer.concat([length_buffer, encoded_message]));
|
|
104
|
+
|
|
105
|
+
setTimeout(() => {
|
|
106
|
+
client.removeListener('data', handle_data);
|
|
107
|
+
reject(new Error('Response timeout'));
|
|
108
|
+
}, 5000);
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const authenticate_client = async (client) => {
|
|
113
|
+
// First setup authentication
|
|
114
|
+
const setup_response = await send_message(client, {
|
|
115
|
+
op: 'setup',
|
|
116
|
+
data: {}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
if (!setup_response.ok) {
|
|
120
|
+
throw new Error(`Setup failed: ${JSON.stringify(setup_response.error || setup_response)}`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const password = setup_response.password;
|
|
124
|
+
if (!password) {
|
|
125
|
+
throw new Error(`Setup response did not contain password: ${JSON.stringify(setup_response)}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Then authenticate
|
|
129
|
+
const auth_response = await send_message(client, {
|
|
130
|
+
op: 'authentication',
|
|
131
|
+
data: { password }
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
if (!auth_response.ok) {
|
|
135
|
+
throw new Error(`Authentication failed: ${JSON.stringify(auth_response.error || auth_response)}`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return password;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
test('admin operation - default (backward compatibility)', async (t) => {
|
|
142
|
+
const client = await create_client();
|
|
143
|
+
await authenticate_client(client);
|
|
144
|
+
|
|
145
|
+
const response = await send_message(client, {
|
|
146
|
+
op: 'admin',
|
|
147
|
+
data: {}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
t.is(response.ok, true);
|
|
151
|
+
t.truthy(response.server);
|
|
152
|
+
t.truthy(response.database);
|
|
153
|
+
t.truthy(response.connections);
|
|
154
|
+
t.truthy(response.authentication);
|
|
155
|
+
t.truthy(response.settings);
|
|
156
|
+
|
|
157
|
+
// Check server info
|
|
158
|
+
t.is(typeof response.server.uptime, 'number');
|
|
159
|
+
t.is(typeof response.server.uptime_formatted, 'string');
|
|
160
|
+
t.truthy(response.server.memory_usage);
|
|
161
|
+
t.is(typeof response.server.node_version, 'string');
|
|
162
|
+
t.is(typeof response.server.platform, 'string');
|
|
163
|
+
t.is(typeof response.server.pid, 'number');
|
|
164
|
+
|
|
165
|
+
// Check database info
|
|
166
|
+
t.is(typeof response.database.total_documents, 'number');
|
|
167
|
+
t.is(typeof response.database.total_collections, 'number');
|
|
168
|
+
t.truthy(response.database.stats);
|
|
169
|
+
t.is(typeof response.database.map_size_usage_percent, 'number');
|
|
170
|
+
|
|
171
|
+
client.end();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test('admin operation - stats action', async (t) => {
|
|
175
|
+
const client = await create_client();
|
|
176
|
+
await authenticate_client(client);
|
|
177
|
+
|
|
178
|
+
const response = await send_message(client, {
|
|
179
|
+
op: 'admin',
|
|
180
|
+
data: { admin_action: 'stats' }
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
t.is(response.ok, 1);
|
|
184
|
+
t.truthy(response.server);
|
|
185
|
+
t.truthy(response.database);
|
|
186
|
+
t.truthy(response.performance);
|
|
187
|
+
t.truthy(response.connections);
|
|
188
|
+
t.truthy(response.write_queue);
|
|
189
|
+
t.truthy(response.authentication);
|
|
190
|
+
|
|
191
|
+
// Check performance metrics
|
|
192
|
+
t.is(typeof response.performance.ops_per_second, 'number');
|
|
193
|
+
t.is(typeof response.performance.avg_response_time_ms, 'number');
|
|
194
|
+
|
|
195
|
+
// Check enhanced database info
|
|
196
|
+
t.is(typeof response.database.map_size_mb, 'number');
|
|
197
|
+
t.is(typeof response.database.used_space_mb, 'number');
|
|
198
|
+
t.is(typeof response.database.usage_percent, 'number');
|
|
199
|
+
|
|
200
|
+
client.end();
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test('admin operation - list_collections action', async (t) => {
|
|
204
|
+
const client = await create_client();
|
|
205
|
+
await authenticate_client(client);
|
|
206
|
+
|
|
207
|
+
// Insert some test data first
|
|
208
|
+
await send_message(client, {
|
|
209
|
+
op: 'insert_one',
|
|
210
|
+
data: {
|
|
211
|
+
collection: 'test_collection',
|
|
212
|
+
document: { name: 'test', value: 123 }
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
await send_message(client, {
|
|
217
|
+
op: 'insert_one',
|
|
218
|
+
data: {
|
|
219
|
+
collection: 'another_collection',
|
|
220
|
+
document: { title: 'test', count: 456 }
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const response = await send_message(client, {
|
|
225
|
+
op: 'admin',
|
|
226
|
+
data: { admin_action: 'list_collections' }
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
t.is(response.ok, 1);
|
|
230
|
+
t.truthy(response.collections);
|
|
231
|
+
t.is(typeof response.total_collections, 'number');
|
|
232
|
+
t.is(typeof response.total_documents, 'number');
|
|
233
|
+
t.true(response.total_collections >= 2);
|
|
234
|
+
t.true(response.total_documents >= 2);
|
|
235
|
+
|
|
236
|
+
// Check collection structure
|
|
237
|
+
const test_collection = response.collections.find(col => col.name === 'test_collection');
|
|
238
|
+
t.truthy(test_collection);
|
|
239
|
+
t.is(typeof test_collection.document_count, 'number');
|
|
240
|
+
t.true(Array.isArray(test_collection.indexes));
|
|
241
|
+
t.is(typeof test_collection.estimated_size_bytes, 'number');
|
|
242
|
+
|
|
243
|
+
client.end();
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test('admin operation - list_documents action', async (t) => {
|
|
247
|
+
const client = await create_client();
|
|
248
|
+
await authenticate_client(client);
|
|
249
|
+
|
|
250
|
+
// Insert test documents
|
|
251
|
+
const test_docs = [
|
|
252
|
+
{ name: 'doc1', value: 100 },
|
|
253
|
+
{ name: 'doc2', value: 200 },
|
|
254
|
+
{ name: 'doc3', value: 300 }
|
|
255
|
+
];
|
|
256
|
+
|
|
257
|
+
for (const doc of test_docs) {
|
|
258
|
+
await send_message(client, {
|
|
259
|
+
op: 'insert_one',
|
|
260
|
+
data: {
|
|
261
|
+
collection: 'list_test',
|
|
262
|
+
document: doc
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const response = await send_message(client, {
|
|
268
|
+
op: 'admin',
|
|
269
|
+
data: {
|
|
270
|
+
admin_action: 'list_documents',
|
|
271
|
+
collection: 'list_test',
|
|
272
|
+
limit: 2
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
t.is(response.ok, 1);
|
|
277
|
+
t.is(response.collection, 'list_test');
|
|
278
|
+
t.true(Array.isArray(response.documents));
|
|
279
|
+
t.is(response.documents.length, 2);
|
|
280
|
+
t.is(response.count, 2);
|
|
281
|
+
t.is(response.skip, 0);
|
|
282
|
+
t.is(response.limit, 2);
|
|
283
|
+
t.is(response.has_more, true);
|
|
284
|
+
|
|
285
|
+
// Check document structure
|
|
286
|
+
const first_doc = response.documents[0];
|
|
287
|
+
t.truthy(first_doc._id);
|
|
288
|
+
t.truthy(first_doc.name);
|
|
289
|
+
t.is(typeof first_doc.value, 'number');
|
|
290
|
+
|
|
291
|
+
client.end();
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
test('admin operation - list_documents with pagination', async (t) => {
|
|
295
|
+
const client = await create_client();
|
|
296
|
+
await authenticate_client(client);
|
|
297
|
+
|
|
298
|
+
// Insert test documents for pagination
|
|
299
|
+
const test_docs = [
|
|
300
|
+
{ name: 'page_doc1', value: 100 },
|
|
301
|
+
{ name: 'page_doc2', value: 200 },
|
|
302
|
+
{ name: 'page_doc3', value: 300 }
|
|
303
|
+
];
|
|
304
|
+
|
|
305
|
+
for (const doc of test_docs) {
|
|
306
|
+
await send_message(client, {
|
|
307
|
+
op: 'insert_one',
|
|
308
|
+
data: {
|
|
309
|
+
collection: 'pagination_test',
|
|
310
|
+
document: doc
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Test pagination
|
|
316
|
+
const response = await send_message(client, {
|
|
317
|
+
op: 'admin',
|
|
318
|
+
data: {
|
|
319
|
+
admin_action: 'list_documents',
|
|
320
|
+
collection: 'pagination_test',
|
|
321
|
+
limit: 1,
|
|
322
|
+
skip: 1
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
t.is(response.ok, 1);
|
|
327
|
+
t.is(response.documents.length, 1);
|
|
328
|
+
t.is(response.skip, 1);
|
|
329
|
+
t.is(response.limit, 1);
|
|
330
|
+
|
|
331
|
+
client.end();
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
test('admin operation - get_document action', async (t) => {
|
|
335
|
+
const client = await create_client();
|
|
336
|
+
await authenticate_client(client);
|
|
337
|
+
|
|
338
|
+
// Insert a test document
|
|
339
|
+
const insert_response = await send_message(client, {
|
|
340
|
+
op: 'insert_one',
|
|
341
|
+
data: {
|
|
342
|
+
collection: 'get_test',
|
|
343
|
+
document: { name: 'specific_doc', value: 999 }
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
const document_id = insert_response.inserted_id;
|
|
348
|
+
|
|
349
|
+
const response = await send_message(client, {
|
|
350
|
+
op: 'admin',
|
|
351
|
+
data: {
|
|
352
|
+
admin_action: 'get_document',
|
|
353
|
+
collection: 'get_test',
|
|
354
|
+
document_id
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
t.is(response.ok, 1);
|
|
359
|
+
t.is(response.found, true);
|
|
360
|
+
t.is(response.collection, 'get_test');
|
|
361
|
+
t.is(response.document_id, document_id);
|
|
362
|
+
t.truthy(response.document);
|
|
363
|
+
t.is(response.document._id, document_id);
|
|
364
|
+
t.is(response.document.name, 'specific_doc');
|
|
365
|
+
t.is(response.document.value, 999);
|
|
366
|
+
|
|
367
|
+
client.end();
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
test('admin operation - get_document not found', async (t) => {
|
|
371
|
+
const client = await create_client();
|
|
372
|
+
await authenticate_client(client);
|
|
373
|
+
|
|
374
|
+
const response = await send_message(client, {
|
|
375
|
+
op: 'admin',
|
|
376
|
+
data: {
|
|
377
|
+
admin_action: 'get_document',
|
|
378
|
+
collection: 'get_test',
|
|
379
|
+
document_id: 'nonexistent'
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
t.is(response.ok, 1);
|
|
384
|
+
t.is(response.found, false);
|
|
385
|
+
t.is(response.collection, 'get_test');
|
|
386
|
+
t.is(response.document_id, 'nonexistent');
|
|
387
|
+
|
|
388
|
+
client.end();
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
test('admin operation - query_documents action', async (t) => {
|
|
392
|
+
const client = await create_client();
|
|
393
|
+
await authenticate_client(client);
|
|
394
|
+
|
|
395
|
+
// Insert test documents with different values
|
|
396
|
+
const test_docs = [
|
|
397
|
+
{ category: 'A', score: 85 },
|
|
398
|
+
{ category: 'B', score: 92 },
|
|
399
|
+
{ category: 'A', score: 78 },
|
|
400
|
+
{ category: 'C', score: 95 }
|
|
401
|
+
];
|
|
402
|
+
|
|
403
|
+
for (const doc of test_docs) {
|
|
404
|
+
await send_message(client, {
|
|
405
|
+
op: 'insert_one',
|
|
406
|
+
data: {
|
|
407
|
+
collection: 'query_test',
|
|
408
|
+
document: doc
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Query for category 'A'
|
|
414
|
+
const response = await send_message(client, {
|
|
415
|
+
op: 'admin',
|
|
416
|
+
data: {
|
|
417
|
+
admin_action: 'query_documents',
|
|
418
|
+
collection: 'query_test',
|
|
419
|
+
filter: { category: 'A' }
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
t.is(response.ok, 1);
|
|
424
|
+
t.is(response.collection, 'query_test');
|
|
425
|
+
t.deepEqual(response.filter, { category: 'A' });
|
|
426
|
+
t.true(Array.isArray(response.documents));
|
|
427
|
+
t.is(response.documents.length, 2);
|
|
428
|
+
t.is(typeof response.total_examined, 'number');
|
|
429
|
+
t.true(response.total_examined >= 2);
|
|
430
|
+
|
|
431
|
+
// Check that all returned documents match the filter
|
|
432
|
+
response.documents.forEach(doc => {
|
|
433
|
+
t.is(doc.category, 'A');
|
|
434
|
+
t.truthy(doc._id);
|
|
435
|
+
t.is(typeof doc.score, 'number');
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
client.end();
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
test('admin operation - query_documents with operators', async (t) => {
|
|
442
|
+
const client = await create_client();
|
|
443
|
+
await authenticate_client(client);
|
|
444
|
+
|
|
445
|
+
// Query with $gt operator
|
|
446
|
+
const response = await send_message(client, {
|
|
447
|
+
op: 'admin',
|
|
448
|
+
data: {
|
|
449
|
+
admin_action: 'query_documents',
|
|
450
|
+
collection: 'query_test',
|
|
451
|
+
filter: { score: { $gt: 90 } }
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
t.is(response.ok, 1);
|
|
456
|
+
t.true(Array.isArray(response.documents));
|
|
457
|
+
|
|
458
|
+
// All returned documents should have score > 90
|
|
459
|
+
response.documents.forEach(doc => {
|
|
460
|
+
t.true(doc.score > 90);
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
client.end();
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
test('admin operation - insert_document action', async (t) => {
|
|
467
|
+
const client = await create_client();
|
|
468
|
+
await authenticate_client(client);
|
|
469
|
+
|
|
470
|
+
const response = await send_message(client, {
|
|
471
|
+
op: 'admin',
|
|
472
|
+
data: {
|
|
473
|
+
admin_action: 'insert_document',
|
|
474
|
+
collection: 'admin_insert_test',
|
|
475
|
+
document: { name: 'admin_inserted', value: 777 }
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
t.is(response.ok, 1);
|
|
480
|
+
t.truthy(response.inserted_id);
|
|
481
|
+
t.is(response.acknowledged, true);
|
|
482
|
+
|
|
483
|
+
// Verify the document was inserted
|
|
484
|
+
const verify_response = await send_message(client, {
|
|
485
|
+
op: 'find_one',
|
|
486
|
+
data: {
|
|
487
|
+
collection: 'admin_insert_test',
|
|
488
|
+
filter: { name: 'admin_inserted' }
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
t.is(verify_response.ok, 1);
|
|
493
|
+
t.truthy(verify_response.document);
|
|
494
|
+
t.is(verify_response.document.name, 'admin_inserted');
|
|
495
|
+
t.is(verify_response.document.value, 777);
|
|
496
|
+
|
|
497
|
+
client.end();
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
test('admin operation - update_document action', async (t) => {
|
|
501
|
+
const client = await create_client();
|
|
502
|
+
await authenticate_client(client);
|
|
503
|
+
|
|
504
|
+
// Insert a document to update
|
|
505
|
+
const insert_response = await send_message(client, {
|
|
506
|
+
op: 'insert_one',
|
|
507
|
+
data: {
|
|
508
|
+
collection: 'admin_update_test',
|
|
509
|
+
document: { name: 'to_update', value: 100 }
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
const response = await send_message(client, {
|
|
514
|
+
op: 'admin',
|
|
515
|
+
data: {
|
|
516
|
+
admin_action: 'update_document',
|
|
517
|
+
collection: 'admin_update_test',
|
|
518
|
+
filter: { name: 'to_update' },
|
|
519
|
+
update: { $set: { value: 200, updated: true } }
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
t.is(response.ok, 1);
|
|
524
|
+
t.is(response.matched_count, 1);
|
|
525
|
+
t.is(response.modified_count, 1);
|
|
526
|
+
t.is(response.acknowledged, true);
|
|
527
|
+
|
|
528
|
+
// Verify the update
|
|
529
|
+
const verify_response = await send_message(client, {
|
|
530
|
+
op: 'find_one',
|
|
531
|
+
data: {
|
|
532
|
+
collection: 'admin_update_test',
|
|
533
|
+
filter: { name: 'to_update' }
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
t.is(verify_response.ok, 1);
|
|
538
|
+
t.is(verify_response.document.value, 200);
|
|
539
|
+
t.is(verify_response.document.updated, true);
|
|
540
|
+
|
|
541
|
+
client.end();
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
test('admin operation - delete_document action', async (t) => {
|
|
545
|
+
const client = await create_client();
|
|
546
|
+
await authenticate_client(client);
|
|
547
|
+
|
|
548
|
+
// Insert a document to delete
|
|
549
|
+
await send_message(client, {
|
|
550
|
+
op: 'insert_one',
|
|
551
|
+
data: {
|
|
552
|
+
collection: 'admin_delete_test',
|
|
553
|
+
document: { name: 'to_delete', value: 100 }
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
const response = await send_message(client, {
|
|
558
|
+
op: 'admin',
|
|
559
|
+
data: {
|
|
560
|
+
admin_action: 'delete_document',
|
|
561
|
+
collection: 'admin_delete_test',
|
|
562
|
+
filter: { name: 'to_delete' }
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
t.is(response.ok, 1);
|
|
567
|
+
t.is(response.deleted_count, 1);
|
|
568
|
+
t.is(response.acknowledged, true);
|
|
569
|
+
|
|
570
|
+
// Verify the document was deleted
|
|
571
|
+
const verify_response = await send_message(client, {
|
|
572
|
+
op: 'find_one',
|
|
573
|
+
data: {
|
|
574
|
+
collection: 'admin_delete_test',
|
|
575
|
+
filter: { name: 'to_delete' }
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
|
|
579
|
+
t.is(verify_response.ok, 1);
|
|
580
|
+
t.is(verify_response.document, null);
|
|
581
|
+
|
|
582
|
+
client.end();
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
test('admin operation - authentication required', async (t) => {
|
|
586
|
+
const client = await create_client();
|
|
587
|
+
|
|
588
|
+
// Try admin operation without authentication
|
|
589
|
+
const response = await send_message(client, {
|
|
590
|
+
op: 'admin',
|
|
591
|
+
data: { admin_action: 'stats' }
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
t.is(response.ok, false);
|
|
595
|
+
t.truthy(response.error);
|
|
596
|
+
t.true(response.error.includes('Authentication required'));
|
|
597
|
+
|
|
598
|
+
client.end();
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
test('admin operation - invalid collection name', async (t) => {
|
|
602
|
+
const client = await create_client();
|
|
603
|
+
await authenticate_client(client);
|
|
604
|
+
|
|
605
|
+
const response = await send_message(client, {
|
|
606
|
+
op: 'admin',
|
|
607
|
+
data: {
|
|
608
|
+
admin_action: 'list_documents'
|
|
609
|
+
// Missing collection parameter
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
|
|
613
|
+
t.is(response.ok, 0);
|
|
614
|
+
t.truthy(response.error);
|
|
615
|
+
t.true(response.error.includes('Collection name is required'));
|
|
616
|
+
|
|
617
|
+
client.end();
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
test('admin operation - error handling', async (t) => {
|
|
621
|
+
const client = await create_client();
|
|
622
|
+
await authenticate_client(client);
|
|
623
|
+
|
|
624
|
+
const response = await send_message(client, {
|
|
625
|
+
op: 'admin',
|
|
626
|
+
data: {
|
|
627
|
+
admin_action: 'get_document',
|
|
628
|
+
collection: 'test'
|
|
629
|
+
// Missing document_id parameter
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
t.is(response.ok, 0);
|
|
634
|
+
t.truthy(response.error);
|
|
635
|
+
t.true(response.error.includes('Collection name and document ID are required'));
|
|
636
|
+
|
|
637
|
+
client.end();
|
|
638
|
+
});
|