1
//! Pure (DB-free) tests for `:date` coercion in the logical payload parser.
2

            
3
use super::parse::parse_create_transaction_logical_payload;
4

            
5
/// Build a minimal valid logical payload carrying the given `:date` literal.
6
5
fn payload_with_date(date: &str) -> String {
7
5
    format!(
8
        "(:date \"{date}\" :splits ((:from \"a\" :to \"b\" \
9
         :from-commodity \"USD\" :to-commodity \"USD\" :value 1)))"
10
    )
11
5
}
12

            
13
5
fn parse_date(date: &str) -> Result<String, String> {
14
5
    let input = parse_create_transaction_logical_payload(&payload_with_date(date))?;
15
4
    Ok(input
16
4
        .post_date
17
4
        .ok_or_else(|| "post_date missing".to_string())?
18
4
        .to_rfc3339())
19
5
}
20

            
21
#[test]
22
1
fn accepts_rfc3339_with_timezone() {
23
1
    let parsed = parse_date("2026-06-15T09:30:00+02:00").expect("rfc3339 accepted");
24
1
    assert_eq!(parsed, "2026-06-15T07:30:00+00:00");
25
1
}
26

            
27
#[test]
28
1
fn accepts_datetime_local_with_seconds_as_utc() {
29
1
    let parsed = parse_date("2026-06-15T09:30:45").expect("datetime-local accepted");
30
1
    assert_eq!(parsed, "2026-06-15T09:30:45+00:00");
31
1
}
32

            
33
#[test]
34
1
fn accepts_datetime_local_without_seconds_as_utc() {
35
1
    let parsed = parse_date("2026-06-15T09:30").expect("datetime-local accepted");
36
1
    assert_eq!(parsed, "2026-06-15T09:30:00+00:00");
37
1
}
38

            
39
#[test]
40
1
fn accepts_bare_date_as_midnight_utc() {
41
1
    let parsed = parse_date("2026-06-15").expect("bare date accepted");
42
1
    assert_eq!(parsed, "2026-06-15T00:00:00+00:00");
43
1
}
44

            
45
#[test]
46
1
fn rejects_clearly_invalid_date() {
47
1
    let err = parse_date("not-a-date").expect_err("invalid date must error");
48
1
    assert!(
49
1
        err.contains("invalid :date"),
50
        "expected invalid-date error, got: {err}"
51
    );
52
1
}