Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 123 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ openssl = { version = "0.10", features = ["vendored"] }
secrecy = { version = "0.10", features = ["serde"] }
reqwest = { version = "0.12.23", features = ["json", "native-tls"] }
rand = "0.7.3"
lettre = "0.11.18"
lettre = { version = "0.11.18", default-features = false }
url = "2.5.7"
tower_governor = "0.8.0"
axum-prometheus = "0.10.0"
Expand Down
2 changes: 1 addition & 1 deletion bin/payego/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ use crate::utility::logging::setup_logging;
use crate::utility::server::serve;
use crate::utility::tasks::{build_router, initialize_system, load_env};
use eyre::Report;
use payego_core::app_state::AppState;
use payego_primitives::models::app_config::AppConfig;
use payego_primitives::models::app_state::AppState;
use tracing::info;

pub async fn run() -> Result<(), Report> {
Expand Down
2 changes: 1 addition & 1 deletion bin/payego/src/utility/clean_up_tasks.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use diesel::ExpressionMethods;
use diesel::QueryDsl;
use diesel::RunQueryDsl;
use payego_primitives::models::app_state::AppState;
use payego_core::AppState;
use payego_primitives::schema::{blacklisted_tokens, refresh_tokens};
use std::sync::Arc;
use std::time::Duration;
Expand Down
2 changes: 1 addition & 1 deletion bin/payego/src/utility/tasks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use axum_prometheus::{metrics_exporter_prometheus::PrometheusHandle, PrometheusM
use eyre::Report;
use http::HeaderValue;
use payego_api::handlers::initialize_banks::initialize_banks;
use payego_primitives::models::app_state::AppState;
use payego_core::app_state::AppState;
use std::sync::Arc;
use tower_http::cors::{Any, CorsLayer};
use tracing::info;
Expand Down
66 changes: 66 additions & 0 deletions bin/payego/tests/audit_tests.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
mod common;

use axum_test::TestServer;
use common::{create_test_app, create_test_app_state, create_test_user};
use diesel::prelude::*;
use payego_primitives::models::entities::audit_log::AuditLog;
use payego_primitives::schema::audit_logs;
use serial_test::serial;

#[tokio::test]
#[serial]
async fn test_audit_log_on_registration() {
let state = create_test_app_state();
let app = create_test_app(state.clone());
let server = TestServer::new(app).unwrap();

let email = format!("audit_test_{}@example.com", uuid::Uuid::new_v4());

// Perform registration
let _ = create_test_user(&server, &email).await;

// Verify audit log
let mut conn = state.db.get().unwrap();
let logs: Vec<AuditLog> = audit_logs::table
.filter(audit_logs::event_type.eq("auth.register"))
.load(&mut conn)
.unwrap();

assert!(!logs.is_empty());
let log = logs
.iter()
.find(|l| l.metadata["email"] == email)
.expect("Audit log for registration not found");
assert_eq!(log.event_type, "auth.register");
}

#[tokio::test]
#[serial]
async fn test_audit_log_on_login() {
let state = create_test_app_state();
let app = create_test_app(state.clone());
let server = TestServer::new(app).unwrap();

let email = format!("login_audit_{}@example.com", uuid::Uuid::new_v4());
let _ = create_test_user(&server, &email).await;

// Perform login
let response = server
.post("/api/auth/login")
.json(&serde_json::json!({
"email": email,
"password": "SecurePass123!"
}))
.await;

response.assert_status(axum::http::StatusCode::OK);

// Verify audit log
let mut conn = state.db.get().unwrap();
let logs: Vec<AuditLog> = audit_logs::table
.filter(audit_logs::event_type.eq("auth.login.success"))
.load(&mut conn)
.unwrap();

assert!(!logs.is_empty());
}
2 changes: 1 addition & 1 deletion bin/payego/tests/auth_tests.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
mod common;

use common::create_test_app_state;
use payego_primitives::config::security_config::SecurityConfig;
use payego_core::SecurityConfig;
use serial_test::serial;

#[tokio::test]
Expand Down
13 changes: 9 additions & 4 deletions bin/payego/tests/bank_service_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ use payego_primitives::models::BankRequest;
use payego_primitives::schema::{bank_accounts, banks, users};
use serde_json::json;
use serial_test::serial;
use std::sync::Arc;
use uuid::Uuid;
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, ResponseTemplate};
Expand Down Expand Up @@ -51,9 +50,11 @@ async fn test_add_bank_account_success() {
.await;

// 3. Setup AppState
let mut base_state = (*common::create_test_app_state()).clone();
base_state.config.paystack_details.paystack_api_url = base_url.clone();
let state = Arc::new(base_state);
let base_state = common::create_test_app_state();
let mut config = base_state.config.clone();
config.paystack_details.paystack_api_url = base_url.clone();
let state = payego_core::AppState::new(base_state.db.clone(), config)
.expect("Failed to create AppState");

let pool = &state.db;
let conn = &mut pool.get().unwrap();
Expand Down Expand Up @@ -107,6 +108,10 @@ async fn test_add_bank_account_success() {
// Removed assertion for paystack_recipient_code if it doesn't exist on BankAccount struct

// 6. Cleanup
use payego_primitives::schema::audit_logs;
diesel::delete(audit_logs::table.filter(audit_logs::user_id.eq(user_id)))
.execute(conn)
.unwrap();
diesel::delete(bank_accounts::table.filter(bank_accounts::user_id.eq(user_id)))
.execute(conn)
.unwrap();
Expand Down
Loading