synta 0.2.6

ASN.1 parser, decoder, and encoder library with DER/BER support and C FFI
Documentation
#!/usr/bin/env python3
"""Tests for format_dn, format_dn_slash, and parse_name_attrs helpers."""

import datetime
import traceback

import pytest

import synta
import synta.oids as oids


def _name_der(cn="Test", org=None):
    b = synta.NameBuilder().common_name(cn)
    if org:
        b = b.organization(org)
    return b.build()


# ── format_dn ─────────────────────────────────────────────────────────────────

def test_format_dn_returns_string():
    result = synta.format_dn(_name_der("Example", "Org"))
    assert isinstance(result, str)
    assert "Example" in result
    assert "Org" in result


def test_format_dn_comma_separated():
    result = synta.format_dn(synta.NameBuilder().country("US").common_name("test").build())
    assert "US" in result


def test_format_dn_empty_name():
    result = synta.format_dn(bytes([0x30, 0x00]))
    assert isinstance(result, str)


def test_format_dn_via_cert():
    key = synta.PrivateKey.generate_ec("P-256")
    name = _name_der("Via Cert")
    now = datetime.datetime(2025, 1, 1, tzinfo=datetime.timezone.utc)
    later = datetime.datetime(2026, 1, 1, tzinfo=datetime.timezone.utc)
    cert = (
        synta.CertificateBuilder()
        .issuer_name(name).subject_name(name)
        .public_key(key.public_key).serial_number(1)
        .not_valid_before_utc(now).not_valid_after_utc(later)
        .sign(key, "sha256")
    )
    assert "Via Cert" in synta.format_dn(cert.subject_raw_der)


# ── format_dn_slash ───────────────────────────────────────────────────────────

def test_format_dn_slash_returns_string():
    result = synta.format_dn_slash(synta.NameBuilder().country("US").common_name("x").build())
    assert isinstance(result, str)


def test_format_dn_slash_has_slash_separator():
    result = synta.format_dn_slash(
        synta.NameBuilder().country("US").organization("ACME").common_name("a").build()
    )
    assert "/" in result


def test_format_dn_slash_via_cert():
    key = synta.PrivateKey.generate_ec("P-256")
    name = _name_der("Slash Test")
    now = datetime.datetime(2025, 1, 1, tzinfo=datetime.timezone.utc)
    later = datetime.datetime(2026, 1, 1, tzinfo=datetime.timezone.utc)
    cert = (
        synta.CertificateBuilder()
        .issuer_name(name).subject_name(name)
        .public_key(key.public_key).serial_number(1)
        .not_valid_before_utc(now).not_valid_after_utc(later)
        .sign(key, "sha256")
    )
    assert "Slash Test" in synta.format_dn_slash(cert.subject_raw_der)


# ── Manual runner ─────────────────────────────────────────────────────────────

def main():
    tests = [
        test_format_dn_returns_string,
        test_format_dn_comma_separated,
        test_format_dn_empty_name,
        test_format_dn_via_cert,
        test_format_dn_slash_returns_string,
        test_format_dn_slash_has_slash_separator,
        test_format_dn_slash_via_cert,
    ]
    passed = failed = 0
    for t in tests:
        try:
            t()
            print(f"  ok  {t.__name__}")
            passed += 1
        except Exception as e:
            print(f"  FAIL {t.__name__}: {e}")
            traceback.print_exc()
            failed += 1
    print(f"\n{passed} passed, {failed} failed")
    if failed:
        raise SystemExit(1)


if __name__ == "__main__":
    main()