This commit is contained in:
Philipp Kunz 2025-05-23 21:20:39 +00:00
parent 9629329bc2
commit 0907949f8a
86 changed files with 654 additions and 569 deletions

View File

@ -16,9 +16,9 @@
"localPublish": ""
},
"devDependencies": {
"@git.zone/tsbuild": "^2.6.0",
"@git.zone/tsbuild": "^2.6.3",
"@git.zone/tsrun": "^1.3.3",
"@git.zone/tstest": "^1.9.0",
"@git.zone/tstest": "^1.9.1",
"@git.zone/tswatch": "^2.0.1",
"@types/node": "^22.15.21"
},

417
pnpm-lock.yaml generated
View File

@ -91,14 +91,14 @@ importers:
version: 11.1.0
devDependencies:
'@git.zone/tsbuild':
specifier: ^2.6.0
version: 2.6.0
specifier: ^2.6.3
version: 2.6.3
'@git.zone/tsrun':
specifier: ^1.3.3
version: 1.3.3
'@git.zone/tstest':
specifier: ^1.9.0
version: 1.9.0(@aws-sdk/credential-providers@3.812.0)(socks@2.8.4)(typescript@5.8.3)
specifier: ^1.9.1
version: 1.9.1(@aws-sdk/credential-providers@3.812.0)(socks@2.8.4)(typescript@5.8.3)
'@git.zone/tswatch':
specifier: ^2.0.1
version: 2.1.0
@ -153,18 +153,26 @@ packages:
resolution: {integrity: sha512-LWkP+Vb2f6aNaway06XvFZG3altSXltAClzCz9cTFuOfKG6V2X+0VWsW9cnFRV4+MFFJW3iQAaPMQ1fBO9Rusg==}
engines: {node: '>=18.0.0'}
'@aws-sdk/client-s3@3.812.0':
resolution: {integrity: sha512-kHgw9JDXNPLa/mHtWpOd5btBVXFSe+wwp1Ed9+bqz9uLkv0iV4joZrdQwnydkO8zlTs60Sc5ez+P2OiZ76i2Qg==}
'@aws-sdk/client-s3@3.817.0':
resolution: {integrity: sha512-nZyjhlLMEXDs0ofWbpikI8tKoeKuuSgYcIb6eEZJk90Nt5HkkXn6nkWOs/kp2FdhpoGJyTILOVsDgdm7eutnLA==}
engines: {node: '>=18.0.0'}
'@aws-sdk/client-sso@3.812.0':
resolution: {integrity: sha512-O//smQRj1+RXELB7xX54s5pZB0V69KHXpUZmz8V+8GAYO1FKTHfbpUgK+zyMNb+lFZxG9B69yl8pWPZ/K8bvxA==}
engines: {node: '>=18.0.0'}
'@aws-sdk/client-sso@3.817.0':
resolution: {integrity: sha512-fCh5rUHmWmWDvw70NNoWpE5+BRdtNi45kDnIoeoszqVg7UKF79SlG+qYooUT52HKCgDNHqgbWaXxMOSqd2I/OQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/core@3.812.0':
resolution: {integrity: sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==}
engines: {node: '>=18.0.0'}
'@aws-sdk/core@3.816.0':
resolution: {integrity: sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-cognito-identity@3.812.0':
resolution: {integrity: sha512-SrEGXP1zs2Cy3jjOwM8eh+UZkr28z7rvjF+cgV4bpOti5F/mzPyVoIxDkG8BQ2sZdAwa9rgEhhOl4CcKjoJoTA==}
engines: {node: '>=18.0.0'}
@ -173,30 +181,58 @@ packages:
resolution: {integrity: sha512-Ge7IEu06ANurGBZx39q9CNN/ncqb1K8lpKZCY969uNWO0/7YPhnplrRJGMZYIS35nD2mBm3ortEKjY/wMZZd5g==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-env@3.816.0':
resolution: {integrity: sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-http@3.812.0':
resolution: {integrity: sha512-Vux2U42vPGXeE407Lp6v3yVA65J7hBO9rB67LXshyGVi7VZLAYWc4mrZxNJNqabEkjcDEmMQQakLPT6zc5SvFw==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-http@3.816.0':
resolution: {integrity: sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-ini@3.812.0':
resolution: {integrity: sha512-oltqGvQ488xtPY5wrNjbD+qQYYkuCjn30IDE1qKMxJ58EM6UVTQl3XV44Xq07xfF5gKwVJQkfIyOkRAguOVybg==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-ini@3.817.0':
resolution: {integrity: sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-node@3.812.0':
resolution: {integrity: sha512-SnvSWBP6cr9nqx784eETnL2Zl7ZnMB/oJgFVEG1aejAGbT1H9gTpMwuUsBXk4u/mEYe3f1lh1Wqo+HwDgNkfrg==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-node@3.817.0':
resolution: {integrity: sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-process@3.812.0':
resolution: {integrity: sha512-YI8bb153XeEOb59F9KtTZEwDAc14s2YHZz58+OFiJ2udnKsPV87mNiFhJPW6ba9nmOLXVat5XDcwtVT1b664wg==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-process@3.816.0':
resolution: {integrity: sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-sso@3.812.0':
resolution: {integrity: sha512-ODsPcNhgiO6GOa82TVNskM97mml9rioe9Cbhemz48lkfDQPv1u06NaCR0o3FsvprX1sEhMvJTR3sE1fyEOzvJQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-sso@3.817.0':
resolution: {integrity: sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-web-identity@3.812.0':
resolution: {integrity: sha512-E9Bmiujvm/Hp9DM/Vc1S+D0pQbx8/x4dR/zyAEZU9EoRq0duQOQ1reWYWbebYmL1OklcVpTfKV0a/VCwuAtGSg==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-web-identity@3.817.0':
resolution: {integrity: sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==}
engines: {node: '>=18.0.0'}
'@aws-sdk/credential-providers@3.812.0':
resolution: {integrity: sha512-hT7Kr8Ao+NS9b8KCB/U8cmpr0DcWOZNZNRBGAOc4eq65JpsRv177QmSqjh75vhM9BzchH3VymcP4GeMoy4SuvA==}
engines: {node: '>=18.0.0'}
@ -209,8 +245,8 @@ packages:
resolution: {integrity: sha512-YW1hySBolALMII6C8y7Z0CRG2UX1dGJjLEBNFeefhO/xP7ZuE1dvnmfJGaEuBMnvc3wkRS63VZ3aqX6sevM1CA==}
engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-flexible-checksums@3.812.0':
resolution: {integrity: sha512-/ayAooUZvV1GTomNMrfbhjUHAEaz0Wmio3lKyaTJsW4WdLJXBuzdo57YADRmYYUqx6awzJ6VJ6HGc1Uc6tOlbw==}
'@aws-sdk/middleware-flexible-checksums@3.816.0':
resolution: {integrity: sha512-kftcwDxB/VoCBsUiRgkm5CIuKbTfCN1WLPbis9LRwX3kQhKgGVxG2gG78SHk4TBB0qviWVAd/t+i/KaUgwiAcA==}
engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-host-header@3.804.0':
@ -229,8 +265,8 @@ packages:
resolution: {integrity: sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==}
engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-sdk-s3@3.812.0':
resolution: {integrity: sha512-e8AqRRIaTsunL1hqtO1hksa9oTYdsIbfezHUyVpPGugUIB1lMqPt/DlBsanI85OzUD711UfNSEcZ1mqAxpDOoA==}
'@aws-sdk/middleware-sdk-s3@3.816.0':
resolution: {integrity: sha512-jJ+EAXM7gnOwiCM6rrl4AUNY5urmtIsX7roTkxtb4DevJxcS+wFYRRg3/j33fQbuxQZrvk21HqxyZYx5UH70PA==}
engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-ssec@3.804.0':
@ -241,22 +277,34 @@ packages:
resolution: {integrity: sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==}
engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-user-agent@3.816.0':
resolution: {integrity: sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/nested-clients@3.812.0':
resolution: {integrity: sha512-FS/fImbEpJU3cXtBGR9fyVd+CP51eNKlvTMi3f4/6lSk3RmHjudNC9yEF/og3jtpT3O+7vsNOUW9mHco5IjdQQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/nested-clients@3.817.0':
resolution: {integrity: sha512-vQ2E06A48STJFssueJQgxYD8lh1iGJoLJnHdshRDWOQb8gy1wVQR+a7MkPGhGR6lGoS0SCnF/Qp6CZhnwLsqsQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/region-config-resolver@3.808.0':
resolution: {integrity: sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==}
engines: {node: '>=18.0.0'}
'@aws-sdk/signature-v4-multi-region@3.812.0':
resolution: {integrity: sha512-JTpk3ZHf7TXYbicKfOKi+VrsBTqcAszg9QR9fQmT9aCxPp39gsF3WsXq7NjepwZ5So11ixGIsPE/jtMym399QQ==}
'@aws-sdk/signature-v4-multi-region@3.816.0':
resolution: {integrity: sha512-idcr9NW86sSIXASSej3423Selu6fxlhhJJtMgpAqoCH/HJh1eQrONJwNKuI9huiruPE8+02pwxuePvLW46X2mw==}
engines: {node: '>=18.0.0'}
'@aws-sdk/token-providers@3.812.0':
resolution: {integrity: sha512-dbVBaKxrxE708ub5uH3w+cmKIeRQas+2Xf6rpckhohYY+IiflGOdK6aLrp3T6dOQgr/FJ37iQtcYNonAG+yVBQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/token-providers@3.817.0':
resolution: {integrity: sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==}
engines: {node: '>=18.0.0'}
'@aws-sdk/types@3.804.0':
resolution: {integrity: sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==}
engines: {node: '>=18.0.0'}
@ -285,6 +333,15 @@ packages:
aws-crt:
optional: true
'@aws-sdk/util-user-agent-node@3.816.0':
resolution: {integrity: sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==}
engines: {node: '>=18.0.0'}
peerDependencies:
aws-crt: '>=1.0.0'
peerDependenciesMeta:
aws-crt:
optional: true
'@aws-sdk/xml-builder@3.804.0':
resolution: {integrity: sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q==}
engines: {node: '>=18.0.0'}
@ -623,8 +680,8 @@ packages:
cpu: [x64]
os: [win32]
'@git.zone/tsbuild@2.6.0':
resolution: {integrity: sha512-LiCcmkmwHshUEV0+CSS3EVbGN61ccMy2JCY4loqMLwKWHFg2Uag21zNloeaasPMeJdHt9ODPTYcIo1K9A3+r6w==}
'@git.zone/tsbuild@2.6.3':
resolution: {integrity: sha512-KIJYGQf9g5YibQZFWniYhESi7cWDZyRiudrYyipEQdyrv0o4VwXCdFgvsi90EZyoR2gdvz9qIWKeB1VaGx/dcQ==}
hasBin: true
'@git.zone/tsbundle@2.2.5':
@ -639,8 +696,8 @@ packages:
resolution: {integrity: sha512-DDzWunkxXLtXJTxBf4EioXLwhuqdA2VzdTmOzWrw4Z4Qnms/YM67q36yajwNohAajPYyRz5DayU0ikrceFXyVw==}
hasBin: true
'@git.zone/tstest@1.9.0':
resolution: {integrity: sha512-UENg0cuXJLhxOJCCVzCn7y3CEY8OMHvqQSuDazZxd5fj5tNXx6RJIYsAEMVoeJeDWQSXYgbt2JW8Yz85kre5MA==}
'@git.zone/tstest@1.9.1':
resolution: {integrity: sha512-mCvs08wmRW84rjPiBQLYJTDdc/7t8D29bzDgVI5nR5BY+4p6T6bN3AX4HEeskzHy8xhln6AWV4cwkCvOwVC2+w==}
hasBin: true
'@git.zone/tswatch@2.1.0':
@ -758,8 +815,8 @@ packages:
'@postalsys/vmc@1.1.2':
resolution: {integrity: sha512-yjJ4XMVXMP4q7QgfyncVC042+ev2yJFnVBuVZmFubzM92NAu2gzJjWdpjR3sCw35eaxVGPE9pmEoyN6sffCqYw==}
'@puppeteer/browsers@2.10.4':
resolution: {integrity: sha512-9DxbZx+XGMNdjBynIs4BRSz+M3iRDeB7qRcAr6UORFLphCIM2x3DXgOucvADiifcqCE4XePFUKcnaAMyGbrDlQ==}
'@puppeteer/browsers@2.10.5':
resolution: {integrity: sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w==}
engines: {node: '>=18'}
hasBin: true
@ -836,8 +893,8 @@ packages:
'@push.rocks/smartexit@1.0.23':
resolution: {integrity: sha512-WmwKYcwbHBByoABhHHB+PAjr5475AtD/xBh1mDcqPrFsOOUOZq3BBUdpq25wI3ccu/SZB5IwaimiVzadls6HkA==}
'@push.rocks/smartexpect@2.4.2':
resolution: {integrity: sha512-L+aS1n5rWhf/yOh5R3zPgwycYtDr5FfrDWgasy6ShhN6Zbn/z/AOPbWcF/OpeTmx0XabWB2h5d4xBcCKLl47cQ==}
'@push.rocks/smartexpect@2.5.0':
resolution: {integrity: sha512-yoyuCoQ3tTiAriuvF+/09fNbVfFnacudL2SwHSzPhX/ugaE7VTSWXQ9A34eKOWvil0MPyDcOY36fVZDxvrPd8A==}
'@push.rocks/smartfeed@1.0.11':
resolution: {integrity: sha512-02uhXxQamgfBo3T12FsAdfyElnpoWuDUb08B2AE60DbIaukVx/7Mi17xwobApY1flNSr5StZDt8N8vxPhBhIXw==}
@ -3466,12 +3523,12 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
puppeteer-core@24.8.2:
resolution: {integrity: sha512-wNw5cRZOHiFibWc0vdYCYO92QuKTbJ8frXiUfOq/UGJWMqhPoBThTKkV+dJ99YyWfzJ2CfQQ4T1nhhR0h8FlVw==}
puppeteer-core@24.9.0:
resolution: {integrity: sha512-HFdCeH/wx6QPz8EncafbCqJBqaCG1ENW75xg3cLFMRUoqZDgByT6HSueiumetT2uClZxwqj0qS4qMVZwLHRHHw==}
engines: {node: '>=18'}
puppeteer@24.8.2:
resolution: {integrity: sha512-Sn6SBPwJ6ASFvQ7knQkR+yG7pcmr4LfXzmoVp3NR0xXyBbPhJa8a8ybtb6fnw1g/DD/2t34//yirubVczko37w==}
puppeteer@24.9.0:
resolution: {integrity: sha512-L0pOtALIx8rgDt24Y+COm8X52v78gNtBOW6EmUcEPci0TYD72SAuaXKqasRIx4JXxmg2Tkw5ySKcpPOwN8xXnQ==}
engines: {node: '>=18'}
hasBin: true
@ -3800,8 +3857,14 @@ packages:
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true
tar-fs@3.0.8:
resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==}
systeminformation@5.26.2:
resolution: {integrity: sha512-MeIqcMRZl9y4ujhuCgpCU/u0ArfUHePZUpmCps/LiQQkkEWd2JxR9XMIJtJIuzGUGOu6KJ+NmEMeSJ+dqYhA2g==}
engines: {node: '>=8.0.0'}
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
hasBin: true
tar-fs@3.0.9:
resolution: {integrity: sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==}
tar-stream@3.1.7:
resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
@ -4145,8 +4208,8 @@ packages:
resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==}
engines: {node: '>= 4.0.0'}
zod@3.25.4:
resolution: {integrity: sha512-7zz8qNtVv37yCd8OeUW37PMXrR0K/zg+6vw+Z2FJ2+oozVdRbFKldkCoqxd9nJflDrx2ZkjUJrPF2DMj+L4pBQ==}
zod@3.25.27:
resolution: {integrity: sha512-xkYsE+ztNLzBeoAG8Ipd2ICr86gyMpovQlB+Vid1LT7V16/Dj0z+Up1u1qxNX58cmJ/AtG2mvGw/7+jK48xEYw==}
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@ -4338,29 +4401,29 @@ snapshots:
- aws-crt
optional: true
'@aws-sdk/client-s3@3.812.0':
'@aws-sdk/client-s3@3.817.0':
dependencies:
'@aws-crypto/sha1-browser': 5.2.0
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.812.0
'@aws-sdk/credential-provider-node': 3.812.0
'@aws-sdk/core': 3.816.0
'@aws-sdk/credential-provider-node': 3.817.0
'@aws-sdk/middleware-bucket-endpoint': 3.808.0
'@aws-sdk/middleware-expect-continue': 3.804.0
'@aws-sdk/middleware-flexible-checksums': 3.812.0
'@aws-sdk/middleware-flexible-checksums': 3.816.0
'@aws-sdk/middleware-host-header': 3.804.0
'@aws-sdk/middleware-location-constraint': 3.804.0
'@aws-sdk/middleware-logger': 3.804.0
'@aws-sdk/middleware-recursion-detection': 3.804.0
'@aws-sdk/middleware-sdk-s3': 3.812.0
'@aws-sdk/middleware-sdk-s3': 3.816.0
'@aws-sdk/middleware-ssec': 3.804.0
'@aws-sdk/middleware-user-agent': 3.812.0
'@aws-sdk/middleware-user-agent': 3.816.0
'@aws-sdk/region-config-resolver': 3.808.0
'@aws-sdk/signature-v4-multi-region': 3.812.0
'@aws-sdk/signature-v4-multi-region': 3.816.0
'@aws-sdk/types': 3.804.0
'@aws-sdk/util-endpoints': 3.808.0
'@aws-sdk/util-user-agent-browser': 3.804.0
'@aws-sdk/util-user-agent-node': 3.812.0
'@aws-sdk/util-user-agent-node': 3.816.0
'@aws-sdk/xml-builder': 3.804.0
'@smithy/config-resolver': 4.1.3
'@smithy/core': 3.4.0
@ -4441,6 +4504,50 @@ snapshots:
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
optional: true
'@aws-sdk/client-sso@3.817.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.816.0
'@aws-sdk/middleware-host-header': 3.804.0
'@aws-sdk/middleware-logger': 3.804.0
'@aws-sdk/middleware-recursion-detection': 3.804.0
'@aws-sdk/middleware-user-agent': 3.816.0
'@aws-sdk/region-config-resolver': 3.808.0
'@aws-sdk/types': 3.804.0
'@aws-sdk/util-endpoints': 3.808.0
'@aws-sdk/util-user-agent-browser': 3.804.0
'@aws-sdk/util-user-agent-node': 3.816.0
'@smithy/config-resolver': 4.1.3
'@smithy/core': 3.4.0
'@smithy/fetch-http-handler': 5.0.3
'@smithy/hash-node': 4.0.3
'@smithy/invalid-dependency': 4.0.3
'@smithy/middleware-content-length': 4.0.3
'@smithy/middleware-endpoint': 4.1.7
'@smithy/middleware-retry': 4.1.8
'@smithy/middleware-serde': 4.0.6
'@smithy/middleware-stack': 4.0.3
'@smithy/node-config-provider': 4.1.2
'@smithy/node-http-handler': 4.0.5
'@smithy/protocol-http': 5.1.1
'@smithy/smithy-client': 4.3.0
'@smithy/types': 4.3.0
'@smithy/url-parser': 4.0.3
'@smithy/util-base64': 4.0.0
'@smithy/util-body-length-browser': 4.0.0
'@smithy/util-body-length-node': 4.0.0
'@smithy/util-defaults-mode-browser': 4.0.15
'@smithy/util-defaults-mode-node': 4.0.15
'@smithy/util-endpoints': 3.0.5
'@smithy/util-middleware': 4.0.3
'@smithy/util-retry': 4.0.4
'@smithy/util-utf8': 4.0.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/core@3.812.0':
dependencies:
@ -4455,6 +4562,21 @@ snapshots:
'@smithy/util-middleware': 4.0.3
fast-xml-parser: 4.4.1
tslib: 2.8.1
optional: true
'@aws-sdk/core@3.816.0':
dependencies:
'@aws-sdk/types': 3.804.0
'@smithy/core': 3.4.0
'@smithy/node-config-provider': 4.1.2
'@smithy/property-provider': 4.0.3
'@smithy/protocol-http': 5.1.1
'@smithy/signature-v4': 5.1.1
'@smithy/smithy-client': 4.3.0
'@smithy/types': 4.3.0
'@smithy/util-middleware': 4.0.3
fast-xml-parser: 4.4.1
tslib: 2.8.1
'@aws-sdk/credential-provider-cognito-identity@3.812.0':
dependencies:
@ -4474,6 +4596,15 @@ snapshots:
'@smithy/property-provider': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
optional: true
'@aws-sdk/credential-provider-env@3.816.0':
dependencies:
'@aws-sdk/core': 3.816.0
'@aws-sdk/types': 3.804.0
'@smithy/property-provider': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
'@aws-sdk/credential-provider-http@3.812.0':
dependencies:
@ -4487,6 +4618,20 @@ snapshots:
'@smithy/types': 4.3.0
'@smithy/util-stream': 4.2.1
tslib: 2.8.1
optional: true
'@aws-sdk/credential-provider-http@3.816.0':
dependencies:
'@aws-sdk/core': 3.816.0
'@aws-sdk/types': 3.804.0
'@smithy/fetch-http-handler': 5.0.3
'@smithy/node-http-handler': 4.0.5
'@smithy/property-provider': 4.0.3
'@smithy/protocol-http': 5.1.1
'@smithy/smithy-client': 4.3.0
'@smithy/types': 4.3.0
'@smithy/util-stream': 4.2.1
tslib: 2.8.1
'@aws-sdk/credential-provider-ini@3.812.0':
dependencies:
@ -4505,6 +4650,25 @@ snapshots:
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
optional: true
'@aws-sdk/credential-provider-ini@3.817.0':
dependencies:
'@aws-sdk/core': 3.816.0
'@aws-sdk/credential-provider-env': 3.816.0
'@aws-sdk/credential-provider-http': 3.816.0
'@aws-sdk/credential-provider-process': 3.816.0
'@aws-sdk/credential-provider-sso': 3.817.0
'@aws-sdk/credential-provider-web-identity': 3.817.0
'@aws-sdk/nested-clients': 3.817.0
'@aws-sdk/types': 3.804.0
'@smithy/credential-provider-imds': 4.0.5
'@smithy/property-provider': 4.0.3
'@smithy/shared-ini-file-loader': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-node@3.812.0':
dependencies:
@ -4522,6 +4686,24 @@ snapshots:
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
optional: true
'@aws-sdk/credential-provider-node@3.817.0':
dependencies:
'@aws-sdk/credential-provider-env': 3.816.0
'@aws-sdk/credential-provider-http': 3.816.0
'@aws-sdk/credential-provider-ini': 3.817.0
'@aws-sdk/credential-provider-process': 3.816.0
'@aws-sdk/credential-provider-sso': 3.817.0
'@aws-sdk/credential-provider-web-identity': 3.817.0
'@aws-sdk/types': 3.804.0
'@smithy/credential-provider-imds': 4.0.5
'@smithy/property-provider': 4.0.3
'@smithy/shared-ini-file-loader': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-process@3.812.0':
dependencies:
@ -4531,6 +4713,16 @@ snapshots:
'@smithy/shared-ini-file-loader': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
optional: true
'@aws-sdk/credential-provider-process@3.816.0':
dependencies:
'@aws-sdk/core': 3.816.0
'@aws-sdk/types': 3.804.0
'@smithy/property-provider': 4.0.3
'@smithy/shared-ini-file-loader': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
'@aws-sdk/credential-provider-sso@3.812.0':
dependencies:
@ -4544,6 +4736,20 @@ snapshots:
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
optional: true
'@aws-sdk/credential-provider-sso@3.817.0':
dependencies:
'@aws-sdk/client-sso': 3.817.0
'@aws-sdk/core': 3.816.0
'@aws-sdk/token-providers': 3.817.0
'@aws-sdk/types': 3.804.0
'@smithy/property-provider': 4.0.3
'@smithy/shared-ini-file-loader': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-web-identity@3.812.0':
dependencies:
@ -4555,6 +4761,18 @@ snapshots:
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
optional: true
'@aws-sdk/credential-provider-web-identity@3.817.0':
dependencies:
'@aws-sdk/core': 3.816.0
'@aws-sdk/nested-clients': 3.817.0
'@aws-sdk/types': 3.804.0
'@smithy/property-provider': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-providers@3.812.0':
dependencies:
@ -4598,12 +4816,12 @@ snapshots:
'@smithy/types': 4.3.0
tslib: 2.8.1
'@aws-sdk/middleware-flexible-checksums@3.812.0':
'@aws-sdk/middleware-flexible-checksums@3.816.0':
dependencies:
'@aws-crypto/crc32': 5.2.0
'@aws-crypto/crc32c': 5.2.0
'@aws-crypto/util': 5.2.0
'@aws-sdk/core': 3.812.0
'@aws-sdk/core': 3.816.0
'@aws-sdk/types': 3.804.0
'@smithy/is-array-buffer': 4.0.0
'@smithy/node-config-provider': 4.1.2
@ -4640,9 +4858,9 @@ snapshots:
'@smithy/types': 4.3.0
tslib: 2.8.1
'@aws-sdk/middleware-sdk-s3@3.812.0':
'@aws-sdk/middleware-sdk-s3@3.816.0':
dependencies:
'@aws-sdk/core': 3.812.0
'@aws-sdk/core': 3.816.0
'@aws-sdk/types': 3.804.0
'@aws-sdk/util-arn-parser': 3.804.0
'@smithy/core': 3.4.0
@ -4672,6 +4890,17 @@ snapshots:
'@smithy/protocol-http': 5.1.1
'@smithy/types': 4.3.0
tslib: 2.8.1
optional: true
'@aws-sdk/middleware-user-agent@3.816.0':
dependencies:
'@aws-sdk/core': 3.816.0
'@aws-sdk/types': 3.804.0
'@aws-sdk/util-endpoints': 3.808.0
'@smithy/core': 3.4.0
'@smithy/protocol-http': 5.1.1
'@smithy/types': 4.3.0
tslib: 2.8.1
'@aws-sdk/nested-clients@3.812.0':
dependencies:
@ -4715,6 +4944,50 @@ snapshots:
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
optional: true
'@aws-sdk/nested-clients@3.817.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.816.0
'@aws-sdk/middleware-host-header': 3.804.0
'@aws-sdk/middleware-logger': 3.804.0
'@aws-sdk/middleware-recursion-detection': 3.804.0
'@aws-sdk/middleware-user-agent': 3.816.0
'@aws-sdk/region-config-resolver': 3.808.0
'@aws-sdk/types': 3.804.0
'@aws-sdk/util-endpoints': 3.808.0
'@aws-sdk/util-user-agent-browser': 3.804.0
'@aws-sdk/util-user-agent-node': 3.816.0
'@smithy/config-resolver': 4.1.3
'@smithy/core': 3.4.0
'@smithy/fetch-http-handler': 5.0.3
'@smithy/hash-node': 4.0.3
'@smithy/invalid-dependency': 4.0.3
'@smithy/middleware-content-length': 4.0.3
'@smithy/middleware-endpoint': 4.1.7
'@smithy/middleware-retry': 4.1.8
'@smithy/middleware-serde': 4.0.6
'@smithy/middleware-stack': 4.0.3
'@smithy/node-config-provider': 4.1.2
'@smithy/node-http-handler': 4.0.5
'@smithy/protocol-http': 5.1.1
'@smithy/smithy-client': 4.3.0
'@smithy/types': 4.3.0
'@smithy/url-parser': 4.0.3
'@smithy/util-base64': 4.0.0
'@smithy/util-body-length-browser': 4.0.0
'@smithy/util-body-length-node': 4.0.0
'@smithy/util-defaults-mode-browser': 4.0.15
'@smithy/util-defaults-mode-node': 4.0.15
'@smithy/util-endpoints': 3.0.5
'@smithy/util-middleware': 4.0.3
'@smithy/util-retry': 4.0.4
'@smithy/util-utf8': 4.0.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/region-config-resolver@3.808.0':
dependencies:
@ -4725,9 +4998,9 @@ snapshots:
'@smithy/util-middleware': 4.0.3
tslib: 2.8.1
'@aws-sdk/signature-v4-multi-region@3.812.0':
'@aws-sdk/signature-v4-multi-region@3.816.0':
dependencies:
'@aws-sdk/middleware-sdk-s3': 3.812.0
'@aws-sdk/middleware-sdk-s3': 3.816.0
'@aws-sdk/types': 3.804.0
'@smithy/protocol-http': 5.1.1
'@smithy/signature-v4': 5.1.1
@ -4744,6 +5017,19 @@ snapshots:
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
optional: true
'@aws-sdk/token-providers@3.817.0':
dependencies:
'@aws-sdk/core': 3.816.0
'@aws-sdk/nested-clients': 3.817.0
'@aws-sdk/types': 3.804.0
'@smithy/property-provider': 4.0.3
'@smithy/shared-ini-file-loader': 4.0.3
'@smithy/types': 4.3.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/types@3.804.0':
dependencies:
@ -4779,6 +5065,15 @@ snapshots:
'@smithy/node-config-provider': 4.1.2
'@smithy/types': 4.3.0
tslib: 2.8.1
optional: true
'@aws-sdk/util-user-agent-node@3.816.0':
dependencies:
'@aws-sdk/middleware-user-agent': 3.816.0
'@aws-sdk/types': 3.804.0
'@smithy/node-config-provider': 4.1.2
'@smithy/types': 4.3.0
tslib: 2.8.1
'@aws-sdk/xml-builder@3.804.0':
dependencies:
@ -5006,7 +5301,7 @@ snapshots:
'@esbuild/win32-x64@0.25.4':
optional: true
'@git.zone/tsbuild@2.6.0':
'@git.zone/tsbuild@2.6.3':
dependencies:
'@git.zone/tspublish': 1.9.1
'@push.rocks/early': 4.0.4
@ -5057,7 +5352,7 @@ snapshots:
'@push.rocks/smartshell': 3.2.3
tsx: 4.19.4
'@git.zone/tstest@1.9.0(@aws-sdk/credential-providers@3.812.0)(socks@2.8.4)(typescript@5.8.3)':
'@git.zone/tstest@1.9.1(@aws-sdk/credential-providers@3.812.0)(socks@2.8.4)(typescript@5.8.3)':
dependencies:
'@api.global/typedserver': 3.0.74
'@git.zone/tsbundle': 2.2.5
@ -5068,7 +5363,7 @@ snapshots:
'@push.rocks/smartcrypto': 2.0.4
'@push.rocks/smartdelay': 3.0.5
'@push.rocks/smartenv': 5.0.12
'@push.rocks/smartexpect': 2.4.2
'@push.rocks/smartexpect': 2.5.0
'@push.rocks/smartfile': 11.2.3
'@push.rocks/smartjson': 5.0.20
'@push.rocks/smartlog': 3.1.8
@ -5307,14 +5602,14 @@ snapshots:
'@peculiar/asn1-x509': 2.3.15
'@peculiar/asn1-x509-logotype': 2.3.15
'@puppeteer/browsers@2.10.4':
'@puppeteer/browsers@2.10.5':
dependencies:
debug: 4.4.1
extract-zip: 2.0.1
progress: 2.0.3
proxy-agent: 6.5.0
semver: 7.7.2
tar-fs: 3.0.8
tar-fs: 3.0.9
yargs: 17.7.2
transitivePeerDependencies:
- bare-buffer
@ -5414,7 +5709,6 @@ snapshots:
- '@aws-sdk/credential-providers'
- '@mongodb-js/zstd'
- '@nuxt/kit'
- aws-crt
- encoding
- gcp-metadata
- kerberos
@ -5455,7 +5749,7 @@ snapshots:
'@push.rocks/smartbucket@3.3.7':
dependencies:
'@aws-sdk/client-s3': 3.812.0
'@aws-sdk/client-s3': 3.817.0
'@push.rocks/smartmime': 2.0.4
'@push.rocks/smartpath': 5.0.18
'@push.rocks/smartpromise': 4.2.3
@ -5566,7 +5860,7 @@ snapshots:
'@push.rocks/smartpromise': 4.2.3
tree-kill: 1.2.2
'@push.rocks/smartexpect@2.4.2':
'@push.rocks/smartexpect@2.5.0':
dependencies:
'@push.rocks/smartdelay': 3.0.5
'@push.rocks/smartpromise': 4.2.3
@ -5737,7 +6031,7 @@ snapshots:
'@types/default-gateway': 3.0.1
isopen: 1.3.0
public-ip: 6.0.2
systeminformation: 5.25.11
systeminformation: 5.26.2
'@push.rocks/smartnetwork@4.0.2':
dependencies:
@ -5839,7 +6133,6 @@ snapshots:
- '@aws-sdk/credential-providers'
- '@mongodb-js/zstd'
- '@nuxt/kit'
- aws-crt
- bufferutil
- encoding
- gcp-metadata
@ -5856,7 +6149,7 @@ snapshots:
dependencies:
'@push.rocks/smartdelay': 3.0.5
'@push.rocks/smartshell': 3.2.3
puppeteer: 24.8.2(typescript@5.8.3)
puppeteer: 24.9.0(typescript@5.8.3)
tree-kill: 1.2.2
transitivePeerDependencies:
- bare-buffer
@ -7085,7 +7378,7 @@ snapshots:
dependencies:
devtools-protocol: 0.0.1439962
mitt: 3.0.1
zod: 3.25.4
zod: 3.25.27
clean-css@4.2.4:
dependencies:
@ -9057,9 +9350,9 @@ snapshots:
punycode@2.3.1: {}
puppeteer-core@24.8.2:
puppeteer-core@24.9.0:
dependencies:
'@puppeteer/browsers': 2.10.4
'@puppeteer/browsers': 2.10.5
chromium-bidi: 5.1.0(devtools-protocol@0.0.1439962)
debug: 4.4.1
devtools-protocol: 0.0.1439962
@ -9071,13 +9364,13 @@ snapshots:
- supports-color
- utf-8-validate
puppeteer@24.8.2(typescript@5.8.3):
puppeteer@24.9.0(typescript@5.8.3):
dependencies:
'@puppeteer/browsers': 2.10.4
'@puppeteer/browsers': 2.10.5
chromium-bidi: 5.1.0(devtools-protocol@0.0.1439962)
cosmiconfig: 9.0.0(typescript@5.8.3)
devtools-protocol: 0.0.1439962
puppeteer-core: 24.8.2
puppeteer-core: 24.9.0
typed-query-selector: 2.12.0
transitivePeerDependencies:
- bare-buffer
@ -9502,7 +9795,9 @@ snapshots:
systeminformation@5.25.11: {}
tar-fs@3.0.8:
systeminformation@5.26.2: {}
tar-fs@3.0.9:
dependencies:
pump: 3.0.2
tar-stream: 3.1.7
@ -9833,6 +10128,6 @@ snapshots:
ylru@1.4.0: {}
zod@3.25.4: {}
zod@3.25.27: {}
zwitch@2.0.4: {}

View File

@ -110,7 +110,7 @@ export async function startTestServer(config: ITestServerConfig): Promise<ITestS
const smtpServer = await createSmtpServer(mockEmailServer, smtpOptions);
// Start the server
await smtpServer.start();
await smtpServer.listen();
// Wait for server to be ready
await waitForServerReady(serverConfig.hostname, serverConfig.port);
@ -140,12 +140,8 @@ export async function stopTestServer(testServer: ITestServer): Promise<void> {
console.log(`🛑 Stopping test SMTP server on ${testServer.hostname}:${testServer.port}`);
// Stop the SMTP server
if (testServer.smtpServer.stop && typeof testServer.smtpServer.stop === 'function') {
await testServer.smtpServer.stop();
} else if (testServer.smtpServer.close && typeof testServer.smtpServer.close === 'function') {
await new Promise<void>((resolve) => {
testServer.smtpServer.close(() => resolve());
});
if (testServer.smtpServer.close && typeof testServer.smtpServer.close === 'function') {
await testServer.smtpServer.close();
}
// Wait for port to be free

View File

@ -30,7 +30,7 @@ test/
├── readme.md # This file
├── helpers/
│ ├── server.loader.ts # SMTP server lifecycle management
│ ├── test.utils.ts # Common test utilities
│ ├── utils.ts # Common test utilities
│ └── smtp.client.ts # Test SMTP client utilities
└── suite/
├── connection/ # Connection management tests (CM)

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_TIMEOUT = 30000;

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_TIMEOUT = 15000;

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_TIMEOUT = 10000;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
// Test configuration
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
// Test configuration
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
// Test configuration
const TEST_PORT = 2525;
@ -192,7 +192,7 @@ tap.test('HELP - should return properly formatted help text', async (tools) => {
// Multi-line help should use 214- prefix
if (helpLines.length > 1) {
const hasMultilineFormat = helpLines.some(l => l.startsWith('214-'));
expect(hasMultilineFormat).toBeTrue();
expect(hasMultilineFormat).toEqual(true);
}
}

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_TIMEOUT = 10000;

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_TIMEOUT = 10000;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
// Test configuration
const TEST_PORT = 2525;
@ -356,7 +356,7 @@ tap.test('QUIT - verify clean connection shutdown', async (tools) => {
socket.on('close', () => {
closeEventFired = true;
if (currentStep === 'quit') {
expect(endEventFired || closeEventFired).toBeTrue();
expect(endEventFired || closeEventFired).toEqual(true);
done.resolve();
}
});

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_TIMEOUT = 10000;

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
// Test configuration
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
// Test configuration
const TEST_PORT = 2525;
@ -49,7 +49,7 @@ tap.test('SIZE Extension - should advertise SIZE in EHLO response', async (tools
socket.write('QUIT\r\n');
setTimeout(() => {
socket.destroy();
expect(sizeSupported).toBeTrue();
expect(sizeSupported).toEqual(true);
if (maxMessageSize !== null) {
expect(maxMessageSize).toBeGreaterThan(0);
}

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
// Test configuration
const TEST_PORT = 2525;

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525;
@ -71,7 +71,7 @@ tap.test('Abrupt Disconnection - should handle socket destruction without QUIT',
setTimeout(() => resolve(false), 5000);
});
expect(recoveryConnected).toBeTrue();
expect(recoveryConnected).toEqual(true);
if (recoveryConnected) {
// Get banner from recovery connection
@ -143,7 +143,7 @@ tap.test('Abrupt Disconnection - should handle multiple simultaneous abrupt disc
setTimeout(() => resolve(false), 5000);
});
expect(stillAccepting).toBeTrue();
expect(stillAccepting).toEqual(true);
if (stillAccepting) {
const banner = await new Promise<string>((resolve) => {
@ -240,7 +240,7 @@ tap.test('Abrupt Disconnection - should handle disconnection during DATA transfe
setTimeout(() => resolve(false), 5000);
});
expect(canConnect).toBeTrue();
expect(canConnect).toEqual(true);
if (canConnect) {
const banner = await new Promise<string>((resolve) => {
@ -307,7 +307,7 @@ tap.test('Abrupt Disconnection - should timeout idle connections', async (tools)
}
// Either behavior is acceptable
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
done.resolve();
@ -316,7 +316,7 @@ tap.test('Abrupt Disconnection - should timeout idle connections', async (tools)
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer();
expect(true).toBeTrue();
expect(true).toEqual(true);
});
tap.start();

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525;
@ -62,7 +62,7 @@ tap.test('Connection Rejection - should handle suspicious domains', async (tools
// We just verify it responds appropriately
const validResponses = ['250', '421', '550', '501'];
const hasValidResponse = validResponses.some(code => response.includes(code));
expect(hasValidResponse).toBeTrue();
expect(hasValidResponse).toEqual(true);
// Clean up
if (!socket.destroyed) {
@ -151,7 +151,7 @@ tap.test('Connection Rejection - should handle overload conditions', async (tool
// Either behavior is acceptable - rejection shows overload protection,
// acceptance shows high capacity
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
// Clean up all connections
@ -225,7 +225,7 @@ tap.test('Connection Rejection - should reject invalid protocol', async (tools)
const hasErrorResponse = errorResponses.some(code => response.includes(code));
const closedWithoutResponse = response === 'CLOSED_WITHOUT_RESPONSE' || response === '';
expect(hasErrorResponse || closedWithoutResponse).toBeTrue();
expect(hasErrorResponse || closedWithoutResponse).toEqual(true);
if (hasErrorResponse) {
console.log('Server properly rejected with error response');
@ -291,7 +291,7 @@ tap.test('Connection Rejection - should handle invalid commands gracefully', asy
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer();
expect(true).toBeTrue();
expect(true).toEqual(true);
});
tap.start();

View File

@ -109,7 +109,7 @@ tap.test('CM-03: Active connection should not timeout', async () => {
}
// Connection should still be active
expect(isConnected).toBeTrue();
expect(isConnected).toEqual(true);
// Close connection gracefully
socket.write('QUIT\r\n');

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_TIMEOUT = 60000; // Longer timeout for keepalive tests
@ -211,7 +211,7 @@ tap.test('Keepalive - should detect connection loss', async (tools) => {
await new Promise(resolve => setTimeout(resolve, 10000));
// Connection should be detected as lost
expect(connectionLost).toBeTrue();
expect(connectionLost).toEqual(true);
console.log('Keepalive detected connection loss');
} finally {

View File

@ -1,13 +1,15 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
import { createConcurrentConnections, performSmtpHandshake, closeSmtpConnection } from '../../helpers/test.utils.js';
import { createConcurrentConnections, performSmtpHandshake, closeSmtpConnection } from '../../helpers/utils.js';
let testServer: SmtpServer;
const CONCURRENT_COUNT = 10;
tap.test('setup - start SMTP server', async () => {
testServer = await startTestServer();
testServer = await startTestServer({
port: 2526
});
await new Promise(resolve => setTimeout(resolve, 1000));
expect(testServer.port).toEqual(2526);
@ -101,7 +103,7 @@ tap.test('CM-02: Connection limit enforcement - verify max connections', async (
});
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer();
await stopTestServer(testServer);
console.log('✅ Test server stopped');
});

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_TIMEOUT = 30000;
@ -25,7 +25,7 @@ tap.test('Plain Connection - should establish basic TCP connection', async (tool
setTimeout(() => resolve(false), 5000);
});
expect(connected).toBeTrue();
expect(connected).toEqual(true);
if (connected) {
console.log('Plain connection established:');
@ -279,7 +279,7 @@ tap.test('Plain Connection - should work on standard SMTP port 25', async (tools
}
// Test passes regardless - port 25 connectivity is environment-dependent
expect(true).toBeTrue();
expect(true).toEqual(true);
done.resolve();
});

View File

@ -2,7 +2,7 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as tls from 'tls';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration
const TEST_PORT = 2525;
@ -12,7 +12,10 @@ let testServer: SmtpServer;
// Setup
tap.test('setup - start SMTP server with STARTTLS support', async () => {
testServer = await startTestServer();
testServer = await startTestServer({
port: TEST_PORT,
tlsEnabled: true // Enable TLS to advertise STARTTLS
});
await new Promise(resolve => setTimeout(resolve, 1000));
@ -73,7 +76,7 @@ tap.test('STARTTLS - should upgrade plain connection to TLS', async (tools) => {
tlsSocket!.write('QUIT\r\n');
setTimeout(() => {
tlsSocket!.destroy();
expect(tlsSocket!.encrypted).toBeTrue();
expect(tlsSocket!.encrypted).toEqual(true);
done.resolve();
}, 100);
}
@ -441,7 +444,7 @@ tap.test('STARTTLS - should use secure TLS version and ciphers', async (tools) =
// Teardown
tap.test('teardown - stop SMTP server', async () => {
if (testServer) {
await stopTestServer();
await stopTestServer(testServer);
}
});

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as tls from 'tls';
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
const TEST_PORT_TLS = 30466;
@ -61,7 +61,7 @@ tap.test('TLS Ciphers - should advertise STARTTLS for cipher negotiation', async
socket.end();
// Either behavior is acceptable
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
await stopTestServer();
@ -106,7 +106,7 @@ tap.test('TLS Ciphers - should negotiate secure cipher suites', async (tools) =>
console.log('Cipher security analysis:', cipherSecurity);
expect(cipher.name).toBeDefined();
expect(cipherSecurity.secure).toBeTrue();
expect(cipherSecurity.secure).toEqual(true);
// Send SMTP command to verify encrypted communication
const banner = await new Promise<string>((resolve) => {
@ -187,7 +187,7 @@ tap.test('TLS Ciphers - should reject weak cipher suites', async (tools) => {
}
// Either behavior is logged - some servers may support legacy ciphers
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
await stopTestServer();
@ -249,7 +249,7 @@ tap.test('TLS Ciphers - should support forward secrecy', async (tools) => {
socket.end();
// Forward secrecy is recommended but not required
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
await stopTestServer();

View File

@ -1,12 +1,15 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
import { connectToSmtp, performSmtpHandshake, closeSmtpConnection } from '../../helpers/test.utils.js';
import { connectToSmtp, performSmtpHandshake, closeSmtpConnection } from '../../helpers/utils.js';
let testServer: SmtpServer;
tap.test('setup - start SMTP server with TLS support', async () => {
testServer = await startTestServer();
testServer = await startTestServer({
port: 2525,
tlsEnabled: true // Enable TLS support
});
await new Promise(resolve => setTimeout(resolve, 1000));
expect(testServer.port).toEqual(2525);
@ -26,7 +29,7 @@ tap.test('CM-01: TLS Connection Test - server should advertise STARTTLS capabili
// Check for STARTTLS support
const supportsStarttls = capabilities.some(cap => cap.toUpperCase().includes('STARTTLS'));
expect(supportsStarttls).toBeTrue();
expect(supportsStarttls).toEqual(true);
// Close connection gracefully
await closeSmtpConnection(socket);
@ -44,7 +47,7 @@ tap.test('CM-01: TLS Connection Test - server should advertise STARTTLS capabili
tap.test('CM-01: TLS Connection Test - verify TLS certificate configuration', async () => {
// This test verifies that the server has TLS certificates configured
expect(testServer.config.tlsEnabled).toBeTrue();
expect(testServer.config.tlsEnabled).toEqual(true);
// The server should have loaded certificates during startup
// In production, this would validate actual certificate properties
@ -52,7 +55,7 @@ tap.test('CM-01: TLS Connection Test - verify TLS certificate configuration', as
});
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer();
await stopTestServer(testServer);
console.log('✅ Test server stopped');
});

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as tls from 'tls';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525;
const TEST_PORT_TLS = 30465;
@ -82,7 +82,7 @@ tap.test('TLS Versions - should support STARTTLS capability', async (tools) => {
socket.end();
// STARTTLS is optional but common
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
done.resolve();
@ -105,7 +105,7 @@ tap.test('TLS Versions - should support modern TLS versions on secure port', asy
// At least one modern version should be supported
const supportsModernTls = tls12Result.success || tls13Result.success;
expect(supportsModernTls).toBeTrue();
expect(supportsModernTls).toEqual(true);
if (tls12Result.success) {
console.log('TLS 1.2 supported with cipher:', tls12Result.cipher);
@ -137,7 +137,7 @@ tap.test('TLS Versions - should reject obsolete TLS versions', async (tools) =>
console.log(`TLS 1.1 ${tls11Result.success ? 'accepted (legacy support)' : 'rejected (good)'}`);
// Either behavior is acceptable - log the results
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
done.resolve();
@ -261,7 +261,7 @@ async function testTlsVersion(version: string, port: number): Promise<{success:
tap.test('cleanup - stop SMTP servers', async () => {
await stopTestServer();
await stopTestServer(testServerTls);
expect(true).toBeTrue();
expect(true).toEqual(true);
});
tap.start();

View File

@ -66,7 +66,7 @@ tap.test('Empty Commands - should reject empty line (just CRLF)', async (tools)
} else {
// Server might ignore empty lines
console.log('Server ignored empty line');
expect(true).toBeTrue();
expect(true).toEqual(true);
}
// Test server is still responsive
@ -425,7 +425,7 @@ tap.test('Empty Commands - server should remain stable after empty commands', as
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer);
expect(true).toBeTrue();
expect(true).toEqual(true);
});
tap.start();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;

View File

@ -93,7 +93,7 @@ tap.test('Extremely Long Lines - should handle lines exceeding RFC 5321 limit',
const accepted = finalResponse.includes('250');
const rejected = finalResponse.includes('552') || finalResponse.includes('500') || finalResponse.includes('554');
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
if (accepted) {
console.log('Server accepted long line (may wrap internally)');
@ -419,7 +419,7 @@ tap.test('Extremely Long Lines - should handle line exactly at RFC limit', async
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer);
expect(true).toBeTrue();
expect(true).toEqual(true);
});
tap.start();

View File

@ -99,7 +99,7 @@ tap.test('Invalid Character Handling - should handle control characters in email
const accepted = finalResponse.includes('250');
const rejected = finalResponse.includes('550') || finalResponse.includes('554');
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
if (rejected) {
console.log('Server rejected control characters (strict security)');
@ -376,7 +376,7 @@ tap.test('Invalid Character Handling - should handle bare LF and CR', async (too
console.log('Server rejected bare LF/CR (strict SMTP compliance)');
}
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
// Clean up
socket.write('QUIT\r\n');
@ -473,7 +473,7 @@ tap.test('Invalid Character Handling - should handle long lines without proper f
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer);
expect(true).toBeTrue();
expect(true).toEqual(true);
});
tap.start();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection, generateRandomEmail } from '../../helpers/test.utils.js';
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection, generateRandomEmail } from '../../helpers/utils.js';
let testServer: ITestServer;

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525;
@ -157,7 +157,7 @@ tap.test('Attachment Handling - Multiple file types', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with multiple attachments accepted successfully');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -253,7 +253,7 @@ tap.test('Attachment Handling - Large attachment', async (tools) => {
const rejected = dataBuffer.includes('552'); // Size exceeded
console.log(`Large attachment: ${accepted ? 'accepted' : 'rejected (size limit)'}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -361,7 +361,7 @@ tap.test('Attachment Handling - Inline vs attachment disposition', async (tools)
if (!completed) {
completed = true;
console.log('Email with inline and attachment dispositions accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -472,7 +472,7 @@ tap.test('Attachment Handling - Filename encoding', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with various filename encodings accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -577,7 +577,7 @@ tap.test('Attachment Handling - Empty and malformed attachments', async (tools)
completed = true;
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
console.log(`Email with malformed attachments ${result}`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525;
@ -141,7 +141,7 @@ tap.test('DSN - Success notification request', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with DSN success request accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -228,7 +228,7 @@ tap.test('DSN - Multiple notification types', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with multiple DSN types accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -280,7 +280,7 @@ tap.test('DSN - Never notify', async (tools) => {
const notSupported = dataBuffer.includes('501') || dataBuffer.includes('555');
console.log(`NOTIFY=NEVER: ${accepted ? 'accepted' : notSupported ? 'not supported' : 'error'}`);
expect(accepted || notSupported).toBeTrue();
expect(accepted || notSupported).toEqual(true);
if (notSupported) {
socket.write('RCPT TO:<recipient@example.com>\r\n');
@ -315,7 +315,7 @@ tap.test('DSN - Never notify', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with NOTIFY=NEVER accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -401,7 +401,7 @@ tap.test('DSN - Original recipient tracking', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with ORCPT tracking accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -464,7 +464,7 @@ tap.test('DSN - Return parameter handling', async (tools) => {
const notSupported = dataBuffer.includes('501') || dataBuffer.includes('555');
console.log(`RET=FULL: ${accepted ? 'accepted' : notSupported ? 'not supported' : 'error'}`);
expect(accepted || notSupported).toBeTrue();
expect(accepted || notSupported).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525;
@ -79,7 +79,7 @@ tap.test('Email Routing - Local domain routing', async (tools) => {
if (!completed) {
completed = true;
console.log('Local domain email routed successfully');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -162,7 +162,7 @@ tap.test('Email Routing - External domain routing', async (tools) => {
if (!completed) {
completed = true;
console.log('External domain email accepted for relay');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -246,7 +246,7 @@ tap.test('Email Routing - Multiple recipients', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with multiple recipients routed successfully');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -504,7 +504,7 @@ tap.test('Email Routing - Subdomain routing', async (tools) => {
if (!completed) {
completed = true;
console.log('Subdomain routing test completed');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -130,7 +130,7 @@ tap.test('MIME Handling - Comprehensive multipart message', async (tools) => {
if (!completed) {
completed = true;
console.log('Complex MIME message accepted successfully');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -207,7 +207,7 @@ tap.test('MIME Handling - Quoted-printable encoding', async (tools) => {
if (!completed) {
completed = true;
console.log('Quoted-printable encoded email accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -296,7 +296,7 @@ tap.test('MIME Handling - Base64 encoding', async (tools) => {
if (!completed) {
completed = true;
console.log('Base64 encoded email accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -396,7 +396,7 @@ tap.test('MIME Handling - Content-Disposition headers', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with various Content-Disposition headers accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -490,7 +490,7 @@ tap.test('MIME Handling - International character sets', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with international character sets accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
let testServer: any;
@ -107,7 +107,7 @@ tap.test('Special Character Handling - Comprehensive Unicode test', async (tools
if (!completed) {
completed = true;
console.log('Email with special characters accepted successfully');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -195,7 +195,7 @@ tap.test('Special Character Handling - Control characters', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with control characters accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -266,7 +266,7 @@ tap.test('Special Character Handling - Subject header encoding', async (tools) =
if (!completed) {
completed = true;
console.log('Email with encoded subject headers accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -338,7 +338,7 @@ tap.test('Special Character Handling - Address headers with special chars', asyn
if (!completed) {
completed = true;
console.log('Email with special characters in addresses accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -435,7 +435,7 @@ tap.test('Special Character Handling - Mixed encodings', async (tools) => {
if (!completed) {
completed = true;
console.log('Email with mixed character encodings accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
@ -299,7 +299,7 @@ tap.test('ERR-08: Error logging - Data transmission errors', async (tools) => {
(finalResponse.includes('250') ||
finalResponse.includes('5'));
expect(hasResponse).toBeTrue();
expect(hasResponse).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
@ -120,7 +120,7 @@ tap.test('ERR-07: Exception handling - Invalid commands', async (tools) => {
console.log('Server still responding:', serverStillResponding);
// Test passes if exceptions were handled OR server is still responding
expect(exceptionHandled || serverStillResponding).toBeTrue();
expect(exceptionHandled || serverStillResponding).toEqual(true);
if (socket.writable) {
socket.write('QUIT\r\n');

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
@ -116,7 +116,7 @@ tap.test('ERR-06: Malformed MIME handling - Invalid boundary', async (tools) =>
response.includes('malformed');
console.log('Malformed MIME response:', response.substring(0, 100));
expect(validResponse).toBeTrue();
expect(validResponse).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -228,7 +228,7 @@ tap.test('ERR-06: Malformed MIME handling - Missing headers', async (tools) => {
response.includes('451');
console.log('Missing headers response:', response.substring(0, 100));
expect(validResponse).toBeTrue();
expect(validResponse).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -349,7 +349,7 @@ tap.test('ERR-06: Malformed MIME handling - Nested multipart errors', async (too
response.includes('451');
console.log('Nested multipart response:', response.substring(0, 100));
expect(validResponse).toBeTrue();
expect(validResponse).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -73,7 +73,7 @@ tap.test('Permanent Failures - should return 5xx for invalid recipient syntax',
const permanentFailureCodes = ['550', '551', '552', '553', '554', '501'];
const isPermanentFailure = permanentFailureCodes.some(code => rcptResponse.includes(code));
expect(isPermanentFailure).toBeTrue();
expect(isPermanentFailure).toEqual(true);
// Clean up
socket.write('QUIT\r\n');
@ -142,7 +142,7 @@ tap.test('Permanent Failures - should handle non-existent domain', async (tools)
// 2. Reject with permanent failure (5xx)
// Both are valid approaches
const acceptedOrRejected = rcptResponse.includes('250') || /^5\d{2}/.test(rcptResponse);
expect(acceptedOrRejected).toBeTrue();
expect(acceptedOrRejected).toEqual(true);
if (rcptResponse.includes('250')) {
console.log('Server accepts unknown domains (will handle bounces later)');
@ -297,7 +297,7 @@ tap.test('Permanent Failures - should persist after RSET', async (tools) => {
console.log('Permanent failures persist correctly after RSET');
} else {
console.log('Server accepts invalid syntax in MAIL FROM (lenient parsing)');
expect(true).toBeTrue();
expect(true).toEqual(true);
}
// Clean up
@ -311,7 +311,7 @@ tap.test('Permanent Failures - should persist after RSET', async (tools) => {
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer);
expect(true).toBeTrue();
expect(true).toEqual(true);
});
tap.start();

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
@ -120,7 +120,7 @@ tap.test('ERR-05: Resource exhaustion handling - Connection limit', async (tools
console.log(`Exhaustion detected: ${exhaustionDetected}`);
if (lastError) console.log(`Last error: ${lastError}`);
expect(hasResourceProtection).toBeTrue();
expect(hasResourceProtection).toEqual(true);
done.resolve();
} catch (error) {
console.error('Test error:', error);
@ -236,12 +236,12 @@ tap.test('ERR-05: Resource exhaustion handling - Memory limits', async (tools) =
}
// Resource protection is working if we got an error or protective response
expect(resourceError || endResponse.includes('552') || endResponse.includes('451')).toBeTrue();
expect(resourceError || endResponse.includes('552') || endResponse.includes('451')).toEqual(true);
} catch (err) {
// Errors during large data transmission indicate resource protection
console.log('Expected resource protection error:', err);
expect(true).toBeTrue();
expect(true).toEqual(true);
}
socket.write('QUIT\r\n');

View File

@ -135,7 +135,7 @@ tap.test('Temporary Failures - should allow retry after temporary failure', asyn
const attempt2 = await attemptConnection(2);
// At least one attempt should work
expect(attempt1.success || attempt2.success).toBeTrue();
expect(attempt1.success || attempt2.success).toEqual(true);
done.resolve();

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
import { createTestSmtpClient, sendConcurrentEmails, measureClientThroughput } from '../../helpers/smtp.client.js';
import { connectToSmtp, sendSmtpCommand, waitForGreeting, createMimeMessage } from '../../helpers/test.utils.js';
import { connectToSmtp, sendSmtpCommand, waitForGreeting, createMimeMessage } from '../../helpers/utils.js';
let testServer: ITestServer;

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
@ -73,7 +73,7 @@ tap.test('REL-05: DNS resolution failure handling - Non-existent domains', async
const mailFromHandled = mailResponse.includes('250') ||
mailResponse.includes('450') ||
mailResponse.includes('550');
expect(mailFromHandled).toBeTrue();
expect(mailFromHandled).toEqual(true);
// Reset if needed
if (mailResponse.includes('250')) {
@ -108,7 +108,7 @@ tap.test('REL-05: DNS resolution failure handling - Non-existent domains', async
const rcptToHandled = rcptResponse.includes('450') || // Temporary failure
rcptResponse.includes('550') || // Permanent failure
rcptResponse.includes('553'); // Address error
expect(rcptToHandled).toBeTrue();
expect(rcptToHandled).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -182,7 +182,7 @@ tap.test('REL-05: DNS resolution failure handling - Malformed domains', async (t
response.includes('553'); // Address error
console.log(` Response: ${response.trim().substring(0, 50)}`);
expect(properlyHandled).toBeTrue();
expect(properlyHandled).toEqual(true);
// Reset if needed
if (!response.includes('5')) {
@ -266,7 +266,7 @@ tap.test('REL-05: DNS resolution failure handling - Special cases', async (tools
console.log(' IP address response:', ipResponse.trim());
const ipHandled = ipResponse.includes('250') || ipResponse.includes('501');
expect(ipHandled).toBeTrue();
expect(ipHandled).toEqual(true);
socket.write('RSET\r\n');
await new Promise<void>((resolve) => {
@ -368,7 +368,7 @@ tap.test('REL-05: DNS resolution failure handling - Mixed valid/invalid recipien
const invalidHandled = invalidRcptResponse.includes('450') ||
invalidRcptResponse.includes('550') ||
invalidRcptResponse.includes('553');
expect(invalidHandled).toBeTrue();
expect(invalidHandled).toEqual(true);
// Try to send data (should work if at least one valid recipient)
socket.write('DATA\r\n');

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
@ -119,7 +119,7 @@ tap.test('REL-04: Error recovery - Invalid command recovery', async (tools) => {
const socket2 = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(socket2);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from invalid commands');
done.resolve();
} catch (error) {
@ -173,7 +173,7 @@ tap.test('REL-04: Error recovery - Malformed data recovery', async (tools) => {
const socket2 = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(socket2);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from malformed data');
done.resolve();
} catch (error) {
@ -221,7 +221,7 @@ tap.test('REL-04: Error recovery - Premature disconnection recovery', async (too
const socket2 = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(socket2);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from premature disconnections');
done.resolve();
} catch (error) {
@ -283,7 +283,7 @@ tap.test('REL-04: Error recovery - Data corruption recovery', async (tools) => {
const socket2 = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(socket2);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from data corruption');
done.resolve();
} catch (error) {
@ -335,7 +335,7 @@ tap.test('REL-04: Error recovery - Connection flooding recovery', async (tools)
const socket2 = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(socket2);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from connection flooding');
done.resolve();
} catch (error) {
@ -392,7 +392,7 @@ tap.test('REL-04: Error recovery - Mixed error scenario', async (tools) => {
const socket = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(socket);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from mixed error scenarios');
done.resolve();
} catch (error) {

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
@ -121,7 +121,7 @@ tap.test('REL-06: Network interruption - Sudden connection drop', async (tools)
const socket2 = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(socket2);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from sudden connection drop');
done.resolve();
} catch (error) {
@ -178,7 +178,7 @@ tap.test('REL-06: Network interruption - Data transfer interruption', async (too
const newSocket = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(newSocket);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from data transfer interruption');
done.resolve();
} catch (error) {
@ -271,7 +271,7 @@ tap.test('REL-06: Network interruption - Partial command interruption', async (t
const newSocket = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(newSocket);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered from partial command interruption');
done.resolve();
} catch (error) {
@ -401,7 +401,7 @@ tap.test('REL-06: Network interruption - Long delay recovery', async (tools) =>
const newSocket = await createConnection();
const recoverySuccess = await testBasicSmtpFlow(newSocket);
expect(recoverySuccess).toBeTrue();
expect(recoverySuccess).toEqual(true);
console.log('✓ Server recovered after long network interruption');
done.resolve();
} catch (error) {

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;
@ -236,8 +236,8 @@ tap.test('REL-03: Resource leak detection - Memory leak analysis', async (tools)
console.log(`Memory leak detected: ${leakAnalysis.memoryLeakDetected}`);
console.log(`Resources stable: ${leakAnalysis.resourcesStable}`);
expect(leakAnalysis.memoryLeakDetected).toBeFalse();
expect(leakAnalysis.resourcesStable).toBeTrue();
expect(leakAnalysis.memoryLeakDetected).toEqual(false);
expect(leakAnalysis.resourcesStable).toEqual(true);
done.resolve();
} catch (error) {
connections.forEach(conn => conn.destroy());

View File

@ -1,7 +1,7 @@
import * as plugins from '@git.zone/tstest/tapbundle';
import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
const TEST_PORT = 2525;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -88,7 +88,7 @@ tap.test('RFC 3461 DSN - MAIL FROM with DSN parameters', async (tools) => {
const accepted = dataBuffer.includes('250');
const properlyRejected = dataBuffer.includes('501') || dataBuffer.includes('555');
expect(accepted || properlyRejected).toBeTrue();
expect(accepted || properlyRejected).toEqual(true);
console.log(`DSN parameters in MAIL FROM ${accepted ? 'accepted' : 'rejected'}`);
if (accepted) {
@ -158,7 +158,7 @@ tap.test('RFC 3461 DSN - RCPT TO with DSN parameters', async (tools) => {
const accepted = dataBuffer.includes('250');
const properlyRejected = dataBuffer.includes('501') || dataBuffer.includes('555');
expect(accepted || properlyRejected).toBeTrue();
expect(accepted || properlyRejected).toEqual(true);
console.log(`DSN parameters in RCPT TO ${accepted ? 'accepted' : 'rejected'}`);
if (accepted) {
@ -319,7 +319,7 @@ tap.test('RFC 3461 DSN - Invalid DSN parameter handling', async (tools) => {
if (properlyRejected) {
console.log('Invalid RET parameter properly rejected');
expect(true).toBeTrue();
expect(true).toEqual(true);
} else if (dataBuffer.includes('250')) {
// Server ignores unknown parameters (also acceptable)
console.log('Server ignores invalid DSN parameters');

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -28,7 +28,7 @@ tap.test('RFC 5321 - Server greeting format', async (tools) => {
const greeting = response.trim();
const validGreeting = greeting.startsWith('220') && greeting.length > 10;
expect(validGreeting).toBeTrue();
expect(validGreeting).toEqual(true);
expect(greeting).toMatch(/^220\s+\S+/); // Should have hostname after 220
socket.write('QUIT\r\n');
@ -170,7 +170,7 @@ tap.test('RFC 5321 - Line length limits', async (tools) => {
const accepted = dataBuffer.includes('250');
const rejected = dataBuffer.includes('501') || dataBuffer.includes('500');
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
console.log(`Long line test ${accepted ? 'accepted' : 'rejected'}`);
socket.write('QUIT\r\n');
@ -244,7 +244,7 @@ tap.test('RFC 5321 - Standard SMTP verb compliance', async (tools) => {
);
console.log('Supported verbs:', supportedVerbs);
expect(hasRequired).toBeTrue();
expect(hasRequired).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -73,7 +73,7 @@ tap.test('RFC 6376 DKIM - Server accepts email with DKIM signature', async (tool
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Email with DKIM signature accepted');
expect(true).toBeTrue(); // Server accepts DKIM headers
expect(true).toEqual(true); // Server accepts DKIM headers
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -74,7 +74,7 @@ tap.test('RFC 7208 SPF - Server handles SPF checks', async (tools) => {
result.mailFromResponse !== undefined
);
expect(allDomainsHandled).toBeTrue();
expect(allDomainsHandled).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -149,7 +149,7 @@ tap.test('RFC 7208 SPF - SPF record syntax handling', async (tools) => {
dataBuffer.includes('550') ||
dataBuffer.includes('553');
expect(handled).toBeTrue();
expect(handled).toEqual(true);
console.log('SPF handling response:', dataBuffer.trim());
socket.write('QUIT\r\n');
@ -263,7 +263,7 @@ tap.test('RFC 7208 SPF - IPv4 and IPv6 mechanism support', async (tools) => {
dataBuffer.includes('550') ||
dataBuffer.includes('553');
expect(handled).toBeTrue();
expect(handled).toEqual(true);
console.log('IP mechanism SPF response:', dataBuffer.trim());
socket.write('QUIT\r\n');

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -75,7 +75,7 @@ tap.test('RFC 7489 DMARC - Server handles DMARC policies', async (tools) => {
result.mailFromResponse !== undefined
);
expect(allScenariosHandled).toBeTrue();
expect(allScenariosHandled).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -2,7 +2,7 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import * as tls from 'tls';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -36,7 +36,7 @@ tap.test('RFC 8314 TLS - STARTTLS advertised in EHLO', async (tools) => {
const advertisesStarttls = dataBuffer.toLowerCase().includes('starttls');
console.log('STARTTLS advertised:', advertisesStarttls);
expect(advertisesStarttls).toBeTrue();
expect(advertisesStarttls).toEqual(true);
// Parse other extensions
const lines = dataBuffer.split('\r\n');
@ -98,7 +98,7 @@ tap.test('RFC 8314 TLS - STARTTLS command functionality', async (tools) => {
// In a real test, we would upgrade to TLS here
// For this test, we just verify the command is accepted
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.end();
done.resolve();
@ -144,7 +144,7 @@ tap.test('RFC 8314 TLS - Commands before STARTTLS', async (tools) => {
console.log('Server allows MAIL FROM before STARTTLS');
} else if (dataBuffer.includes('530') || dataBuffer.includes('554')) {
console.log('Server requires STARTTLS before MAIL FROM (RFC 8314 compliant)');
expect(true).toBeTrue(); // This is actually good for security
expect(true).toEqual(true); // This is actually good for security
}
socket.write('QUIT\r\n');

View File

@ -1,6 +1,6 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection } from '../../helpers/test.utils.js';
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection } from '../../helpers/utils.js';
let testServer: ITestServer;

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -45,7 +45,7 @@ tap.test('Authorization - Valid sender domain', async (tools) => {
const accepted = dataBuffer.includes('250');
console.log(`Valid sender domain ${accepted ? 'accepted' : 'rejected'}`);
expect(accepted).toBeTrue();
expect(accepted).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -94,7 +94,7 @@ tap.test('Authorization - External sender domain', async (tools) => {
} else if (dataBuffer.includes('530')) {
// Authentication required
console.log('External sender requires authentication');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -102,7 +102,7 @@ tap.test('Authorization - External sender domain', async (tools) => {
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
// Rejected for policy reasons
console.log('External sender rejected by policy');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -115,7 +115,7 @@ tap.test('Authorization - External sender domain', async (tools) => {
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
console.log(`External sender: accepted=${accepted}, authRequired=${authRequired}, rejected=${rejected}`);
expect(accepted || authRequired || rejected).toBeTrue();
expect(accepted || authRequired || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -165,7 +165,7 @@ tap.test('Authorization - Relay attempt rejection', async (tools) => {
} else {
// MAIL FROM already rejected
console.log('External sender rejected at MAIL FROM');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -179,7 +179,7 @@ tap.test('Authorization - Relay attempt rejection', async (tools) => {
dataBuffer.includes('554');
console.log(`Relay attempt ${rejected ? 'properly rejected' : 'unexpectedly accepted'}`);
expect(rejected).toBeTrue();
expect(rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -230,7 +230,7 @@ tap.test('Authorization - IP-based restrictions', async (tools) => {
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
console.log(`IP-based authorization: ${accepted ? 'accepted' : 'rejected'}`);
expect(accepted || rejected).toBeTrue(); // Either is valid based on server config
expect(accepted || rejected).toEqual(true); // Either is valid based on server config
socket.write('QUIT\r\n');
socket.end();
@ -281,7 +281,7 @@ tap.test('Authorization - Case sensitivity in addresses', async (tools) => {
const accepted = dataBuffer.includes('250');
console.log(`Mixed case addresses ${accepted ? 'accepted' : 'rejected'}`);
expect(accepted).toBeTrue();
expect(accepted).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -43,7 +43,7 @@ tap.test('Bounce Management - Invalid recipient domain', async (tools) => {
} else if (step === 'rcpt') {
if (dataBuffer.includes('550') || dataBuffer.includes('551') || dataBuffer.includes('553')) {
console.log('Bounce management active - invalid recipient properly rejected');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -73,7 +73,7 @@ tap.test('Bounce Management - Invalid recipient domain', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Email accepted for processing - bounce will be generated');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -122,7 +122,7 @@ tap.test('Bounce Management - Empty return path (null sender)', async (tools) =>
dataBuffer = '';
} else {
console.log('Null sender rejected');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -153,7 +153,7 @@ tap.test('Bounce Management - Empty return path (null sender)', async (tools) =>
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Bounce message with null sender accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -222,7 +222,7 @@ tap.test('Bounce Management - DSN headers', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Email with DSN headers accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -271,7 +271,7 @@ tap.test('Bounce Management - Bounce loop prevention', async (tools) => {
} else if (step === 'rcpt') {
if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
console.log('Bounce loop prevented - mailer-daemon recipient rejected');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -302,7 +302,7 @@ tap.test('Bounce Management - Bounce loop prevention', async (tools) => {
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
console.log(`Bounce loop test: ${result}`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -368,7 +368,7 @@ tap.test('Bounce Management - Valid email (control test)', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Valid email accepted - no bounce expected');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -76,7 +76,7 @@ tap.test('Content Scanning - Suspicious content patterns', async (tools) => {
console.log('Content scanning operational - email processed');
}
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -159,7 +159,7 @@ tap.test('Content Scanning - Malware patterns', async (tools) => {
const rejected = dataBuffer.includes('550');
console.log(`Malware pattern email: ${accepted ? 'accepted' : 'rejected'}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -236,7 +236,7 @@ tap.test('Content Scanning - Spam keywords', async (tools) => {
const rejected = dataBuffer.includes('550');
console.log(`Spam keyword email: ${accepted ? 'accepted' : 'rejected (spam detected)'}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -308,7 +308,7 @@ tap.test('Content Scanning - Clean legitimate email', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Clean email accepted - content scanning allows legitimate emails');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -392,7 +392,7 @@ tap.test('Content Scanning - Large attachment', async (tools) => {
const rejected = dataBuffer.includes('550') || dataBuffer.includes('552');
console.log(`Large attachment: ${accepted ? 'accepted' : 'rejected (size or content issue)'}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -75,7 +75,7 @@ tap.test('DKIM Processing - Valid DKIM signature', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Email with valid DKIM signature accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -155,7 +155,7 @@ tap.test('DKIM Processing - Invalid DKIM signature', async (tools) => {
const accepted = dataBuffer.includes('250');
console.log(`Email with invalid DKIM signature ${accepted ? 'accepted' : 'rejected'}`);
// Either response is valid - server may accept and mark as failed, or reject
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -222,7 +222,7 @@ tap.test('DKIM Processing - Missing DKIM signature', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Email without DKIM signature accepted (neutral)');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -302,7 +302,7 @@ tap.test('DKIM Processing - Multiple DKIM signatures', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('Email with multiple DKIM signatures accepted');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -383,7 +383,7 @@ tap.test('DKIM Processing - Expired DKIM signature', async (tools) => {
const accepted = dataBuffer.includes('250');
console.log(`Email with expired DKIM signature ${accepted ? 'accepted' : 'rejected'}`);
// Either response is valid
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -47,7 +47,7 @@ tap.test('DMARC Policy - Reject policy enforcement', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
console.log('DMARC reject policy enforced at MAIL FROM');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -80,7 +80,7 @@ tap.test('DMARC Policy - Reject policy enforcement', async (tools) => {
const rejected = dataBuffer.includes('550');
console.log(`DMARC reject policy: accepted=${accepted}, rejected=${rejected}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -147,7 +147,7 @@ tap.test('DMARC Policy - Quarantine policy', async (tools) => {
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
const accepted = dataBuffer.includes('250');
console.log(`DMARC quarantine policy: ${accepted ? 'accepted (may be quarantined)' : 'rejected'}`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -213,7 +213,7 @@ tap.test('DMARC Policy - None policy', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
console.log('DMARC none policy: email accepted (monitoring only)');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -283,7 +283,7 @@ tap.test('DMARC Policy - Alignment testing', async (tools) => {
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
console.log(`DMARC alignment test: ${result}`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -350,7 +350,7 @@ tap.test('DMARC Policy - Percentage testing', async (tools) => {
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
console.log(`DMARC percentage policy: ${result} (may vary based on percentage)`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -70,7 +70,7 @@ tap.test('Header Injection Prevention - CRLF injection in headers', async (tools
console.log('Header injection prevention active - malicious headers detected');
}
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -118,7 +118,7 @@ tap.test('Header Injection Prevention - Command injection in MAIL FROM', async (
dataBuffer.includes('500');
console.log('Command injection attempt handled');
expect(properResponse).toBeTrue();
expect(properResponse).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -191,7 +191,7 @@ tap.test('Header Injection Prevention - HTML/Script injection in body', async (t
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
const accepted = dataBuffer.includes('250');
console.log(`HTML/Script content: ${accepted ? 'accepted (may be sanitized)' : 'rejected'}`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -239,7 +239,7 @@ tap.test('Header Injection Prevention - Null byte injection', async (tools) => {
dataBuffer.includes('550');
console.log('Null byte injection attempt handled');
expect(handled).toBeTrue();
expect(handled).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -308,7 +308,7 @@ tap.test('Header Injection Prevention - Unicode and encoding attacks', async (to
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
console.log(`Unicode/encoding attack: ${result}`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -35,7 +35,7 @@ tap.test('IP Reputation - Suspicious hostname in EHLO', async (tools) => {
const rejected = dataBuffer.includes('550') || dataBuffer.includes('521');
console.log(`Suspicious hostname: accepted=${accepted}, rejected=${rejected}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
if (rejected) {
console.log('IP reputation check working - suspicious host rejected at EHLO');
@ -88,7 +88,7 @@ tap.test('IP Reputation - Blacklisted sender domain', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
console.log('Blacklisted sender rejected - IP reputation check working');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -99,7 +99,7 @@ tap.test('IP Reputation - Blacklisted sender domain', async (tools) => {
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
console.log(`Blacklisted domain at RCPT: accepted=${accepted}, rejected=${rejected}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -146,7 +146,7 @@ tap.test('IP Reputation - Known good sender', async (tools) => {
dataBuffer = '';
} else if (step === 'rcpt' && dataBuffer.includes('250')) {
console.log('Good sender accepted - IP reputation allows legitimate senders');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -198,7 +198,7 @@ tap.test('IP Reputation - Multiple connections from same IP', async (tools) => {
completedConnections++;
if (completedConnections === totalConnections) {
console.log('All connections completed');
expect(true).toBeTrue();
expect(true).toEqual(true);
done.resolve();
}
});
@ -264,7 +264,7 @@ tap.test('IP Reputation - Suspicious patterns in email', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('452') || dataBuffer.includes('550')) {
console.log('Multiple recipients limited - reputation control active');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -291,7 +291,7 @@ tap.test('IP Reputation - Suspicious patterns in email', async (tools) => {
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
console.log(`Suspicious content email ${result}`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -108,7 +108,7 @@ tap.test('Rate Limiting - should limit rapid consecutive connections', async (to
// Note: We consider the test passed if rate limiting is either working OR not configured
// Many SMTP servers don't have rate limiting, which is also valid
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
done.resolve();
@ -219,11 +219,11 @@ tap.test('Rate Limiting - should allow connections after rate limit period', asy
} catch (error) {
console.log('Retry connection failed:', error);
// Some servers might have longer rate limit periods
expect(true).toBeTrue();
expect(true).toEqual(true);
}
} else {
console.log('Rate limiting not triggered or not configured');
expect(true).toBeTrue();
expect(true).toEqual(true);
}
} finally {
@ -309,7 +309,7 @@ tap.test('Rate Limiting - should limit rapid MAIL FROM commands', async (tools)
socket.end();
// Test passes regardless - rate limiting is optional
expect(true).toBeTrue();
expect(true).toEqual(true);
} finally {
done.resolve();
@ -318,7 +318,7 @@ tap.test('Rate Limiting - should limit rapid MAIL FROM commands', async (tools)
tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer);
expect(true).toBeTrue();
expect(true).toEqual(true);
});
tap.start();

View File

@ -1,7 +1,7 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -44,7 +44,7 @@ tap.test('SPF Checking - Authorized IP from local domain', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
console.log('Local domain sender rejected (SPF fail)');
expect(true).toBeTrue(); // Either result shows SPF processing
expect(true).toEqual(true); // Either result shows SPF processing
socket.write('QUIT\r\n');
socket.end();
@ -52,7 +52,7 @@ tap.test('SPF Checking - Authorized IP from local domain', async (tools) => {
}
} else if (step === 'rcpt' && dataBuffer.includes('250')) {
console.log('Email accepted - SPF likely passed or neutral');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -101,7 +101,7 @@ tap.test('SPF Checking - External domain sender', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
console.log('External domain sender rejected (SPF fail)');
expect(true).toBeTrue(); // Shows SPF is working
expect(true).toEqual(true); // Shows SPF is working
socket.write('QUIT\r\n');
socket.end();
@ -112,7 +112,7 @@ tap.test('SPF Checking - External domain sender', async (tools) => {
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
console.log(`External domain: accepted=${accepted}, rejected=${rejected}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -161,7 +161,7 @@ tap.test('SPF Checking - Known SPF fail domain', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
console.log('SPF fail domain properly rejected');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -170,7 +170,7 @@ tap.test('SPF Checking - Known SPF fail domain', async (tools) => {
} else if (step === 'rcpt') {
// Either accepted or rejected is valid
const response = dataBuffer.includes('250') || dataBuffer.includes('550') || dataBuffer.includes('553');
expect(response).toBeTrue();
expect(response).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -217,7 +217,7 @@ tap.test('SPF Checking - IPv4 literal in HELO', async (tools) => {
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
console.log(`IP literal sender: accepted=${accepted}, rejected=${rejected}`);
expect(accepted || rejected).toBeTrue();
expect(accepted || rejected).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -266,7 +266,7 @@ tap.test('SPF Checking - Subdomain sender', async (tools) => {
dataBuffer = '';
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
console.log('Subdomain sender rejected');
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();
@ -275,7 +275,7 @@ tap.test('SPF Checking - Subdomain sender', async (tools) => {
} else if (step === 'rcpt') {
const accepted = dataBuffer.includes('250');
console.log(`Subdomain SPF test: ${accepted ? 'passed' : 'failed'}`);
expect(true).toBeTrue();
expect(true).toEqual(true);
socket.write('QUIT\r\n');
socket.end();

View File

@ -2,7 +2,7 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as net from 'net';
import * as tls from 'tls';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
@ -78,7 +78,7 @@ tap.test('TLS Certificate Validation - STARTTLS certificate check', async (tools
const isValid = now >= validFrom && now <= validTo;
console.log('Certificate currently valid:', isValid);
expect(true).toBeTrue(); // Certificate present
expect(true).toEqual(true); // Certificate present
}
// Test EHLO over TLS
@ -91,7 +91,7 @@ tap.test('TLS Certificate Validation - STARTTLS certificate check', async (tools
if (response.includes('250')) {
console.log('EHLO over TLS successful');
expect(true).toBeTrue();
expect(true).toEqual(true);
tlsSocket.write('QUIT\r\n');
tlsSocket.end();
@ -133,7 +133,7 @@ tap.test('TLS Certificate Validation - Direct TLS connection', async (tools) =>
const cert = socket.getPeerCertificate();
if (cert && Object.keys(cert).length > 0) {
console.log('Certificate found on direct TLS connection');
expect(true).toBeTrue();
expect(true).toEqual(true);
}
socket.end();
@ -143,7 +143,7 @@ tap.test('TLS Certificate Validation - Direct TLS connection', async (tools) =>
socket.on('error', (err) => {
// Direct TLS might not be supported, try plain connection
console.log('Direct TLS not supported, this is expected for STARTTLS servers');
expect(true).toBeTrue();
expect(true).toEqual(true);
done.resolve();
});
@ -205,7 +205,7 @@ tap.test('TLS Certificate Validation - Certificate verification with strict mode
console.log('Authorization error:', tlsSocket.authorizationError);
}
expect(true).toBeTrue(); // Connection established
expect(true).toEqual(true); // Connection established
tlsSocket.write('QUIT\r\n');
tlsSocket.end();
done.resolve();
@ -213,7 +213,7 @@ tap.test('TLS Certificate Validation - Certificate verification with strict mode
tlsSocket.on('error', (err) => {
console.log('Certificate verification error (expected for self-signed):', err.message);
expect(true).toBeTrue(); // Error is expected for self-signed certificates
expect(true).toEqual(true); // Error is expected for self-signed certificates
socket.end();
done.resolve();
});

View File

@ -1,214 +0,0 @@
/**
* Test server loader for SMTP test suite
* Provides simplified server lifecycle management for tests
*/
import { DcRouter } from '../../ts/classes.dcrouter.js';
import { UnifiedEmailServer } from '../../ts/mail/routing/classes.unified.email.server.js';
import { createSmtpServer } from '../../ts/mail/delivery/smtpserver/index.js';
import * as fs from 'fs';
import * as path from 'path';
import * as net from 'net';
let activeServer = null;
let activePort = null;
/**
* Start test server on default port 2525
*/
async function startTestServer(port = 2525) {
if (activeServer) {
console.log('Test server already running, stopping it first...');
await stopTestServer();
}
console.log(`Starting test SMTP server on port ${port}...`);
try {
// Create a minimal email server for testing
const mockEmailServer = {
processEmailByMode: async (emailData: any) => {
console.log('📧 Processed test email:', emailData.subject || 'No subject');
return emailData;
}
} as any; // Type assertion for test purposes
// Load test certificates if available
let key = '';
let cert = '';
try {
const __dirname = path.dirname(new URL(import.meta.url).pathname);
key = fs.readFileSync(path.join(__dirname, '../../../test/smtp-prod/certs/test.key'), 'utf8');
cert = fs.readFileSync(path.join(__dirname, '../../../test/smtp-prod/certs/test.cert'), 'utf8');
} catch (e) {
console.log('Test certificates not found, running without TLS');
}
// SMTP server options
const smtpOptions = {
port: port,
hostname: 'localhost',
key: key,
cert: cert,
maxConnections: 100,
size: 10 * 1024 * 1024, // 10MB
maxRecipients: 100,
socketTimeout: 30000,
connectionTimeout: 60000,
cleanupInterval: 300000,
auth: {
required: false,
methods: [] as ('PLAIN' | 'LOGIN' | 'OAUTH2')[]
}
};
// Create and start SMTP server
const smtpServer = createSmtpServer(mockEmailServer, smtpOptions);
await smtpServer.listen();
activeServer = smtpServer;
activePort = port;
// Wait for server to be ready
await waitForServerReady('localhost', port, 10000);
console.log(`✅ Test SMTP server started on port ${port}`);
return smtpServer;
} catch (error) {
console.error('Failed to start test server:', error);
throw error;
}
}
/**
* Stop test server
*/
async function stopTestServer() {
if (!activeServer) {
console.log('No active test server to stop');
return;
}
console.log(`Stopping test SMTP server on port ${activePort}...`);
try {
if (activeServer.close && typeof activeServer.close === 'function') {
await activeServer.close();
} else if (activeServer.destroy && typeof activeServer.destroy === 'function') {
await activeServer.destroy();
} else if (activeServer.stop && typeof activeServer.stop === 'function') {
await activeServer.stop();
}
// Force close any remaining connections
if (activeServer._connections) {
for (const conn of activeServer._connections) {
if (conn && !conn.destroyed) {
conn.destroy();
}
}
}
activeServer = null;
const port = activePort;
activePort = null;
// Wait for port to be free
await waitForPortFree(port, 3000);
console.log(`✅ Test SMTP server stopped`);
} catch (error) {
console.error('Error stopping test server:', error);
activeServer = null;
activePort = null;
}
}
/**
* Wait for server to be ready to accept connections
*/
async function waitForServerReady(hostname, port, timeout) {
const startTime = Date.now();
const maxRetries = 20;
let retries = 0;
while (retries < maxRetries) {
try {
await new Promise((resolve, reject) => {
const socket = net.createConnection({ port, host: hostname });
socket.on('connect', () => {
socket.end();
resolve(undefined);
});
socket.on('error', (error) => {
socket.destroy();
reject(error);
});
setTimeout(() => {
socket.destroy();
reject(new Error('Connection timeout'));
}, 1000);
});
return; // Server is ready
} catch (error) {
retries++;
if (Date.now() - startTime > timeout) {
throw new Error(`Server did not become ready within ${timeout}ms`);
}
// Wait before retrying
await new Promise(resolve => setTimeout(resolve, 500));
}
}
throw new Error(`Server did not become ready after ${maxRetries} retries`);
}
/**
* Wait for port to be free
*/
async function waitForPortFree(port, timeout) {
const startTime = Date.now();
while (Date.now() - startTime < timeout) {
const isFree = await isPortFree(port);
if (isFree) {
return true;
}
await new Promise(resolve => setTimeout(resolve, 100));
}
return false;
}
/**
* Check if port is free
*/
async function isPortFree(port) {
return new Promise((resolve) => {
const server = net.createServer();
server.listen(port, () => {
server.close(() => {
resolve(true);
});
});
server.on('error', () => {
resolve(false);
});
});
}
// Export functions
export {
startTestServer,
stopTestServer
};

View File

@ -87,7 +87,7 @@ tap.test('should allocate IPs using balanced policy', async () => {
}
// We should use at least 2 different IPs with balanced policy
expect(usedIPs.size >= 2).toBeTrue();
expect(usedIPs.size >= 2).toEqual(true);
});
// Test round robin allocation policy
@ -122,7 +122,7 @@ tap.test('should allocate IPs using round robin policy', async () => {
});
// Round robin should give us different IPs for consecutive calls
expect(firstIP !== secondIP).toBeTrue();
expect(firstIP !== secondIP).toEqual(true);
// With 3 IPs, the fourth call should cycle back to one of the IPs
const fourthIP = ipWarmupManager.getBestIPForSending({
@ -132,7 +132,7 @@ tap.test('should allocate IPs using round robin policy', async () => {
});
// Check that the fourth IP is one of the 3 valid IPs
expect(['192.168.1.1', '192.168.1.2', '192.168.1.3'].includes(fourthIP)).toBeTrue();
expect(['192.168.1.1', '192.168.1.2', '192.168.1.3'].includes(fourthIP)).toEqual(true);
});
// Test dedicated domain allocation policy
@ -219,7 +219,7 @@ tap.test('should enforce daily sending limits', async () => {
domain: 'example.com'
});
expect(ip === '192.168.1.1').toBeTrue();
expect(ip === '192.168.1.1').toEqual(true);
// Record 5 sends to reach the daily limit
for (let i = 0; i < 5; i++) {
@ -238,7 +238,7 @@ tap.test('should enforce daily sending limits', async () => {
domain: 'example.com'
});
expect(sixthIP === null).toBeTrue();
expect(sixthIP === null).toEqual(true);
});
// Test recording sends
@ -307,7 +307,7 @@ tap.test('should assign IPs using dedicated domain policy', async () => {
domain: 'example.com'
});
expect(ip1again === ip1).toBeTrue();
expect(ip1again === ip1).toEqual(true);
}
});

View File

@ -47,7 +47,7 @@ tap.test('verify that SenderReputationMonitor and IPWarmupManager are functionin
if (bestIP) {
ipWarmupManager.recordSend(bestIP);
const canSendMore = ipWarmupManager.canSendMoreToday(bestIP);
expect(canSendMore !== undefined).toBeTrue();
expect(canSendMore !== undefined).toEqual(true);
}
const stageCount = ipWarmupManager.getStageCount();

View File

@ -120,14 +120,14 @@ tap.test('should calculate reputation scores correctly', async () => {
// Get reputation summary
const summary = reputationMonitor.getReputationSummary();
expect(Array.isArray(summary)).toBeTrue();
expect(summary.length >= 3).toBeTrue();
expect(Array.isArray(summary)).toEqual(true);
expect(summary.length >= 3).toEqual(true);
// Check that domains are included in the summary
const domains = summary.map(item => item.domain);
expect(domains.includes('high.com')).toBeTrue();
expect(domains.includes('medium.com')).toBeTrue();
expect(domains.includes('low.com')).toBeTrue();
expect(domains.includes('high.com')).toEqual(true);
expect(domains.includes('medium.com')).toEqual(true);
expect(domains.includes('low.com')).toEqual(true);
});
// Test adding and removing domains
@ -154,7 +154,7 @@ tap.test('should add and remove domains for monitoring', async () => {
// Check that data is no longer available
const removedMetrics = reputationMonitor.getReputationData('newdomain.com');
expect(removedMetrics === null).toBeTrue();
expect(removedMetrics === null).toEqual(true);
});
// Test handling open and click events

View File

@ -14,15 +14,15 @@ tap.test('EmailValidator - should validate email formats correctly', async (tool
const validator = new EmailValidator();
// Test valid email formats
expect(validator.isValidFormat('user@example.com')).toBeTrue();
expect(validator.isValidFormat('firstname.lastname@example.com')).toBeTrue();
expect(validator.isValidFormat('user+tag@example.com')).toBeTrue();
expect(validator.isValidFormat('user@example.com')).toEqual(true);
expect(validator.isValidFormat('firstname.lastname@example.com')).toEqual(true);
expect(validator.isValidFormat('user+tag@example.com')).toEqual(true);
// Test invalid email formats
expect(validator.isValidFormat('user@')).toBeFalse();
expect(validator.isValidFormat('@example.com')).toBeFalse();
expect(validator.isValidFormat('user@example')).toBeFalse();
expect(validator.isValidFormat('user.example.com')).toBeFalse();
expect(validator.isValidFormat('user@')).toEqual(false);
expect(validator.isValidFormat('@example.com')).toEqual(false);
expect(validator.isValidFormat('user@example')).toEqual(false);
expect(validator.isValidFormat('user.example.com')).toEqual(false);
});
tap.test('EmailValidator - should perform comprehensive validation', async (tools) => {
@ -30,8 +30,8 @@ tap.test('EmailValidator - should perform comprehensive validation', async (tool
// Test basic validation (syntax-only)
const basicResult = await validator.validate('user@example.com', { checkSyntaxOnly: true });
expect(basicResult.isValid).toBeTrue();
expect(basicResult.details.formatValid).toBeTrue();
expect(basicResult.isValid).toEqual(true);
expect(basicResult.details.formatValid).toEqual(true);
// We can't reliably test MX validation in all environments, but the function should run
const mxResult = await validator.validate('user@example.com', { checkMx: true });
@ -43,8 +43,8 @@ tap.test('EmailValidator - should detect invalid emails', async (tools) => {
const validator = new EmailValidator();
const invalidResult = await validator.validate('invalid@@example.com', { checkSyntaxOnly: true });
expect(invalidResult.isValid).toBeFalse();
expect(invalidResult.details.formatValid).toBeFalse();
expect(invalidResult.isValid).toEqual(false);
expect(invalidResult.details.formatValid).toEqual(false);
});
tap.test('TemplateManager - should register and retrieve templates', async (tools) => {
@ -72,8 +72,8 @@ tap.test('TemplateManager - should register and retrieve templates', async (tool
// List templates
const templates = templateManager.listTemplates();
expect(templates.length > 0).toBeTrue();
expect(templates.some(t => t.id === 'test-template')).toBeTrue();
expect(templates.length > 0).toEqual(true);
expect(templates.some(t => t.id === 'test-template')).toEqual(true);
});
tap.test('TemplateManager - should create smartmail from template', async (tools) => {
@ -101,7 +101,7 @@ tap.test('TemplateManager - should create smartmail from template', async (tools
expect(smartmail).toBeTruthy();
expect(smartmail.options.from).toEqual('welcome@example.com');
expect(smartmail.getSubject()).toEqual('Welcome, John Doe!');
expect(smartmail.getBody(true).indexOf('Hello, John Doe!') > -1).toBeTrue();
expect(smartmail.getBody(true).indexOf('Hello, John Doe!') > -1).toEqual(true);
});
tap.test('Email - should handle template variables', async (tools) => {
@ -121,7 +121,7 @@ tap.test('Email - should handle template variables', async (tools) => {
// Test variable substitution
expect(email.getSubjectWithVariables()).toEqual('Hello John Doe!');
expect(email.getTextWithVariables()).toEqual('Welcome, John Doe! Your order #12345 has been processed.');
expect(email.getHtmlWithVariables().indexOf('<strong>John Doe</strong>') > -1).toBeTrue();
expect(email.getHtmlWithVariables().indexOf('<strong>John Doe</strong>') > -1).toEqual(true);
// Test with additional variables
const additionalVars = {
@ -133,7 +133,7 @@ tap.test('Email - should handle template variables', async (tools) => {
// Add a new variable
email.setVariable('trackingNumber', 'TRK123456');
expect(email.getTextWithVariables().indexOf('12345') > -1).toBeTrue();
expect(email.getTextWithVariables().indexOf('12345') > -1).toEqual(true);
// Update multiple variables at once
email.setVariables({
@ -141,7 +141,7 @@ tap.test('Email - should handle template variables', async (tools) => {
status: 'delivered'
});
expect(email.getTextWithVariables().indexOf('67890') > -1).toBeTrue();
expect(email.getTextWithVariables().indexOf('67890') > -1).toEqual(true);
});
tap.test('Email and Smartmail compatibility - should convert between formats', async (tools) => {
@ -172,9 +172,9 @@ tap.test('Email and Smartmail compatibility - should convert between formats', a
// Verify first conversion (Smartmail to Email)
expect(email.from).toEqual('smartmail@example.com');
expect(email.to.indexOf('recipient@example.com') > -1).toBeTrue();
expect(email.to.indexOf('recipient@example.com') > -1).toEqual(true);
expect(email.subject).toEqual('Test Subject');
expect(email.html?.indexOf('This is a test email') > -1).toBeTrue();
expect(email.html?.indexOf('This is a test email') > -1).toEqual(true);
expect(email.attachments.length).toEqual(1);
// Convert back to Smartmail
@ -182,10 +182,10 @@ tap.test('Email and Smartmail compatibility - should convert between formats', a
// Verify second conversion (Email back to Smartmail) with simplified assertions
expect(convertedSmartmail.options.from).toEqual('smartmail@example.com');
expect(Array.isArray(convertedSmartmail.options.to)).toBeTrue();
expect(Array.isArray(convertedSmartmail.options.to)).toEqual(true);
expect(convertedSmartmail.options.to.length).toEqual(1);
expect(convertedSmartmail.getSubject()).toEqual('Test Subject');
expect(convertedSmartmail.getBody(true).indexOf('This is a test email') > -1).toBeTrue();
expect(convertedSmartmail.getBody(true).indexOf('This is a test email') > -1).toEqual(true);
expect(convertedSmartmail.attachments.length).toEqual(1);
});
@ -202,10 +202,10 @@ tap.test('Email - should validate email addresses', async (tools) => {
});
} catch (error) {
errorThrown = true;
expect(error.message.indexOf('Invalid sender email address') > -1).toBeTrue();
expect(error.message.indexOf('Invalid sender email address') > -1).toEqual(true);
}
expect(errorThrown).toBeTrue();
expect(errorThrown).toEqual(true);
// Attempt with invalid recipient
errorThrown = false;
@ -219,10 +219,10 @@ tap.test('Email - should validate email addresses', async (tools) => {
});
} catch (error) {
errorThrown = true;
expect(error.message.indexOf('Invalid recipient email address') > -1).toBeTrue();
expect(error.message.indexOf('Invalid recipient email address') > -1).toEqual(true);
}
expect(errorThrown).toBeTrue();
expect(errorThrown).toEqual(true);
// Valid email should not throw
let validEmail: Email;
@ -237,7 +237,7 @@ tap.test('Email - should validate email addresses', async (tools) => {
expect(validEmail).toBeTruthy();
expect(validEmail.from).toEqual('sender@example.com');
} catch (error) {
expect(error === undefined).toBeTrue(); // This should not happen
expect(error === undefined).toEqual(true); // This should not happen
}
});