Skip to main content

vantage_table/mocks/
mod.rs

1pub mod mock_column;
2pub mod mock_table_source;
3pub mod mock_type_system;
4
5pub use mock_column::MockColumn;
6
7#[cfg(test)]
8mod tests {
9    use super::*;
10    use crate::table::Table;
11    use mock_table_source::MockTableSource;
12    use rust_decimal::Decimal;
13    use serde::{Deserialize, Serialize};
14    use vantage_dataset::ReadableValueSet;
15
16    #[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
17    pub struct User {
18        pub name: String,
19        pub email: String,
20        pub age: i64,
21        pub balance: Decimal,
22        pub is_active: bool,
23    }
24
25    #[tokio::test]
26    async fn test_mock_table_with_data() {
27        use serde_json::json;
28
29        // Create mock data
30        let test_data = vec![
31            json!({
32                "id": "user1",
33                "name": "John Doe",
34                "email": "john@example.com",
35                "age": 30,
36                "balance": {"decimal": "100.50"},
37                "is_active": true
38            }),
39            json!({
40                "id": "user2",
41                "name": "Jane Smith",
42                "email": "jane@example.com",
43                "age": 25,
44                "balance": {"decimal": "250.75"},
45                "is_active": false
46            }),
47        ];
48
49        // Set up mock query source for expression support
50        use vantage_expressions::mocks::mock_builder;
51        let mock_query_source = mock_builder::new();
52
53        let mock_ds = MockTableSource::new()
54            .with_data("users", test_data)
55            .await
56            .with_query_source(mock_query_source);
57
58        let table: Table<MockTableSource, User> = Table::new("users", mock_ds)
59            .with_column(MockColumn::<String>::new("id"))
60            .with_column(MockColumn::<String>::new("name"))
61            .with_column(MockColumn::<String>::new("email"))
62            .with_column(MockColumn::<i64>::new("age"))
63            .with_column(MockColumn::<Decimal>::new("balance"))
64            .with_column(MockColumn::<bool>::new("is_active"));
65
66        // Test data loading through list_values()
67        let values = table.list_values().await.unwrap();
68        assert_eq!(values.len(), 2);
69
70        // Verify data content
71        assert!(values.contains_key("user1"));
72        assert!(values.contains_key("user2"));
73
74        // Test specific value retrieval
75        let user1_record = &values["user1"];
76        assert_eq!(user1_record["name"], json!("John Doe"));
77        assert_eq!(user1_record["email"], json!("john@example.com"));
78        assert_eq!(user1_record["age"], json!(30));
79        assert_eq!(user1_record["is_active"], json!(true));
80
81        let user2_record = &values["user2"];
82        assert_eq!(user2_record["name"], json!("Jane Smith"));
83        assert_eq!(user2_record["is_active"], json!(false));
84
85        // Test count
86        let count = table.get_count().await.unwrap();
87        assert_eq!(count, 2);
88
89        // Test expression-based count
90        // TODO: Fix type conversion from serde_json::Value to usize in expression system
91        // let count_expr = table.get_expr_count().get().await.unwrap();
92        // assert_eq!(count_expr, 2);
93    }
94}