2020parse_schedule = _funcs ["parse_schedule" ]
2121parse_machine_state = _funcs ["parse_machine_state" ]
2222get_program_name = _funcs ["get_program_name" ]
23+ parse_link_header = _funcs ["parse_link_header" ]
2324
2425
2526# ---------------------------------------------------------------------------
@@ -663,6 +664,35 @@ def test_forced_program_target_metric_fallback_via_frontmatter(self):
663664 assert target == 0.95
664665
665666
667+ # ---------------------------------------------------------------------------
668+ # parseLinkHeader — extract next-page URL from GitHub API Link header
669+ # ---------------------------------------------------------------------------
670+
671+ class TestParseLinkHeader :
672+ def test_returns_null_for_none (self ):
673+ assert parse_link_header (None ) is None
674+
675+ def test_returns_null_for_empty_string (self ):
676+ assert parse_link_header ("" ) is None
677+
678+ def test_extracts_next_url (self ):
679+ header = '<https://api.github.com/repos/o/r/issues?page=2&per_page=100>; rel="next", <https://api.github.com/repos/o/r/issues?page=5&per_page=100>; rel="last"'
680+ assert parse_link_header (header ) == "https://api.github.com/repos/o/r/issues?page=2&per_page=100"
681+
682+ def test_returns_null_when_no_next (self ):
683+ header = '<https://api.github.com/repos/o/r/issues?page=1&per_page=100>; rel="prev", <https://api.github.com/repos/o/r/issues?page=5&per_page=100>; rel="last"'
684+ assert parse_link_header (header ) is None
685+
686+ def test_next_not_first (self ):
687+ """next rel is not the first segment."""
688+ header = '<https://api.github.com/repos/o/r/issues?page=1&per_page=100>; rel="prev", <https://api.github.com/repos/o/r/issues?page=3&per_page=100>; rel="next", <https://api.github.com/repos/o/r/issues?page=5&per_page=100>; rel="last"'
689+ assert parse_link_header (header ) == "https://api.github.com/repos/o/r/issues?page=3&per_page=100"
690+
691+ def test_single_next_segment (self ):
692+ header = '<https://api.github.com/repos/o/r/issues?page=2&per_page=100>; rel="next"'
693+ assert parse_link_header (header ) == "https://api.github.com/repos/o/r/issues?page=2&per_page=100"
694+
695+
666696# ---------------------------------------------------------------------------
667697# Extraction sanity check — verify conftest.py found the expected functions
668698# ---------------------------------------------------------------------------
@@ -677,6 +707,9 @@ def test_parse_machine_state_extracted(self):
677707 def test_get_program_name_extracted (self ):
678708 assert callable (get_program_name )
679709
710+ def test_parse_link_header_extracted (self ):
711+ assert callable (parse_link_header )
712+
680713 def test_read_program_state_extracted (self ):
681714 # read_program_state exists in the workflow but depends on file I/O
682715 assert "read_program_state" in _funcs
0 commit comments