dwn 0.4.0

Rust implementation of a Decentralized Web Node.
Documentation
use dwn_core::message::{Version, descriptor::ProtocolDefinition, mime::TEXT_PLAIN};
use serde_json::json;
use tracing_test::traced_test;

use crate::utils::init_dwn;

#[tokio::test]
#[traced_test]
async fn test_protocol_anyone_create() {
    let (alice, bob, dwn) = init_dwn();

    let raw_definition = json!({
        "protocol": "my-protocol",
        "published": true,
        "types": {
            "my-value": {
                "dataFormat": ["text/plain"],
            },
            "non-value": {
                "dataFormat": ["text/plain"],
            }
        },
        "structure": {
            "my-value": {
                "$actions": [{
                    "who": "anyone",
                    "can": ["create"],
                }]
            },
            "non-value": {}
        }
    });
    let definition = serde_json::from_value::<ProtocolDefinition>(raw_definition).unwrap();
    let version = Version::new(1, 2, 3);

    alice
        .configure_protocol(version.clone(), definition.clone())
        .process()
        .await
        .unwrap();

    let data = "Hello, world!".as_bytes().to_vec();

    let record_id = bob
        .write()
        .protocol(
            definition.protocol.clone(),
            version.clone(),
            "my-value".to_string(),
        )
        .data(TEXT_PLAIN, data.clone())
        .target(&alice.did)
        .process()
        .await
        .unwrap();

    let found = dwn
        .record_store
        .read(dwn.data_store.as_ref(), &alice.did, &record_id)
        .unwrap()
        .unwrap();
    assert_eq!(found.initial_entry.record_id, record_id);
    assert_eq!(found.latest_entry.record_id, record_id);

    let res = alice
        .write()
        .protocol(definition.protocol, version, "non-value".to_string())
        .data(TEXT_PLAIN, data)
        .process()
        .await;
    assert!(res.is_err());
}

#[tokio::test]
#[traced_test]
async fn test_protocol_author_update() {
    let (alice, bob, dwn) = init_dwn();

    let raw_definition = json!({
        "protocol": "my-protocol",
        "published": true,
        "types": {
            "my-value": {
                "dataFormat": ["text/plain"],
            }
        },
        "structure": {
            "my-value": {
                "$actions": [
                    {
                        "who": "anyone",
                        "can": ["create"],
                    },
                    {
                        "who": "author",
                        "can": ["update"],
                    },
                ]
            }
        }
    });
    let definition = serde_json::from_value::<ProtocolDefinition>(raw_definition).unwrap();
    let version = Version::new(1, 2, 3);

    alice
        .configure_protocol(version.clone(), definition.clone())
        .process()
        .await
        .unwrap();

    let data_1 = "Hello, world!".as_bytes().to_vec();
    let data_2 = "Goodbye, world!".as_bytes().to_vec();

    let record_id = bob
        .write()
        .protocol(
            definition.protocol.clone(),
            version.clone(),
            "my-value".to_string(),
        )
        .data(TEXT_PLAIN, data_1.clone())
        .target(&alice.did)
        .process()
        .await
        .unwrap();

    bob.write()
        .record_id(record_id.clone())
        .protocol(
            definition.protocol.clone(),
            version.clone(),
            "my-value".to_string(),
        )
        .data(TEXT_PLAIN, data_2.clone())
        .target(&alice.did)
        .process()
        .await
        .unwrap();

    let found = dwn
        .record_store
        .read(dwn.data_store.as_ref(), &alice.did, &record_id)
        .unwrap()
        .unwrap();
    assert_eq!(found.initial_entry.record_id, record_id);
    assert_eq!(found.latest_entry.record_id, record_id);
    assert_ne!(found.initial_entry.data, found.latest_entry.data);

    let res = alice
        .write()
        .record_id(record_id.clone())
        .protocol(
            definition.protocol.clone(),
            version.clone(),
            "my-value".to_string(),
        )
        .data(TEXT_PLAIN, data_2.clone())
        .target(&alice.did)
        .process()
        .await;
    assert!(res.is_err())
}