diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2024-09-29 13:14:16 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2024-10-01 21:01:37 +0300 |
| commit | 1570c6e33e100701f568c57c4944c02bd43cca14 (patch) | |
| tree | 096439160ad3a5a6783a640d6342b64fd4e0f6f3 /tests/integration.rs | |
| parent | 559c9a7346a263db2fde5abb4820fed4af25c385 (diff) | |
Implement basic schema functionality, upsert
Diffstat (limited to 'tests/integration.rs')
| -rw-r--r-- | tests/integration.rs | 120 |
1 files changed, 96 insertions, 24 deletions
diff --git a/tests/integration.rs b/tests/integration.rs index e500219..2c0a958 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,37 +1,31 @@ -use log_db::log_db; +use log_db::log_db::{Config, Record, RecordFieldType, RecordValue, DB}; use serial_test::serial; const TEST_DATA_DIR: &str = "test_db_data"; const TEST_SEGMENT_SIZE: u64 = 1024 * 1024; // 1 MB const TEST_MEMTABLE_SIZE: u64 = 1024 * 1024; // 1 MB -struct TestRecord { - id: u64, - data: String, -} - -impl log_db::Record for TestRecord { - fn serialize(&self) -> Vec<u8> { - format!("{}:{}", self.id, self.data).into_bytes() - } - - fn deserialize(data: Vec<u8>) -> Self { - let data = String::from_utf8(data).unwrap(); - let parts: Vec<&str> = data.split(':').collect(); - TestRecord { - id: parts[0].parse().unwrap(), - data: parts[1].to_string(), - } - } +#[derive(Eq, PartialEq, Clone)] +enum Field { + Id, + Name, + Data, } #[test] #[serial] fn test_initialize() { - let _db: log_db::DB<TestRecord> = log_db::DB::initialize(&log_db::Config { + let _db = DB::initialize(&Config { data_dir: TEST_DATA_DIR.to_string(), segment_size: TEST_SEGMENT_SIZE, memtable_size: TEST_MEMTABLE_SIZE, + fields: vec![ + (Field::Id, RecordFieldType::Int), + (Field::Name, RecordFieldType::String), + (Field::Data, RecordFieldType::Bytes), + ], + primary_key: Field::Id, + secondary_keys: vec![], }) .unwrap(); @@ -42,19 +36,97 @@ fn test_initialize() { #[test] #[serial] fn test_upsert_to_empty_db() { - let db: log_db::DB<TestRecord> = log_db::DB::initialize(&log_db::Config { + let mut db = DB::initialize(&Config { data_dir: TEST_DATA_DIR.to_string(), segment_size: TEST_SEGMENT_SIZE, memtable_size: TEST_MEMTABLE_SIZE, + fields: vec![ + (Field::Id, RecordFieldType::Int), + (Field::Name, RecordFieldType::String), + (Field::Data, RecordFieldType::Bytes), + ], + primary_key: Field::Id, + secondary_keys: vec![], }) .unwrap(); - let record = TestRecord { - id: 1, - data: "hello".to_string(), + let record = Record { + values: vec![ + RecordValue::Int(1), + RecordValue::String("Alice".to_string()), + RecordValue::Bytes(vec![0, 1, 2]), + ], }; db.upsert(&record).unwrap(); + let result = db.get(Field::Id, RecordValue::Int(1)).unwrap().unwrap(); + + // Check that the IDs match + assert!(match (&result.values[0], &record.values[0]) { + (RecordValue::Int(a), RecordValue::Int(b)) => a == b, + _ => false, + }); + + // Clean up + std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); +} + +#[test] +#[serial] +fn test_upsert_fails_on_invalid_number_of_values() { + let mut db = DB::initialize(&Config { + data_dir: TEST_DATA_DIR.to_string(), + segment_size: TEST_SEGMENT_SIZE, + memtable_size: TEST_MEMTABLE_SIZE, + fields: vec![ + (Field::Id, RecordFieldType::Int), + (Field::Name, RecordFieldType::String), + (Field::Data, RecordFieldType::Bytes), + ], + primary_key: Field::Id, + secondary_keys: vec![], + }) + .unwrap(); + + let record = Record { + // Missing primary key + values: vec![ + RecordValue::String("Alice".to_string()), + RecordValue::Bytes(vec![0, 1, 2]), + ], + }; + assert!(db.upsert(&record).is_err()); + + // Clean up + std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); +} + +#[test] +#[serial] +fn test_upsert_fails_on_invalid_value_type() { + let mut db = DB::initialize(&Config { + data_dir: TEST_DATA_DIR.to_string(), + segment_size: TEST_SEGMENT_SIZE, + memtable_size: TEST_MEMTABLE_SIZE, + fields: vec![ + (Field::Id, RecordFieldType::Int), + (Field::Name, RecordFieldType::String), + (Field::Data, RecordFieldType::Bytes), + ], + primary_key: Field::Id, + secondary_keys: vec![], + }) + .unwrap(); + + let record = Record { + values: vec![ + RecordValue::String("foo".to_string()), + RecordValue::String("bar".to_string()), + RecordValue::String("baz".to_string()), + ], + }; + assert!(db.upsert(&record).is_err()); + // Clean up std::fs::remove_dir_all(TEST_DATA_DIR.to_string()).unwrap(); } |
