From 9e38f90ff4bac34bb0a3b53bd95f7e1cd7e8c76b Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 9 Jan 2025 11:49:34 +0100 Subject: [PATCH 01/22] feat: add mockserver module --- package-lock.json | 595 +++++++++++++++++- packages/modules/mockserver/jest.config.ts | 11 + packages/modules/mockserver/package.json | 39 ++ packages/modules/mockserver/src/index.ts | 1 + .../src/mockserver-container.test.ts | 31 + .../mockserver/src/mockserver-container.ts | 27 + .../modules/mockserver/tsconfig.build.json | 13 + packages/modules/mockserver/tsconfig.json | 21 + 8 files changed, 709 insertions(+), 29 deletions(-) create mode 100644 packages/modules/mockserver/jest.config.ts create mode 100644 packages/modules/mockserver/package.json create mode 100644 packages/modules/mockserver/src/index.ts create mode 100644 packages/modules/mockserver/src/mockserver-container.test.ts create mode 100644 packages/modules/mockserver/src/mockserver-container.ts create mode 100644 packages/modules/mockserver/tsconfig.build.json create mode 100644 packages/modules/mockserver/tsconfig.json diff --git a/package-lock.json b/package-lock.json index bea730605..8be22eff6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5756,6 +5756,10 @@ "resolved": "packages/modules/mariadb", "link": true }, + "node_modules/@testcontainers/mockserver": { + "resolved": "packages/modules/mockserver", + "link": true + }, "node_modules/@testcontainers/mongodb": { "resolved": "packages/modules/mongodb", "link": true @@ -6003,6 +6007,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/couchbase": { "version": "2.4.9", "resolved": "https://registry.npmjs.org/@types/couchbase/-/couchbase-2.4.9.tgz", @@ -6152,6 +6163,13 @@ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", "dev": true }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -6381,6 +6399,19 @@ "@types/node": "*" } }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, "node_modules/@types/tar": { "version": "6.1.13", "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.13.tgz", @@ -7717,6 +7748,13 @@ "node": ">=8" } }, + "node_modules/browser-or-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", + "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", + "dev": true, + "license": "MIT" + }, "node_modules/browserslist": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", @@ -7828,6 +7866,20 @@ "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==", "dev": true }, + "node_modules/bufferutil": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", + "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/buildcheck": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", @@ -7978,6 +8030,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -8498,6 +8581,16 @@ "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "dev": true }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/compress-commons": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", @@ -8640,6 +8733,13 @@ "node": ">= 0.6" } }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -8848,6 +8948,20 @@ "node": ">=4" } }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -9217,6 +9331,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexify": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", @@ -9412,13 +9541,11 @@ "dev": true }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -9504,6 +9631,49 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -9675,6 +9845,22 @@ "node": ">=4.0" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -9765,6 +9951,17 @@ "node": ">=0.10.0" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -9841,6 +10038,16 @@ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "dev": true }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -9937,6 +10144,13 @@ "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", "dev": true }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-xml-parser": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", @@ -10212,6 +10426,21 @@ "node": ">= 14.17" } }, + "node_modules/formidable": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", + "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^2.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/fp-and-or": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", @@ -11267,16 +11496,22 @@ "dev": true }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -11319,6 +11554,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stdin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", @@ -11554,12 +11803,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11715,10 +11965,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11798,6 +12049,16 @@ "readable-stream": "^3.6.0" } }, + "node_modules/hexoid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz", + "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", @@ -14527,6 +14788,16 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -14558,6 +14829,16 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -14919,6 +15200,21 @@ "node": ">=10" } }, + "node_modules/mockserver-client": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/mockserver-client/-/mockserver-client-5.15.0.tgz", + "integrity": "sha512-t0DiypyKH60cX1L9ubUMNnJz+XxmwTYHVdFePQMUNnrwBgERcA5WNqKyuttxRMf7P/WiWO3nWHNHSlPirIFEPw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "browser-or-node": "~2.1.1", + "q": "~2.0.3", + "websocket": "~1.0.34" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/mongodb-connection-string-url": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", @@ -15364,6 +15660,13 @@ "integrity": "sha512-tta/zBfbjm24uGgumckYgVxqnTDenPNo2BQwy+eOD7H2tn9oP3U/OikzOvQuRzfRkRtag0ynrTjXw0JsAXZJkw==", "dev": true }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true, + "license": "ISC" + }, "node_modules/nkeys.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/nkeys.js/-/nkeys.js-1.1.0.tgz", @@ -15473,6 +15776,18 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-gyp/node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -16120,10 +16435,14 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16889,6 +17208,13 @@ "node": ">=8" } }, + "node_modules/pop-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", + "integrity": "sha512-HRCx4+KJE30JhX84wBN4+vja9bNfysxg1y28l0DuJmkoaICiv2ZSilKddbS48pq50P8d2erAhqDLbp47yv3MbQ==", + "dev": true, + "license": "MIT" + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -17316,6 +17642,35 @@ } ] }, + "node_modules/q": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", + "integrity": "sha512-gv6vLGcmAOg96/fgo3d9tvA4dJNZL3fMyBqVRrGxQ+Q/o4k9QzbJ3NQF9cOO/71wRodoXhaPgphvMFU68qVAJQ==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "^2.0.0", + "pop-iterate": "^1.0.1", + "weak-map": "^1.0.5" + } + }, + "node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -18094,14 +18449,76 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18767,6 +19184,40 @@ "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", "dev": true }, + "node_modules/superagent": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.1.1.tgz", + "integrity": "sha512-9pIwrHrOj3uAnqg9gDlW7EA2xv+N5au/dSM0kM22HTqmUu8jBxNT+8uA7tA3UoCnmiqzpSbu8rasIUZvbyamMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -19405,6 +19856,13 @@ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", "dev": true }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true, + "license": "ISC" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -19734,6 +20192,20 @@ "requires-port": "^1.0.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -19805,6 +20277,13 @@ "makeerror": "1.0.12" } }, + "node_modules/weak-map": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", + "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/weaviate-ts-client": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/weaviate-ts-client/-/weaviate-ts-client-2.2.0.tgz", @@ -19840,6 +20319,24 @@ "node": ">=12" } }, + "node_modules/websocket": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", + "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.63", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -19863,6 +20360,23 @@ "node": ">=0.8.0" } }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", @@ -20174,6 +20688,16 @@ "node": ">=10" } }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.32" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -20499,6 +21023,19 @@ "mariadb": "^3.4.0" } }, + "packages/modules/mockserver": { + "name": "@testcontainers/mockserver", + "version": "10.16.0", + "license": "MIT", + "dependencies": { + "testcontainers": "^10.16.0" + }, + "devDependencies": { + "@types/superagent": "^8.1.9", + "mockserver-client": "^5.15.0", + "superagent": "^10.1.1" + } + }, "packages/modules/mongodb": { "name": "@testcontainers/mongodb", "version": "10.16.0", diff --git a/packages/modules/mockserver/jest.config.ts b/packages/modules/mockserver/jest.config.ts new file mode 100644 index 000000000..1f677baaf --- /dev/null +++ b/packages/modules/mockserver/jest.config.ts @@ -0,0 +1,11 @@ +import type { Config } from "jest"; +import * as path from "path"; + +const config: Config = { + preset: "ts-jest", + moduleNameMapper: { + "^testcontainers$": path.resolve(__dirname, "../../testcontainers/src"), + }, +}; + +export default config; diff --git a/packages/modules/mockserver/package.json b/packages/modules/mockserver/package.json new file mode 100644 index 000000000..29bfe719b --- /dev/null +++ b/packages/modules/mockserver/package.json @@ -0,0 +1,39 @@ +{ + "name": "@testcontainers/mockserver", + "version": "10.16.0", + "description": "Mockserver module for Testcontainers", + "main": "build/index.js", + "devDependencies": { + "@types/superagent": "^8.1.9", + "mockserver-client": "^5.15.0", + "superagent": "^10.1.1" + }, + "scripts": { + "prepack": "shx cp ../../../README.md . && shx cp ../../../LICENSE .", + "build": "tsc --project tsconfig.build.json" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/testcontainers/testcontainers-node.git" + }, + "files": [ + "build" + ], + "keywords": [ + "mockserver", + "testing", + "docker", + "testcontainers" + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/testcontainers/testcontainers-node/issues" + }, + "homepage": "https://github.com/testcontainers/testcontainers-node#readme", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "testcontainers": "^10.16.0" + } +} diff --git a/packages/modules/mockserver/src/index.ts b/packages/modules/mockserver/src/index.ts new file mode 100644 index 000000000..f3befd08f --- /dev/null +++ b/packages/modules/mockserver/src/index.ts @@ -0,0 +1 @@ +export { MockserverContainer, StartedMockserverContainer } from "./mockserver-container"; \ No newline at end of file diff --git a/packages/modules/mockserver/src/mockserver-container.test.ts b/packages/modules/mockserver/src/mockserver-container.test.ts new file mode 100644 index 000000000..5dbdb86a7 --- /dev/null +++ b/packages/modules/mockserver/src/mockserver-container.test.ts @@ -0,0 +1,31 @@ +import { mockServerClient } from "mockserver-client"; +import superagent from "superagent"; +import { MockserverContainer } from "./mockserver-container"; + +describe.only("MockserverContainer", () => { + jest.setTimeout(240_000); + + it("should start and accept mocks", async () => { + const container = await new MockserverContainer().start(); + const client = mockServerClient(container.getHost(), container.getMockserverPort()); + const url = container.getUrl(); + + await client.mockAnyResponse({ + httpRequest: { + method: "GET", + path: "/foo", + }, + httpResponse: { + body: { + string: "bar", + }, + statusCode: 200, + }, + }); + + const response = await superagent.get(`${url}/foo`); + + expect(response.statusCode).toBe(200); + expect(response.text).toBe("bar"); + }); +}); diff --git a/packages/modules/mockserver/src/mockserver-container.ts b/packages/modules/mockserver/src/mockserver-container.ts new file mode 100644 index 000000000..764497dc6 --- /dev/null +++ b/packages/modules/mockserver/src/mockserver-container.ts @@ -0,0 +1,27 @@ +import { AbstractStartedContainer, GenericContainer, Wait } from "testcontainers"; + +export class StartedMockserverContainer extends AbstractStartedContainer { + getMockserverPort(): number { + return this.getFirstMappedPort(); + } + + getUrl(): string { + return `http://${this.getHost()}:${this.getFirstMappedPort()}`; + } +} + +const MOCKSERVER_PORT = 1080; + +export class MockserverContainer extends GenericContainer { + constructor(image = "mockserver/mockserver:5.15.0") { + super(image); + + this.withWaitStrategy(Wait.forAll([Wait.forLogMessage(/started on port: 1080/)])).withStartupTimeout(120_000); + } + + override async start(): Promise { + this.withExposedPorts(MOCKSERVER_PORT); + + return new StartedMockserverContainer(await super.start()); + } +} diff --git a/packages/modules/mockserver/tsconfig.build.json b/packages/modules/mockserver/tsconfig.build.json new file mode 100644 index 000000000..0222f6ff1 --- /dev/null +++ b/packages/modules/mockserver/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "build", + "jest.config.ts", + "src/**/*.test.ts" + ], + "references": [ + { + "path": "../../testcontainers" + } + ] +} \ No newline at end of file diff --git a/packages/modules/mockserver/tsconfig.json b/packages/modules/mockserver/tsconfig.json new file mode 100644 index 000000000..39b165817 --- /dev/null +++ b/packages/modules/mockserver/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "paths": { + "testcontainers": [ + "../../testcontainers/src" + ] + } + }, + "exclude": [ + "build", + "jest.config.ts" + ], + "references": [ + { + "path": "../../testcontainers" + } + ] +} \ No newline at end of file From b74d0bcbd99e94139b8ca209658c49ec2c771587 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 9 Jan 2025 11:57:05 +0100 Subject: [PATCH 02/22] docs: add docs I've copied the description from https://testcontainers.com/modules/mockserve/ --- docs/modules/mockserver.md | 15 +++++++++++++++ mkdocs.yml | 1 + .../mockserver/src/mockserver-container.test.ts | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 docs/modules/mockserver.md diff --git a/docs/modules/mockserver.md b/docs/modules/mockserver.md new file mode 100644 index 000000000..bde009ab9 --- /dev/null +++ b/docs/modules/mockserver.md @@ -0,0 +1,15 @@ +# Mockserver Module + +[MockServer](https://www.mock-server.com/#what-is-mockserver) allows you to mock any server or service via HTTP or HTTPS, such as a REST or RPC service. + +## Install + +```bash +npm install @testcontainers/mockserver --save-dev +``` + +## Examples + + +[Start container:](../../packages/modules/mockserver/src/mockserver-container.test.ts) inside_block:startContainer + diff --git a/mkdocs.yml b/mkdocs.yml index 65cdb41c4..1d5481a23 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -54,6 +54,7 @@ nav: - Kafka: modules/kafka.md - Localstack: modules/localstack.md - MariaDB: modules/mariadb.md + - Mockserver: modules/mockserver.md - MongoDB: modules/mongodb.md - MSSQLServer: modules/mssqlserver.md - MySQL: modules/mysql.md diff --git a/packages/modules/mockserver/src/mockserver-container.test.ts b/packages/modules/mockserver/src/mockserver-container.test.ts index 5dbdb86a7..4ca22ff1c 100644 --- a/packages/modules/mockserver/src/mockserver-container.test.ts +++ b/packages/modules/mockserver/src/mockserver-container.test.ts @@ -5,6 +5,7 @@ import { MockserverContainer } from "./mockserver-container"; describe.only("MockserverContainer", () => { jest.setTimeout(240_000); + // startContainer { it("should start and accept mocks", async () => { const container = await new MockserverContainer().start(); const client = mockServerClient(container.getHost(), container.getMockserverPort()); @@ -28,4 +29,5 @@ describe.only("MockserverContainer", () => { expect(response.statusCode).toBe(200); expect(response.text).toBe("bar"); }); + // } }); From cd8d643689f5c5937e4267548223da45cd4bfb83 Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 10 Jan 2025 20:37:00 +0100 Subject: [PATCH 03/22] style: lint --- packages/modules/mockserver/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/mockserver/src/index.ts b/packages/modules/mockserver/src/index.ts index f3befd08f..0c29e28e5 100644 --- a/packages/modules/mockserver/src/index.ts +++ b/packages/modules/mockserver/src/index.ts @@ -1 +1 @@ -export { MockserverContainer, StartedMockserverContainer } from "./mockserver-container"; \ No newline at end of file +export { MockserverContainer, StartedMockserverContainer } from "./mockserver-container"; From 2d9b6f34c95158879128ccd84a51e8b71bd0dbd7 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 12 Jan 2025 14:51:52 +0100 Subject: [PATCH 04/22] feat: add eventstoredb module --- docs/modules/eventstoredb.md | 15 +++++ mkdocs.yml | 1 + package-lock.json | 55 ++++++++++++++++++ packages/modules/eventstoredb/jest.config.ts | 11 ++++ packages/modules/eventstoredb/package.json | 32 +++++++++++ .../src/eventstoredb-container.test.ts | 56 +++++++++++++++++++ .../src/eventstoredb-container.ts | 29 ++++++++++ packages/modules/eventstoredb/src/index.ts | 1 + .../modules/eventstoredb/tsconfig.build.json | 13 +++++ packages/modules/eventstoredb/tsconfig.json | 21 +++++++ 10 files changed, 234 insertions(+) create mode 100644 docs/modules/eventstoredb.md create mode 100644 packages/modules/eventstoredb/jest.config.ts create mode 100644 packages/modules/eventstoredb/package.json create mode 100644 packages/modules/eventstoredb/src/eventstoredb-container.test.ts create mode 100644 packages/modules/eventstoredb/src/eventstoredb-container.ts create mode 100644 packages/modules/eventstoredb/src/index.ts create mode 100644 packages/modules/eventstoredb/tsconfig.build.json create mode 100644 packages/modules/eventstoredb/tsconfig.json diff --git a/docs/modules/eventstoredb.md b/docs/modules/eventstoredb.md new file mode 100644 index 000000000..e3024266c --- /dev/null +++ b/docs/modules/eventstoredb.md @@ -0,0 +1,15 @@ +# Redis Module + +[EventStoreDB](https://eventstore.com) is an event sourcing database that stores data in streams of immutable events. + +## Install + +```bash +npm install @testcontainers/eventstoredb --save-dev +``` + +## Examples + + +[Start container:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:startContainer + diff --git a/mkdocs.yml b/mkdocs.yml index 1d5481a23..9538557b0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -48,6 +48,7 @@ nav: - ChromaDB: modules/chromadb.md - Couchbase: modules/couchbase.md - Elasticsearch: modules/elasticsearch.md + - EventStoreDB: modules/eventstoredb.md - GCloud: modules/gcloud.md - HiveMQ: modules/hivemq.md - K3s: modules/k3s.md diff --git a/package-lock.json b/package-lock.json index 7ca24abf8..3aa1b5b36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2560,6 +2560,32 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@eventstore/db-client": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@eventstore/db-client/-/db-client-6.2.1.tgz", + "integrity": "sha512-utUkIO3Ns9TzTHOTDg+eVTm2Z/Jj5X3VT/otZEWwgmOm7CgSnrWdOxEsAN1jfMht7oVBRB5iGHYFGA3IiQm/Ng==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.9.12", + "@types/debug": "^4.1.12", + "@types/google-protobuf": "^3.15.12", + "@types/node": "^16.18.67", + "debug": "^4.3.2", + "google-protobuf": "^3.21.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@eventstore/db-client/node_modules/@types/node": { + "version": "16.18.123", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.123.tgz", + "integrity": "sha512-/n7I6V/4agSpJtFDKKFEa763Hc1z3hmvchobHS1TisCOTKD5nxq8NJ2iK7SRIMYL276Q9mgWOx2AWp5n2XI6eA==", + "dev": true, + "license": "MIT" + }, "node_modules/@fastify/busboy": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", @@ -5732,6 +5758,10 @@ "resolved": "packages/modules/elasticsearch", "link": true }, + "node_modules/@testcontainers/eventstoredb": { + "resolved": "packages/modules/eventstoredb", + "link": true + }, "node_modules/@testcontainers/gcloud": { "resolved": "packages/modules/gcloud", "link": true @@ -6081,6 +6111,13 @@ "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", "dev": true }, + "node_modules/@types/google-protobuf": { + "version": "3.15.12", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.12.tgz", + "integrity": "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -11802,6 +11839,13 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/google-protobuf": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", + "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", + "dev": true, + "license": "(BSD-3-Clause AND Apache-2.0)" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -20951,6 +20995,17 @@ "@elastic/elasticsearch": "^7.17.14" } }, + "packages/modules/eventstoredb": { + "name": "@testcontainers/eventstoredb", + "version": "10.16.0", + "license": "MIT", + "dependencies": { + "testcontainers": "^10.16.0" + }, + "devDependencies": { + "@eventstore/db-client": "^6.2.1" + } + }, "packages/modules/gcloud": { "name": "@testcontainers/gcloud", "version": "10.16.0", diff --git a/packages/modules/eventstoredb/jest.config.ts b/packages/modules/eventstoredb/jest.config.ts new file mode 100644 index 000000000..1f677baaf --- /dev/null +++ b/packages/modules/eventstoredb/jest.config.ts @@ -0,0 +1,11 @@ +import type { Config } from "jest"; +import * as path from "path"; + +const config: Config = { + preset: "ts-jest", + moduleNameMapper: { + "^testcontainers$": path.resolve(__dirname, "../../testcontainers/src"), + }, +}; + +export default config; diff --git a/packages/modules/eventstoredb/package.json b/packages/modules/eventstoredb/package.json new file mode 100644 index 000000000..30a932740 --- /dev/null +++ b/packages/modules/eventstoredb/package.json @@ -0,0 +1,32 @@ +{ + "name": "@testcontainers/eventstoredb", + "version": "10.16.0", + "description": "EventStoreDB module for Testcontainers", + "main": "build/index.js", + "scripts": { + "prepack": "shx cp ../../../README.md . && shx cp ../../../LICENSE .", + "build": "tsc --project tsconfig.build.json" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/testcontainers/testcontainers-node.git" + }, + "keywords": [ + "eventstoredb", + "testing", + "docker", + "testcontainers" + ], + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/testcontainers/testcontainers-node/issues" + }, + "homepage": "https://github.com/testcontainers/testcontainers-node#readme", + "dependencies": { + "testcontainers": "^10.16.0" + }, + "devDependencies": { + "@eventstore/db-client": "^6.2.1" + } +} diff --git a/packages/modules/eventstoredb/src/eventstoredb-container.test.ts b/packages/modules/eventstoredb/src/eventstoredb-container.test.ts new file mode 100644 index 000000000..8a2cb4f60 --- /dev/null +++ b/packages/modules/eventstoredb/src/eventstoredb-container.test.ts @@ -0,0 +1,56 @@ +import { EventStoreDBClient, StreamingRead } from "@eventstore/db-client"; +import { EventStoreDBContainer } from "./eventstoredb-container"; + +describe("EventStoreDBContainer", () => { + jest.setTimeout(240_000); + + // startContainer { + it("should execute write and read", async () => { + const container = await new EventStoreDBContainer().start(); + + const client = EventStoreDBClient.connectionString(container.getConnectionString()); + + await client.appendToStream("User-1", [ + { + contentType: "application/json", + data: { email: "john@foo.local" }, + type: "UserCreated", + id: "28ab6bca-d9ae-418b-a1af-eb65dd653c38", + metadata: { + someMetadata: "bar", + }, + }, + ]); + + expect(await consumeSteamingRead(client.readStream("User-1"))).toEqual([ + expect.objectContaining({ + event: expect.objectContaining({ + data: { + email: "john@foo.local", + }, + id: "28ab6bca-d9ae-418b-a1af-eb65dd653c38", + isJson: true, + metadata: { + someMetadata: "bar", + }, + revision: 0n, + streamId: "User-1", + type: "UserCreated", + }), + }), + ]); + + await container.stop(); + }); + // } +}); + +async function consumeSteamingRead(read: StreamingRead): Promise { + const events = []; + + for await (const event of read) { + events.push(event); + } + + return events; +} diff --git a/packages/modules/eventstoredb/src/eventstoredb-container.ts b/packages/modules/eventstoredb/src/eventstoredb-container.ts new file mode 100644 index 000000000..7a22c1d51 --- /dev/null +++ b/packages/modules/eventstoredb/src/eventstoredb-container.ts @@ -0,0 +1,29 @@ +import { AbstractStartedContainer, GenericContainer, Wait } from "testcontainers"; + +export class StartedEventStoreDBContainer extends AbstractStartedContainer { + getConnectionString(): string { + return `esdb://${this.getHost()}:${this.getFirstMappedPort()}?tls=false`; + } +} + +const EVENT_STORE_DB_PORT = 2113; + +export class EventStoreDBContainer extends GenericContainer { + constructor(image = "eventstore/eventstore:24.10") { + super(image); + + this.withExposedPorts(EVENT_STORE_DB_PORT) + .withEnvironment({ + EVENTSTORE_CLUSTER_SIZE: "1", + EVENTSTORE_RUN_PROJECTIONS: "All", + EVENTSTORE_START_STANDARD_PROJECTIONS: "true", + EVENTSTORE_INSECURE: "true", + }) + .withStartupTimeout(120_000) + .withWaitStrategy(Wait.forHealthCheck()); + } + + public override async start(): Promise { + return new StartedEventStoreDBContainer(await super.start()); + } +} diff --git a/packages/modules/eventstoredb/src/index.ts b/packages/modules/eventstoredb/src/index.ts new file mode 100644 index 000000000..a47095f16 --- /dev/null +++ b/packages/modules/eventstoredb/src/index.ts @@ -0,0 +1 @@ +export { StartedEventStoreDBContainer, EventStoreDBContainer } from "./eventstoredb-container"; diff --git a/packages/modules/eventstoredb/tsconfig.build.json b/packages/modules/eventstoredb/tsconfig.build.json new file mode 100644 index 000000000..0222f6ff1 --- /dev/null +++ b/packages/modules/eventstoredb/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "build", + "jest.config.ts", + "src/**/*.test.ts" + ], + "references": [ + { + "path": "../../testcontainers" + } + ] +} \ No newline at end of file diff --git a/packages/modules/eventstoredb/tsconfig.json b/packages/modules/eventstoredb/tsconfig.json new file mode 100644 index 000000000..39b165817 --- /dev/null +++ b/packages/modules/eventstoredb/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "paths": { + "testcontainers": [ + "../../testcontainers/src" + ] + } + }, + "exclude": [ + "build", + "jest.config.ts" + ], + "references": [ + { + "path": "../../testcontainers" + } + ] +} \ No newline at end of file From 802872db49a150d1be7beb3e370b0710e6678c72 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 12 Jan 2025 15:24:59 +0100 Subject: [PATCH 05/22] test(eventstoredb): test standard projections --- .../src/eventstoredb-container.test.ts | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/modules/eventstoredb/src/eventstoredb-container.test.ts b/packages/modules/eventstoredb/src/eventstoredb-container.test.ts index 8a2cb4f60..d7d31f22e 100644 --- a/packages/modules/eventstoredb/src/eventstoredb-container.test.ts +++ b/packages/modules/eventstoredb/src/eventstoredb-container.test.ts @@ -1,4 +1,4 @@ -import { EventStoreDBClient, StreamingRead } from "@eventstore/db-client"; +import { EventStoreDBClient, StreamingRead, StreamSubscription } from "@eventstore/db-client"; import { EventStoreDBContainer } from "./eventstoredb-container"; describe("EventStoreDBContainer", () => { @@ -43,6 +43,48 @@ describe("EventStoreDBContainer", () => { await container.stop(); }); // } + + it("should use built-in projections", async () => { + const container = await new EventStoreDBContainer().start(); + const client = EventStoreDBClient.connectionString(container.getConnectionString()); + + await client.appendToStream("Todo-1", [ + { + contentType: "application/json", + data: { title: "Do something" }, + metadata: {}, + id: "7eccc3a7-0664-4348-a621-029125741e22", + type: "TodoCreated", + }, + ]); + const stream = client.subscribeToStream("$ce-Todo", { resolveLinkTos: true }); + + expect(await getStreamFirstEvent(stream)).toEqual( + expect.objectContaining({ + event: expect.objectContaining({ + data: { title: "Do something" }, + id: "7eccc3a7-0664-4348-a621-029125741e22", + isJson: true, + metadata: {}, + revision: 0n, + streamId: "Todo-1", + type: "TodoCreated", + }), + link: expect.objectContaining({ + isJson: false, + metadata: expect.objectContaining({ + $causedBy: "7eccc3a7-0664-4348-a621-029125741e22", + $o: "Todo-1", + }), + revision: 0n, + streamId: "$ce-Todo", + type: "$>", + }), + }) + ); + await stream.unsubscribe(); + await container.stop(); + }); }); async function consumeSteamingRead(read: StreamingRead): Promise { @@ -54,3 +96,9 @@ async function consumeSteamingRead(read: StreamingRead): Promise { + for await (const event of stream) { + return event; + } +} From 611f9fcd9f7dba5af2f60871173c8d20a4dec688 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 12 Jan 2025 15:30:25 +0100 Subject: [PATCH 06/22] docs(eventstoredb): add another example in the docs and fix the code block references --- docs/modules/eventstoredb.md | 6 +++++- .../modules/eventstoredb/src/eventstoredb-container.test.ts | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/modules/eventstoredb.md b/docs/modules/eventstoredb.md index e3024266c..e55d487b5 100644 --- a/docs/modules/eventstoredb.md +++ b/docs/modules/eventstoredb.md @@ -11,5 +11,9 @@ npm install @testcontainers/eventstoredb --save-dev ## Examples -[Start container:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:startContainer +[Start container:](../../packages/modules/eventstoredb/src/eventstoredb-container.test.ts) inside_block:startContainer + + + +[Start container:](../../packages/modules/eventstoredb/src/eventstoredb-container.test.ts) inside_block:usingStandardProjections diff --git a/packages/modules/eventstoredb/src/eventstoredb-container.test.ts b/packages/modules/eventstoredb/src/eventstoredb-container.test.ts index d7d31f22e..b5a7c6242 100644 --- a/packages/modules/eventstoredb/src/eventstoredb-container.test.ts +++ b/packages/modules/eventstoredb/src/eventstoredb-container.test.ts @@ -44,6 +44,7 @@ describe("EventStoreDBContainer", () => { }); // } + // usingStandardProjections { it("should use built-in projections", async () => { const container = await new EventStoreDBContainer().start(); const client = EventStoreDBClient.connectionString(container.getConnectionString()); @@ -85,6 +86,7 @@ describe("EventStoreDBContainer", () => { await stream.unsubscribe(); await container.stop(); }); + // } }); async function consumeSteamingRead(read: StreamingRead): Promise { From 5abdbd9846e0cf8e11c03bd3989abf990bd18d21 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 12 Jan 2025 15:32:16 +0100 Subject: [PATCH 07/22] docs(eventstoredb): fix documentation page title --- docs/modules/eventstoredb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/eventstoredb.md b/docs/modules/eventstoredb.md index e55d487b5..7b1467caa 100644 --- a/docs/modules/eventstoredb.md +++ b/docs/modules/eventstoredb.md @@ -1,4 +1,4 @@ -# Redis Module +# EventStoreDB Module [EventStoreDB](https://eventstore.com) is an event sourcing database that stores data in streams of immutable events. From d2228bf5c376ce94dd341ddd860d6bce72897227 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 12 Jan 2025 15:34:40 +0100 Subject: [PATCH 08/22] docs(eventstoredb): fix code block description --- docs/modules/eventstoredb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/eventstoredb.md b/docs/modules/eventstoredb.md index 7b1467caa..05dcdb1dc 100644 --- a/docs/modules/eventstoredb.md +++ b/docs/modules/eventstoredb.md @@ -15,5 +15,5 @@ npm install @testcontainers/eventstoredb --save-dev -[Start container:](../../packages/modules/eventstoredb/src/eventstoredb-container.test.ts) inside_block:usingStandardProjections +[Subscribe to standard projection:](../../packages/modules/eventstoredb/src/eventstoredb-container.test.ts) inside_block:usingStandardProjections From 80472b71127ede5635c859a4b786b2a01675950f Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 22 Jan 2025 08:54:00 +0100 Subject: [PATCH 09/22] docs(kurrent): change eventstoredb to kurrent --- docs/modules/eventstoredb.md | 19 ------------------- docs/modules/kurrent.md | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 docs/modules/eventstoredb.md create mode 100644 docs/modules/kurrent.md diff --git a/docs/modules/eventstoredb.md b/docs/modules/eventstoredb.md deleted file mode 100644 index 05dcdb1dc..000000000 --- a/docs/modules/eventstoredb.md +++ /dev/null @@ -1,19 +0,0 @@ -# EventStoreDB Module - -[EventStoreDB](https://eventstore.com) is an event sourcing database that stores data in streams of immutable events. - -## Install - -```bash -npm install @testcontainers/eventstoredb --save-dev -``` - -## Examples - - -[Start container:](../../packages/modules/eventstoredb/src/eventstoredb-container.test.ts) inside_block:startContainer - - - -[Subscribe to standard projection:](../../packages/modules/eventstoredb/src/eventstoredb-container.test.ts) inside_block:usingStandardProjections - diff --git a/docs/modules/kurrent.md b/docs/modules/kurrent.md new file mode 100644 index 000000000..1c3e06d1a --- /dev/null +++ b/docs/modules/kurrent.md @@ -0,0 +1,19 @@ +# Kurrent Module + +[Kurrent](https://kurrent.io) is an event sourcing database that stores data in streams of immutable events. + +## Install + +```bash +npm install @testcontainers/kurrent --save-dev +``` + +## Examples + + +[Start container:](../../packages/modules/kurrent/src/kurrent-container.test.ts) inside_block:startContainer + + + +[Subscribe to standard projection:](../../packages/modules/kurrent/src/kurrent-container.test.ts) inside_block:usingStandardProjections + From e4dd1c485287669b40de7d523ddb4e6ea5d51ba1 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 22 Jan 2025 08:57:14 +0100 Subject: [PATCH 10/22] fix(kurrent): rename eventstoredb to kurrent I didn't change the image name bacuse Kurrent are still naming their docker image `eventstoredb`. --- packages/modules/eventstoredb/src/index.ts | 2 +- ...toredb-container.test.ts => kurrent-container.test.ts} | 6 +++--- .../{eventstoredb-container.ts => kurrent-container.ts} | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) rename packages/modules/eventstoredb/src/{eventstoredb-container.test.ts => kurrent-container.test.ts} (93%) rename packages/modules/eventstoredb/src/{eventstoredb-container.ts => kurrent-container.ts} (70%) diff --git a/packages/modules/eventstoredb/src/index.ts b/packages/modules/eventstoredb/src/index.ts index a47095f16..aecfa9a5f 100644 --- a/packages/modules/eventstoredb/src/index.ts +++ b/packages/modules/eventstoredb/src/index.ts @@ -1 +1 @@ -export { StartedEventStoreDBContainer, EventStoreDBContainer } from "./eventstoredb-container"; +export { StartedKurrentContainer, KurrentContainer } from "./kurrent-container"; diff --git a/packages/modules/eventstoredb/src/eventstoredb-container.test.ts b/packages/modules/eventstoredb/src/kurrent-container.test.ts similarity index 93% rename from packages/modules/eventstoredb/src/eventstoredb-container.test.ts rename to packages/modules/eventstoredb/src/kurrent-container.test.ts index b5a7c6242..2602f3211 100644 --- a/packages/modules/eventstoredb/src/eventstoredb-container.test.ts +++ b/packages/modules/eventstoredb/src/kurrent-container.test.ts @@ -1,12 +1,12 @@ import { EventStoreDBClient, StreamingRead, StreamSubscription } from "@eventstore/db-client"; -import { EventStoreDBContainer } from "./eventstoredb-container"; +import { KurrentContainer } from "./kurrent-container"; describe("EventStoreDBContainer", () => { jest.setTimeout(240_000); // startContainer { it("should execute write and read", async () => { - const container = await new EventStoreDBContainer().start(); + const container = await new KurrentContainer().start(); const client = EventStoreDBClient.connectionString(container.getConnectionString()); @@ -46,7 +46,7 @@ describe("EventStoreDBContainer", () => { // usingStandardProjections { it("should use built-in projections", async () => { - const container = await new EventStoreDBContainer().start(); + const container = await new KurrentContainer().start(); const client = EventStoreDBClient.connectionString(container.getConnectionString()); await client.appendToStream("Todo-1", [ diff --git a/packages/modules/eventstoredb/src/eventstoredb-container.ts b/packages/modules/eventstoredb/src/kurrent-container.ts similarity index 70% rename from packages/modules/eventstoredb/src/eventstoredb-container.ts rename to packages/modules/eventstoredb/src/kurrent-container.ts index 7a22c1d51..609cf9f77 100644 --- a/packages/modules/eventstoredb/src/eventstoredb-container.ts +++ b/packages/modules/eventstoredb/src/kurrent-container.ts @@ -1,6 +1,6 @@ import { AbstractStartedContainer, GenericContainer, Wait } from "testcontainers"; -export class StartedEventStoreDBContainer extends AbstractStartedContainer { +export class StartedKurrentContainer extends AbstractStartedContainer { getConnectionString(): string { return `esdb://${this.getHost()}:${this.getFirstMappedPort()}?tls=false`; } @@ -8,7 +8,7 @@ export class StartedEventStoreDBContainer extends AbstractStartedContainer { const EVENT_STORE_DB_PORT = 2113; -export class EventStoreDBContainer extends GenericContainer { +export class KurrentContainer extends GenericContainer { constructor(image = "eventstore/eventstore:24.10") { super(image); @@ -23,7 +23,7 @@ export class EventStoreDBContainer extends GenericContainer { .withWaitStrategy(Wait.forHealthCheck()); } - public override async start(): Promise { - return new StartedEventStoreDBContainer(await super.start()); + public override async start(): Promise { + return new StartedKurrentContainer(await super.start()); } } From 1cb3ac65fffe5906b96d299a3bb38ed68707bd40 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 22 Jan 2025 09:00:10 +0100 Subject: [PATCH 11/22] fix(kurrent): rename eventstoredb to kurrent in package.json --- packages/modules/eventstoredb/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/modules/eventstoredb/package.json b/packages/modules/eventstoredb/package.json index 33662fd9b..86bb9b176 100644 --- a/packages/modules/eventstoredb/package.json +++ b/packages/modules/eventstoredb/package.json @@ -1,14 +1,15 @@ { - "name": "@testcontainers/eventstoredb", + "name": "@testcontainers/kurrent", "version": "10.17.1", "license": "MIT", "keywords": [ "eventstoredb", + "kurrent", "testing", "docker", "testcontainers" ], - "description": "EventStoreDB module for Testcontainers", + "description": "Kurrent module for Testcontainers", "homepage": "https://github.com/testcontainers/testcontainers-node#readme", "repository": { "type": "git", From d29879196e7f50913987108074fb3050b9efa0ed Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 22 Jan 2025 09:02:01 +0100 Subject: [PATCH 12/22] fix(kurrent): rename the package's directory --- package-lock.json | 30 +++++++++---------- .../{eventstoredb => kurrent}/jest.config.ts | 0 .../{eventstoredb => kurrent}/package.json | 0 .../{eventstoredb => kurrent}/src/index.ts | 0 .../src/kurrent-container.test.ts | 0 .../src/kurrent-container.ts | 0 .../tsconfig.build.json | 0 .../{eventstoredb => kurrent}/tsconfig.json | 0 8 files changed, 15 insertions(+), 15 deletions(-) rename packages/modules/{eventstoredb => kurrent}/jest.config.ts (100%) rename packages/modules/{eventstoredb => kurrent}/package.json (100%) rename packages/modules/{eventstoredb => kurrent}/src/index.ts (100%) rename packages/modules/{eventstoredb => kurrent}/src/kurrent-container.test.ts (100%) rename packages/modules/{eventstoredb => kurrent}/src/kurrent-container.ts (100%) rename packages/modules/{eventstoredb => kurrent}/tsconfig.build.json (100%) rename packages/modules/{eventstoredb => kurrent}/tsconfig.json (100%) diff --git a/package-lock.json b/package-lock.json index 4a5c1ab26..851d5db9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5762,10 +5762,6 @@ "resolved": "packages/modules/elasticsearch", "link": true }, - "node_modules/@testcontainers/eventstoredb": { - "resolved": "packages/modules/eventstoredb", - "link": true - }, "node_modules/@testcontainers/gcloud": { "resolved": "packages/modules/gcloud", "link": true @@ -5782,6 +5778,10 @@ "resolved": "packages/modules/kafka", "link": true }, + "node_modules/@testcontainers/kurrent": { + "resolved": "packages/modules/kurrent", + "link": true + }, "node_modules/@testcontainers/localstack": { "resolved": "packages/modules/localstack", "link": true @@ -21212,17 +21212,6 @@ "@elastic/elasticsearch": "^7.17.14" } }, - "packages/modules/eventstoredb": { - "name": "@testcontainers/eventstoredb", - "version": "10.17.1", - "license": "MIT", - "dependencies": { - "testcontainers": "^10.17.1" - }, - "devDependencies": { - "@eventstore/db-client": "^6.2.1" - } - }, "packages/modules/gcloud": { "name": "@testcontainers/gcloud", "version": "10.17.1", @@ -21273,6 +21262,17 @@ "kafkajs": "^2.2.4" } }, + "packages/modules/kurrent": { + "name": "@testcontainers/kurrent", + "version": "10.17.1", + "license": "MIT", + "dependencies": { + "testcontainers": "^10.17.1" + }, + "devDependencies": { + "@eventstore/db-client": "^6.2.1" + } + }, "packages/modules/localstack": { "name": "@testcontainers/localstack", "version": "10.17.1", diff --git a/packages/modules/eventstoredb/jest.config.ts b/packages/modules/kurrent/jest.config.ts similarity index 100% rename from packages/modules/eventstoredb/jest.config.ts rename to packages/modules/kurrent/jest.config.ts diff --git a/packages/modules/eventstoredb/package.json b/packages/modules/kurrent/package.json similarity index 100% rename from packages/modules/eventstoredb/package.json rename to packages/modules/kurrent/package.json diff --git a/packages/modules/eventstoredb/src/index.ts b/packages/modules/kurrent/src/index.ts similarity index 100% rename from packages/modules/eventstoredb/src/index.ts rename to packages/modules/kurrent/src/index.ts diff --git a/packages/modules/eventstoredb/src/kurrent-container.test.ts b/packages/modules/kurrent/src/kurrent-container.test.ts similarity index 100% rename from packages/modules/eventstoredb/src/kurrent-container.test.ts rename to packages/modules/kurrent/src/kurrent-container.test.ts diff --git a/packages/modules/eventstoredb/src/kurrent-container.ts b/packages/modules/kurrent/src/kurrent-container.ts similarity index 100% rename from packages/modules/eventstoredb/src/kurrent-container.ts rename to packages/modules/kurrent/src/kurrent-container.ts diff --git a/packages/modules/eventstoredb/tsconfig.build.json b/packages/modules/kurrent/tsconfig.build.json similarity index 100% rename from packages/modules/eventstoredb/tsconfig.build.json rename to packages/modules/kurrent/tsconfig.build.json diff --git a/packages/modules/eventstoredb/tsconfig.json b/packages/modules/kurrent/tsconfig.json similarity index 100% rename from packages/modules/eventstoredb/tsconfig.json rename to packages/modules/kurrent/tsconfig.json From 8e7980a015c4d3b082f4d36ce979078bee08b276 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 22 Jan 2025 09:02:39 +0100 Subject: [PATCH 13/22] docs(kurrent): update mkdocs.yml --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 92091d744..88466f338 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -48,11 +48,11 @@ nav: - ChromaDB: modules/chromadb.md - Couchbase: modules/couchbase.md - Elasticsearch: modules/elasticsearch.md - - EventStoreDB: modules/eventstoredb.md - GCloud: modules/gcloud.md - HiveMQ: modules/hivemq.md - K3s: modules/k3s.md - Kafka: modules/kafka.md + - Kurrent: modules/kurrent.md - Localstack: modules/localstack.md - MariaDB: modules/mariadb.md - Mockserver: modules/mockserver.md From 70ec4a034cc39e25c966e1fa466312e21323995a Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 22 Jan 2025 09:04:21 +0100 Subject: [PATCH 14/22] test(kurrent): rename the test's title --- packages/modules/kurrent/src/kurrent-container.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/kurrent/src/kurrent-container.test.ts b/packages/modules/kurrent/src/kurrent-container.test.ts index 2602f3211..4e9bc8ba9 100644 --- a/packages/modules/kurrent/src/kurrent-container.test.ts +++ b/packages/modules/kurrent/src/kurrent-container.test.ts @@ -1,7 +1,7 @@ import { EventStoreDBClient, StreamingRead, StreamSubscription } from "@eventstore/db-client"; import { KurrentContainer } from "./kurrent-container"; -describe("EventStoreDBContainer", () => { +describe("KurrentContainer", () => { jest.setTimeout(240_000); // startContainer { From f48028ab6b176acd6868a04471ec2f5705c5bd95 Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Fri, 23 May 2025 17:13:57 +0100 Subject: [PATCH 15/22] Lint --- package-lock.json | 20 ++++++++++++++++---- packages/modules/kurrent/src/index.ts | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index aeeb0d6ac..0658ff751 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5189,10 +5189,6 @@ "resolved": "packages/modules/etcd", "link": true }, - "node_modules/@testcontainers/eventstoredb": { - "resolved": "packages/modules/eventstoredb", - "link": true - }, "node_modules/@testcontainers/gcloud": { "resolved": "packages/modules/gcloud", "link": true @@ -5209,6 +5205,10 @@ "resolved": "packages/modules/kafka", "link": true }, + "node_modules/@testcontainers/kurrent": { + "resolved": "packages/modules/kurrent", + "link": true + }, "node_modules/@testcontainers/localstack": { "resolved": "packages/modules/localstack", "link": true @@ -20055,6 +20055,7 @@ "packages/modules/eventstoredb": { "name": "@testcontainers/eventstoredb", "version": "10.28.0", + "extraneous": true, "license": "MIT", "dependencies": { "testcontainers": "^10.28.0" @@ -20113,6 +20114,17 @@ "kafkajs": "^2.2.4" } }, + "packages/modules/kurrent": { + "name": "@testcontainers/kurrent", + "version": "10.28.0", + "license": "MIT", + "dependencies": { + "testcontainers": "^10.28.0" + }, + "devDependencies": { + "@eventstore/db-client": "^6.2.1" + } + }, "packages/modules/localstack": { "name": "@testcontainers/localstack", "version": "10.28.0", diff --git a/packages/modules/kurrent/src/index.ts b/packages/modules/kurrent/src/index.ts index aecfa9a5f..0b937e9f8 100644 --- a/packages/modules/kurrent/src/index.ts +++ b/packages/modules/kurrent/src/index.ts @@ -1 +1 @@ -export { StartedKurrentContainer, KurrentContainer } from "./kurrent-container"; +export { KurrentContainer, StartedKurrentContainer } from "./kurrent-container"; From 4108d03f4dea814f167df1028d8959137cdcac87 Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Fri, 23 May 2025 17:37:32 +0100 Subject: [PATCH 16/22] Use Kurrent image and lib --- package-lock.json | 212 +++++++++++++++--- packages/modules/kurrent/package.json | 3 +- .../kurrent/src/kurrent-container.test.ts | 10 +- .../modules/kurrent/src/kurrent-container.ts | 14 +- 4 files changed, 197 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0658ff751..b0992a236 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2283,32 +2283,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eventstore/db-client": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@eventstore/db-client/-/db-client-6.2.1.tgz", - "integrity": "sha512-utUkIO3Ns9TzTHOTDg+eVTm2Z/Jj5X3VT/otZEWwgmOm7CgSnrWdOxEsAN1jfMht7oVBRB5iGHYFGA3IiQm/Ng==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.9.12", - "@types/debug": "^4.1.12", - "@types/google-protobuf": "^3.15.12", - "@types/node": "^16.18.67", - "debug": "^4.3.2", - "google-protobuf": "^3.21.2", - "uuid": "^8.3.2" - }, - "engines": { - "node": "^12.18.3 || >=14" - } - }, - "node_modules/@eventstore/db-client/node_modules/@types/node": { - "version": "16.18.123", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.123.tgz", - "integrity": "sha512-/n7I6V/4agSpJtFDKKFEa763Hc1z3hmvchobHS1TisCOTKD5nxq8NJ2iK7SRIMYL276Q9mgWOx2AWp5n2XI6eA==", - "dev": true, - "license": "MIT" - }, "node_modules/@fastify/busboy": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", @@ -3210,6 +3184,183 @@ "node": ">=18" } }, + "node_modules/@kurrent/bridge": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@kurrent/bridge/-/bridge-0.1.1.tgz", + "integrity": "sha512-01oJEoA/L/cBr2QXZD00cabvflv/JrSg3eYS/NOkHib7uRaxm/qEsjEX2q98Pf5HhVaduFaRaVKwJ0E+wEhfdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@neon-rs/load": "^0.1.82" + }, + "optionalDependencies": { + "@kurrent/bridge-darwin-arm64": "0.1.1", + "@kurrent/bridge-darwin-x64": "0.1.1", + "@kurrent/bridge-linux-arm64-gnu": "0.1.1", + "@kurrent/bridge-linux-x64-gnu": "0.1.1", + "@kurrent/bridge-win32-x64-msvc": "0.1.1" + } + }, + "node_modules/@kurrent/bridge-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@kurrent/bridge-darwin-arm64/-/bridge-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-vGBCkDLNjozqCn5fIEPDJBo5tSqmV/J78sskJ7wFzVneHRhEZkI4t3M/yu2Yz10ooyEnKzaJ5RnrZYPBplq1pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "ISC", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@kurrent/bridge-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@kurrent/bridge-darwin-x64/-/bridge-darwin-x64-0.1.1.tgz", + "integrity": "sha512-6GICehReyvpjsg8mOCO4H/6anNHMg02yNWUXo4+3iyeBEybvSvCcWDHq8N7mlJtAlScwlsPYVuq+E8ZcprheKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "ISC", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@kurrent/bridge-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@kurrent/bridge-linux-arm64-gnu/-/bridge-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-/qwp9/UoboJtZehglbvsHl/u82gn0RTj+JckrN97+0R2LTPmhe5K45iaSe+ysyb4+KHk3B1pZEbkLl9PHjZxuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "ISC", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@kurrent/bridge-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@kurrent/bridge-linux-x64-gnu/-/bridge-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-g7pGS/ZJd8NGA5DlC20Fh/Z/jvaOBC++BM/eSTr85UBwhG0/Pgk1AP9xbLY0N/sOCjKOXgxDqx9iFy54Q/vYoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "ISC", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@kurrent/bridge-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@kurrent/bridge-win32-x64-msvc/-/bridge-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-BZ9bUu3jS+ikeR3Y9bip+Md3usR+Q4fILDhesFvDYFrh8YwcsVjFydZvFklC9DCf7QmogJqNY35dj3Xs6nAPsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "ISC", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@kurrent/kurrentdb-client": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@kurrent/kurrentdb-client/-/kurrentdb-client-1.0.1.tgz", + "integrity": "sha512-i/UNqNNXt6ju23h3B5LGypq6azwV8t3WJaAfQSFzPmhu3QkNkTAoacpCKLSHxs3/cbKOcb4tehsgs2I7fNU5qg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.12.4", + "@kurrent/bridge": "^0.1.1", + "@types/debug": "^4.1.12", + "@types/google-protobuf": "^3.15.12", + "@types/node": "^22.10.2", + "debug": "^4.4.0", + "google-protobuf": "^3.21.4", + "uuid": "11.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@kurrent/kurrentdb-client/node_modules/@grpc/grpc-js": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", + "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@kurrent/kurrentdb-client/node_modules/@types/node": { + "version": "22.15.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", + "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@kurrent/kurrentdb-client/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@kurrent/kurrentdb-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@kurrent/kurrentdb-client/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@kurrent/kurrentdb-client/node_modules/uuid": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", + "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz", @@ -3297,6 +3448,13 @@ "node": ">= 18.0.0" } }, + "node_modules/@neon-rs/load": { + "version": "0.1.82", + "resolved": "https://registry.npmjs.org/@neon-rs/load/-/load-0.1.82.tgz", + "integrity": "sha512-H4Gu2o5kPp+JOEhRrOQCnJnf7X6sv9FBLttM/wSbb4efsgFWeHzfU/ItZ01E5qqEk+U6QGdeVO7lxXIAtYHr5A==", + "dev": true, + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -20122,7 +20280,7 @@ "testcontainers": "^10.28.0" }, "devDependencies": { - "@eventstore/db-client": "^6.2.1" + "@kurrent/kurrentdb-client": "^1.0.1" } }, "packages/modules/localstack": { diff --git a/packages/modules/kurrent/package.json b/packages/modules/kurrent/package.json index 3b766138c..fd72b5efc 100644 --- a/packages/modules/kurrent/package.json +++ b/packages/modules/kurrent/package.json @@ -3,7 +3,6 @@ "version": "10.28.0", "license": "MIT", "keywords": [ - "eventstoredb", "kurrent", "testing", "docker", @@ -30,7 +29,7 @@ "build": "tsc --project tsconfig.build.json" }, "devDependencies": { - "@eventstore/db-client": "^6.2.1" + "@kurrent/kurrentdb-client": "^1.0.1" }, "dependencies": { "testcontainers": "^10.28.0" diff --git a/packages/modules/kurrent/src/kurrent-container.test.ts b/packages/modules/kurrent/src/kurrent-container.test.ts index 8b5a5cd4c..f53d62c6b 100644 --- a/packages/modules/kurrent/src/kurrent-container.test.ts +++ b/packages/modules/kurrent/src/kurrent-container.test.ts @@ -1,4 +1,4 @@ -import { EventStoreDBClient, StreamingRead, StreamSubscription } from "@eventstore/db-client"; +import { KurrentDBClient, StreamSubscription } from "@kurrent/kurrentdb-client"; import { KurrentContainer } from "./kurrent-container"; describe("KurrentContainer", { timeout: 240_000 }, () => { @@ -6,7 +6,7 @@ describe("KurrentContainer", { timeout: 240_000 }, () => { it("should execute write and read", async () => { const container = await new KurrentContainer().start(); - const client = EventStoreDBClient.connectionString(container.getConnectionString()); + const client = KurrentDBClient.connectionString(container.getConnectionString()); await client.appendToStream("User-1", [ { @@ -31,7 +31,7 @@ describe("KurrentContainer", { timeout: 240_000 }, () => { metadata: { someMetadata: "bar", }, - revision: 0n, + revision: 0, streamId: "User-1", type: "UserCreated", }), @@ -45,7 +45,7 @@ describe("KurrentContainer", { timeout: 240_000 }, () => { // usingStandardProjections { it("should use built-in projections", async () => { const container = await new KurrentContainer().start(); - const client = EventStoreDBClient.connectionString(container.getConnectionString()); + const client = KurrentDBClient.connectionString(container.getConnectionString()); await client.appendToStream("Todo-1", [ { @@ -87,7 +87,7 @@ describe("KurrentContainer", { timeout: 240_000 }, () => { // } }); -async function consumeSteamingRead(read: StreamingRead): Promise { +async function consumeSteamingRead(read: AsyncIterableIterator): Promise { const events = []; for await (const event of read) { diff --git a/packages/modules/kurrent/src/kurrent-container.ts b/packages/modules/kurrent/src/kurrent-container.ts index 609cf9f77..bfb6df4c0 100644 --- a/packages/modules/kurrent/src/kurrent-container.ts +++ b/packages/modules/kurrent/src/kurrent-container.ts @@ -6,18 +6,16 @@ export class StartedKurrentContainer extends AbstractStartedContainer { } } -const EVENT_STORE_DB_PORT = 2113; - export class KurrentContainer extends GenericContainer { - constructor(image = "eventstore/eventstore:24.10") { + constructor(image = "kurrentplatform/kurrentdb:25.0") { super(image); - this.withExposedPorts(EVENT_STORE_DB_PORT) + this.withExposedPorts(2113) .withEnvironment({ - EVENTSTORE_CLUSTER_SIZE: "1", - EVENTSTORE_RUN_PROJECTIONS: "All", - EVENTSTORE_START_STANDARD_PROJECTIONS: "true", - EVENTSTORE_INSECURE: "true", + KURRENTDB_CLUSTER_SIZE: "1", + KURRENTDB_RUN_PROJECTIONS: "All", + KURRENTDB_START_STANDARD_PROJECTIONS: "true", + KURRENTDB_INSECURE: "true", }) .withStartupTimeout(120_000) .withWaitStrategy(Wait.forHealthCheck()); From 1dd1d6cc4a2865ba2de8f90ece52bf3a0224bac0 Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Fri, 23 May 2025 18:44:11 +0100 Subject: [PATCH 17/22] Rename from kurrent -> kurrentdb --- docs/modules/kurrent.md | 19 ------------------- docs/modules/kurrentdb.md | 19 +++++++++++++++++++ packages/modules/kurrent/src/index.ts | 1 - .../{kurrent => kurrentdb}/package.json | 6 +++--- packages/modules/kurrentdb/src/index.ts | 1 + .../src/kurrent-db-container.test.ts} | 8 ++++---- .../src/kurrent-db-container.ts} | 8 ++++---- .../tsconfig.build.json | 0 .../{kurrent => kurrentdb}/tsconfig.json | 0 9 files changed, 31 insertions(+), 31 deletions(-) delete mode 100644 docs/modules/kurrent.md create mode 100644 docs/modules/kurrentdb.md delete mode 100644 packages/modules/kurrent/src/index.ts rename packages/modules/{kurrent => kurrentdb}/package.json (87%) create mode 100644 packages/modules/kurrentdb/src/index.ts rename packages/modules/{kurrent/src/kurrent-container.test.ts => kurrentdb/src/kurrent-db-container.test.ts} (91%) rename packages/modules/{kurrent/src/kurrent-container.ts => kurrentdb/src/kurrent-db-container.ts} (69%) rename packages/modules/{kurrent => kurrentdb}/tsconfig.build.json (100%) rename packages/modules/{kurrent => kurrentdb}/tsconfig.json (100%) diff --git a/docs/modules/kurrent.md b/docs/modules/kurrent.md deleted file mode 100644 index 1c3e06d1a..000000000 --- a/docs/modules/kurrent.md +++ /dev/null @@ -1,19 +0,0 @@ -# Kurrent Module - -[Kurrent](https://kurrent.io) is an event sourcing database that stores data in streams of immutable events. - -## Install - -```bash -npm install @testcontainers/kurrent --save-dev -``` - -## Examples - - -[Start container:](../../packages/modules/kurrent/src/kurrent-container.test.ts) inside_block:startContainer - - - -[Subscribe to standard projection:](../../packages/modules/kurrent/src/kurrent-container.test.ts) inside_block:usingStandardProjections - diff --git a/docs/modules/kurrentdb.md b/docs/modules/kurrentdb.md new file mode 100644 index 000000000..d83a120e0 --- /dev/null +++ b/docs/modules/kurrentdb.md @@ -0,0 +1,19 @@ +# KurrentDB Module + +[KurrentDB](https://kurrent.io) is an event sourcing database that stores data in streams of immutable events. + +## Install + +```bash +npm install @testcontainers/kurrentdb --save-dev +``` + +## Examples + + +[Start container:](../../packages/modules/kurrentdb/src/kurrent-container.test.ts) inside_block:startContainer + + + +[Subscribe to standard projection:](../../packages/modules/kurrentdb/src/kurrent-container.test.ts) inside_block:usingStandardProjections + diff --git a/packages/modules/kurrent/src/index.ts b/packages/modules/kurrent/src/index.ts deleted file mode 100644 index 0b937e9f8..000000000 --- a/packages/modules/kurrent/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { KurrentContainer, StartedKurrentContainer } from "./kurrent-container"; diff --git a/packages/modules/kurrent/package.json b/packages/modules/kurrentdb/package.json similarity index 87% rename from packages/modules/kurrent/package.json rename to packages/modules/kurrentdb/package.json index fd72b5efc..d5332723c 100644 --- a/packages/modules/kurrent/package.json +++ b/packages/modules/kurrentdb/package.json @@ -1,14 +1,14 @@ { - "name": "@testcontainers/kurrent", + "name": "@testcontainers/kurrentdb", "version": "10.28.0", "license": "MIT", "keywords": [ - "kurrent", + "kurrentdb", "testing", "docker", "testcontainers" ], - "description": "Kurrent module for Testcontainers", + "description": "KurrentDB module for Testcontainers", "homepage": "https://github.com/testcontainers/testcontainers-node#readme", "repository": { "type": "git", diff --git a/packages/modules/kurrentdb/src/index.ts b/packages/modules/kurrentdb/src/index.ts new file mode 100644 index 000000000..f729dca2c --- /dev/null +++ b/packages/modules/kurrentdb/src/index.ts @@ -0,0 +1 @@ +export { KurrentDbContainer, StartedKurrentDbContainer } from "./kurrent-db-container"; diff --git a/packages/modules/kurrent/src/kurrent-container.test.ts b/packages/modules/kurrentdb/src/kurrent-db-container.test.ts similarity index 91% rename from packages/modules/kurrent/src/kurrent-container.test.ts rename to packages/modules/kurrentdb/src/kurrent-db-container.test.ts index f53d62c6b..8e9b5c924 100644 --- a/packages/modules/kurrent/src/kurrent-container.test.ts +++ b/packages/modules/kurrentdb/src/kurrent-db-container.test.ts @@ -1,10 +1,10 @@ import { KurrentDBClient, StreamSubscription } from "@kurrent/kurrentdb-client"; -import { KurrentContainer } from "./kurrent-container"; +import { KurrentDbContainer } from "./kurrent-db-container"; -describe("KurrentContainer", { timeout: 240_000 }, () => { +describe("KurrentDbContainer", { timeout: 240_000 }, () => { // startContainer { it("should execute write and read", async () => { - const container = await new KurrentContainer().start(); + const container = await new KurrentDbContainer().start(); const client = KurrentDBClient.connectionString(container.getConnectionString()); @@ -44,7 +44,7 @@ describe("KurrentContainer", { timeout: 240_000 }, () => { // usingStandardProjections { it("should use built-in projections", async () => { - const container = await new KurrentContainer().start(); + const container = await new KurrentDbContainer().start(); const client = KurrentDBClient.connectionString(container.getConnectionString()); await client.appendToStream("Todo-1", [ diff --git a/packages/modules/kurrent/src/kurrent-container.ts b/packages/modules/kurrentdb/src/kurrent-db-container.ts similarity index 69% rename from packages/modules/kurrent/src/kurrent-container.ts rename to packages/modules/kurrentdb/src/kurrent-db-container.ts index bfb6df4c0..f32b878bd 100644 --- a/packages/modules/kurrent/src/kurrent-container.ts +++ b/packages/modules/kurrentdb/src/kurrent-db-container.ts @@ -1,12 +1,12 @@ import { AbstractStartedContainer, GenericContainer, Wait } from "testcontainers"; -export class StartedKurrentContainer extends AbstractStartedContainer { +export class StartedKurrentDbContainer extends AbstractStartedContainer { getConnectionString(): string { return `esdb://${this.getHost()}:${this.getFirstMappedPort()}?tls=false`; } } -export class KurrentContainer extends GenericContainer { +export class KurrentDbContainer extends GenericContainer { constructor(image = "kurrentplatform/kurrentdb:25.0") { super(image); @@ -21,7 +21,7 @@ export class KurrentContainer extends GenericContainer { .withWaitStrategy(Wait.forHealthCheck()); } - public override async start(): Promise { - return new StartedKurrentContainer(await super.start()); + public override async start(): Promise { + return new StartedKurrentDbContainer(await super.start()); } } diff --git a/packages/modules/kurrent/tsconfig.build.json b/packages/modules/kurrentdb/tsconfig.build.json similarity index 100% rename from packages/modules/kurrent/tsconfig.build.json rename to packages/modules/kurrentdb/tsconfig.build.json diff --git a/packages/modules/kurrent/tsconfig.json b/packages/modules/kurrentdb/tsconfig.json similarity index 100% rename from packages/modules/kurrent/tsconfig.json rename to packages/modules/kurrentdb/tsconfig.json From bcd0716fda1db6381c75f3e0bf659444e5989d52 Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Fri, 23 May 2025 18:47:21 +0100 Subject: [PATCH 18/22] Update package-lock.json --- package-lock.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0992a236..1287f3c02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5363,8 +5363,8 @@ "resolved": "packages/modules/kafka", "link": true }, - "node_modules/@testcontainers/kurrent": { - "resolved": "packages/modules/kurrent", + "node_modules/@testcontainers/kurrentdb": { + "resolved": "packages/modules/kurrentdb", "link": true }, "node_modules/@testcontainers/localstack": { @@ -20275,6 +20275,18 @@ "packages/modules/kurrent": { "name": "@testcontainers/kurrent", "version": "10.28.0", + "extraneous": true, + "license": "MIT", + "dependencies": { + "testcontainers": "^10.28.0" + }, + "devDependencies": { + "@kurrent/kurrentdb-client": "^1.0.1" + } + }, + "packages/modules/kurrentdb": { + "name": "@testcontainers/kurrentdb", + "version": "10.28.0", "license": "MIT", "dependencies": { "testcontainers": "^10.28.0" From 2bc06c239215fa63093b890974c342d36c26b8ae Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Fri, 23 May 2025 18:49:34 +0100 Subject: [PATCH 19/22] Update docs link --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 5d501751c..514e31af2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -61,7 +61,7 @@ nav: - HiveMQ: modules/hivemq.md - K3s: modules/k3s.md - Kafka: modules/kafka.md - - Kurrent: modules/kurrent.md + - KurrentDB: modules/kurrentdb.md - Localstack: modules/localstack.md - MariaDB: modules/mariadb.md - Mockserver: modules/mockserver.md From cd65f3135ae9ab41b07e2afbc0f8930a2f251b62 Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Fri, 23 May 2025 18:54:17 +0100 Subject: [PATCH 20/22] Update docs --- docs/modules/kurrentdb.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/kurrentdb.md b/docs/modules/kurrentdb.md index d83a120e0..4c95adf40 100644 --- a/docs/modules/kurrentdb.md +++ b/docs/modules/kurrentdb.md @@ -11,9 +11,9 @@ npm install @testcontainers/kurrentdb --save-dev ## Examples -[Start container:](../../packages/modules/kurrentdb/src/kurrent-container.test.ts) inside_block:startContainer +[Start container:](../../packages/modules/kurrentdb/src/kurrent-db-container.test.ts) inside_block:startContainer -[Subscribe to standard projection:](../../packages/modules/kurrentdb/src/kurrent-container.test.ts) inside_block:usingStandardProjections +[Subscribe to standard projection:](../../packages/modules/kurrentdb/src/kurrent-db-container.test.ts) inside_block:usingStandardProjections From 61aa07d9292137e5a8c06245ebe93586053fd08b Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Sun, 25 May 2025 18:46:27 +0100 Subject: [PATCH 21/22] Remove default image --- packages/modules/kurrentdb/src/kurrent-db-container.test.ts | 6 ++++-- packages/modules/kurrentdb/src/kurrent-db-container.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/modules/kurrentdb/src/kurrent-db-container.test.ts b/packages/modules/kurrentdb/src/kurrent-db-container.test.ts index 8e9b5c924..4898f1aee 100644 --- a/packages/modules/kurrentdb/src/kurrent-db-container.test.ts +++ b/packages/modules/kurrentdb/src/kurrent-db-container.test.ts @@ -1,10 +1,12 @@ import { KurrentDBClient, StreamSubscription } from "@kurrent/kurrentdb-client"; import { KurrentDbContainer } from "./kurrent-db-container"; +const IMAGE = "kurrentplatform/kurrentdb:25.0"; + describe("KurrentDbContainer", { timeout: 240_000 }, () => { // startContainer { it("should execute write and read", async () => { - const container = await new KurrentDbContainer().start(); + const container = await new KurrentDbContainer(IMAGE).start(); const client = KurrentDBClient.connectionString(container.getConnectionString()); @@ -44,7 +46,7 @@ describe("KurrentDbContainer", { timeout: 240_000 }, () => { // usingStandardProjections { it("should use built-in projections", async () => { - const container = await new KurrentDbContainer().start(); + const container = await new KurrentDbContainer(IMAGE).start(); const client = KurrentDBClient.connectionString(container.getConnectionString()); await client.appendToStream("Todo-1", [ diff --git a/packages/modules/kurrentdb/src/kurrent-db-container.ts b/packages/modules/kurrentdb/src/kurrent-db-container.ts index f32b878bd..53b73a237 100644 --- a/packages/modules/kurrentdb/src/kurrent-db-container.ts +++ b/packages/modules/kurrentdb/src/kurrent-db-container.ts @@ -7,7 +7,7 @@ export class StartedKurrentDbContainer extends AbstractStartedContainer { } export class KurrentDbContainer extends GenericContainer { - constructor(image = "kurrentplatform/kurrentdb:25.0") { + constructor(image: string) { super(image); this.withExposedPorts(2113) From ae4ef969846d28638c62da9722b7f72b4c23f88d Mon Sep 17 00:00:00 2001 From: Cristian Greco Date: Sun, 25 May 2025 20:08:08 +0100 Subject: [PATCH 22/22] kurrent-db -> kurrentdb --- docs/modules/kurrentdb.md | 4 ++-- packages/modules/kurrentdb/src/index.ts | 2 +- ...rrent-db-container.test.ts => kurrentdb-container.test.ts} | 2 +- .../src/{kurrent-db-container.ts => kurrentdb-container.ts} | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename packages/modules/kurrentdb/src/{kurrent-db-container.test.ts => kurrentdb-container.test.ts} (97%) rename packages/modules/kurrentdb/src/{kurrent-db-container.ts => kurrentdb-container.ts} (100%) diff --git a/docs/modules/kurrentdb.md b/docs/modules/kurrentdb.md index 4c95adf40..d016770ef 100644 --- a/docs/modules/kurrentdb.md +++ b/docs/modules/kurrentdb.md @@ -11,9 +11,9 @@ npm install @testcontainers/kurrentdb --save-dev ## Examples -[Start container:](../../packages/modules/kurrentdb/src/kurrent-db-container.test.ts) inside_block:startContainer +[Start container:](../../packages/modules/kurrentdb/src/kurrentdb-container.test.ts) inside_block:startContainer -[Subscribe to standard projection:](../../packages/modules/kurrentdb/src/kurrent-db-container.test.ts) inside_block:usingStandardProjections +[Subscribe to standard projection:](../../packages/modules/kurrentdb/src/kurrentdb-container.test.ts) inside_block:usingStandardProjections diff --git a/packages/modules/kurrentdb/src/index.ts b/packages/modules/kurrentdb/src/index.ts index f729dca2c..261145939 100644 --- a/packages/modules/kurrentdb/src/index.ts +++ b/packages/modules/kurrentdb/src/index.ts @@ -1 +1 @@ -export { KurrentDbContainer, StartedKurrentDbContainer } from "./kurrent-db-container"; +export { KurrentDbContainer, StartedKurrentDbContainer } from "./kurrentdb-container"; diff --git a/packages/modules/kurrentdb/src/kurrent-db-container.test.ts b/packages/modules/kurrentdb/src/kurrentdb-container.test.ts similarity index 97% rename from packages/modules/kurrentdb/src/kurrent-db-container.test.ts rename to packages/modules/kurrentdb/src/kurrentdb-container.test.ts index 4898f1aee..0fff3c557 100644 --- a/packages/modules/kurrentdb/src/kurrent-db-container.test.ts +++ b/packages/modules/kurrentdb/src/kurrentdb-container.test.ts @@ -1,5 +1,5 @@ import { KurrentDBClient, StreamSubscription } from "@kurrent/kurrentdb-client"; -import { KurrentDbContainer } from "./kurrent-db-container"; +import { KurrentDbContainer } from "./kurrentdb-container"; const IMAGE = "kurrentplatform/kurrentdb:25.0"; diff --git a/packages/modules/kurrentdb/src/kurrent-db-container.ts b/packages/modules/kurrentdb/src/kurrentdb-container.ts similarity index 100% rename from packages/modules/kurrentdb/src/kurrent-db-container.ts rename to packages/modules/kurrentdb/src/kurrentdb-container.ts