use jmap_base_client::{ClientError, Session};
use jmap_did_types::KeyCustody;
use serde_json::{Value, json};
fn session(capabilities: Value, accounts: Value) -> Session {
serde_json::from_value(json!({
"capabilities": capabilities,
"accounts": accounts,
"primaryAccounts": {},
"username": "u@example.com",
"apiUrl": "https://jmap.example.com/api/",
"downloadUrl": "https://jmap.example.com/dl/{accountId}/{blobId}/{name}?accept={type}",
"uploadUrl": "https://jmap.example.com/ul/{accountId}/",
"eventSourceUrl": "https://jmap.example.com/sse/?types={types}&closeafter={closeafter}&ping={ping}",
"state": "s1"
}))
.expect("Session must deserialize")
}
fn draft_example_session() -> Session {
session(
json!({
"urn:ietf:params:jmap:core": {},
"urn:ietf:params:jmap:did": {
"supportedMethods": ["key", "web"],
"verificationEndpoint": null
}
}),
json!({
"acct-001": {
"name": "acct-001@example.com",
"isPersonal": true,
"isReadOnly": false,
"accountCapabilities": {
"urn:ietf:params:jmap:did": {
"did": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
"didDocumentUri": null,
"previousDid": null,
"keyCustody": "user"
}
}
}
}),
)
}
#[test]
fn session_did_capability_parses_draft_example() {
let cap = draft_example_session()
.did_capability()
.expect("well-formed")
.expect("advertised");
assert_eq!(cap.supported_methods, ["key", "web"]);
assert_eq!(cap.verification_endpoint, None);
}
#[test]
fn account_did_capability_parses_draft_example() {
let s = draft_example_session();
let cap = s.accounts["acct-001"]
.did_capability()
.expect("well-formed")
.expect("advertised");
assert_eq!(
cap.did,
"did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK"
);
assert_eq!(cap.did_document_uri, None);
assert_eq!(cap.previous_did, None);
assert_eq!(cap.key_custody, Some(KeyCustody::User));
}
#[test]
fn did_capability_absent_is_none() {
let s = session(
json!({ "urn:ietf:params:jmap:core": {} }),
json!({
"a1": {
"name": "a1@example.com",
"isPersonal": true,
"isReadOnly": false,
"accountCapabilities": {}
}
}),
);
assert!(matches!(s.did_capability(), Ok(None)));
assert!(matches!(s.accounts["a1"].did_capability(), Ok(None)));
}
#[test]
fn session_did_capability_empty_methods_is_parse_error() {
let s = session(
json!({
"urn:ietf:params:jmap:did": {
"supportedMethods": [],
"verificationEndpoint": null
}
}),
json!({}),
);
assert!(matches!(s.did_capability(), Err(ClientError::Parse(_))));
}
#[test]
fn account_did_capability_missing_did_is_parse_error() {
let s = session(
json!({}),
json!({
"a1": {
"name": "a1@example.com",
"isPersonal": true,
"isReadOnly": false,
"accountCapabilities": {
"urn:ietf:params:jmap:did": {
"didDocumentUri": null,
"previousDid": null,
"keyCustody": null
}
}
}
}),
);
assert!(matches!(
s.accounts["a1"].did_capability(),
Err(ClientError::Parse(_))
));
}