sumup 0.6.0

Rust SDK for the SumUp API.
Documentation
use serde_json::json;
use sumup::{Currency, Nullable, checkouts, readers, transactions};

#[test]
fn request_builders_convert_strings_and_omit_optional_fields() {
    let pairing_code = String::from("12345678");
    let request = readers::CreateRequest::builder()
        .name("Front desk")
        .pairing_code(pairing_code)
        .build();

    assert_eq!(
        serde_json::to_value(&request).unwrap(),
        json!({"name": "Front desk", "pairing_code": "12345678"})
    );
    assert_eq!(
        serde_json::from_value::<readers::CreateRequest>(serde_json::to_value(&request).unwrap())
            .unwrap(),
        request
    );
}

#[test]
fn request_builders_preserve_enums_and_nullable_values() {
    let request = checkouts::CreateRequest::builder()
        .amount(10.0)
        .checkout_reference("order-123")
        .currency(Currency::EUR)
        .merchant_code("M123")
        .description("Coffee")
        .valid_until(Nullable::Null)
        .build();

    assert_eq!(
        serde_json::to_value(request).unwrap(),
        json!({
            "amount": 10.0,
            "checkout_reference": "order-123",
            "currency": "EUR",
            "merchant_code": "M123",
            "description": "Coffee",
            "valid_until": null
        })
    );
}

#[test]
fn nested_builders_preserve_absent_null_and_present_fields() {
    let request = readers::CreateCheckoutRequest::builder()
        .total_amount(
            readers::CreateCheckoutRequestTotalAmount::builder()
                .currency("EUR")
                .minor_unit(2)
                .value(1000)
                .build(),
        )
        .affiliate(Nullable::Null)
        .installments(Nullable::Value(3))
        .build();

    assert_eq!(
        serde_json::to_value(request).unwrap(),
        json!({
            "total_amount": {"currency": "EUR", "minor_unit": 2, "value": 1000},
            "affiliate": null,
            "installments": 3
        })
    );
}

#[test]
fn query_builders_accept_optional_strings_and_numbers() {
    let params = transactions::ListParams::builder()
        .transaction_code("TX123")
        .limit(10)
        .build();

    assert_eq!(
        serde_json::to_value(params).unwrap(),
        json!({"transaction_code": "TX123", "limit": 10})
    );
    assert_eq!(
        transactions::ListParams::builder().build(),
        transactions::ListParams::default()
    );
}

#[test]
fn additional_properties_default_to_empty_and_remain_settable() {
    let empty = readers::CreateCheckoutRequestAffiliateTags::builder().build();
    assert_eq!(serde_json::to_value(empty).unwrap(), json!({}));

    let tags = readers::CreateCheckoutRequestAffiliateTags::builder()
        .additional_properties(std::collections::HashMap::from([(
            "order".to_owned(),
            json!("123"),
        )]))
        .build();
    assert_eq!(serde_json::to_value(tags).unwrap(), json!({"order": "123"}));
}