Создать соединение с БД из тестовой функции (rocket_db_pools)
От: zelenprog  
Дата: 17.03.25 18:32
Оценка:
Добрый день!

Есть простая программа — HTTP-сервис.
При обработке get-запроса программа использует файловую базу данных sqlite. Для работы с БД используется rocket_db_pools.
Все сделано и работает как описано вот в этой статье:
https://docs.rs/rocket_db_pools/latest/rocket_db_pools/

В обычном "рабочем" режиме библиотека rocket "автоматически" вызывает функцию-обработчик get-запроса, и в качестве параметра передает ей объект соединения с БД Connection<LogsDB>. Этот параметр-объект создается "автоматически" внутри библиотеки rocket.

Проблема возникла при реализации тестовой функции.
Я из тестовой функции хочу вызвать функцию, которая реализует обработку get-запроса. Для этого нужно "вручную" создать объект Connection<LogsDB> и передать его в обработчик-запроса.
Но как это сделать?.
Как в тестовой функции "вручную" создать объект Connection<LogsDB>?
Я читал описание этой библиотеки, но так и не смог ничего найти.
Подскажите пожалуйста.

Вот код программы:
use rocket::get;
use rocket_db_pools::{Connection, Database};
use rocket_db_pools::sqlx::Row;
 
#[derive(Database)]
#[database("data_store")]
struct LogsDB(sqlx::SqlitePool);
 
#[get("/<id>")]
//async fn read(mut db: Connection<LogsDB>, id: i64) -> Option<Log> {
async fn read(mut db: Connection<LogsDB>, id: i64) {
    let res = sqlx::query("SELECT content FROM logs WHERE id = ?").bind(id)
        .fetch_one(&mut **db).await;
//        .and_then(|r| Ok(log::Log(r.try_get(0)?)))
//        .ok()
}
 
#[cfg(test)]
mod tests {
    use super::*;
 
    #[tokio::test]
    async fn test_load_requests_and_write_updxmlfile() {
 
        let l_rocket = rocket::build().attach(LogsDB::init());
        //let l_database = MarkingDatabase::init();
        let l_db1 = LogsDB::fetch(&l_rocket).unwrap();
        let mut l_db_connection1 = l_db1.aquire().await.unwrap();        
        
        read(l_db_connection1, 50)?;
    }
 
}


Я так понимаю, что объект Connection<LogsDB> надо как-то получить в строке
"let mut l_db_connection1 = l_db1.aquire().await.unwrap();"

Компилятор выдает ошибку на эту строку.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.