Skip to content

Commit

Permalink
feat: add Valkey module (#252)
Browse files Browse the repository at this point in the history
Co-authored-by: Artem Medvedev <[email protected]>
  • Loading branch information
ivanvs and DDtKey authored Jan 7, 2025
1 parent 4e58c1f commit b5c8b61
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 0 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ solr = []
surrealdb = []
trufflesuite_ganachecli = []
victoria_metrics = []
valkey = []
zookeeper = []
cockroach_db = []
kwok = []
Expand Down
4 changes: 4 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,10 @@ pub mod surrealdb;
#[cfg_attr(docsrs, doc(cfg(feature = "trufflesuite_ganachecli")))]
/// **Trufflesuite Ganache CLI** (etherium simulator) testcontainer
pub mod trufflesuite_ganachecli;
#[cfg(feature = "valkey")]
#[cfg_attr(docsrs, doc(cfg(feature = "valkey")))]
/// **Valkey** (in memory nosql database) testcontainer
pub mod valkey;
#[cfg(feature = "victoria_metrics")]
#[cfg_attr(docsrs, doc(cfg(feature = "victoria_metrics")))]
/// **VictoriaMetrics** (monitoring and time series metrics database) testcontainer
Expand Down
87 changes: 87 additions & 0 deletions src/valkey/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
use testcontainers::{
core::{ContainerPort, WaitFor},
Image,
};

const NAME: &str = "valkey/valkey";
const TAG: &str = "8.0.1-alpine";

/// Default port (6379) on which Valkey is exposed
pub const VALKEY_PORT: ContainerPort = ContainerPort::Tcp(6379);

/// Module to work with [`Valkey`] inside of tests.
/// Valkey is a high-performance data structure server that primarily serves key/value workloads.
///
/// Starts an instance of Valkey based on the official [`Valkey docker image`].
///
/// By default, Valkey is exposed on Port 6379 ([`VALKEY_PORT`]), just like Redis, and has no access control.
/// Currently, for communication with Valkey we can still use redis library.
///
/// # Example
/// ```
/// use redis::Commands;
/// use testcontainers_modules::{
/// testcontainers::runners::SyncRunner,
/// valkey::{Valkey, VALKEY_PORT},
/// };
///
/// let valkey_instance = Valkey::default().start().unwrap();
/// let host_ip = valkey_instance.get_host().unwrap();
/// let host_port = valkey_instance.get_host_port_ipv4(VALKEY_PORT).unwrap();
///
/// let url = format!("redis://{host_ip}:{host_port}");
/// let client = redis::Client::open(url.as_ref()).unwrap();
/// let mut con = client.get_connection().unwrap();
///
/// con.set::<_, _, ()>("my_key", 42).unwrap();
/// let result: i64 = con.get("my_key").unwrap();
/// ```
///
/// [`Valkey`]: https://valkey.io/
/// [`Valeky docker image`]: https://hub.docker.com/r/valkey/valkey
/// [`VALKEY_PORT`]: super::VALKEY_PORT
#[derive(Debug, Default, Clone)]
pub struct Valkey {
/// (remove if there is another variable)
/// Field is included to prevent this struct to be a unit struct.
/// This allows extending functionality (and thus further variables) without breaking changes
_priv: (),
}

impl Image for Valkey {
fn name(&self) -> &str {
NAME
}

fn tag(&self) -> &str {
TAG
}

fn ready_conditions(&self) -> Vec<WaitFor> {
vec![WaitFor::message_on_stdout("Ready to accept connections")]
}
}

#[cfg(test)]
mod tests {
use redis::Commands;

use crate::{testcontainers::runners::SyncRunner, valkey::Valkey};

#[test]
fn valkey_fetch_an_integer() -> Result<(), Box<dyn std::error::Error + 'static>> {
let _ = pretty_env_logger::try_init();
let node = Valkey::default().start()?;
let host_ip = node.get_host()?;
let host_port = node.get_host_port_ipv4(6379)?;
let url = format!("redis://{host_ip}:{host_port}");

let client = redis::Client::open(url.as_ref()).unwrap();
let mut con = client.get_connection().unwrap();

con.set::<_, _, ()>("my_key", 42).unwrap();
let result: i64 = con.get("my_key").unwrap();
assert_eq!(42, result);
Ok(())
}
}

0 comments on commit b5c8b61

Please sign in to comment.