diff --git a/README.md b/README.md index 842f2a5..38a037c 100644 --- a/README.md +++ b/README.md @@ -56,3 +56,4 @@ nix develop * [x] Hack https://github.com/bigskysoftware/htmx/blob/master/src/ext/json-enc.js to all embedded fields. * [x] Create UI to create user * [x] Create UI to create security +* [ ] Find a "nice" solution for chart.js diff --git a/src/db/_accounts.rs b/src/db/_accounts.rs index 83481b4..7786d37 100644 --- a/src/db/_accounts.rs +++ b/src/db/_accounts.rs @@ -59,6 +59,7 @@ impl Clone for AccountType { } } +#[derive(Debug)] pub struct Account { id: i64, amount: i64, @@ -413,7 +414,7 @@ pub fn get_number_of_accounts(tx: &Connection, pub fn get_security_market_cap(tx: &Connection, sec: &SecurityId) -> CustomResult { let q = " - SELECT -1 * SUM(amount) AS count + SELECT COALESCE(-1 * SUM(amount), 0) AS count FROM accounts WHERE security = ? AND account_type = ? @@ -424,6 +425,7 @@ pub fn get_security_market_cap(tx: &Connection, #[cfg(test)] mod test_accounts { + use apache_avro::Schema::String; use rusqlite::{Connection, Transaction}; use serde_json::to_string; @@ -445,7 +447,7 @@ mod test_accounts { } fn create_all_accounts( - tx: &Transaction, + tx: &Connection, users: &Vec, secs: &Vec, ) -> CustomResult> { @@ -608,4 +610,43 @@ mod test_accounts { assert_eq!(res.len(), 2); Ok(()) } + + #[test] + fn test_get_number_of_accounts() -> CustomResult<()> { + let (mut conn, users, secs) = setup(); + create_all_accounts(&conn, &users, &secs)?; + let n = get_number_of_accounts(&conn, &secs.get(0).unwrap().id(), AccountType::Checking)?; + assert_eq!(n, 2); + + let n = get_number_of_accounts(&conn, &secs.get(0).unwrap().id(), AccountType::SecurityEmitter)?; + assert_eq!(n, 0); + + create_security_emitter_account(&conn, &secs.get(0).unwrap().id(), &users.get(0).unwrap().id(), &"".to_string())?; + let n = get_number_of_accounts(&conn, &secs.get(0).unwrap().id(), AccountType::SecurityEmitter)?; + assert_eq!(n, 1); + Ok(()) + } + + #[test] + fn test_get_security_market_cap() -> CustomResult<()> { + let (mut conn, users, secs) = setup(); + let accounts = create_all_accounts(&conn, &users, &secs.get(0..1).unwrap().to_vec())?; + let sec_id = &secs.get(0).unwrap().id(); + let sec_emitter = create_security_emitter_account(&conn, sec_id, &users.get(0).unwrap().id(), &"".to_string())?; + + let n = get_security_market_cap(&conn, sec_id)?; + assert_eq!(n, 0); + + add_to_account(&conn, &accounts.get(0).unwrap().id(), 800)?; + + // markcap is ONLY based on security emitter accounts + let n = get_security_market_cap(&conn, sec_id)?; + assert_eq!(n, 0); + + add_to_account(&conn, &sec_emitter.id(), -800)?; + let n = get_security_market_cap(&conn, sec_id)?; + assert_eq!(n, 800); + + Ok(()) + } }