ocpi-tariffs 0.43.0

OCPI tariff calculations
Documentation
use assert_matches::assert_matches;

use crate::{
    cdr,
    json::FromJson as _,
    price::{normalize_periods, Period, PeriodNormalized},
    test::{self, datetime_from_str},
};

use super::v221;

#[test]
fn should_extract_periods() {
    const CDR_JSON: &str =
        include_str!("../../test_data/v221/real_world/step_size_energy/cdr1.json");
    const TIMEZONE: chrono_tz::Tz = chrono_tz::Tz::Europe__Amsterdam;

    test::setup();

    let cdr::ParseReport {
        cdr: cdr_elem,
        unexpected_fields,
    } = cdr::parse_with_version(CDR_JSON, crate::Version::V221).unwrap();
    assert_matches!(unexpected_fields.into_strings().as_slice(), []);
    let cdr = v221::Cdr::from_json(cdr_elem.as_element()).unwrap();
    let (cdr, warnings) = cdr.into_parts();
    assert!(
        warnings.is_empty(),
        "The CDR has warnings;\n{:?}",
        warnings.path_id_map()
    );

    let periods = cdr
        .charging_periods
        .into_iter()
        .map(Period::try_from)
        .collect::<Result<Vec<_>, _>>()
        .unwrap();
    let periods = normalize_periods(periods, cdr.end_date_time, TIMEZONE);

    let [period_0, period_1, period_2] = periods.try_into().unwrap();

    assert_eq!(period_0.start_snapshot.local_timezone, TIMEZONE);
    assert_eq!(
        period_0.end_snapshot.local_timezone,
        period_1.start_snapshot.local_timezone
    );
    assert_eq!(
        period_1.end_snapshot.local_timezone,
        period_2.start_snapshot.local_timezone
    );
    assert_eq!(
        period_0.end_snapshot.date_time,
        period_1.start_snapshot.date_time
    );
    assert_eq!(
        period_1.end_snapshot.date_time,
        period_2.start_snapshot.date_time
    );

    {
        let PeriodNormalized { start_snapshot, .. } = period_0;
        assert_eq!(
            start_snapshot.date_time,
            datetime_from_str("2022-01-13T16:55:00")
        );
    }

    {
        let PeriodNormalized {
            start_snapshot,
            end_snapshot,
            ..
        } = period_1;
        assert_eq!(
            start_snapshot.date_time,
            datetime_from_str("2022-01-13T17:00:00")
        );
        assert_eq!(
            end_snapshot.date_time,
            datetime_from_str("2022-01-13T17:02:00")
        );
    }

    {
        let PeriodNormalized {
            start_snapshot,
            end_snapshot,
            ..
        } = period_2;
        assert_eq!(
            start_snapshot.date_time,
            datetime_from_str("2022-01-13T17:02:00")
        );
        assert_eq!(
            end_snapshot.date_time,
            datetime_from_str("2022-01-13T17:07:00")
        );
    }
}