use crate::support::{
AvailableComponents, Component, REDIS_CE_6_0, TestContext, TestContextVersioning,
};
use redis_test::{MockCmd, MockRedisConnection};
mod support;
fn build_available_components(input: &str) -> AvailableComponents {
let mut conn = MockRedisConnection::new(vec![MockCmd::new(redis::cmd("INFO"), Ok(input))]);
AvailableComponents::from(&mut conn)
}
fn assert_components_eq(components: AvailableComponents, mut expected: Vec<Component>) {
let mut actual: Vec<Component> = (&components).into();
actual.sort();
expected.sort();
assert_eq!(actual, expected);
}
struct MockTestContext {
components: AvailableComponents,
}
impl MockTestContext {
fn new(input: &str) -> Self {
let components = build_available_components(input);
Self { components }
}
}
impl TestContextVersioning for MockTestContext {
fn get_available_components(&self) -> AvailableComponents {
self.components.clone()
}
}
#[test]
fn ctx_supports_exact_match() {
let mock = MockTestContext::new("foo_version: 42.4711.23");
assert!(mock.supports(("foo", (42, 4711, 23))));
}
#[test]
fn ctx_supports_major_smaller() {
let mock = MockTestContext::new("foo_version: 42.4711.23");
assert!(mock.supports(("foo", (41, 4712, 24))));
}
#[test]
fn ctx_supports_major_bigger() {
let mock = MockTestContext::new("foo_version: 42.4711.23");
assert!(!mock.supports(("foo", (43, 4710, 22))));
}
#[test]
fn ctx_supports_major_match_minor_smaller() {
let mock = MockTestContext::new("foo_version: 42.4711.23");
assert!(mock.supports(("foo", (42, 4710, 24))));
}
#[test]
fn ctx_supports_major_match_minor_bigger() {
let mock = MockTestContext::new("foo_version: 42.4711.23");
assert!(!mock.supports(("foo", (42, 4712, 22))));
}
#[test]
fn ctx_supports_major_match_minor_match_patch_smaller() {
let mock = MockTestContext::new("foo_version: 42.4711.23");
assert!(mock.supports(("foo", (42, 4711, 22))));
}
#[test]
fn ctx_supports_major_match_minor_match_patch_bigger() {
let mock = MockTestContext::new("foo_version: 42.4711.23");
assert!(!mock.supports(("foo", (42, 4711, 24))));
}
#[test]
fn ctx_supports_disjunctive() {
let mock = MockTestContext::new("bar_version: 42.4711.23");
assert!(mock.supports([
("foo", (23, 23, 23)),
("bar", (42, 0, 0)),
("baz", (42, 42, 42)),
]));
assert!(!mock.supports([
("foo", (23, 23, 23)),
("bar", (43, 0, 0)),
("baz", (42, 42, 42)),
]));
assert!(!mock.supports([("foo", (23, 23, 23)), ("baz", (42, 42, 42)),]));
}
#[test]
fn ctx_supports_conjunctive() {
let input = r#"
foo_version: 42.0.0
bar_version: 4711.0.0
baz_version: 23.0.0
"#;
let mock = MockTestContext::new(input);
assert!(mock.supports([
&[
("foo", (43, 0, 0)), ("bar", (151, 0, 0)) ][..],
&[("baz", (23, 0, 0))], ]));
assert!(!mock.supports([
&[
("foo", (43, 0, 0)), ("bar", (4712, 0, 0)) ][..],
&[("baz", (23, 0, 0))], ]));
assert!(!mock.supports([
&[
("foo", (43, 0, 0)), ("bar", (151, 0, 0)) ][..],
&[("baz", (151, 0, 0))][..], ]));
}
#[test]
fn ctx_live_test_server() {
let ctx = TestContext::new();
let mut conn = ctx.connection();
let components = AvailableComponents::from(&mut conn);
assert!(components.supports(REDIS_CE_6_0));
}
#[test]
fn component_parse_single_all_single_digit() {
let input = "foo_version: 10203";
let components = build_available_components(input);
assert_components_eq(components, vec![("foo", (1, 2, 3))]);
}
#[test]
fn component_parse_single_multiple_digits_suffixed() {
let input = "foo_version: 1234567-rc23";
let components = build_available_components(input);
assert_components_eq(components, vec![("foo", (123, 45, 67))]);
}
#[test]
fn component_parse_triplet_all_single_digit() {
let input = "foo_version: 4.2.6";
let components = build_available_components(input);
assert_components_eq(components, vec![("foo", (4, 2, 6))]);
}
#[test]
fn component_parse_triplet_multiple_digits_suffixed() {
let input = "foo_version: 42.4711.23-rc121";
let components = build_available_components(input);
assert_components_eq(components, vec![("foo", (42, 4711, 23))]);
}
#[test]
fn component_parse_multiline_simple_server_version() {
let input = r#"
bar: baz
foo_version:4711.23.42
quux: quuux
"#;
let components = build_available_components(input);
assert_components_eq(components, vec![("foo", (4711, 23, 42))]);
}
#[test]
fn component_parse_multiline_simple_module_version() {
let input = r#"
bar: baz
module:name=foo,ver=47112342
quux: quuux
"#;
let components = build_available_components(input);
assert_components_eq(components, vec![("foo", (4711, 23, 42))]);
}
#[test]
fn component_parse_mix() {
let input = r#"
foo_version : 2600.3.14159 # with whitespace padding
#bar_version:1.2.3 # commented out
this is # partly commented out
module : foo=bar, ver = 47112342, quux=quuux, name = baz , baz =
"#;
let components = build_available_components(input);
assert_components_eq(
components,
vec![("foo", (2600, 3, 14159)), ("baz", (4711, 23, 42))],
);
}