| 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
282ms
|
|||||
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
603ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/binary/download.test.ts
|
|||||
| binary/download-nonexistent-blob | Download nonexistent blobId returns 404 | RFC8620 §6.2 | Required | PASS | PASS |
fastmail: PASS
323ms
|
|||||
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
576ms
|
|||||
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
1231ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
1229ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
306ms
|
|||||
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
922ms
|
|||||
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
305ms
|
|||||
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
308ms
|
|||||
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
347ms
|
|||||
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
307ms
|
|||||
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
281ms
|
|||||
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
308ms
|
|||||
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
280ms
|
|||||
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
312ms
|
|||||
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
303ms
|
|||||
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
285ms
|
|||||
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
1022ms
|
|||||
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
1049ms
|
|||||
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
376ms
|
|||||
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
278ms
|
|||||
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
307ms
|
|||||
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
312ms
|
|||||
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
303ms
|
|||||
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
279ms
|
|||||
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
393ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/core/result-references.test.ts
|
|||||
| core/result-ref-simple | Simple result reference resolves correctly | RFC8620 §3.7 | Required | PASS | PASS |
fastmail: PASS
1235ms
|
|||||
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
349ms
|
|||||
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 (148) | |||||
| 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
717ms
|
|||||
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
304ms
|
|||||
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
1126ms
|
|||||
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
306ms
|
|||||
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
329ms
|
|||||
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
326ms
|
|||||
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
309ms
|
|||||
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
288ms
|
|||||
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
282ms
|
|||||
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
355ms
|
|||||
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
284ms
|
|||||
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
304ms
|
|||||
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
312ms
|
|||||
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
1822ms
|
|||||
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
1463ms
|
|||||
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
1632ms
|
|||||
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
680ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
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
311ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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 | FAIL |
fastmail: PASS
613ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
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 | FAIL |
fastmail: PASS
306ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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
307ms
|
|||||
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
1204ms
|
|||||
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
379ms
|
|||||
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
442ms
|
|||||
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
285ms
|
|||||
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
289ms
|
|||||
stalwart: PASS
2ms
|
|||||
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
305ms
|
|||||
stalwart: PASS
2ms
|
|||||
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
284ms
|
|||||
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 | FAIL |
fastmail: PASS
304ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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
379ms
|
|||||
stalwart: PASS
2ms
|
|||||
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
286ms
|
|||||
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
291ms
|
|||||
stalwart: FAIL
Expected array to NOT include "geiaaabrc"
2ms
|
|||||
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
1010ms
|
|||||
stalwart: FAIL
Expected array to include "geiaaabrc", got []
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
305ms
|
|||||
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
284ms
|
|||||
stalwart: FAIL
Expected array to include "gfuaaabrn", got []
2ms
|
|||||
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
286ms
|
|||||
stalwart: FAIL
Expected array to include "gfuaaabrn", got []
2ms
|
|||||
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
284ms
|
|||||
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
284ms
|
|||||
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
1150ms
|
|||||
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
309ms
|
|||||
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
303ms
|
|||||
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
905ms
|
|||||
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
356ms
|
|||||
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
290ms
|
|||||
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
309ms
|
|||||
stalwart: PASS
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
326ms
|
|||||
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
284ms
|
|||||
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
284ms
|
|||||
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
393ms
|
|||||
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
284ms
|
|||||
stalwart: PASS
2ms
|
|||||
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
286ms
|
|||||
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
284ms
|
|||||
stalwart: PASS
2ms
|
|||||
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
310ms
|
|||||
stalwart: PASS
2ms
|
|||||
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
297ms
|
|||||
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
307ms
|
|||||
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
307ms
|
|||||
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
374ms
|
|||||
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
327ms
|
|||||
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
331ms
|
|||||
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
307ms
|
|||||
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
334ms
|
|||||
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
284ms
|
|||||
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
303ms
|
|||||
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
991ms
|
|||||
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
318ms
|
|||||
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
284ms
|
|||||
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
1013ms
|
|||||
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
282ms
|
|||||
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
282ms
|
|||||
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
282ms
|
|||||
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
307ms
|
|||||
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
332ms
|
|||||
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
283ms
|
|||||
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
282ms
|
|||||
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
309ms
|
|||||
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
283ms
|
|||||
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
282ms
|
|||||
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
284ms
|
|||||
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
304ms
|
|||||
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
281ms
|
|||||
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
336ms
|
|||||
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
307ms
|
|||||
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
634ms
|
|||||
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
3053ms
|
|||||
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 | FAIL | FAIL |
fastmail: FAIL
Expected "blobNotFound", got "invalidProperties"
308ms
|
|||||
stalwart: FAIL
Expected "blobNotFound", got "invalidProperties"
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
1229ms
|
|||||
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
1229ms
|
|||||
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
1208ms
|
|||||
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
923ms
|
|||||
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
1967ms
|
|||||
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
586ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
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
641ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| email/paging-calculate-total | Email/query calculateTotal returns total count | RFC8621 §4.4 | Required | PASS | FAIL |
fastmail: PASS
307ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
src/tests/email/email-query-paging.test.ts
|
|||||
| email/paging-limit | Email/query limit restricts result count | RFC8621 §4.4 | Required | PASS | FAIL |
fastmail: PASS
308ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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 | FAIL |
fastmail: PASS
801ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
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 | FAIL |
fastmail: PASS
284ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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 | FAIL |
fastmail: PASS
290ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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 | FAIL |
fastmail: PASS
572ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
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 | FAIL |
fastmail: PASS
290ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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
599ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
304ms
|
|||||
stalwart: FAIL
undefined is not an object (evaluating 'arr.includes')
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
1550ms
|
|||||
stalwart: FAIL
Server MUST return notParsable for non-email blob
3ms
|
|||||
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 {}
638ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
614ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
1533ms
|
|||||
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
1213ms
|
|||||
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
1246ms
|
|||||
stalwart: PASS
8ms
|
|||||
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
609ms
|
|||||
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 | FAIL |
fastmail: PASS
612ms
|
|||||
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/set-create-creation-id-reference | Email/set create uses creation id reference for mailbox | RFC8621 §4.6 | Required | PASS | PASS |
fastmail: PASS
1100ms
|
|||||
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
598ms
|
|||||
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
1860ms
|
|||||
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
615ms
|
|||||
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
581ms
|
|||||
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
576ms
|
|||||
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
868ms
|
|||||
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
860ms
|
|||||
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
598ms
|
|||||
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
1290ms
|
|||||
stalwart: FAIL
undefined is not an object (evaluating 'notDestroyed["nonexistent-email-xyz"]')
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
1491ms
|
|||||
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
6ms
|
|||||
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
908ms
|
|||||
stalwart: PASS
6ms
|
|||||
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
1286ms
|
|||||
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
920ms
|
|||||
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
1154ms
|
|||||
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
309ms
|
|||||
stalwart: FAIL
undefined is not an object (evaluating 'notUpdated["nonexistent-email-xyz"]')
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
1869ms
|
|||||
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
2272ms
|
|||||
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
1839ms
|
|||||
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
1050ms
|
|||||
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
281ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| email/sort-has-keyword | Email/query sort by hasKeyword | RFC8621 §4.4.2 | Required | PASS | PASS |
fastmail: PASS
308ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| email/sort-multi-property | Email/query sort by multiple properties | RFC8621 §4.4.2 | Required | PASS | FAIL |
fastmail: PASS
972ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
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
668ms
|
|||||
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
564ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
659ms
|
|||||
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
1509ms
|
|||||
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
849ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/email/email-query-sort.test.ts
|
|||||
| email/sort-to | Email/query sort by to | RFC8621 §4.4.2 | Required | PASS | FAIL |
fastmail: PASS
283ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
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
1617ms
|
|||||
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
561ms
|
|||||
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
563ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
293ms
|
|||||
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
293ms
|
|||||
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
296ms
|
|||||
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
297ms
|
|||||
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
364ms
|
|||||
stalwart: FAIL
undefined is not an object (evaluating 'notUpdated["nonexistent-identity-xyz"]')
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
1283ms
|
|||||
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
1457ms
|
|||||
stalwart: PASS
7ms
|
|||||
src/tests/identity/identity-set.test.ts
|
|||||
| identity/set-update-reply-to | Identity/set update replyTo | RFC8621 §6.3 | Required | PASS | PASS |
fastmail: PASS
1826ms
|
|||||
stalwart: PASS
5ms
|
|||||
src/tests/identity/identity-set.test.ts
|
|||||
| identity/set-update-text-signature | Identity/set update textSignature | RFC8621 §6.3 | Required | PASS | PASS |
fastmail: PASS
2645ms
|
|||||
stalwart: PASS
6ms
|
|||||
src/tests/identity/identity-set.test.ts
|
|||||
| ▼mailbox (43) | |||||
| mailbox/changes-after-create | Mailbox/changes reflects newly created mailbox | RFC8621 §2.2 | Required | PASS | PASS |
fastmail: PASS
1349ms
|
|||||
stalwart: PASS
6ms
|
|||||
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
2756ms
|
|||||
stalwart: PASS
8ms
|
|||||
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
563ms
|
|||||
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
639ms
|
|||||
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
758ms
|
|||||
stalwart: PASS
4ms
|
|||||
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
282ms
|
|||||
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
365ms
|
|||||
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
1124ms
|
|||||
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
311ms
|
|||||
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
406ms
|
|||||
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
305ms
|
|||||
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
291ms
|
|||||
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
409ms
|
|||||
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
307ms
|
|||||
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
629ms
|
|||||
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 | FAIL |
fastmail: PASS
320ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| mailbox/query-changes-after-create | Mailbox/queryChanges reflects new mailbox creation | RFC8621 §2.4 | Required | PASS | FAIL |
fastmail: PASS
1348ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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 | FAIL |
fastmail: FAIL
Expected array length 0, got 2
599ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
src/tests/mailbox/mailbox-query-changes.test.ts
|
|||||
| mailbox/query-changes-response-structure | Mailbox/queryChanges response has required properties | RFC8621 §2.4 | Required | PASS | FAIL |
fastmail: PASS
612ms
|
|||||
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-filter-by-name | Mailbox/query filter by name matches | RFC8621 §2.3 | Required | PASS | PASS |
fastmail: PASS
307ms
|
|||||
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
305ms
|
|||||
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
296ms
|
|||||
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
307ms
|
|||||
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
616ms
|
|||||
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
306ms
|
|||||
stalwart: PASS
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 | FAIL |
fastmail: PASS
282ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| mailbox/query-position | Mailbox/query with position skips results | RFC8621 §2.3 | Required | PASS | FAIL |
fastmail: PASS
639ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| mailbox/query-response-structure | Mailbox/query response has required properties | RFC8621 §2.3 | Required | PASS | FAIL |
fastmail: PASS
307ms
|
|||||
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-sort-by-name | Mailbox/query sorted by name returns alphabetical order | RFC8621 §2.3 | Required | PASS | FAIL |
fastmail: PASS
619ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
2ms
|
|||||
src/tests/mailbox/mailbox-query.test.ts
|
|||||
| mailbox/query-sort-by-sort-order | Mailbox/query sorted by sortOrder | RFC8621 §2.3 | Required | PASS | FAIL |
fastmail: PASS
302ms
|
|||||
stalwart: FAIL
HTTP 400: Bad Request
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
3293ms
|
|||||
stalwart: PASS
9ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| mailbox/set-change-sort-order | Mailbox/set update sortOrder | RFC8621 §2.5 | Required | PASS | PASS |
fastmail: PASS
2332ms
|
|||||
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
1962ms
|
|||||
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
670ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
743ms
|
|||||
stalwart: PASS
3ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| mailbox/set-destroy-empty | Mailbox/set destroy empty mailbox | RFC8621 §2.5 | Required | PASS | PASS |
fastmail: PASS
683ms
|
|||||
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
1265ms
|
|||||
stalwart: FAIL
undefined is not an object (evaluating 'notDestroyed["nonexistent-mailbox-xyz"]')
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"
1320ms
|
|||||
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
1843ms
|
|||||
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
1091ms
|
|||||
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
3208ms
|
|||||
stalwart: PASS
17ms
|
|||||
src/tests/mailbox/mailbox-set.test.ts
|
|||||
| mailbox/set-rename | Mailbox/set rename mailbox | RFC8621 §2.5 | Required | PASS | PASS |
fastmail: PASS
2208ms
|
|||||
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
1614ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
927ms
|
|||||
stalwart: PASS
2ms
|
|||||
src/tests/push/event-source.test.ts
|
|||||
| push-eventsource/eventsource-connect | EventSource URL is connectable | RFC8620 §7.3 | Required | PASS | PASS |
fastmail: PASS
304ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
2458ms
|
|||||
stalwart: PASS
508ms
|
|||||
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
307ms
|
|||||
stalwart: PASS
2ms
|
|||||
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'
406ms
|
|||||
stalwart: PASS
3ms
|
|||||
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
5ms
|
|||||
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'
308ms
|
|||||
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 | FAIL |
fastmail: FAIL
JMAP method error: unknownMethod - Unknown method 'set'
1845ms
|
|||||
stalwart: FAIL
Server MUST send push notification after state change
15007ms
|
|||||
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'
1087ms
|
|||||
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'
407ms
|
|||||
stalwart: PASS
3ms
|
|||||
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'
310ms
|
|||||
stalwart: PASS
6ms
|
|||||
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
615ms
|
|||||
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
677ms
|
|||||
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
283ms
|
|||||
stalwart: FAIL
undefined is not an object (evaluating 'arr.includes')
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
1127ms
|
|||||
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 | FAIL | FAIL |
fastmail: FAIL
notFound must be array
956ms
|
|||||
stalwart: FAIL
notFound must be 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
1741ms
|
|||||
stalwart: PASS
4ms
|
|||||
src/tests/search-snippet/search-snippet-get.test.ts
|
|||||
| ▼submission (13) | |||||
| submission/changes-no-changes | EmailSubmission/changes with current state returns empty | RFC8621 §7.2 | Required | PASS | PASS |
fastmail: PASS
564ms
|
|||||
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
1509ms
|
|||||
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
1050ms
|
|||||
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
307ms
|
|||||
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
281ms
|
|||||
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 | FAIL |
fastmail: PASS
306ms
|
|||||
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
283ms
|
|||||
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 | FAIL |
fastmail: PASS
331ms
|
|||||
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/set-create-submission | EmailSubmission/set creates a submission (sends email) | RFC8621 §7.5 | Required | PASS | FAIL |
fastmail: PASS
1229ms
|
|||||
stalwart: FAIL
Expected truthy value, got undefined
6ms
|
|||||
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
2253ms
|
|||||
stalwart: PASS
6ms
|
|||||
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
864ms
|
|||||
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
1431ms
|
|||||
stalwart: PASS
8ms
|
|||||
src/tests/submission/submission-set.test.ts
|
|||||
| submission/set-submission-properties | EmailSubmission object has required properties | RFC8621 §7.5 | Required | FAIL | PASS |
fastmail: FAIL
undefined is not an object (evaluating 'fetchedSub.identityId')
1429ms
|
|||||
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
2047ms
|
|||||
stalwart: FAIL
Expected array to include "br7", got []
10ms
|
|||||
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
2151ms
|
|||||
stalwart: PASS
8ms
|
|||||
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
1119ms
|
|||||
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
4ms
|
|||||
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
1172ms
|
|||||
stalwart: PASS
4ms
|
|||||
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
573ms
|
|||||
stalwart: PASS
4ms
|
|||||
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
851ms
|
|||||
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
281ms
|
|||||
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
388ms
|
|||||
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
1ms
|
|||||
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
5ms
|
|||||
src/tests/vacation/vacation-set.test.ts
|
|||||