nil-zonefile 0.3.0

A library for parsing and creating zonefiles on the new internet.
Documentation
#![cfg(feature = "wasm")]

extern crate wasm_bindgen_test;
use wasm_bindgen_test::*;
use nil_zonefile::wasm;
use nil_zonefile::ZoneFile;

wasm_bindgen_test_configure!(run_in_node_experimental);

#[wasm_bindgen_test]
fn test_parse_clarity_buffer() {
    // Create a sample zonefile JSON
    let sample_json = r#"{"v":"0","owner":"SP3D03X5BHMNSAAW71NN7BQRMV4DW2G4JB3MZAGJ8","general":"Test.Name","twitter":"@test","url":"test.locker","nostr":"","lightning":"","btc":"bc1","subdomains":{}}"#;
    
    // Convert to hex string (simulating a Clarity buffer)
    let hex_string = format!("0x{}", hex::encode(sample_json));

    let result = wasm::parse_zonefile_from_clarity_buffer_hex_string(&hex_string);
    println!("result: {:?}", result);
    assert!(result.is_ok());
    
    let cbor_bytes = result.unwrap();
    let zonefile = ZoneFile::from_bytes(&cbor_bytes).unwrap();
    
    match zonefile {
        ZoneFile::V0 { owner, general, twitter, url, nostr, lightning, btc, subdomains } => {
            assert_eq!(owner, "SP3D03X5BHMNSAAW71NN7BQRMV4DW2G4JB3MZAGJ8");
            assert_eq!(general, "Test.Name");
            assert_eq!(twitter, "@test");
            assert_eq!(url, "test.locker");
            assert_eq!(nostr, "");
            assert_eq!(lightning, "");
            assert_eq!(btc, "bc1");
            assert!(subdomains.is_empty());
        }
        _ => panic!("Expected V0 zonefile"),
    }
}

#[wasm_bindgen_test]
fn test_generate_zonefile() {
    // Create a sample zonefile
    let sample_json = r#"{"v":"0","owner":"SP3D03X5BHMNSAAW71NN7BQRMV4DW2G4JB3MZAGJ8","general":"Test.Name","twitter":"@test","url":"test.locker","nostr":"","lightning":"","btc":"bc1","subdomains":{}}"#;
    let zonefile: ZoneFile = serde_json::from_str(sample_json).unwrap();
    let js_value = serde_wasm_bindgen::to_value(&zonefile).unwrap();

    // Test uncompressed
    let result = wasm::generate_zonefile(js_value.clone(), false);
    assert!(result.is_ok());
    let cbor_bytes = result.unwrap();
    let parsed = ZoneFile::from_cbor(&cbor_bytes).unwrap();
    match parsed {
        ZoneFile::V0 { owner, .. } => {
            assert_eq!(owner, "SP3D03X5BHMNSAAW71NN7BQRMV4DW2G4JB3MZAGJ8");
        }
        _ => panic!("Expected V0 zonefile"),
    }

    // Test compressed
    let compressed = wasm::generate_zonefile(js_value, true);
    assert!(compressed.is_ok());
    let compressed_bytes = compressed.unwrap();
    let parsed_compressed = ZoneFile::from_bytes(&compressed_bytes).unwrap();
    match parsed_compressed {
        ZoneFile::V0 { owner, .. } => {
            assert_eq!(owner, "SP3D03X5BHMNSAAW71NN7BQRMV4DW2G4JB3MZAGJ8");
        }
        _ => panic!("Expected V0 zonefile"),
    }
}

#[wasm_bindgen_test]
fn test_parse_invalid_hex() {
    // Test with invalid hex string
    let result = wasm::parse_zonefile_from_clarity_buffer_hex_string("invalid hex");
    assert!(result.is_err());
    
    // Test with empty string
    let result = wasm::parse_zonefile_from_clarity_buffer_hex_string("");
    assert!(result.is_err());
    
    // Test with malformed hex (odd length)
    let result = wasm::parse_zonefile_from_clarity_buffer_hex_string("0xa");
    assert!(result.is_err());
}

#[wasm_bindgen_test]
fn test_parse_invalid_cbor() {
    // Test with valid hex but invalid CBOR data
    let result = wasm::parse_zonefile_from_clarity_buffer_hex_string("0xffff");
    assert!(result.is_err());
}