update
This commit is contained in:
parent
9629329bc2
commit
0907949f8a
@ -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
417
pnpm-lock.yaml
generated
@ -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: {}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
});
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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();
|
@ -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');
|
||||
|
@ -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 {
|
||||
|
@ -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');
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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');
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
@ -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;
|
||||
|
@ -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();
|
@ -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();
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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');
|
||||
|
@ -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();
|
||||
|
@ -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();
|
@ -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');
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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');
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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');
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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');
|
||||
|
@ -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();
|
||||
|
@ -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');
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
@ -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();
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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
|
||||
};
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
});
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user