| Test ID | Name | RFC | Type | fastmail | stalwart |
|---|---|---|---|---|---|
| ▼binary (13) | |||||
| ▶binary/blob-copy-cross-account | Blob/copy copies blob to another account | RFC8620 §6.3 | Required | ▶SKIP | ▶SKIP |
fastmail: SKIP
No cross-account access available
0ms
|
|||||
stalwart: SKIP
No cross-account access available
0ms
|
|||||
src/tests/binary/blob-copy.test.ts
|
|||||
| ▶binary/blob-copy-not-found | Blob/copy returns notCopied for invalid blobId | RFC8620 §6.3 | Required | ▶SKIP | ▶SKIP |
fastmail: SKIP
No cross-account access available
0ms
|
|||||
stalwart: SKIP
No cross-account access available
0ms
|
|||||
src/tests/binary/blob-copy.test.ts
|
|||||
| ▶binary/blob-copy-response-structure | Blob/copy response has required properties | RFC8620 §6.3 | Required | ▶SKIP | ▶SKIP |
fastmail: SKIP
No cross-account access available
0ms
|
|||||
stalwart: SKIP
No cross-account access available
0ms
|
|||||
src/tests/binary/blob-copy.test.ts
|
|||||
| ▶binary/blob-copy-same-account-error | Blob/copy rejects same-account copy | RFC8620 §6.3 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
Same-account copy must return invalidArguments
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/binary/blob-copy.test.ts
|
|||||
| ▶binary/download-email-blob | Download an email's blob by blobId | RFC8620 §6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
609ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/binary/download.test.ts
|
|||||
| ▶binary/download-nonexistent-blob | Download nonexistent blobId returns 404 | RFC8620 §6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/binary/download.test.ts
|
|||||
| ▶binary/download-respects-type-param | Download URL type parameter affects Content-Type header | RFC8620 §6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
614ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/binary/download.test.ts
|
|||||
| ▶binary/download-uploaded-blob | Download a previously uploaded blob returns same data | RFC8620 §6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1229ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/binary/download.test.ts
|
|||||
| ▶binary/upload-basic | Upload binary data returns blobId, type, and size | RFC8620 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1127ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/binary/upload.test.ts
|
|||||
| ▶binary/upload-binary-content | Upload binary (non-text) data preserves content | RFC8620 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/binary/upload.test.ts
|
|||||
| ▶binary/upload-large-data | Upload moderately large data succeeds | RFC8620 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1535ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/binary/upload.test.ts
|
|||||
| ▶binary/upload-preserves-content-type | Upload preserves specified content type (server may normalize with params) | RFC8620 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/binary/upload.test.ts
|
|||||
| ▶binary/upload-returns-valid-blob-id | Uploaded blobId is a valid JMAP Id | RFC8620 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/binary/upload.test.ts
|
|||||
| ▼core (38) | |||||
| ▶core/echo-basic | Core/echo returns same arguments | RFC8620 §4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
304ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/echo.test.ts
|
|||||
| ▶core/echo-empty | Core/echo with empty arguments | RFC8620 §4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
310ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/echo.test.ts
|
|||||
| ▶core/echo-nested | Core/echo with nested complex arguments | RFC8620 §4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
304ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/echo.test.ts
|
|||||
| ▶core/error-account-not-found | Server returns accountNotFound for fake account ID | RFC8620 §3.6.2 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
351ms
|
|||||
stalwart: FAIL
Expected "accountNotFound", got "invalidArguments"
2ms
|
|||||
src/tests/core/method-errors.test.ts
|
|||||
| ▶core/error-empty-using | Server processes request with empty using but rejects each method with unknownMethod | RFC8620 §3.6.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
307ms
|
|||||
stalwart: FAIL
With empty using, method call must return error
2ms
|
|||||
src/tests/core/request-errors.test.ts
|
|||||
| ▶core/error-invalid-arguments-bad-type | Server returns invalidArguments for wrong argument types | RFC8620 §3.6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/method-errors.test.ts
|
|||||
| ▶core/error-invalid-arguments-missing-account | Server returns invalidArguments for missing accountId on Mailbox/get | RFC8620 §3.6.2 | Required | ▶FAIL | ▶FAIL |
fastmail: FAIL
Missing accountId must return invalidArguments
283ms
|
|||||
stalwart: FAIL
Expected "error", got "Mailbox/get"
2ms
|
|||||
src/tests/core/method-errors.test.ts
|
|||||
| ▶core/error-method-calls-not-array | Server returns error when methodCalls is not an array | RFC8620 §3.6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
304ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/request-errors.test.ts
|
|||||
| ▶core/error-method-level-has-type | Method-level errors include 'type' property | RFC8620 §3.6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/method-errors.test.ts
|
|||||
| ▶core/error-multiple-method-responses | Server returns one response per method call, in order | RFC8620 §3.6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/method-errors.test.ts
|
|||||
| ▶core/error-not-json | Server returns error for non-JSON body | RFC8620 §3.6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
289ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/request-errors.test.ts
|
|||||
| ▶core/error-not-request | Server MUST return 400 for JSON that is not a valid Request | RFC8620 §3.6.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
282ms
|
|||||
stalwart: FAIL
Expected 4xx client error, got 200
2ms
|
|||||
src/tests/core/request-errors.test.ts
|
|||||
| ▶core/error-response-has-session-state | API response includes sessionState property | RFC8620 §3.6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/method-errors.test.ts
|
|||||
| ▶core/error-state-mismatch | Server MUST return stateMismatch for incorrect ifInState | RFC8620 §3.6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
920ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/method-errors.test.ts
|
|||||
| ▶core/error-unknown-capability | Server MUST return HTTP-level error for unknown capability in using | RFC8620 §3.6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
348ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/request-errors.test.ts
|
|||||
| ▶core/error-unknown-method | Server returns unknownMethod for nonexistent method | RFC8620 §3.6.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
287ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/method-errors.test.ts
|
|||||
| ▶core/error-wrong-content-type | Server returns error for wrong Content-Type | RFC8620 §3.6.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
308ms
|
|||||
stalwart: FAIL
Expected 4xx client error for wrong content type, got 200
2ms
|
|||||
src/tests/core/request-errors.test.ts
|
|||||
| ▶core/result-ref-call-id-preserved | Call IDs are preserved in responses for result references | RFC8620 §3.7 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/result-references.test.ts
|
|||||
| ▶core/result-ref-chained | Chained result references across multiple calls | RFC8620 §3.7 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/result-references.test.ts
|
|||||
| ▶core/result-ref-invalid-result-of | Invalid resultOf returns invalidResultReference error | RFC8620 §3.7 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/result-references.test.ts
|
|||||
| ▶core/result-ref-path-single-value | Result reference with path to single value | RFC8620 §3.7 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/core/result-references.test.ts
|
|||||
| ▶core/result-ref-simple | Simple result reference resolves correctly | RFC8620 §3.7 | Required | ▶PASS | ▶PASS |
fastmail: PASS
309ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/result-references.test.ts
|
|||||
| ▶core/result-ref-wrong-method-name | Result reference with wrong method name returns error | RFC8620 §3.7 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1227ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/result-references.test.ts
|
|||||
| ▶core/session-account-capabilities-mail | Mail account has urn:ietf:params:jmap:mail capability | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-account-properties | Account objects have required properties | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-accounts-present | Session has accounts object with at least one account | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-api-url | Session has apiUrl string | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-core-capability-properties | Core capability has required properties | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-download-url-template | Session downloadUrl contains template variables | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-event-source-url | Session has eventSourceUrl | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-has-capabilities | Session resource has capabilities object | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-has-core-capability | Session advertises urn:ietf:params:jmap:core | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-has-mail-capability | Session advertises urn:ietf:params:jmap:mail | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-mail-capability-properties | Mail capability has required properties | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-primary-accounts | Session has primaryAccounts with mail account | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-state | Session has state string | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-upload-url | Session has uploadUrl with accountId template | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▶core/session-username | Session has username string | RFC8620 §2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
0ms
|
|||||
stalwart: PASS
0ms
|
|||||
src/tests/core/session.test.ts
|
|||||
| ▼email (150) | |||||
| ▶email/body-attachment-blob-id | Email/get attachment parts have blobId for download | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-attachments | Email/get attachments returns non-inline attachment parts | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-html-body | Email/get htmlBody returns HTML parts for multipart/alternative | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-inline-attachment-cid | Email/get inline attachment has Content-ID (cid) | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-invalid-ascii-handling | Email/get handles malformed ASCII email gracefully | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
329ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-max-body-value-bytes | Email/get maxBodyValueBytes truncates large bodies | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-multipart-alternative-text-and-html | Email/get textBody and htmlBody differ for multipart/alternative | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-non-utf8-charset | Email/get handles non-UTF8 charset (EUC-KR) | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
285ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-properties-filter | Email/get bodyProperties limits returned body part properties | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-structure | Email/get bodyStructure returns MIME tree | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
331ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-text-body | Email/get textBody returns plain text parts | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
309ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-values-all | Email/get fetchAllBodyValues returns all body values | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
383ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-values-html | Email/get fetchHTMLBodyValues returns HTML content | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
355ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/body-values-text | Email/get fetchTextBodyValues returns body content | RFC8621 §4.1.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
284ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-body.test.ts
|
|||||
| ▶email/changes-after-create-and-destroy | Email/changes tracks creation and destruction | RFC8621 §4.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2557ms
|
|||||
stalwart: PASS
9ms
|
|||||
src/tests/email/email-changes.test.ts
|
|||||
| ▶email/changes-after-keyword-change | Email/changes reflects keyword update | RFC8621 §4.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2151ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/email/email-changes.test.ts
|
|||||
| ▶email/changes-no-changes | Email/changes with current state returns empty arrays | RFC8621 §4.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
614ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/email/email-changes.test.ts
|
|||||
| ▶email/changes-response-structure | Email/changes response has required properties | RFC8621 §4.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
616ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/email/email-changes.test.ts
|
|||||
| ▶email/collapse-threads-basic | Email/query collapseThreads=true returns one per thread | RFC8621 §4.4.3 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
615ms
|
|||||
stalwart: FAIL
Collapsed total should be less than expanded
4ms
|
|||||
src/tests/email/email-query-thread-collapse.test.ts
|
|||||
| ▶email/collapse-threads-calculate-total | Email/query collapseThreads total counts unique threads | RFC8621 §4.4.3 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
307ms
|
|||||
stalwart: FAIL
Expected 20, got 22
2ms
|
|||||
src/tests/email/email-query-thread-collapse.test.ts
|
|||||
| ▶email/collapse-threads-one-per-thread | Email/query collapseThreads returns exactly one email per thread | RFC8621 §4.4.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
615ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-thread-collapse.test.ts
|
|||||
| ▶email/collapse-threads-sort-determines-representative | Email/query collapseThreads uses sort to pick thread representative | RFC8621 §4.4.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-thread-collapse.test.ts
|
|||||
| ▶email/collapse-threads-with-filter | Email/query collapseThreads interacts correctly with filter | RFC8621 §4.4.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
817ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-thread-collapse.test.ts
|
|||||
| ▶email/copy-cross-account | Email/copy copies email to another account | RFC8621 §4.7 | Required | ▶SKIP | ▶SKIP |
fastmail: SKIP
No cross-account access available
0ms
|
|||||
stalwart: SKIP
No cross-account access available
0ms
|
|||||
src/tests/email/email-copy.test.ts
|
|||||
| ▶email/copy-not-found | Email/copy returns notCreated for invalid source id | RFC8621 §4.7 | Required | ▶SKIP | ▶SKIP |
fastmail: SKIP
No cross-account access available
0ms
|
|||||
stalwart: SKIP
No cross-account access available
0ms
|
|||||
src/tests/email/email-copy.test.ts
|
|||||
| ▶email/copy-same-account-error | Email/copy rejects same-account copy | RFC8621 §4.7 | Required | ▶PASS | ▶PASS |
fastmail: PASS
331ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-copy.test.ts
|
|||||
| ▶email/filter-after | Email/query filter after returns emails after date | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-before | Email/query filter before returns emails before date | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
330ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-before-and-after | Email/query filter with both before and after (date range) | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-body | Email/query filter body matches body text | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
284ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-cc | Email/query filter cc matches CC recipient | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
286ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-custom-keyword | Email/query filter hasKeyword with custom keyword | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
998ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-empty-matches-all | Email/query with null filter returns all emails | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-from | Email/query filter from matches sender | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-from-display-name | Email/query filter from matches display name | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
283ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-has-attachment-false | Email/query filter hasAttachment=false returns emails without attachments | RFC8621 §4.4.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
1586ms
|
|||||
stalwart: FAIL
hasAttachment=false query returned email WITH attachment: "Q3 Financial Report" (from: bob@example.org, id: i7qaaacgu)
4ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-has-attachment-true | Email/query filter hasAttachment=true returns emails with attachments | RFC8621 §4.4.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
566ms
|
|||||
stalwart: FAIL
html-attachment (has PDF attachment) should be in hasAttachment=true results
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-has-keyword | Email/query filter hasKeyword returns emails with that keyword | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1071ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-header-name-only | Email/query filter header [name] checks header existence | RFC8621 §4.4.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
296ms
|
|||||
stalwart: FAIL
Expected array to include "i92aaacg3", got []
3ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-header-name-value | Email/query filter header [name, value] checks header value | RFC8621 §4.4.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
308ms
|
|||||
stalwart: FAIL
Expected array to include "i92aaacg3", got []
3ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-in-child-mailbox | Email/query filter inMailbox with child mailbox | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
359ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-in-mailbox | Email/query filter inMailbox returns emails in that mailbox | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-in-mailbox-other-than | Email/query filter inMailboxOtherThan excludes specified mailboxes | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
284ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-max-size | Email/query filter maxSize returns emails at most that size | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-min-size | Email/query filter minSize returns emails at least that size | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
311ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-multiple-conditions-on-one-filter | Email/query with multiple conditions on single FilterCondition | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
282ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-nested-operators | Email/query nested FilterOperators work correctly | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
312ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-none-in-thread-have-keyword | Email/query filter noneInThreadHaveKeyword excludes threads with keyword | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1042ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-not-keyword | Email/query filter notKeyword excludes emails with keyword | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
360ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-null-accepted | Email/query accepts filter: null | RFC8621 §4.4.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
286ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-operator-and | Email/query FilterOperator AND combines conditions | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
312ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-operator-not | Email/query FilterOperator NOT negates condition | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
814ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-operator-or | Email/query FilterOperator OR combines conditions | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
303ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-some-in-thread-have-keyword | Email/query filter someInThreadHaveKeyword matches | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
286ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-subject | Email/query filter subject matches subject text | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
282ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-text-search-body | Email/query filter text SHOULD search body content | RFC8621 §4.4.1 | Recommended | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-text-search-headers | Email/query filter text MUST search from/to/cc/bcc/subject | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1535ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/filter-to | Email/query filter to matches recipient | RFC8621 §4.4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
285ms
|
|||||
stalwart: PASS
10ms
|
|||||
src/tests/email/email-query-filters.test.ts
|
|||||
| ▶email/get-by-id | Email/get returns email by id | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
921ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-has-attachment-false | Email/get hasAttachment is false for plain email | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1228ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-has-attachment-true | Email/get hasAttachment is true for email with attachment | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1281ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-keywords | Email/get keywords reflect set keywords | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
283ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-mailbox-ids | Email/get mailboxIds reflects correct mailbox membership | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
284ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-metadata-properties | Email/get returns all metadata properties | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
301ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-multiple-emails | Email/get with multiple ids returns all | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-not-found | Email/get returns notFound for unknown ids | RFC8621 §4.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
310ms
|
|||||
stalwart: FAIL
Expected array to include "nonexistent-email-xyz", got []
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-preview-is-text | Email/get preview is plain text summary | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-properties-filter | Email/get properties filter limits returned properties | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
304ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-received-at-is-utc-date | Email/get receivedAt is a valid UTC date string | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-state-returned | Email/get returns state string | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/get-thread-id-consistent | Email/get threadId is consistent for threaded emails | RFC8621 §4.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get.test.ts
|
|||||
| ▶email/header-as-addresses | Email/get header:From:asAddresses returns parsed addresses | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-as-date | Email/get header:Date:asDate returns parsed date | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1358ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-as-grouped-addresses | Email/get header:From:asGroupedAddresses returns grouped format | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
310ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-as-message-ids | Email/get header:Message-ID:asMessageIds returns parsed IDs | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
283ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-as-urls | Email/get header:List-Unsubscribe:asURLs returns URL array | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
287ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-bcc | Email/get 'bcc' returns BCC addresses when available | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
283ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-case-insensitive | Email/get header names are case-insensitive | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1227ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-cc | Email/get 'cc' returns CC addresses | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-custom-header | Email/get header:X-Custom-Header returns custom header value | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
326ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-from | Email/get 'from' returns sender address | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-in-reply-to | Email/get 'inReplyTo' returns referenced message IDs | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
302ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-intl-from-decoded | Email/get decodes RFC 2047 encoded From header | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-message-id | Email/get 'messageId' returns array of message IDs | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
312ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-raw-access | Email/get header:Subject:asText returns raw header value | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-raw-form | Email/get header:Subject (raw) returns raw header value | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-references | Email/get 'references' returns full reference chain | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-sent-at | Email/get 'sentAt' returns Date header as date string | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-subject | Email/get 'subject' returns subject string | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-subject-empty | Email/get 'subject' for email with no subject | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/header-to | Email/get 'to' returns recipient addresses | RFC8621 §4.1.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-get-headers.test.ts
|
|||||
| ▶email/import-invalid-blob | Email/import rejects non-message blob | RFC8621 §4.8 | Recommended | ▶PASS | ▶FAIL |
fastmail: PASS
613ms
|
|||||
stalwart: FAIL
Server MUST reject import of non-RFC5322 blob
4ms
|
|||||
src/tests/email/email-import.test.ts
|
|||||
| ▶email/import-multiple | Email/import can import multiple emails at once | RFC8621 §4.8 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1259ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/email/email-import.test.ts
|
|||||
| ▶email/import-not-found-blob | Email/import returns error for nonexistent blobId | RFC8621 §4.8 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-import.test.ts
|
|||||
| ▶email/import-sets-keywords | Email/import sets specified keywords | RFC8621 §4.8 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1331ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/email/email-import.test.ts
|
|||||
| ▶email/import-sets-mailbox | Email/import places email in specified mailbox | RFC8621 §4.8 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1228ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/email/email-import.test.ts
|
|||||
| ▶email/import-sets-received-at | Email/import sets specified receivedAt date | RFC8621 §4.8 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2561ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/email/email-import.test.ts
|
|||||
| ▶email/import-state-changes | Email/import returns oldState and newState | RFC8621 §4.8 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1034ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/email/email-import.test.ts
|
|||||
| ▶email/import-valid-message | Email/import imports a valid RFC 5322 message | RFC8621 §4.8 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1945ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/email/email-import.test.ts
|
|||||
| ▶email/paging-anchor | Email/query anchor returns results starting from anchored email | RFC8621 §4.4 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
590ms
|
|||||
stalwart: FAIL
Expected 2, got 0
4ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-anchor-not-found | Email/query MUST return anchorNotFound for invalid anchor | RFC8621 §4.4 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
283ms
|
|||||
stalwart: FAIL
Expected "anchorNotFound", got "invalidArguments"
2ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-anchor-offset | Email/query anchor with anchorOffset shifts start | RFC8621 §4.4 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
639ms
|
|||||
stalwart: FAIL
Expected "i22aaachh", got "i2eaaachb"
4ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-calculate-total | Email/query calculateTotal returns total count | RFC8621 §4.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-limit | Email/query limit restricts result count | RFC8621 §4.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1010ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-negative-position | Email/query with negative position counts from end | RFC8621 §4.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
817ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-position-beyond-total | Email/query with position >= total returns empty | RFC8621 §4.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
332ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-position-zero | Email/query position=0 starts from beginning | RFC8621 §4.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
287ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-positive-position | Email/query with positive position skips results | RFC8621 §4.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
602ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/paging-response-position | Email/query response position reflects actual start position | RFC8621 §4.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| ▶email/parse-body-values | Email/parse returns body values when requested | RFC8621 §4.9 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1641ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-parse.test.ts
|
|||||
| ▶email/parse-not-found | Email/parse returns notFound for invalid blobId | RFC8621 §4.9 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
305ms
|
|||||
stalwart: FAIL
Expected notFound to contain 'nonexistent-blob-xyz', but got null (server claims all blob ids were found)
2ms
|
|||||
src/tests/email/email-parse.test.ts
|
|||||
| ▶email/parse-not-parsable | Email/parse returns notParsable for non-email blob | RFC8621 §4.9 | Recommended | ▶FAIL | ▶FAIL |
fastmail: FAIL
Server MUST return notParsable for non-email blob
616ms
|
|||||
stalwart: FAIL
Server MUST return notParsable for non-email blob
4ms
|
|||||
src/tests/email/email-parse.test.ts
|
|||||
| ▶email/parse-null-metadata | Email/parse returns null for metadata properties (id, mailboxIds, etc) | RFC8621 §4.9 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
Expected null, got {}
614ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-parse.test.ts
|
|||||
| ▶email/parse-response-structure | Email/parse response has required properties | RFC8621 §4.9 | Required | ▶PASS | ▶PASS |
fastmail: PASS
592ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-parse.test.ts
|
|||||
| ▶email/parse-valid-message | Email/parse parses uploaded RFC 5322 message | RFC8621 §4.9 | Required | ▶PASS | ▶PASS |
fastmail: PASS
575ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-parse.test.ts
|
|||||
| ▶email/query-changes-after-add | Email/queryChanges reflects newly added email | RFC8621 §4.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2150ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/email/email-query-changes.test.ts
|
|||||
| ▶email/query-changes-after-remove | Email/queryChanges reflects removed email | RFC8621 §4.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1233ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/email/email-query-changes.test.ts
|
|||||
| ▶email/query-changes-filter-null-accepted | Email/queryChanges accepts filter: null | RFC8621 §4.5 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
568ms
|
|||||
stalwart: FAIL
JMAP method error: invalidArguments - invalid type: null, expected a filter object at line 1 column 201
2ms
|
|||||
src/tests/email/email-query-changes.test.ts
|
|||||
| ▶email/query-changes-no-changes | Email/queryChanges with current state returns empty changes | RFC8621 §4.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
615ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/email/email-query-changes.test.ts
|
|||||
| ▶email/query-changes-response-structure | Email/queryChanges response has required properties | RFC8621 §4.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1367ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/email/email-query-changes.test.ts
|
|||||
| ▶email/set-create-creation-id-reference | Email/set create uses creation id reference for mailbox | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1145ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/email/email-set-create.test.ts
|
|||||
| ▶email/set-create-html | Email/set create HTML email | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
719ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-set-create.test.ts
|
|||||
| ▶email/set-create-multipart-alternative | Email/set create multipart/alternative email | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2965ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/email/email-set-create.test.ts
|
|||||
| ▶email/set-create-plain-text | Email/set create plain text email | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
723ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-set-create.test.ts
|
|||||
| ▶email/set-create-server-set-properties | Email/set create returns server-set properties | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1550ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-set-create.test.ts
|
|||||
| ▶email/set-create-state-changes | Email/set create changes state | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
578ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-set-create.test.ts
|
|||||
| ▶email/set-create-with-attachment | Email/set create email with attachment via blobId | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1558ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/email/email-set-create.test.ts
|
|||||
| ▶email/set-create-with-keywords | Email/set create with keywords (draft, seen) | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
908ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/email/email-set-create.test.ts
|
|||||
| ▶email/set-destroy-multiple | Email/set destroy multiple emails at once | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1741ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-set-destroy.test.ts
|
|||||
| ▶email/set-destroy-not-found | Email/set destroy returns notDestroyed for unknown id | RFC8621 §4.6 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
307ms
|
|||||
stalwart: FAIL
Email/set notDestroyed must not be null when destroying a nonexistent id
2ms
|
|||||
src/tests/email/email-set-destroy.test.ts
|
|||||
| ▶email/set-destroy-removes-from-all-mailboxes | Email/set destroy removes email from all mailboxes | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2331ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/email/email-set-destroy.test.ts
|
|||||
| ▶email/set-destroy-single | Email/set destroy single email | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
921ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/email/email-set-destroy.test.ts
|
|||||
| ▶email/set-update-add-keyword | Email/set update adds keyword | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
917ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/email/email-set-update.test.ts
|
|||||
| ▶email/set-update-add-mailbox | Email/set update adds email to additional mailbox | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1218ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/email/email-set-update.test.ts
|
|||||
| ▶email/set-update-if-in-state | Email/set update with ifInState succeeds with correct state | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1572ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/email/email-set-update.test.ts
|
|||||
| ▶email/set-update-move-mailbox | Email/set update moves email to different mailbox | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1273ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/email/email-set-update.test.ts
|
|||||
| ▶email/set-update-not-found | Email/set update returns notUpdated for unknown id | RFC8621 §4.6 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
307ms
|
|||||
stalwart: FAIL
Email/set notUpdated must not be null when updating a nonexistent id
2ms
|
|||||
src/tests/email/email-set-update.test.ts
|
|||||
| ▶email/set-update-remove-keyword | Email/set update removes keyword via patch null | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
901ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/email/email-set-update.test.ts
|
|||||
| ▶email/set-update-remove-mailbox | Email/set update removes email from a mailbox via patch null | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
3149ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/email/email-set-update.test.ts
|
|||||
| ▶email/set-update-replace-keywords | Email/set update replaces all keywords at once | RFC8621 §4.6 | Required | ▶PASS | ▶PASS |
fastmail: PASS
899ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/email/email-set-update.test.ts
|
|||||
| ▶email/sort-default-no-sort | Email/query with no sort returns results in server-determined order | RFC8621 §4.4.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
282ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-from | Email/query sort by from | RFC8621 §4.4.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
611ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-has-keyword | Email/query sort by hasKeyword | RFC8621 §4.4.2 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
686ms
|
|||||
stalwart: FAIL
Flagged email appeared after non-flagged email in descending hasKeyword sort
3ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-multi-property | Email/query sort by multiple properties | RFC8621 §4.4.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1300ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-received-at-asc | Email/query sort by receivedAt ascending (oldest first) | RFC8621 §4.4.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
703ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-received-at-desc | Email/query sort by receivedAt descending (newest first) | RFC8621 §4.4.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
570ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-sent-at | Email/query sort by sentAt | RFC8621 §4.4.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
567ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-size | Email/query sort by size | RFC8621 §4.4.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1436ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-subject | Email/query sort by subject | RFC8621 §4.4.2 | Recommended | ▶PASS | ▶PASS |
fastmail: PASS
592ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▶email/sort-to | Email/query sort by to | RFC8621 §4.4.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
614ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| ▼identity (13) | |||||
| ▶identity/changes-after-update | Identity/changes reflects updated identity | RFC8621 §6.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: cannotCalculateChanges - Not currently supported for this object type
2696ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/identity/identity-changes.test.ts
|
|||||
| ▶identity/changes-no-changes | Identity/changes with current state returns empty | RFC8621 §6.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: cannotCalculateChanges - Not currently supported for this object type
615ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/identity/identity-changes.test.ts
|
|||||
| ▶identity/changes-response-structure | Identity/changes response has required properties | RFC8621 §6.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: cannotCalculateChanges - Not currently supported for this object type
565ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/identity/identity-changes.test.ts
|
|||||
| ▶identity/get-all-identities | Identity/get with ids=null returns all identities | RFC8621 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1250ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/identity/identity-get.test.ts
|
|||||
| ▶identity/get-identity-by-id | Identity/get returns specific identity by id | RFC8621 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/identity/identity-get.test.ts
|
|||||
| ▶identity/get-identity-email-matches | Identity email address is valid | RFC8621 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
335ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/identity/identity-get.test.ts
|
|||||
| ▶identity/get-identity-not-found | Identity/get returns notFound for unknown id | RFC8621 §6.1 | Required | ▶FAIL | ▶FAIL |
fastmail: FAIL
JMAP method error: invalidArguments - ids contains an invalid id: nonexistent-identity-xyz
280ms
|
|||||
stalwart: FAIL
Expected array to include "nonexistent-identity-xyz", got []
2ms
|
|||||
src/tests/identity/identity-get.test.ts
|
|||||
| ▶identity/get-identity-properties | Identity object has required properties | RFC8621 §6.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/identity/identity-get.test.ts
|
|||||
| ▶identity/set-not-found | Identity/set update returns notUpdated for unknown id | RFC8621 §6.3 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
363ms
|
|||||
stalwart: FAIL
Identity/set notUpdated must not be null when updating a nonexistent id
2ms
|
|||||
src/tests/identity/identity-set.test.ts
|
|||||
| ▶identity/set-update-html-signature | Identity/set update htmlSignature | RFC8621 §6.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2150ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/identity/identity-set.test.ts
|
|||||
| ▶identity/set-update-name | Identity/set update name | RFC8621 §6.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1330ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/identity/identity-set.test.ts
|
|||||
| ▶identity/set-update-reply-to | Identity/set update replyTo | RFC8621 §6.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1230ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/identity/identity-set.test.ts
|
|||||
| ▶identity/set-update-text-signature | Identity/set update textSignature | RFC8621 §6.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1449ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/identity/identity-set.test.ts
|
|||||
| ▼mailbox (45) | |||||
| ▶mailbox/changes-after-create | Mailbox/changes reflects newly created mailbox | RFC8621 §2.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1350ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/mailbox/mailbox-changes.test.ts
|
|||||
| ▶mailbox/changes-after-rename | Mailbox/changes reflects renamed mailbox as updated | RFC8621 §2.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1607ms
|
|||||
stalwart: PASS
9ms
|
|||||
src/tests/mailbox/mailbox-changes.test.ts
|
|||||
| ▶mailbox/changes-has-more-changes | Mailbox/changes hasMoreChanges is boolean | RFC8621 §2.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
569ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-changes.test.ts
|
|||||
| ▶mailbox/changes-no-changes | Mailbox/changes with current state returns empty arrays | RFC8621 §2.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
626ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-changes.test.ts
|
|||||
| ▶mailbox/changes-response-structure | Mailbox/changes response has all required properties | RFC8621 §2.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
660ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-changes.test.ts
|
|||||
| ▶mailbox/get-account-id-returned | Mailbox/get returns accountId in response | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
310ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-all | Mailbox/get with ids=null returns all mailboxes | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
303ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-by-ids | Mailbox/get with specific ids returns requested mailboxes | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1643ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-inbox-exists | Inbox mailbox exists with role 'inbox' | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-mailbox-properties | Mailbox object has all required properties | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-not-found | Mailbox/get returns notFound for unknown ids | RFC8621 §2.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
302ms
|
|||||
stalwart: FAIL
Expected array to include "nonexistent-mailbox-xyz", got []
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-parent-id-correct | Child mailbox parentId references parent correctly | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-properties-filter | Mailbox/get with properties filter returns only requested properties | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1230ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-state-returned | Mailbox/get returns state string | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/get-total-emails-accurate | Mailbox totalEmails reflects actual email count | RFC8621 §2.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
615ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-get.test.ts
|
|||||
| ▶mailbox/query-all | Mailbox/query with no filter returns all mailboxes | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
311ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-changes-after-create | Mailbox/queryChanges reflects new mailbox creation | RFC8621 §2.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1430ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/mailbox/mailbox-query-changes.test.ts
|
|||||
| ▶mailbox/query-changes-filter-null-accepted | Mailbox/queryChanges accepts filter: null | RFC8621 §2.4 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
634ms
|
|||||
stalwart: FAIL
JMAP method error: invalidArguments - invalid type: null, expected a filter object at line 1 column 203
2ms
|
|||||
src/tests/mailbox/mailbox-query-changes.test.ts
|
|||||
| ▶mailbox/query-changes-no-changes | Mailbox/queryChanges with current state returns empty changes | RFC8621 §2.4 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
Expected array length 0, got 2
615ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-query-changes.test.ts
|
|||||
| ▶mailbox/query-changes-response-structure | Mailbox/queryChanges response has required properties | RFC8621 §2.4 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1106ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-query-changes.test.ts
|
|||||
| ▶mailbox/query-filter-by-name | Mailbox/query filter by name matches | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
348ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-filter-by-parent-id | Mailbox/query filter by parentId returns children | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
283ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-filter-by-parent-id-null | Mailbox/query filter by parentId=null returns top-level mailboxes | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
283ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-filter-by-role | Mailbox/query filter by role returns correct mailbox | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-filter-has-any-role | Mailbox/query filter hasAnyRole=true returns only role mailboxes | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
613ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-filter-has-any-role-false | Mailbox/query filter hasAnyRole=false returns non-role mailboxes | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
316ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-filter-null-accepted | Mailbox/query accepts filter: null | RFC8621 §2.3 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
306ms
|
|||||
stalwart: FAIL
JMAP method error: invalidArguments - invalid type: null, expected a filter object at line 1 column 203
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-limit | Mailbox/query with limit returns at most limit results | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-position | Mailbox/query with position skips results | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
616ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-response-structure | Mailbox/query response has required properties | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-sort-by-name | Mailbox/query sorted by name returns alphabetical order | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
610ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/query-sort-by-sort-order | Mailbox/query sorted by sortOrder | RFC8621 §2.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
304ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| ▶mailbox/set-cannot-destroy-with-children | Mailbox/set MUST fail to destroy mailbox with children | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2792ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-change-sort-order | Mailbox/set update sortOrder | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1403ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-create-child | Mailbox/set create child mailbox | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2112ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-create-returns-server-set-props | Mailbox/set create returns server-set properties | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
673ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-create-top-level | Mailbox/set create top-level mailbox | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
754ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-destroy-empty | Mailbox/set destroy empty mailbox | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
706ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-destroy-not-found | Mailbox/set destroy returns notDestroyed for unknown id | RFC8621 §2.5 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
330ms
|
|||||
stalwart: FAIL
Mailbox/set notDestroyed must not be null when destroying a nonexistent id
2ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-duplicate-name-same-parent | Mailbox/set MUST reject duplicate name under same parent | RFC8621 §2.5 | Required | ▶FAIL | ▶FAIL |
fastmail: FAIL
Expected "alreadyExists", got "invalidProperties"
1330ms
|
|||||
stalwart: FAIL
Expected "alreadyExists", got "invalidProperties"
5ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-move-parent | Mailbox/set change parent (move mailbox) | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1400ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-on-destroy-remove-emails | Mailbox/set destroy with onDestroyRemoveEmails removes emails | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1028ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-on-destroy-remove-emails-with-children | Mailbox/set destroy with onDestroyRemoveEmails MUST fail if mailbox has children | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
3380ms
|
|||||
stalwart: PASS
16ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-rename | Mailbox/set rename mailbox | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1363ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▶mailbox/set-state-changes | Mailbox/set returns oldState and newState | RFC8621 §2.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
673ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| ▼push-eventsource (4) | |||||
| ▶push-eventsource/eventsource-closeafter | EventSource closeafter=state closes after first event | RFC8620 §7.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1180ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/push/event-source.test.ts
|
|||||
| ▶push-eventsource/eventsource-connect | EventSource URL is connectable | RFC8620 §7.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
359ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/push/event-source.test.ts
|
|||||
| ▶push-eventsource/eventsource-receives-state-change | EventSource receives StateChange event after modification | RFC8620 §7.3 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
Expected "StateChange", got undefined
2564ms
|
|||||
stalwart: PASS
516ms
|
|||||
src/tests/push/event-source.test.ts
|
|||||
| ▶push-eventsource/eventsource-types-filter | EventSource types parameter filters event types | RFC8620 §7.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
316ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/push/event-source.test.ts
|
|||||
| ▼push-subscription (7) | |||||
| ▶push-subscription/push-subscription-create | PushSubscription/set creates a subscription | RFC8620 §7.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: unknownMethod - Unknown method 'set'
354ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/push/push-subscription.test.ts
|
|||||
| ▶push-subscription/push-subscription-destroy | PushSubscription/set destroy removes subscription | RFC8620 §7.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: unknownMethod - Unknown method 'set'
308ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/push/push-subscription.test.ts
|
|||||
| ▶push-subscription/push-subscription-get | PushSubscription/get returns created subscriptions | RFC8620 §7.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: unknownMethod - Unknown method 'set'
816ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/push/push-subscription.test.ts
|
|||||
| ▶push-subscription/push-subscription-receives-notification | PushSubscription MUST receive push notification after change | RFC8620 §7.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: unknownMethod - Unknown method 'set'
1312ms
|
|||||
stalwart: PASS
3160ms
|
|||||
src/tests/push/push-subscription.test.ts
|
|||||
| ▶push-subscription/push-subscription-reject-non-https | PushSubscription/set MUST reject non-https URL | RFC8620 §7.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: unknownMethod - Unknown method 'set'
281ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/push/push-subscription.test.ts
|
|||||
| ▶push-subscription/push-subscription-types-filter | PushSubscription/set can set types filter | RFC8620 §7.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: unknownMethod - Unknown method 'set'
282ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/push/push-subscription.test.ts
|
|||||
| ▶push-subscription/push-subscription-verification | PushSubscription supports verification code | RFC8620 §7.2 | Required | ▶FAIL | ▶PASS |
fastmail: FAIL
JMAP method error: unknownMethod - Unknown method 'set'
282ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/push/push-subscription.test.ts
|
|||||
| ▼search-snippet (6) | |||||
| ▶search-snippet/snippet-body-match | SearchSnippet/get returns snippet for body text match | RFC8621 §5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1556ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/search-snippet/search-snippet-get.test.ts
|
|||||
| ▶search-snippet/snippet-mark-tags | SearchSnippet/get SHOULD use <mark> tags for highlighting | RFC8621 §5 | Recommended | ▶PASS | ▶PASS |
fastmail: PASS
593ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/search-snippet/search-snippet-get.test.ts
|
|||||
| ▶search-snippet/snippet-not-found | SearchSnippet/get returns notFound for invalid emailId | RFC8621 §5 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
327ms
|
|||||
stalwart: FAIL
Expected notFound to contain 'nonexistent-email-xyz', but got null (server claims all email ids were found)
2ms
|
|||||
src/tests/search-snippet/search-snippet-get.test.ts
|
|||||
| ▶search-snippet/snippet-null-when-no-match | SearchSnippet/get returns null fields when no text match in snippet | RFC8621 §5 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
308ms
|
|||||
stalwart: FAIL
Expected null, got undefined
2ms
|
|||||
src/tests/search-snippet/search-snippet-get.test.ts
|
|||||
| ▶search-snippet/snippet-response-structure | SearchSnippet/get response has required properties | RFC8621 §5 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
286ms
|
|||||
stalwart: FAIL
notFound must be null or a non-empty array
2ms
|
|||||
src/tests/search-snippet/search-snippet-get.test.ts
|
|||||
| ▶search-snippet/snippet-subject-match | SearchSnippet/get returns snippet for subject match | RFC8621 §5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
612ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/search-snippet/search-snippet-get.test.ts
|
|||||
| ▼submission (14) | |||||
| ▶submission/changes-no-changes | EmailSubmission/changes with current state returns empty | RFC8621 §7.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1558ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/submission/submission-changes.test.ts
|
|||||
| ▶submission/changes-response-structure | EmailSubmission/changes response has required properties | RFC8621 §7.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1638ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/submission/submission-changes.test.ts
|
|||||
| ▶submission/get-empty | EmailSubmission/get with ids=null returns submissions | RFC8621 §7.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
352ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/submission/submission-get.test.ts
|
|||||
| ▶submission/get-not-found | EmailSubmission/get returns notFound for unknown id | RFC8621 §7.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
1230ms
|
|||||
stalwart: FAIL
Expected array to include "nonexistent-submission-xyz", got []
2ms
|
|||||
src/tests/submission/submission-get.test.ts
|
|||||
| ▶submission/get-response-structure | EmailSubmission/get response has required properties | RFC8621 §7.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
283ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/submission/submission-get.test.ts
|
|||||
| ▶submission/query-all | EmailSubmission/query with no filter returns all submissions | RFC8621 §7.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/submission/submission-query.test.ts
|
|||||
| ▶submission/query-filter-null-accepted | EmailSubmission/query accepts filter: null | RFC8621 §7.3 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
307ms
|
|||||
stalwart: FAIL
JMAP method error: invalidArguments - invalid type: null, expected a filter object at line 1 column 211
2ms
|
|||||
src/tests/submission/submission-query.test.ts
|
|||||
| ▶submission/query-filter-undo-status | EmailSubmission/query filter by undoStatus | RFC8621 §7.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
309ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/submission/submission-query.test.ts
|
|||||
| ▶submission/query-response-structure | EmailSubmission/query response has required properties | RFC8621 §7.3 | Required | ▶PASS | ▶PASS |
fastmail: PASS
306ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/submission/submission-query.test.ts
|
|||||
| ▶submission/set-create-submission | EmailSubmission/set creates a submission (sends email) | RFC8621 §7.5 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
1862ms
|
|||||
stalwart: FAIL
sendAt is set by server and required
8ms
|
|||||
src/tests/submission/submission-set.test.ts
|
|||||
| ▶submission/set-create-with-envelope | EmailSubmission/set with explicit envelope | RFC8621 §7.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1190ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/submission/submission-set.test.ts
|
|||||
| ▶submission/set-no-recipients-error | EmailSubmission/set MUST reject email with no recipients | RFC8621 §7.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1841ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/submission/submission-set.test.ts
|
|||||
| ▶submission/set-on-success-update-email | EmailSubmission/set onSuccessUpdateEmail moves to sent and removes $draft | RFC8621 §7.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1554ms
|
|||||
stalwart: PASS
9ms
|
|||||
src/tests/submission/submission-set.test.ts
|
|||||
| ▶submission/set-submission-properties | EmailSubmission object has required properties | RFC8621 §7.5 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1538ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/submission/submission-set.test.ts
|
|||||
| ▼thread (9) | |||||
| ▶thread/changes-after-email-destroy | Thread/changes reflects destroyed thread after last email removed | RFC8621 §3.2 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
2479ms
|
|||||
stalwart: FAIL
Expected array to include "chm", got []
9ms
|
|||||
src/tests/thread/thread-changes.test.ts
|
|||||
| ▶thread/changes-after-new-email | Thread/changes reflects new thread after email creation | RFC8621 §3.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
1411ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/thread/thread-changes.test.ts
|
|||||
| ▶thread/changes-no-changes | Thread/changes with current state returns empty | RFC8621 §3.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
614ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/thread/thread-changes.test.ts
|
|||||
| ▶thread/changes-response-structure | Thread/changes response has required properties | RFC8621 §3.2 | Required | ▶PASS | ▶PASS |
fastmail: PASS
614ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/thread/thread-changes.test.ts
|
|||||
| ▶thread/get-single-email-thread | Thread/get for single-email thread has one emailId | RFC8621 §3.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
614ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/thread/thread-get.test.ts
|
|||||
| ▶thread/get-thread-by-id | Thread/get returns thread with emailIds | RFC8621 §3.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
688ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/thread/thread-get.test.ts
|
|||||
| ▶thread/get-thread-email-ids-order | Thread/get emailIds are ordered by receivedAt | RFC8621 §3.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
2663ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/thread/thread-get.test.ts
|
|||||
| ▶thread/get-thread-not-found | Thread/get returns notFound for unknown thread id | RFC8621 §3.1 | Required | ▶PASS | ▶FAIL |
fastmail: PASS
305ms
|
|||||
stalwart: FAIL
Expected array to include "nonexistent-thread-xyz", got []
2ms
|
|||||
src/tests/thread/thread-get.test.ts
|
|||||
| ▶thread/get-thread-response-structure | Thread/get response has required properties | RFC8621 §3.1 | Required | ▶PASS | ▶PASS |
fastmail: PASS
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/thread/thread-get.test.ts
|
|||||
| ▼vacation (10) | |||||
| ▶vacation/get-not-found-invalid-id | VacationResponse/get returns notFound for non-singleton id | RFC8621 §8.1 | Required | ▶SKIP | ▶FAIL |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: FAIL
Expected array to include "not-singleton", got []
2ms
|
|||||
src/tests/vacation/vacation-get.test.ts
|
|||||
| ▶vacation/get-singleton | VacationResponse/get returns singleton with id='singleton' | RFC8621 §8.1 | Required | ▶SKIP | ▶FAIL |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: FAIL
Expected array length 1, got 0
2ms
|
|||||
src/tests/vacation/vacation-get.test.ts
|
|||||
| ▶vacation/get-singleton-null-ids | VacationResponse/get with ids=null returns singleton | RFC8621 §8.1 | Required | ▶SKIP | ▶FAIL |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: FAIL
Expected array length 1, got 0
2ms
|
|||||
src/tests/vacation/vacation-get.test.ts
|
|||||
| ▶vacation/get-singleton-properties | VacationResponse has all required properties | RFC8621 §8.1 | Required | ▶SKIP | ▶FAIL |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: FAIL
undefined is not an object (evaluating 'vr.id')
2ms
|
|||||
src/tests/vacation/vacation-get.test.ts
|
|||||
| ▶vacation/set-cannot-create | VacationResponse/set rejects create (singleton) | RFC8621 §8.2 | Required | ▶SKIP | ▶FAIL |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: FAIL
Should not allow creating new VacationResponse
2ms
|
|||||
src/tests/vacation/vacation-set.test.ts
|
|||||
| ▶vacation/set-cannot-destroy | VacationResponse/set rejects destroy (singleton) | RFC8621 §8.2 | Required | ▶SKIP | ▶FAIL |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: FAIL
Should not allow destroying VacationResponse singleton
2ms
|
|||||
src/tests/vacation/vacation-set.test.ts
|
|||||
| ▶vacation/set-dates | VacationResponse/set can set fromDate and toDate | RFC8621 §8.2 | Required | ▶SKIP | ▶PASS |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/vacation/vacation-set.test.ts
|
|||||
| ▶vacation/set-disable-vacation | VacationResponse/set can disable vacation response | RFC8621 §8.2 | Required | ▶SKIP | ▶PASS |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/vacation/vacation-set.test.ts
|
|||||
| ▶vacation/set-enable-vacation | VacationResponse/set can enable vacation response | RFC8621 §8.2 | Required | ▶SKIP | ▶FAIL |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: FAIL
undefined is not an object (evaluating 'original.isEnabled')
5ms
|
|||||
src/tests/vacation/vacation-set.test.ts
|
|||||
| ▶vacation/set-html-body | VacationResponse/set can set htmlBody | RFC8621 §8.2 | Required | ▶SKIP | ▶PASS |
fastmail: SKIP
Server does not support vacationresponse
0ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/vacation/vacation-set.test.ts
|
|||||