pub(crate) mod grpc_server;
pub(crate) mod web_api_server;
use concepts::prefixed_ulid::DeploymentId;
use concepts::storage::{DeploymentState, Pagination};
pub(crate) fn should_add_current_deployment(
pagination: &Pagination<Option<DeploymentId>>,
current_deployment_id: DeploymentId,
states: &[DeploymentState],
) -> bool {
let current_not_in_results =
states.first().map(|dep| dep.deployment_id) != Some(current_deployment_id);
match pagination {
Pagination::OlderThan { cursor: None, .. } => current_not_in_results,
Pagination::OlderThan {
cursor: Some(cursor),
including_cursor: true,
..
} if *cursor == current_deployment_id => current_not_in_results,
Pagination::NewerThan {
length,
cursor,
including_cursor,
} => {
let excluded_by_cursor = *cursor == Some(current_deployment_id) && !including_cursor;
states.len() < usize::from(*length) && current_not_in_results && !excluded_by_cursor
}
Pagination::OlderThan { .. } => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn older_than_no_cursor_adds_current_if_missing() {
let current = DeploymentId::generate();
let other = DeploymentId::generate();
let pagination = Pagination::OlderThan {
length: 20,
cursor: None,
including_cursor: false,
};
let states = vec![DeploymentState::new(other)];
assert!(should_add_current_deployment(&pagination, current, &states));
let states = vec![DeploymentState::new(current)];
assert!(!should_add_current_deployment(
&pagination,
current,
&states
));
let states: Vec<DeploymentState> = vec![];
assert!(should_add_current_deployment(&pagination, current, &states));
}
#[test]
fn older_than_with_cursor_current_including_adds_if_missing() {
let current = DeploymentId::generate();
let other = DeploymentId::generate();
let pagination = Pagination::OlderThan {
length: 20,
cursor: Some(current),
including_cursor: true,
};
let states = vec![DeploymentState::new(other)];
assert!(should_add_current_deployment(&pagination, current, &states));
let states = vec![DeploymentState::new(current)];
assert!(!should_add_current_deployment(
&pagination,
current,
&states
));
}
#[test]
fn older_than_with_cursor_current_excluding_does_not_add() {
let current = DeploymentId::generate();
let pagination = Pagination::OlderThan {
length: 20,
cursor: Some(current),
including_cursor: false,
};
let states: Vec<DeploymentState> = vec![];
assert!(!should_add_current_deployment(
&pagination,
current,
&states
));
}
#[test]
fn older_than_with_other_cursor_does_not_add() {
let current = DeploymentId::generate();
let other = DeploymentId::generate();
let pagination = Pagination::OlderThan {
length: 20,
cursor: Some(other),
including_cursor: true,
};
let states: Vec<DeploymentState> = vec![];
assert!(!should_add_current_deployment(
&pagination,
current,
&states
));
}
#[test]
fn newer_than_fewer_results_adds_current_if_missing() {
let current = DeploymentId::generate();
let other = DeploymentId::generate();
let pagination = Pagination::NewerThan {
length: 20,
cursor: Some(other),
including_cursor: false,
};
let states = vec![DeploymentState::new(other)];
assert!(should_add_current_deployment(&pagination, current, &states));
let states: Vec<DeploymentState> = vec![];
assert!(should_add_current_deployment(&pagination, current, &states));
}
#[test]
fn newer_than_full_results_does_not_add() {
let current = DeploymentId::generate();
let pagination = Pagination::NewerThan {
length: 2,
cursor: None,
including_cursor: false,
};
let states = vec![
DeploymentState::new(DeploymentId::generate()),
DeploymentState::new(DeploymentId::generate()),
];
assert!(!should_add_current_deployment(
&pagination,
current,
&states
));
}
#[test]
fn newer_than_cursor_current_excluding_does_not_add() {
let current = DeploymentId::generate();
let pagination = Pagination::NewerThan {
length: 20,
cursor: Some(current),
including_cursor: false,
};
let states: Vec<DeploymentState> = vec![];
assert!(!should_add_current_deployment(
&pagination,
current,
&states
));
}
#[test]
fn newer_than_cursor_current_including_adds_if_missing() {
let current = DeploymentId::generate();
let pagination = Pagination::NewerThan {
length: 20,
cursor: Some(current),
including_cursor: true,
};
let states: Vec<DeploymentState> = vec![];
assert!(should_add_current_deployment(&pagination, current, &states));
}
#[test]
fn does_not_add_if_current_already_first() {
let current = DeploymentId::generate();
let states = vec![DeploymentState::new(current)];
let pagination = Pagination::OlderThan {
length: 20,
cursor: None,
including_cursor: false,
};
assert!(!should_add_current_deployment(
&pagination,
current,
&states
));
let pagination = Pagination::NewerThan {
length: 20,
cursor: None,
including_cursor: false,
};
assert!(!should_add_current_deployment(
&pagination,
current,
&states
));
}
}