use onetaskgraph_github_projects::{NODE_COUNT_LIMIT, graphql, worst_case_node_count};
fn over_limit(doing: &str, document: &str) -> Option<String> {
let count = worst_case_node_count(document)
.unwrap_or_else(|error| panic!("the document for {doing} could not be counted: {error}"));
(count >= NODE_COUNT_LIMIT).then(|| {
format!(
"the document for {doing} may return {count} nodes, at or above GitHub's limit \
of {NODE_COUNT_LIMIT}; next: give one of its connections a smaller page size, \
or stop selecting it"
)
})
}
#[test]
fn every_document_this_source_sends_stays_under_githubs_node_limit() {
let refused = graphql::DOCUMENTS
.iter()
.filter_map(|(document, doing)| over_limit(doing, document))
.collect::<Vec<_>>();
assert!(refused.is_empty(), "{}", refused.join("\n"));
}
#[test]
fn the_documents_that_reach_an_issue_under_a_page_are_the_ones_with_least_headroom() {
let count = |document: &str| worst_case_node_count(document).expect("a countable document");
assert_eq!(count(graphql::SEARCH_ISSUES), 56_100);
assert_eq!(count(graphql::SUB_ISSUES), 56_100);
assert_eq!(count(graphql::BOARD), 260_150);
assert_eq!(count(graphql::ISSUE), 560);
assert_eq!(count(graphql::ISSUE_DEPENDENCIES), 200);
assert_eq!(count(graphql::REPOSITORY), 0);
}
const SEARCH_ISSUES_BEFORE_THE_FIX: &str = r#"query($search:String!,$type:SearchType!,$first:Int!,$after:String,$nestedFirst:Int!,$boardItems:Int!,$duplicates:Boolean!){
search(query:$search,type:$type,first:$first,after:$after){
pageInfo{hasNextPage endCursor}
nodes{__typename ...BoardIssue}
}
} fragment BoardIssue on Issue{__typename id title body url createdAt updatedAt state stateReason(enableDuplicate:$duplicates) repository{nameWithOwner} parent{id} subIssuesSummary{total}
labels(first:$nestedFirst){nodes{id name color}pageInfo{hasNextPage}}
projectItems(first:$boardItems){nodes{id project{number}
fieldValues(first:$nestedFirst){nodes{
... on ProjectV2ItemFieldSingleSelectValue{name field{
... on ProjectV2SingleSelectField{id name options{id name}}
}}
... on ProjectV2ItemFieldTextValue{text field{... on ProjectV2Field{id name}}}
... on ProjectV2ItemFieldLabelValue{labels(first:$nestedFirst){nodes{id name color}pageInfo{hasNextPage}}}
}pageInfo{hasNextPage}}}pageInfo{hasNextPage}}}"#;
#[test]
fn the_check_reports_a_failure_naming_an_over_limit_document_and_its_count() {
let refusal = over_limit(
"searching this board's issues before the fix",
SEARCH_ISSUES_BEFORE_THE_FIX,
)
.expect("the pre-fix document is over the limit");
assert!(
refusal.contains("searching this board's issues before the fix"),
"{refusal}"
);
assert!(refusal.contains("2556100"), "{refusal}");
assert!(refusal.contains("500000"), "{refusal}");
}
#[test]
fn the_count_sums_sibling_paths_rather_than_taking_the_deepest_one() {
assert_eq!(
worst_case_node_count(SEARCH_ISSUES_BEFORE_THE_FIX).expect("a countable document"),
2_556_100
);
}