summaryrefslogtreecommitdiffstats
path: root/tests/server_core.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/server_core.rs')
-rw-r--r--tests/server_core.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/server_core.rs b/tests/server_core.rs
index cab74a7..cf05102 100644
--- a/tests/server_core.rs
+++ b/tests/server_core.rs
@@ -4,7 +4,9 @@ use rusqlite::Connection;
4use zagan_bet::server::core::{ConnectionState, ServerCore}; 4use zagan_bet::server::core::{ConnectionState, ServerCore};
5use zagan_bet::server::database; 5use zagan_bet::server::database;
6use zagan_bet::server::games::registry::GameRegistry; 6use zagan_bet::server::games::registry::GameRegistry;
7use zagan_bet::server::games::roulette::RouletteGame;
7use zagan_bet::server::games::slots::SlotsGame; 8use zagan_bet::server::games::slots::SlotsGame;
9use zagan_bet::roulette::Bets;
8 10
9fn setup(name: &str, grid: &str) -> (ServerCore, String) { 11fn setup(name: &str, grid: &str) -> (ServerCore, String) {
10 let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR")) 12 let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR"))
@@ -29,6 +31,22 @@ const LOSS: &str = "CLOOGDSLCDCOGLS";
29/// Top line is C C C D D; it pays 2x total bet. 31/// Top line is C C C D D; it pays 2x total bet.
30const WIN3: &str = "CCCCLLCLODGSDGS"; 32const WIN3: &str = "CCCCLLCLODGSDGS";
31 33
34fn setup_roulette(name: &str, number: u8) -> (ServerCore, String) {
35 let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR"))
36 .join(format!("server-core-{name}.db"))
37 .to_string_lossy()
38 .into_owned();
39 let _ = std::fs::remove_file(&path);
40
41 let conn = Connection::open(&path).unwrap();
42 database::init_db(&conn);
43
44 let registry = GameRegistry::new();
45 registry.register_game(RouletteGame::with_result(number));
46
47 (ServerCore::with_registry(conn, registry, 4), path)
48}
49
32fn register(core: &mut ServerCore, state: &mut ConnectionState, user: &str) { 50fn register(core: &mut ServerCore, state: &mut ConnectionState, user: &str) {
33 assert_eq!( 51 assert_eq!(
34 core.handle_message(state, &format!("REGISTER {user} credential")), 52 core.handle_message(state, &format!("REGISTER {user} credential")),
@@ -164,6 +182,47 @@ fn plays_record_the_game_type_and_game_specific_details() {
164} 182}
165 183
166#[test] 184#[test]
185fn roulette_settles_split_bets_and_records_details() {
186 let (mut core, path) = setup_roulette("roulette", 17);
187 let mut state = ConnectionState::default();
188 register(&mut core, &mut state, "alice");
189 login(&mut core, &mut state, "alice");
190
191 let bets =
192 r#"{"red":10,"black":10,"even":10,"odd":10,"numbers":[{"number":17,"amount":5}]}"#;
193 let response = core.handle_message(&mut state, &format!("PLAY_START roulette 45 {bets}"));
194
195 assert!(
196 response.starts_with("ROULETTE_RESULT"),
197 "response: {response}"
198 );
199 assert!(
200 response.contains(" 220 45 1175 17 black "),
201 "response: {response}"
202 );
203 assert!(response.ends_with(&format!(" {bets}")), "response: {response}");
204 assert_eq!(core.balance("alice"), Some(1175));
205 assert_eq!(core.play_count("alice"), 1);
206 assert_eq!(core.session_count(), 0);
207
208 let conn = Connection::open(&path).unwrap();
209 let (game_type, details): (String, String) = conn
210 .query_row(
211 "SELECT game_type, details FROM plays WHERE username = 'alice'",
212 [],
213 |row| Ok((row.get(0)?, row.get(1)?)),
214 )
215 .unwrap();
216
217 assert_eq!(game_type, "roulette");
218 let details: serde_json::Value = serde_json::from_str(&details).unwrap();
219 assert_eq!(details["number"], "17");
220 assert_eq!(details["color"], "black");
221 let stored: Bets = serde_json::from_str(details["bets"].as_str().unwrap()).unwrap();
222 assert_eq!(stored.total(), 45);
223}
224
225#[test]
167fn a_failed_audit_insert_rolls_back_the_balance_change() { 226fn a_failed_audit_insert_rolls_back_the_balance_change() {
168 let (mut core, path) = setup("rollback", LOSS); 227 let (mut core, path) = setup("rollback", LOSS);
169 let mut state = ConnectionState::default(); 228 let mut state = ConnectionState::default();