Files
AstralRinth/apps/labrinth/src/test/db.rs
aecsocket bcc36362be Expose utilities for setting up the database (#4657)
* Expose utilities for setting up the database

* Expose migrator directly

* Make some test utils publicly accessible

* expose migrator

* more test fixture utils

* more test fixture utils

* more test fixture utils

* fix

* fix lint
2025-10-30 10:10:25 +00:00

82 lines
2.5 KiB
Rust

use eyre::{Context, Result};
use sqlx::{Executor, PgPool};
/// Static personal access token for use in [`AppendPat`].
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Pat(pub &'static str);
/// Dummy [`Pat`]s.
#[allow(missing_docs, reason = "self-explanatory")]
pub mod pat {
use super::Pat;
pub const ADMIN: Pat = Pat("mrp_patadmin");
pub const MODERATOR: Pat = Pat("mrp_patmoderator");
pub const USER: Pat = Pat("mrp_patuser");
pub const FRIEND: Pat = Pat("mrp_patfriend");
pub const ENEMY: Pat = Pat("mrp_patenemy");
}
/// See [`AppendPat::append_pat`].
pub trait AppendPat {
/// Appends a [`Pat`] authorization token to an
/// [`actix_web::test::TestRequest`].
#[must_use]
fn append_pat(self, pat: Pat) -> Self;
}
impl AppendPat for actix_web::test::TestRequest {
fn append_pat(self, pat: Pat) -> Self {
self.append_header(("Authorization", pat.0))
}
}
/// Dummy [`DBUserId`]s.
///
/// [`DBUserId`]: crate::database::models::DBUserId
pub mod user_id {
use crate::database::models::DBUserId;
pub const ADMIN: DBUserId = DBUserId(1);
pub const MODERATOR: DBUserId = DBUserId(2);
pub const USER: DBUserId = DBUserId(3);
pub const FRIEND: DBUserId = DBUserId(4);
pub const ENEMY: DBUserId = DBUserId(5);
}
/// Initialize a database with dummy fixture data.
///
/// # Errors
///
/// Errors if the fixture could not be applied.
pub async fn add_dummy_data(db: &PgPool) -> Result<()> {
db.execute(
include_str!("../../fixtures/dummy_data.sql")
//
.replace("{{user_id::ADMIN}}", &user_id::ADMIN.0.to_string())
.replace(
"{{user_id::MODERATOR}}",
&user_id::MODERATOR.0.to_string(),
)
.replace("{{user_id::USER}}", &user_id::USER.0.to_string())
.replace("{{user_id::FRIEND}}", &user_id::FRIEND.0.to_string())
.replace("{{user_id::ENEMY}}", &user_id::ENEMY.0.to_string())
//
.replace("{{pat::ADMIN}}", pat::ADMIN.0)
.replace("{{pat::MODERATOR}}", pat::MODERATOR.0)
.replace("{{pat::USER}}", pat::USER.0)
.replace("{{pat::FRIEND}}", pat::FRIEND.0)
.replace("{{pat::ENEMY}}", pat::ENEMY.0)
//
.replace(
"{{all_scopes}}",
&crate::models::pats::Scopes::all().bits().to_string(),
)
.as_str(),
)
.await
.wrap_err("failed to add dummy data")?;
Ok(())
}