kcode-k1-web-code-session 0.2.0

Own pure session-bound versionless Web-code handles
Documentation
use kcode_k1_transaction_id::TxId;
use kcode_k1_web_code_document::{CodeDocument, Language};
use kcode_k1_web_code_session::{DocumentPart, OpenedSource, SessionError, SessionScope};
use kcode_k1_web_package::{AuthorityId, WebFamily};
use semver::Version;

fn authority(byte: u8) -> [u8; 12] {
    [byte; 12]
}

fn document(code: &str) -> CodeDocument {
    let family = WebFamily::new(AuthorityId::new(TxId::from_bytes(authority(1))), "alpha").unwrap();
    CodeDocument::new(
        family,
        b"<!-- k1-web/v1\n{\"dependencies\":[]}\n-->\nDocs\r\n".to_vec(),
        Language::JavaScript,
        code.as_bytes().to_vec(),
    )
    .unwrap()
}

fn unpublished(revision: u8) -> OpenedSource {
    OpenedSource::Unpublished {
        id: TxId::from_bytes([4; 12]),
        revision: TxId::from_bytes([revision; 12]),
    }
}

#[test]
fn scope_authority_source_and_document_are_all_validated() {
    let scope = SessionScope::new();
    let value = document("export async function runTests(){}\n");
    let opened = scope
        .open(authority(1), value.clone(), unpublished(5))
        .unwrap();
    assert_eq!(opened.version_text(), TxId::from_bytes([4; 12]).to_string());
    assert!(
        scope
            .validate(authority(1), &opened, &value, &unpublished(5))
            .is_ok()
    );
    assert_eq!(
        scope.validate(authority(2), &opened, &value, &unpublished(5)),
        Err(SessionError::ForeignHandle)
    );
    assert_eq!(
        scope.validate(authority(1), &opened, &value, &unpublished(6)),
        Err(SessionError::StaleSource)
    );
    assert_eq!(
        SessionScope::new().validate(authority(1), &opened, &value, &unpublished(5)),
        Err(SessionError::ForeignHandle)
    );
}

#[test]
fn replacement_preserves_the_other_exact_authored_part() {
    let scope = SessionScope::new();
    let value = document("old\r\n");
    let source = OpenedSource::Published(Version::new(1, 2, 3));
    let opened = scope
        .open(authority(1), value.clone(), source.clone())
        .unwrap();
    let changed = scope
        .replacement(
            authority(1),
            &opened,
            &value,
            &source,
            DocumentPart::Code,
            "new\n".into(),
        )
        .unwrap();
    assert_eq!(changed.documentation(), value.documentation());
    assert_eq!(changed.code(), b"new\n");
    let changed_docs = scope
        .replacement(
            authority(1),
            &opened,
            &value,
            &source,
            DocumentPart::Documentation,
            "<!-- k1-web/v1\n{\"dependencies\":[]}\n-->\nNew".into(),
        )
        .unwrap();
    assert_eq!(changed_docs.code(), value.code());
}