#![allow(dead_code)]
use js_sys::{Array, Object, Promise, Reflect};
use tap_wasm::WasmTapAgent;
use wasm_bindgen::{JsCast, JsValue};
use wasm_bindgen_futures::JsFuture;
use wasm_bindgen_test::*;
wasm_bindgen_test_configure!(run_in_browser);
#[wasm_bindgen_test]
async fn test_pack_message_returns_promise() {
let config = Object::new();
let agent = WasmTapAgent::new(config.into()).expect("Failed to create agent");
let message = create_test_message(&agent.get_did());
let result = agent.pack_message(message.into());
assert!(
result.is_instance_of::<Promise>(),
"pack_message should return a Promise"
);
let packed = JsFuture::from(result).await;
assert!(packed.is_ok(), "Promise should resolve successfully");
}
#[wasm_bindgen_test]
async fn test_unpack_message_returns_promise() {
let config = Object::new();
let agent = WasmTapAgent::new(config.into()).expect("Failed to create agent");
let message = create_test_message(&agent.get_did());
let pack_promise = agent.pack_message(message.into());
let packed_result = JsFuture::from(pack_promise)
.await
.expect("Packing should succeed");
let packed_str = Reflect::get(&packed_result, &JsValue::from_str("message"))
.unwrap()
.as_string()
.unwrap();
let result = agent.unpack_message(&packed_str, None);
assert!(
result.is_instance_of::<Promise>(),
"unpack_message should return a Promise"
);
let unpacked = JsFuture::from(result).await;
assert!(unpacked.is_ok(), "Promise should resolve successfully");
}
#[wasm_bindgen_test]
async fn test_concurrent_pack_operations() {
let config = Object::new();
let agent = WasmTapAgent::new(config.into()).expect("Failed to create agent");
let message1 = create_test_message(&agent.get_did());
let message2 = create_test_message(&agent.get_did());
let message3 = create_test_message(&agent.get_did());
let promise1 = agent.pack_message(message1.into());
let promise2 = agent.pack_message(message2.into());
let promise3 = agent.pack_message(message3.into());
assert!(promise1.is_instance_of::<Promise>());
assert!(promise2.is_instance_of::<Promise>());
assert!(promise3.is_instance_of::<Promise>());
let result1 = JsFuture::from(promise1).await;
let result2 = JsFuture::from(promise2).await;
let result3 = JsFuture::from(promise3).await;
assert!(result1.is_ok(), "First pack should succeed");
assert!(result2.is_ok(), "Second pack should succeed");
assert!(result3.is_ok(), "Third pack should succeed");
}
#[wasm_bindgen_test]
async fn test_concurrent_unpack_operations() {
let config = Object::new();
let agent = WasmTapAgent::new(config.into()).expect("Failed to create agent");
let messages = vec![
create_test_message(&agent.get_did()),
create_test_message(&agent.get_did()),
create_test_message(&agent.get_did()),
];
let mut packed_messages = Vec::new();
for msg in messages {
let pack_promise = agent.pack_message(msg.into());
let packed_result = JsFuture::from(pack_promise)
.await
.expect("Packing should succeed");
let packed_str = Reflect::get(&packed_result, &JsValue::from_str("message"))
.unwrap()
.as_string()
.unwrap();
packed_messages.push(packed_str);
}
let promise1 = agent.unpack_message(&packed_messages[0], None);
let promise2 = agent.unpack_message(&packed_messages[1], None);
let promise3 = agent.unpack_message(&packed_messages[2], None);
assert!(promise1.is_instance_of::<Promise>());
assert!(promise2.is_instance_of::<Promise>());
assert!(promise3.is_instance_of::<Promise>());
let result1 = JsFuture::from(promise1).await;
let result2 = JsFuture::from(promise2).await;
let result3 = JsFuture::from(promise3).await;
assert!(result1.is_ok(), "First unpack should succeed");
assert!(result2.is_ok(), "Second unpack should succeed");
assert!(result3.is_ok(), "Third unpack should succeed");
}
#[wasm_bindgen_test]
async fn test_async_error_propagation() {
let config = Object::new();
let agent = WasmTapAgent::new(config.into()).expect("Failed to create agent");
let invalid_message = Object::new();
let pack_promise = agent.pack_message(invalid_message.into());
let result = JsFuture::from(pack_promise).await;
assert!(result.is_err(), "Packing invalid message should fail");
let unpack_promise = agent.unpack_message("invalid-jws-data", None);
let result = JsFuture::from(unpack_promise).await;
assert!(result.is_err(), "Unpacking invalid data should fail");
}
fn create_test_message(from_did: &str) -> Object {
let message = Object::new();
Reflect::set(
&message,
&JsValue::from_str("id"),
&JsValue::from_str("test-msg"),
)
.unwrap();
Reflect::set(
&message,
&JsValue::from_str("type"),
&JsValue::from_str("https://tap.rsvp/schema/1.0#Transfer"),
)
.unwrap();
Reflect::set(
&message,
&JsValue::from_str("from"),
&JsValue::from_str(from_did),
)
.unwrap();
let to_array = Array::new();
to_array.push(&JsValue::from_str("did:key:z6MkRecipient"));
Reflect::set(&message, &JsValue::from_str("to"), &to_array).unwrap();
let body = Object::new();
Reflect::set(
&body,
&JsValue::from_str("amount"),
&JsValue::from_str("100"),
)
.unwrap();
Reflect::set(&message, &JsValue::from_str("body"), &body).unwrap();
message
}