diff --git a/redisless/src/server/tests/mod.rs b/redisless/src/server/tests/mod.rs index d0f9cb4..4d8a68b 100644 --- a/redisless/src/server/tests/mod.rs +++ b/redisless/src/server/tests/mod.rs @@ -1,6 +1,7 @@ use redis::{Commands, Connection, RedisResult}; use std::{thread::sleep, time::Duration}; +use crate::command::command_error::RedisCommandError; use crate::server::ServerState; use crate::storage::in_memory::InMemoryStorage; use crate::Server; @@ -37,6 +38,15 @@ fn test_incr_decr_commands() { let value: u32 = con.get("63").unwrap(); assert_eq!(value, 79_u32); + let response: Result = con.incr("63", "foo"); + match response { + Ok(_) => panic!("got valid response from incr command for key {} and value {}", "63", "foo"), + Err(error) => { + assert_eq!(error.kind(), redis::ErrorKind::ExtensionError); + assert_eq!(error.to_string(), "invalid: digit found in string"); + } + }; + assert_eq!(server.stop(), Some(ServerState::Stopped)); } diff --git a/redisless/src/server/util/run_command.rs b/redisless/src/server/util/run_command.rs index 93520c2..81f245b 100644 --- a/redisless/src/server/util/run_command.rs +++ b/redisless/src/server/util/run_command.rs @@ -123,15 +123,14 @@ pub fn run_command_and_get_response( match storage.read(k.as_slice()) { Some(value) => { - if let Ok(mut int_val) = std::str::from_utf8(value).unwrap().parse::() - { - int_val += 1; - let new_value = int_val.to_string().into_bytes(); - storage.write(k.as_slice(), new_value.as_slice()); - RedisResponse::single(Integer(int_val as i64)) - } else { - // handle this error - unimplemented!() + match std::str::from_utf8(value).unwrap().parse::() { + Ok(mut int_val) => { + int_val += 1; + let new_value = int_val.to_string().into_bytes(); + storage.write(k.as_slice(), new_value.as_slice()); + RedisResponse::single(Integer(int_val as i64)) + } + Err(error) => RedisResponse::error(RedisCommandError::IntParse(error)) } } None => { @@ -146,15 +145,14 @@ pub fn run_command_and_get_response( match storage.read(k.as_slice()) { Some(value) => { - if let Ok(mut int_val) = std::str::from_utf8(value).unwrap().parse::() - { - int_val += increment; - let new_value = int_val.to_string().into_bytes(); - storage.write(k.as_slice(), new_value.as_slice()); - RedisResponse::single(Integer(int_val as i64)) - } else { - //RedisResponse::error(...) - unimplemented!() + match std::str::from_utf8(value).unwrap().parse::() { + Ok(mut int_val) => { + int_val += increment; + let new_value = int_val.to_string().into_bytes(); + storage.write(k.as_slice(), new_value.as_slice()); + RedisResponse::single(Integer(int_val as i64)) + } + Err(error) => RedisResponse::error(RedisCommandError::IntParse(error)) } } None => {