athena_rs 3.26.4

Hyper performant polyglot Database driver
Documentation
//! Present-table counter mutation policy for expected-table evaluation.
//!
//! This module owns how relation-type mismatches and missing-column counts are
//! accounted when an expected table is present in observed schema state.

use super::debug_evaluation_contracts::ExpectedTablesEvaluation;
use super::debug_table_comparison_contracts::LoggingSchemaTableComparison;

/// Applies relation-mismatch and missing-column counter mutations for found tables.
pub(super) fn apply_present_comparison_counters(
    evaluation: &mut ExpectedTablesEvaluation,
    required: bool,
    comparison: &LoggingSchemaTableComparison,
) {
    if !comparison.relation_type_matches {
        evaluation.relation_type_mismatch_count =
            evaluation.relation_type_mismatch_count.saturating_add(1);
    }

    if required {
        evaluation.required_missing_column_count = evaluation
            .required_missing_column_count
            .saturating_add(comparison.missing_columns.len());
    } else {
        evaluation.optional_missing_column_count = evaluation
            .optional_missing_column_count
            .saturating_add(comparison.missing_columns.len());
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    /// Builds one table-comparison fixture for counter-policy tests.
    fn comparison(
        relation_type_matches: bool,
        missing_columns: Vec<&str>,
    ) -> LoggingSchemaTableComparison {
        LoggingSchemaTableComparison {
            relation_type_matches,
            missing_columns: missing_columns
                .into_iter()
                .map(|value| value.to_string())
                .collect(),
            unexpected_columns: Vec::new(),
        }
    }

    #[test]
    /// Increments required missing-column and mismatch counters for required tables.
    fn present_counters_increment_required_columns_and_mismatches() {
        let mut evaluation = ExpectedTablesEvaluation::default();

        apply_present_comparison_counters(
            &mut evaluation,
            true,
            &comparison(false, vec!["request_id", "status_code"]),
        );

        assert_eq!(evaluation.required_missing_column_count, 2);
        assert_eq!(evaluation.optional_missing_column_count, 0);
        assert_eq!(evaluation.relation_type_mismatch_count, 1);
    }

    #[test]
    /// Increments only optional missing-column counters when relation type matches.
    fn present_counters_increment_optional_columns_without_mismatch() {
        let mut evaluation = ExpectedTablesEvaluation::default();

        apply_present_comparison_counters(
            &mut evaluation,
            false,
            &comparison(true, vec!["route_path"]),
        );

        assert_eq!(evaluation.required_missing_column_count, 0);
        assert_eq!(evaluation.optional_missing_column_count, 1);
        assert_eq!(evaluation.relation_type_mismatch_count, 0);
    }
}