Set up tests for database queries

This commit is contained in:
silverpill 2022-01-06 11:09:45 +00:00
parent 040934da2d
commit 011951c129
6 changed files with 98 additions and 0 deletions

23
Cargo.lock generated
View file

@ -1718,6 +1718,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"serde_yaml", "serde_yaml",
"serial_test",
"sha2", "sha2",
"thiserror", "thiserror",
"tokio", "tokio",
@ -2746,6 +2747,28 @@ dependencies = [
"yaml-rust", "yaml-rust",
] ]
[[package]]
name = "serial_test"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0bccbcf40c8938196944a3da0e133e031a33f4d6b72db3bda3cc556e361905d"
dependencies = [
"lazy_static",
"parking_lot",
"serial_test_derive",
]
[[package]]
name = "serial_test_derive"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "sha-1" name = "sha-1"
version = "0.9.4" version = "0.9.4"

View file

@ -79,3 +79,6 @@ ulid = { version = "0.4.1", features = ["uuid"] }
uuid = { version = "0.8.2", features = ["serde", "v4"] } uuid = { version = "0.8.2", features = ["serde", "v4"] }
# Used to query ethereum node # Used to query ethereum node
web3 = { version = "0.15.0", default-features = false, features = ["http", "http-tls", "signing"] } web3 = { version = "0.15.0", default-features = false, features = ["http", "http-tls", "signing"] }
[dev-dependencies]
serial_test = "0.5.1"

View file

@ -3,6 +3,9 @@ use tokio_postgres::config::{Config as DbConfig};
pub mod int_enum; pub mod int_enum;
pub mod migrate; pub mod migrate;
#[cfg(test)]
pub mod test_utils;
pub type Pool = deadpool_postgres::Pool; pub type Pool = deadpool_postgres::Pool;
pub async fn create_database_client(db_config: &DbConfig) -> tokio_postgres::Client { pub async fn create_database_client(db_config: &DbConfig) -> tokio_postgres::Client {

View file

@ -0,0 +1,37 @@
use tokio_postgres::Client;
use tokio_postgres::config::Config;
use super::create_database_client;
use super::migrate::apply_migrations;
const DEFAULT_CONNECTION_URL: &str = "postgres://mitra:mitra@127.0.0.1:5432/mitra-test";
pub async fn create_test_database() -> Client {
let connection_url = std::env::var("TEST_DATABASE_URL")
.unwrap_or(DEFAULT_CONNECTION_URL.to_string());
let mut db_config: Config = connection_url.parse()
.expect("invalid database connection URL");
let db_name = db_config.get_dbname()
.expect("database name not specified")
.to_string();
// Create connection without database name
db_config.dbname("");
let db_client = create_database_client(&db_config).await;
let drop_db_statement = format!(
"DROP DATABASE IF EXISTS {db_name:?}",
db_name=db_name,
);
db_client.execute(drop_db_statement.as_str(), &[]).await.unwrap();
let create_db_statement = format!(
"CREATE DATABASE {db_name:?} WITH OWNER={owner:?};",
db_name=db_name,
owner=db_config.get_user().unwrap(),
);
db_client.execute(create_db_statement.as_str(), &[]).await.unwrap();
// Create new connection to database
db_config.dbname(&db_name);
let mut db_client = create_database_client(&db_config).await;
apply_migrations(&mut db_client).await;
db_client
}

View file

@ -382,3 +382,34 @@ pub async fn update_post_count(
let profile = row.try_get("actor_profile")?; let profile = row.try_get("actor_profile")?;
Ok(profile) Ok(profile)
} }
#[cfg(test)]
mod tests {
use serial_test::serial;
use crate::database::test_utils::create_test_database;
use super::*;
#[tokio::test]
#[serial]
async fn test_create_profile() {
let profile_data = ProfileCreateData {
username: "test".to_string(),
..Default::default()
};
let db_client = create_test_database().await;
let profile = create_profile(&db_client, &profile_data).await.unwrap();
assert_eq!(profile.username, profile_data.username);
}
#[tokio::test]
#[serial]
async fn test_delete_profile() {
let profile_data = ProfileCreateData::default();
let mut db_client = create_test_database().await;
let profile = create_profile(&db_client, &profile_data).await.unwrap();
let deletion_queue = delete_profile(&mut db_client, &profile.id).await.unwrap();
assert_eq!(deletion_queue.files.len(), 0);
assert_eq!(deletion_queue.ipfs_objects.len(), 0);
}
}

View file

@ -135,6 +135,7 @@ impl Default for DbActorProfile {
} }
} }
#[cfg_attr(test, derive(Default))]
pub struct ProfileCreateData { pub struct ProfileCreateData {
pub username: String, pub username: String,
pub display_name: Option<String>, pub display_name: Option<String>,