use super::Open;
use crate::core::entity::{Cycle, Page, TeamId};
use crate::core::store::{List, ListOf, Store};
#[derive(Debug, Clone, PartialEq)]
pub enum Request {
TeamCycles {
team_id: TeamId,
after: Option<String>,
},
}
impl Request {
pub fn cursor(&self) -> Option<&str> {
match self {
Self::TeamCycles { after, .. } => after.as_deref(),
}
}
}
pub fn open_team_cycles(store: &mut Store, team_id: TeamId) -> Open {
store
.open_list(List::Cycles, ListOf::TeamCycles(team_id))
.into()
}
pub fn next_page(store: &mut Store) -> Option<super::Request> {
store.next_page(List::Cycles).map(super::Request::page)
}
pub fn reload(store: &mut Store) -> Option<super::Request> {
store.reload_list(List::Cycles).map(super::Request::page)
}
pub fn take_page(store: &mut Store, of: &ListOf, page: Page<Cycle>) -> bool {
store.cycles.accept_for(of, page)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::entity::PageInfo;
fn cycles(more: bool) -> Page<Cycle> {
let cycle: Cycle = serde_json::from_str(r#"{"id":"c","number":1}"#).unwrap();
let info = PageInfo {
has_next_page: more,
end_cursor: more.then(|| "c1".into()),
};
Page::new(vec![cycle], info, false)
}
#[test]
fn a_teams_cycles_are_fetched_once() {
let mut store = Store::default();
assert_eq!(
open_team_cycles(&mut store, TeamId::from("t")).request(),
Some(crate::core::usecase::Request::Cycle(Request::TeamCycles {
team_id: "t".into(),
after: None
}))
);
take_page(
&mut store,
&ListOf::TeamCycles(TeamId::from("t")),
cycles(false),
);
assert_eq!(
open_team_cycles(&mut store, TeamId::from("t")),
Open::Cached
);
}
#[test]
fn cycles_for_a_team_left_behind_are_dropped() {
let mut store = Store::default();
open_team_cycles(&mut store, TeamId::from("u"));
assert!(!take_page(
&mut store,
&ListOf::TeamCycles(TeamId::from("t")),
cycles(false)
));
}
#[test]
fn the_next_page_is_asked_for_once() {
let mut store = Store::default();
open_team_cycles(&mut store, TeamId::from("t"));
take_page(
&mut store,
&ListOf::TeamCycles(TeamId::from("t")),
cycles(true),
);
assert!(next_page(&mut store).is_some());
assert_eq!(next_page(&mut store), None);
assert_eq!(
reload(&mut store),
Some(crate::core::usecase::Request::Cycle(Request::TeamCycles {
team_id: "t".into(),
after: None
}))
);
}
}