sea-orm-spanner 0.1.0

Google Cloud Spanner backend for SeaORM
Documentation
mod common;
mod entity;

use {
    common::setup_test_database,
    entity::uuid_types,
    sea_orm::{ActiveModelTrait, EntityTrait, Set},
    serial_test::serial,
    uuid::Uuid,
};

#[tokio::test]
#[serial]
async fn test_uuid_insert_and_select() {
    let db = setup_test_database().await;

    let id = Uuid::new_v4().to_string();
    let uuid_val = Uuid::new_v4();
    let uuid_nullable = Some(Uuid::new_v4());

    let model = uuid_types::ActiveModel {
        id: Set(id.clone()),
        uuid_val: Set(uuid_val),
        uuid_nullable: Set(uuid_nullable),
    };

    model.insert(&db).await.expect("Failed to insert");

    let result = uuid_types::Entity::find_by_id(&id)
        .one(&db)
        .await
        .expect("Failed to query")
        .expect("Not found");

    assert_eq!(result.uuid_val, uuid_val);
    assert_eq!(result.uuid_nullable, uuid_nullable);
}

#[tokio::test]
#[serial]
async fn test_uuid_nullable_null() {
    let db = setup_test_database().await;

    let id = Uuid::new_v4().to_string();
    let uuid_val = Uuid::new_v4();

    let model = uuid_types::ActiveModel {
        id: Set(id.clone()),
        uuid_val: Set(uuid_val),
        uuid_nullable: Set(None),
    };

    model.insert(&db).await.expect("Failed to insert");

    let result = uuid_types::Entity::find_by_id(&id)
        .one(&db)
        .await
        .expect("Failed to query")
        .expect("Not found");

    assert_eq!(result.uuid_val, uuid_val);
    assert!(result.uuid_nullable.is_none());
}

#[tokio::test]
#[serial]
async fn test_uuid_update() {
    let db = setup_test_database().await;

    let id = Uuid::new_v4().to_string();
    let original_uuid = Uuid::new_v4();
    let updated_uuid = Uuid::new_v4();

    let model = uuid_types::ActiveModel {
        id: Set(id.clone()),
        uuid_val: Set(original_uuid),
        uuid_nullable: Set(None),
    };

    model.insert(&db).await.expect("Failed to insert");

    let mut active: uuid_types::ActiveModel = uuid_types::Entity::find_by_id(&id)
        .one(&db)
        .await
        .expect("Failed to query")
        .expect("Not found")
        .into();

    active.uuid_val = Set(updated_uuid);
    active.uuid_nullable = Set(Some(Uuid::new_v4()));
    active.update(&db).await.expect("Failed to update");

    let result = uuid_types::Entity::find_by_id(&id)
        .one(&db)
        .await
        .expect("Failed to query")
        .expect("Not found");

    assert_eq!(result.uuid_val, updated_uuid);
    assert!(result.uuid_nullable.is_some());
}

#[tokio::test]
#[serial]
async fn test_uuid_specific_value() {
    let db = setup_test_database().await;

    let id = Uuid::new_v4().to_string();
    let specific_uuid = Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").unwrap();

    let model = uuid_types::ActiveModel {
        id: Set(id.clone()),
        uuid_val: Set(specific_uuid),
        uuid_nullable: Set(None),
    };

    model.insert(&db).await.expect("Failed to insert");

    let result = uuid_types::Entity::find_by_id(&id)
        .one(&db)
        .await
        .expect("Failed to query")
        .expect("Not found");

    assert_eq!(result.uuid_val, specific_uuid);
}

#[tokio::test]
#[serial]
async fn test_uuid_roundtrip() {
    let db = setup_test_database().await;

    let id = Uuid::new_v4().to_string();
    let uuid_val = Uuid::new_v4();

    let model = uuid_types::ActiveModel {
        id: Set(id.clone()),
        uuid_val: Set(uuid_val),
        uuid_nullable: Set(None),
    };

    model.insert(&db).await.expect("Failed to insert");

    let result = uuid_types::Entity::find_by_id(&id)
        .one(&db)
        .await
        .expect("Failed to query")
        .expect("Not found");

    assert_eq!(result.uuid_val, uuid_val);
    assert_eq!(result.uuid_val.to_string(), uuid_val.to_string());
}