From 0907949f8a5fb67a028c254ed54145328d638b65 Mon Sep 17 00:00:00 2001 From: Philipp Kunz Date: Fri, 23 May 2025 21:20:39 +0000 Subject: [PATCH] update --- package.json | 4 +- pnpm-lock.yaml | 417 +++++++++++++++--- test/helpers/server.loader.ts | 10 +- test/readme.md | 2 +- .../suite/commands/test.command-pipelining.ts | 2 +- test/suite/commands/test.data-command.ts | 2 +- test/suite/commands/test.ehlo-command.ts | 2 +- test/suite/commands/test.expn-command.ts | 2 +- test/suite/commands/test.helo-command.ts | 2 +- test/suite/commands/test.help-command.ts | 4 +- test/suite/commands/test.mail-from.ts | 2 +- test/suite/commands/test.noop-command.ts | 2 +- test/suite/commands/test.quit-command.ts | 4 +- test/suite/commands/test.rcpt-to.ts | 2 +- test/suite/commands/test.rset-command.ts | 2 +- test/suite/commands/test.size-extension.ts | 4 +- test/suite/commands/test.vrfy-command.ts | 2 +- .../connection/test.abrupt-disconnection.ts | 12 +- .../connection/test.connection-limits.ts | 2 +- .../connection/test.connection-rejection.ts | 10 +- .../connection/test.connection-timeout.ts | 2 +- test/suite/connection/test.keepalive.ts | 4 +- .../connection/test.multiple-connections.ts | 10 +- .../suite/connection/test.plain-connection.ts | 6 +- .../suite/connection/test.starttls-upgrade.ts | 11 +- test/suite/connection/test.tls-ciphers.ts | 10 +- test/suite/connection/test.tls-connection.ts | 15 +- test/suite/connection/test.tls-versions.ts | 10 +- test/suite/edge-cases/test.empty-commands.ts | 4 +- .../edge-cases/test.extremely-long-headers.ts | 2 +- .../edge-cases/test.extremely-long-lines.ts | 4 +- .../test.invalid-character-handling.ts | 6 +- .../edge-cases/test.nested-mime-structures.ts | 2 +- .../edge-cases/test.unusual-mime-types.ts | 2 +- .../suite/edge-cases/test.very-large-email.ts | 2 +- .../test.attachment-handling.ts | 12 +- .../test.basic-email-sending.ts | 2 +- .../test.delivery-status-notifications.ts | 14 +- .../email-processing/test.email-routing.ts | 10 +- .../test.invalid-email-addresses.ts | 2 +- .../email-processing/test.large-email.ts | 2 +- .../email-processing/test.mime-handling.ts | 12 +- .../test.multiple-recipients.ts | 2 +- .../test.special-character-handling.ts | 12 +- .../error-handling/test.error-logging.ts | 4 +- .../error-handling/test.exception-handling.ts | 4 +- .../error-handling/test.malformed-mime.ts | 8 +- .../error-handling/test.permanent-failures.ts | 8 +- .../test.resource-exhaustion.ts | 8 +- .../error-handling/test.temporary-failures.ts | 2 +- test/suite/performance/test.concurrency.ts | 2 +- .../test.connection-processing-time.ts | 2 +- .../suite/performance/test.cpu-utilization.ts | 2 +- test/suite/performance/test.memory-usage.ts | 2 +- .../test.message-processing-time.ts | 2 +- .../performance/test.resource-cleanup.ts | 2 +- test/suite/performance/test.throughput.ts | 2 +- .../test.dns-resolution-failure.ts | 12 +- test/suite/reliability/test.error-recovery.ts | 14 +- .../test.long-running-operation.ts | 2 +- .../reliability/test.network-interruption.ts | 10 +- .../test.resource-leak-detection.ts | 6 +- .../reliability/test.restart-recovery.ts | 2 +- .../test.rfc3461-dsn-compliance.ts | 8 +- .../rfc-compliance/test.rfc5321-compliance.ts | 8 +- .../rfc-compliance/test.rfc5322-compliance.ts | 2 +- .../test.rfc6376-dkim-compliance.ts | 4 +- .../test.rfc7208-spf-compliance.ts | 8 +- .../test.rfc7489-dmarc-compliance.ts | 4 +- .../test.rfc8314-tls-compliance.ts | 8 +- test/suite/security/test.authentication.ts | 2 +- test/suite/security/test.authorization.ts | 18 +- test/suite/security/test.bounce-management.ts | 18 +- test/suite/security/test.content-scanning.ts | 12 +- test/suite/security/test.dkim-processing.ts | 12 +- test/suite/security/test.dmarc-policy.ts | 14 +- .../test.header-injection-prevention.ts | 12 +- test/suite/security/test.ip-reputation.ts | 16 +- test/suite/security/test.rate-limiting.ts | 10 +- test/suite/security/test.spf-checking.ts | 20 +- .../test.tls-certificate-validation.ts | 14 +- test/suite/server.loader.ts | 214 --------- test/test.ipwarmupmanager.ts | 12 +- test/test.minimal.ts | 2 +- test/test.reputationmonitor.ts | 12 +- test/test.smartmail.ts | 52 +-- 86 files changed, 654 insertions(+), 569 deletions(-) delete mode 100644 test/suite/server.loader.ts diff --git a/package.json b/package.json index ace06a0..5ce6280 100644 --- a/package.json +++ b/package.json @@ -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" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0075f31..ae7c1f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: {} diff --git a/test/helpers/server.loader.ts b/test/helpers/server.loader.ts index aef3728..ca788da 100644 --- a/test/helpers/server.loader.ts +++ b/test/helpers/server.loader.ts @@ -110,7 +110,7 @@ export async function startTestServer(config: ITestServerConfig): Promise { 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((resolve) => { - testServer.smtpServer.close(() => resolve()); - }); + if (testServer.smtpServer.close && typeof testServer.smtpServer.close === 'function') { + await testServer.smtpServer.close(); } // Wait for port to be free diff --git a/test/readme.md b/test/readme.md index 723c7b2..a2e84b4 100644 --- a/test/readme.md +++ b/test/readme.md @@ -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) diff --git a/test/suite/commands/test.command-pipelining.ts b/test/suite/commands/test.command-pipelining.ts index cd712f4..4b2da3a 100644 --- a/test/suite/commands/test.command-pipelining.ts +++ b/test/suite/commands/test.command-pipelining.ts @@ -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; diff --git a/test/suite/commands/test.data-command.ts b/test/suite/commands/test.data-command.ts index 67780df..f322a13 100644 --- a/test/suite/commands/test.data-command.ts +++ b/test/suite/commands/test.data-command.ts @@ -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; diff --git a/test/suite/commands/test.ehlo-command.ts b/test/suite/commands/test.ehlo-command.ts index 87e2bb0..ca13e18 100644 --- a/test/suite/commands/test.ehlo-command.ts +++ b/test/suite/commands/test.ehlo-command.ts @@ -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; diff --git a/test/suite/commands/test.expn-command.ts b/test/suite/commands/test.expn-command.ts index 7126fac..c9f13b0 100644 --- a/test/suite/commands/test.expn-command.ts +++ b/test/suite/commands/test.expn-command.ts @@ -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; diff --git a/test/suite/commands/test.helo-command.ts b/test/suite/commands/test.helo-command.ts index 15c86eb..82cd74c 100644 --- a/test/suite/commands/test.helo-command.ts +++ b/test/suite/commands/test.helo-command.ts @@ -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; diff --git a/test/suite/commands/test.help-command.ts b/test/suite/commands/test.help-command.ts index 4187034..dd7d548 100644 --- a/test/suite/commands/test.help-command.ts +++ b/test/suite/commands/test.help-command.ts @@ -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); } } diff --git a/test/suite/commands/test.mail-from.ts b/test/suite/commands/test.mail-from.ts index 26b287c..f524442 100644 --- a/test/suite/commands/test.mail-from.ts +++ b/test/suite/commands/test.mail-from.ts @@ -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; diff --git a/test/suite/commands/test.noop-command.ts b/test/suite/commands/test.noop-command.ts index ad01227..19a6e6a 100644 --- a/test/suite/commands/test.noop-command.ts +++ b/test/suite/commands/test.noop-command.ts @@ -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; diff --git a/test/suite/commands/test.quit-command.ts b/test/suite/commands/test.quit-command.ts index 634bdbd..ad701d7 100644 --- a/test/suite/commands/test.quit-command.ts +++ b/test/suite/commands/test.quit-command.ts @@ -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(); } }); diff --git a/test/suite/commands/test.rcpt-to.ts b/test/suite/commands/test.rcpt-to.ts index 8b95ced..1d3ea15 100644 --- a/test/suite/commands/test.rcpt-to.ts +++ b/test/suite/commands/test.rcpt-to.ts @@ -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; diff --git a/test/suite/commands/test.rset-command.ts b/test/suite/commands/test.rset-command.ts index 6796f88..07e52eb 100644 --- a/test/suite/commands/test.rset-command.ts +++ b/test/suite/commands/test.rset-command.ts @@ -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; diff --git a/test/suite/commands/test.size-extension.ts b/test/suite/commands/test.size-extension.ts index 3501552..cac3455 100644 --- a/test/suite/commands/test.size-extension.ts +++ b/test/suite/commands/test.size-extension.ts @@ -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); } diff --git a/test/suite/commands/test.vrfy-command.ts b/test/suite/commands/test.vrfy-command.ts index 6273b59..550b0ea 100644 --- a/test/suite/commands/test.vrfy-command.ts +++ b/test/suite/commands/test.vrfy-command.ts @@ -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; diff --git a/test/suite/connection/test.abrupt-disconnection.ts b/test/suite/connection/test.abrupt-disconnection.ts index 8782d2b..d1a0147 100644 --- a/test/suite/connection/test.abrupt-disconnection.ts +++ b/test/suite/connection/test.abrupt-disconnection.ts @@ -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((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((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(); diff --git a/test/suite/connection/test.connection-limits.ts b/test/suite/connection/test.connection-limits.ts index a464be5..63f0f48 100644 --- a/test/suite/connection/test.connection-limits.ts +++ b/test/suite/connection/test.connection-limits.ts @@ -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 diff --git a/test/suite/connection/test.connection-rejection.ts b/test/suite/connection/test.connection-rejection.ts index 8fe2694..e56a690 100644 --- a/test/suite/connection/test.connection-rejection.ts +++ b/test/suite/connection/test.connection-rejection.ts @@ -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(); \ No newline at end of file diff --git a/test/suite/connection/test.connection-timeout.ts b/test/suite/connection/test.connection-timeout.ts index fb85747..9a9703b 100644 --- a/test/suite/connection/test.connection-timeout.ts +++ b/test/suite/connection/test.connection-timeout.ts @@ -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'); diff --git a/test/suite/connection/test.keepalive.ts b/test/suite/connection/test.keepalive.ts index 94d8a0e..d2ed362 100644 --- a/test/suite/connection/test.keepalive.ts +++ b/test/suite/connection/test.keepalive.ts @@ -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 { diff --git a/test/suite/connection/test.multiple-connections.ts b/test/suite/connection/test.multiple-connections.ts index c9a0f9a..ed4a4fd 100644 --- a/test/suite/connection/test.multiple-connections.ts +++ b/test/suite/connection/test.multiple-connections.ts @@ -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'); }); diff --git a/test/suite/connection/test.plain-connection.ts b/test/suite/connection/test.plain-connection.ts index bc6bbb4..ac453ff 100644 --- a/test/suite/connection/test.plain-connection.ts +++ b/test/suite/connection/test.plain-connection.ts @@ -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(); }); diff --git a/test/suite/connection/test.starttls-upgrade.ts b/test/suite/connection/test.starttls-upgrade.ts index 1a25c7c..bd512ea 100644 --- a/test/suite/connection/test.starttls-upgrade.ts +++ b/test/suite/connection/test.starttls-upgrade.ts @@ -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); } }); diff --git a/test/suite/connection/test.tls-ciphers.ts b/test/suite/connection/test.tls-ciphers.ts index 7778b9f..090ce80 100644 --- a/test/suite/connection/test.tls-ciphers.ts +++ b/test/suite/connection/test.tls-ciphers.ts @@ -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((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(); diff --git a/test/suite/connection/test.tls-connection.ts b/test/suite/connection/test.tls-connection.ts index 265944e..bfc829f 100644 --- a/test/suite/connection/test.tls-connection.ts +++ b/test/suite/connection/test.tls-connection.ts @@ -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'); }); diff --git a/test/suite/connection/test.tls-versions.ts b/test/suite/connection/test.tls-versions.ts index 2e636f0..54ce175 100644 --- a/test/suite/connection/test.tls-versions.ts +++ b/test/suite/connection/test.tls-versions.ts @@ -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(); diff --git a/test/suite/edge-cases/test.empty-commands.ts b/test/suite/edge-cases/test.empty-commands.ts index ecb4f69..145b8af 100644 --- a/test/suite/edge-cases/test.empty-commands.ts +++ b/test/suite/edge-cases/test.empty-commands.ts @@ -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(); \ No newline at end of file diff --git a/test/suite/edge-cases/test.extremely-long-headers.ts b/test/suite/edge-cases/test.extremely-long-headers.ts index 1816669..1973e68 100644 --- a/test/suite/edge-cases/test.extremely-long-headers.ts +++ b/test/suite/edge-cases/test.extremely-long-headers.ts @@ -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; diff --git a/test/suite/edge-cases/test.extremely-long-lines.ts b/test/suite/edge-cases/test.extremely-long-lines.ts index 5cd7217..50d3d3a 100644 --- a/test/suite/edge-cases/test.extremely-long-lines.ts +++ b/test/suite/edge-cases/test.extremely-long-lines.ts @@ -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(); \ No newline at end of file diff --git a/test/suite/edge-cases/test.invalid-character-handling.ts b/test/suite/edge-cases/test.invalid-character-handling.ts index 5adbdc9..7cdc04f 100644 --- a/test/suite/edge-cases/test.invalid-character-handling.ts +++ b/test/suite/edge-cases/test.invalid-character-handling.ts @@ -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(); \ No newline at end of file diff --git a/test/suite/edge-cases/test.nested-mime-structures.ts b/test/suite/edge-cases/test.nested-mime-structures.ts index fdbf6db..ff19140 100644 --- a/test/suite/edge-cases/test.nested-mime-structures.ts +++ b/test/suite/edge-cases/test.nested-mime-structures.ts @@ -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; diff --git a/test/suite/edge-cases/test.unusual-mime-types.ts b/test/suite/edge-cases/test.unusual-mime-types.ts index d2f595c..99ff9dc 100644 --- a/test/suite/edge-cases/test.unusual-mime-types.ts +++ b/test/suite/edge-cases/test.unusual-mime-types.ts @@ -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; diff --git a/test/suite/edge-cases/test.very-large-email.ts b/test/suite/edge-cases/test.very-large-email.ts index ffafc95..fbd42d5 100644 --- a/test/suite/edge-cases/test.very-large-email.ts +++ b/test/suite/edge-cases/test.very-large-email.ts @@ -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; diff --git a/test/suite/email-processing/test.attachment-handling.ts b/test/suite/email-processing/test.attachment-handling.ts index c6ea0eb..6a92d79 100644 --- a/test/suite/email-processing/test.attachment-handling.ts +++ b/test/suite/email-processing/test.attachment-handling.ts @@ -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(); diff --git a/test/suite/email-processing/test.basic-email-sending.ts b/test/suite/email-processing/test.basic-email-sending.ts index 1fd2986..17a9860 100644 --- a/test/suite/email-processing/test.basic-email-sending.ts +++ b/test/suite/email-processing/test.basic-email-sending.ts @@ -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 diff --git a/test/suite/email-processing/test.delivery-status-notifications.ts b/test/suite/email-processing/test.delivery-status-notifications.ts index dd69861..5da1769 100644 --- a/test/suite/email-processing/test.delivery-status-notifications.ts +++ b/test/suite/email-processing/test.delivery-status-notifications.ts @@ -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:\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(); diff --git a/test/suite/email-processing/test.email-routing.ts b/test/suite/email-processing/test.email-routing.ts index 81221ed..dba64d0 100644 --- a/test/suite/email-processing/test.email-routing.ts +++ b/test/suite/email-processing/test.email-routing.ts @@ -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(); diff --git a/test/suite/email-processing/test.invalid-email-addresses.ts b/test/suite/email-processing/test.invalid-email-addresses.ts index 85ff50f..6f74aa2 100644 --- a/test/suite/email-processing/test.invalid-email-addresses.ts +++ b/test/suite/email-processing/test.invalid-email-addresses.ts @@ -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 diff --git a/test/suite/email-processing/test.large-email.ts b/test/suite/email-processing/test.large-email.ts index 89bec64..0ba07b5 100644 --- a/test/suite/email-processing/test.large-email.ts +++ b/test/suite/email-processing/test.large-email.ts @@ -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 diff --git a/test/suite/email-processing/test.mime-handling.ts b/test/suite/email-processing/test.mime-handling.ts index e9e7156..f300771 100644 --- a/test/suite/email-processing/test.mime-handling.ts +++ b/test/suite/email-processing/test.mime-handling.ts @@ -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(); diff --git a/test/suite/email-processing/test.multiple-recipients.ts b/test/suite/email-processing/test.multiple-recipients.ts index 4401e58..7482561 100644 --- a/test/suite/email-processing/test.multiple-recipients.ts +++ b/test/suite/email-processing/test.multiple-recipients.ts @@ -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 diff --git a/test/suite/email-processing/test.special-character-handling.ts b/test/suite/email-processing/test.special-character-handling.ts index 74eca2a..fdf4304 100644 --- a/test/suite/email-processing/test.special-character-handling.ts +++ b/test/suite/email-processing/test.special-character-handling.ts @@ -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(); diff --git a/test/suite/error-handling/test.error-logging.ts b/test/suite/error-handling/test.error-logging.ts index 0f5985a..bd36b39 100644 --- a/test/suite/error-handling/test.error-logging.ts +++ b/test/suite/error-handling/test.error-logging.ts @@ -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(); diff --git a/test/suite/error-handling/test.exception-handling.ts b/test/suite/error-handling/test.exception-handling.ts index ad19bd6..ba3bbbe 100644 --- a/test/suite/error-handling/test.exception-handling.ts +++ b/test/suite/error-handling/test.exception-handling.ts @@ -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'); diff --git a/test/suite/error-handling/test.malformed-mime.ts b/test/suite/error-handling/test.malformed-mime.ts index a473d4b..78f9322 100644 --- a/test/suite/error-handling/test.malformed-mime.ts +++ b/test/suite/error-handling/test.malformed-mime.ts @@ -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(); diff --git a/test/suite/error-handling/test.permanent-failures.ts b/test/suite/error-handling/test.permanent-failures.ts index aeadbe1..70a78b5 100644 --- a/test/suite/error-handling/test.permanent-failures.ts +++ b/test/suite/error-handling/test.permanent-failures.ts @@ -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(); \ No newline at end of file diff --git a/test/suite/error-handling/test.resource-exhaustion.ts b/test/suite/error-handling/test.resource-exhaustion.ts index 33b7ed8..821fe05 100644 --- a/test/suite/error-handling/test.resource-exhaustion.ts +++ b/test/suite/error-handling/test.resource-exhaustion.ts @@ -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'); diff --git a/test/suite/error-handling/test.temporary-failures.ts b/test/suite/error-handling/test.temporary-failures.ts index f1f7ab4..167c57a 100644 --- a/test/suite/error-handling/test.temporary-failures.ts +++ b/test/suite/error-handling/test.temporary-failures.ts @@ -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(); diff --git a/test/suite/performance/test.concurrency.ts b/test/suite/performance/test.concurrency.ts index c749a3e..4ac7155 100644 --- a/test/suite/performance/test.concurrency.ts +++ b/test/suite/performance/test.concurrency.ts @@ -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; diff --git a/test/suite/performance/test.connection-processing-time.ts b/test/suite/performance/test.connection-processing-time.ts index d4df8df..e725c98 100644 --- a/test/suite/performance/test.connection-processing-time.ts +++ b/test/suite/performance/test.connection-processing-time.ts @@ -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; diff --git a/test/suite/performance/test.cpu-utilization.ts b/test/suite/performance/test.cpu-utilization.ts index a158d72..985fdef 100644 --- a/test/suite/performance/test.cpu-utilization.ts +++ b/test/suite/performance/test.cpu-utilization.ts @@ -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; diff --git a/test/suite/performance/test.memory-usage.ts b/test/suite/performance/test.memory-usage.ts index cd8669a..d954fb6 100644 --- a/test/suite/performance/test.memory-usage.ts +++ b/test/suite/performance/test.memory-usage.ts @@ -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; diff --git a/test/suite/performance/test.message-processing-time.ts b/test/suite/performance/test.message-processing-time.ts index 0fa8d20..25a1891 100644 --- a/test/suite/performance/test.message-processing-time.ts +++ b/test/suite/performance/test.message-processing-time.ts @@ -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; diff --git a/test/suite/performance/test.resource-cleanup.ts b/test/suite/performance/test.resource-cleanup.ts index 7e59c10..93a7f8f 100644 --- a/test/suite/performance/test.resource-cleanup.ts +++ b/test/suite/performance/test.resource-cleanup.ts @@ -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; diff --git a/test/suite/performance/test.throughput.ts b/test/suite/performance/test.throughput.ts index 696e13d..7a79c95 100644 --- a/test/suite/performance/test.throughput.ts +++ b/test/suite/performance/test.throughput.ts @@ -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; diff --git a/test/suite/reliability/test.dns-resolution-failure.ts b/test/suite/reliability/test.dns-resolution-failure.ts index de0d98e..d71995e 100644 --- a/test/suite/reliability/test.dns-resolution-failure.ts +++ b/test/suite/reliability/test.dns-resolution-failure.ts @@ -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((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'); diff --git a/test/suite/reliability/test.error-recovery.ts b/test/suite/reliability/test.error-recovery.ts index 5b1f0ec..22c087e 100644 --- a/test/suite/reliability/test.error-recovery.ts +++ b/test/suite/reliability/test.error-recovery.ts @@ -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) { diff --git a/test/suite/reliability/test.long-running-operation.ts b/test/suite/reliability/test.long-running-operation.ts index a2f5369..21fc2c3 100644 --- a/test/suite/reliability/test.long-running-operation.ts +++ b/test/suite/reliability/test.long-running-operation.ts @@ -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; diff --git a/test/suite/reliability/test.network-interruption.ts b/test/suite/reliability/test.network-interruption.ts index 2afeee7..a1d27cc 100644 --- a/test/suite/reliability/test.network-interruption.ts +++ b/test/suite/reliability/test.network-interruption.ts @@ -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) { diff --git a/test/suite/reliability/test.resource-leak-detection.ts b/test/suite/reliability/test.resource-leak-detection.ts index bbc665b..08bb7df 100644 --- a/test/suite/reliability/test.resource-leak-detection.ts +++ b/test/suite/reliability/test.resource-leak-detection.ts @@ -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()); diff --git a/test/suite/reliability/test.restart-recovery.ts b/test/suite/reliability/test.restart-recovery.ts index e647c44..e9c00bd 100644 --- a/test/suite/reliability/test.restart-recovery.ts +++ b/test/suite/reliability/test.restart-recovery.ts @@ -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; diff --git a/test/suite/rfc-compliance/test.rfc3461-dsn-compliance.ts b/test/suite/rfc-compliance/test.rfc3461-dsn-compliance.ts index 61edf76..3b3edfd 100644 --- a/test/suite/rfc-compliance/test.rfc3461-dsn-compliance.ts +++ b/test/suite/rfc-compliance/test.rfc3461-dsn-compliance.ts @@ -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'); diff --git a/test/suite/rfc-compliance/test.rfc5321-compliance.ts b/test/suite/rfc-compliance/test.rfc5321-compliance.ts index da4264c..9e95a96 100644 --- a/test/suite/rfc-compliance/test.rfc5321-compliance.ts +++ b/test/suite/rfc-compliance/test.rfc5321-compliance.ts @@ -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(); diff --git a/test/suite/rfc-compliance/test.rfc5322-compliance.ts b/test/suite/rfc-compliance/test.rfc5322-compliance.ts index 6865186..daa6def 100644 --- a/test/suite/rfc-compliance/test.rfc5322-compliance.ts +++ b/test/suite/rfc-compliance/test.rfc5322-compliance.ts @@ -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; diff --git a/test/suite/rfc-compliance/test.rfc6376-dkim-compliance.ts b/test/suite/rfc-compliance/test.rfc6376-dkim-compliance.ts index a7a36a4..ee2fae2 100644 --- a/test/suite/rfc-compliance/test.rfc6376-dkim-compliance.ts +++ b/test/suite/rfc-compliance/test.rfc6376-dkim-compliance.ts @@ -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(); diff --git a/test/suite/rfc-compliance/test.rfc7208-spf-compliance.ts b/test/suite/rfc-compliance/test.rfc7208-spf-compliance.ts index 9d37a2c..fcc3f91 100644 --- a/test/suite/rfc-compliance/test.rfc7208-spf-compliance.ts +++ b/test/suite/rfc-compliance/test.rfc7208-spf-compliance.ts @@ -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'); diff --git a/test/suite/rfc-compliance/test.rfc7489-dmarc-compliance.ts b/test/suite/rfc-compliance/test.rfc7489-dmarc-compliance.ts index c8022ab..0bc3837 100644 --- a/test/suite/rfc-compliance/test.rfc7489-dmarc-compliance.ts +++ b/test/suite/rfc-compliance/test.rfc7489-dmarc-compliance.ts @@ -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(); diff --git a/test/suite/rfc-compliance/test.rfc8314-tls-compliance.ts b/test/suite/rfc-compliance/test.rfc8314-tls-compliance.ts index 8d3ee67..c8fa54e 100644 --- a/test/suite/rfc-compliance/test.rfc8314-tls-compliance.ts +++ b/test/suite/rfc-compliance/test.rfc8314-tls-compliance.ts @@ -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'); diff --git a/test/suite/security/test.authentication.ts b/test/suite/security/test.authentication.ts index 0042bdd..ac3fe34 100644 --- a/test/suite/security/test.authentication.ts +++ b/test/suite/security/test.authentication.ts @@ -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; diff --git a/test/suite/security/test.authorization.ts b/test/suite/security/test.authorization.ts index 5adcd2c..6602be2 100644 --- a/test/suite/security/test.authorization.ts +++ b/test/suite/security/test.authorization.ts @@ -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(); diff --git a/test/suite/security/test.bounce-management.ts b/test/suite/security/test.bounce-management.ts index 1b93338..8b8c118 100644 --- a/test/suite/security/test.bounce-management.ts +++ b/test/suite/security/test.bounce-management.ts @@ -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(); diff --git a/test/suite/security/test.content-scanning.ts b/test/suite/security/test.content-scanning.ts index 93e69d6..213799c 100644 --- a/test/suite/security/test.content-scanning.ts +++ b/test/suite/security/test.content-scanning.ts @@ -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(); diff --git a/test/suite/security/test.dkim-processing.ts b/test/suite/security/test.dkim-processing.ts index 966aa1d..6f36add 100644 --- a/test/suite/security/test.dkim-processing.ts +++ b/test/suite/security/test.dkim-processing.ts @@ -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(); diff --git a/test/suite/security/test.dmarc-policy.ts b/test/suite/security/test.dmarc-policy.ts index 5f30aea..f328630 100644 --- a/test/suite/security/test.dmarc-policy.ts +++ b/test/suite/security/test.dmarc-policy.ts @@ -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(); diff --git a/test/suite/security/test.header-injection-prevention.ts b/test/suite/security/test.header-injection-prevention.ts index 6084813..a6c24ee 100644 --- a/test/suite/security/test.header-injection-prevention.ts +++ b/test/suite/security/test.header-injection-prevention.ts @@ -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(); diff --git a/test/suite/security/test.ip-reputation.ts b/test/suite/security/test.ip-reputation.ts index 0ba71b4..f88d991 100644 --- a/test/suite/security/test.ip-reputation.ts +++ b/test/suite/security/test.ip-reputation.ts @@ -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(); diff --git a/test/suite/security/test.rate-limiting.ts b/test/suite/security/test.rate-limiting.ts index 122b881..f9f9554 100644 --- a/test/suite/security/test.rate-limiting.ts +++ b/test/suite/security/test.rate-limiting.ts @@ -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(); \ No newline at end of file diff --git a/test/suite/security/test.spf-checking.ts b/test/suite/security/test.spf-checking.ts index 6d64157..1a0bab6 100644 --- a/test/suite/security/test.spf-checking.ts +++ b/test/suite/security/test.spf-checking.ts @@ -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(); diff --git a/test/suite/security/test.tls-certificate-validation.ts b/test/suite/security/test.tls-certificate-validation.ts index 8547b82..6aaf1cb 100644 --- a/test/suite/security/test.tls-certificate-validation.ts +++ b/test/suite/security/test.tls-certificate-validation.ts @@ -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(); }); diff --git a/test/suite/server.loader.ts b/test/suite/server.loader.ts deleted file mode 100644 index 7db7000..0000000 --- a/test/suite/server.loader.ts +++ /dev/null @@ -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 -}; \ No newline at end of file diff --git a/test/test.ipwarmupmanager.ts b/test/test.ipwarmupmanager.ts index f187c20..0e51362 100644 --- a/test/test.ipwarmupmanager.ts +++ b/test/test.ipwarmupmanager.ts @@ -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); } }); diff --git a/test/test.minimal.ts b/test/test.minimal.ts index 5288d5b..bdebfb5 100644 --- a/test/test.minimal.ts +++ b/test/test.minimal.ts @@ -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(); diff --git a/test/test.reputationmonitor.ts b/test/test.reputationmonitor.ts index e1b20ad..84e85bd 100644 --- a/test/test.reputationmonitor.ts +++ b/test/test.reputationmonitor.ts @@ -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 diff --git a/test/test.smartmail.ts b/test/test.smartmail.ts index 0a9b83a..43f6844 100644 --- a/test/test.smartmail.ts +++ b/test/test.smartmail.ts @@ -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('John Doe') > -1).toBeTrue(); + expect(email.getHtmlWithVariables().indexOf('John Doe') > -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 } });