aboutsummaryrefslogtreecommitdiffstats
path: root/tests/integration.rs
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2024-09-29 13:14:16 +0300
committerJan Tuomi <jan@jantuomi.fi>2024-10-01 21:01:37 +0300
commit1570c6e33e100701f568c57c4944c02bd43cca14 (patch)
tree096439160ad3a5a6783a640d6342b64fd4e0f6f3 /tests/integration.rs
parent559c9a7346a263db2fde5abb4820fed4af25c385 (diff)
Implement basic schema functionality, upsert
Diffstat (limited to 'tests/integration.rs')
-rw-r--r--tests/integration.rs120
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();
}