use serde::Deserialize;
use crate::PgTaskId;
pub(crate) const INSERT_EVENT_IDS_CAP: usize = 65_536;
#[derive(Debug, Deserialize)]
pub(crate) struct InsertEvent {
pub(crate) job_type: String,
#[serde(default)]
pub(crate) id: Option<PgTaskId>,
#[serde(default)]
pub(crate) ids: Vec<PgTaskId>,
}
impl InsertEvent {
pub(crate) fn into_ids(self) -> (String, Vec<PgTaskId>) {
let Self {
job_type,
id,
mut ids,
} = self;
if ids.len() > INSERT_EVENT_IDS_CAP {
ids.truncate(INSERT_EVENT_IDS_CAP);
}
if !ids.is_empty() {
(job_type, ids)
} else {
(job_type, id.into_iter().collect())
}
}
}
#[cfg(test)]
mod tests {
use lets_expect::lets_expect;
use ulid::Ulid;
use super::*;
fn task_id() -> PgTaskId {
PgTaskId::new(Ulid::new())
}
fn event(id: Option<PgTaskId>, ids_len: usize) -> InsertEvent {
InsertEvent {
job_type: "emails".to_string(),
id,
ids: (0..ids_len).map(|_| task_id()).collect(),
}
}
fn resolved_id_count(id: Option<PgTaskId>, ids_len: usize) -> usize {
event(id, ids_len).into_ids().1.len()
}
fn resolved_job_type(id: Option<PgTaskId>, ids_len: usize) -> String {
event(id, ids_len).into_ids().0
}
lets_expect! {
expect(resolved_id_count(id, ids_len)) {
let id: Option<PgTaskId> = None;
let ids_len = 3_usize;
to returns_every_id { equal(3) }
when the_ids_array_length_equals_the_cap {
let ids_len = INSERT_EVENT_IDS_CAP;
to keeps_every_id_without_truncating { equal(INSERT_EVENT_IDS_CAP) }
}
when the_ids_array_length_is_one_above_the_cap {
let ids_len = INSERT_EVENT_IDS_CAP + 1;
to truncates_to_exactly_the_cap { equal(INSERT_EVENT_IDS_CAP) }
}
when both_an_ids_array_and_a_legacy_id_are_present {
let id = Some(task_id());
to prefers_the_ids_array_and_ignores_the_legacy_id { equal(3) }
}
when only_a_legacy_id_is_present {
let ids_len = 0;
let id = Some(task_id());
to falls_back_to_the_single_legacy_id { equal(1) }
}
when neither_an_ids_array_nor_a_legacy_id_is_present {
let ids_len = 0;
to returns_no_ids { equal(0) }
}
}
expect(resolved_job_type(None, 1)) {
to passes_the_job_type_through_unchanged { equal("emails".to_string()) }
}
}
}