File size: 3,896 Bytes
6ce7899 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | """Unit tests for the NJC directive ingester (canlex/directive.py). Offline only.
The ingester is a full rebuild, so anything a run fails to parse disappears from
directives.json -- the shape of the 2026-07-27 D-memo loss, one directive at a
time. These cover which directives get their last-good chunks back, and the
act_code identity that decision hangs on.
"""
import unittest
from canlex import directive
class PreserveFailedTests(unittest.TestCase):
STORED = [{"act_code": "d4", "text": "relocation"},
{"act_code": "d4", "text": "part two"},
{"act_code": "fsd-dse", "text": "foreign service"}]
def test_unparseable_directive_keeps_its_last_good_chunks(self):
failures = [("d4", "NJC Relocation Directive", "no content parsed")]
chunks, preserved = directive.preserve_failed([], failures, self.STORED)
self.assertEqual(preserved, ["d4"])
self.assertEqual(len(chunks), 2)
def test_freshly_parsed_chunks_win_over_stored(self):
fresh = [{"act_code": "d4", "text": "new text"}]
failures = [("d4", "NJC Relocation Directive", "404")]
chunks, preserved = directive.preserve_failed(fresh, failures,
self.STORED)
self.assertEqual((chunks, preserved), (fresh, []))
def test_directive_dropped_from_the_index_is_not_resurrected(self):
# Not in this run and not a failure: the NJC retired it on purpose.
chunks, preserved = directive.preserve_failed([], [], self.STORED)
self.assertEqual((chunks, preserved), ([], []))
def test_directive_we_never_stored_cannot_be_preserved(self):
failures = [("d99", "Brand New Directive", "404")]
chunks, preserved = directive.preserve_failed([], failures, self.STORED)
self.assertEqual((chunks, preserved), ([], []))
def test_a_retitled_directive_is_still_matched(self):
# Identity is the URL slug, so an NJC reword of the index title (which
# is all `failures` used to carry) does not lose the stored chunks.
failures = [("fsd-dse", "Foreign Service Directives (2026 edition)",
"no content parsed")]
chunks, preserved = directive.preserve_failed([], failures, self.STORED)
self.assertEqual(preserved, ["fsd-dse"])
self.assertEqual([c["text"] for c in chunks], ["foreign service"])
def test_each_failed_directive_is_restored_once(self):
failures = [("d4", "Relocation", "404"),
("fsd-dse", "Foreign Service Directives", "404")]
chunks, preserved = directive.preserve_failed([], failures, self.STORED)
self.assertEqual(preserved, ["d4", "fsd-dse"])
self.assertEqual(len(chunks), 3)
class FailureIdentityTests(unittest.TestCase):
"""The failure tuple's code must be the one parse_directive stamps on
chunks, or preservation silently matches nothing."""
URL = "https://www.njc-cnm.gc.ca/directive/d99/en"
HTML = ("<main><h2>1.1 Purpose</h2><p>The purpose of this directive.</p>"
"</main>")
def test_parsed_chunks_carry_the_code_from_the_url(self):
chunks = directive.parse_directive(self.HTML, self.URL, "Test Directive",
"2026-01-01")
self.assertTrue(chunks)
self.assertEqual({c["act_code"] for c in chunks}, {"d99"})
def test_the_ingest_loop_derives_the_same_code(self):
code = directive._CODE.search(self.URL).group(1)
chunks = directive.parse_directive(self.HTML, self.URL, "Test Directive",
"")
stored = [dict(c) for c in chunks]
_chunks, preserved = directive.preserve_failed(
[], [(code, "Test Directive", "404")], stored)
self.assertEqual(preserved, [code])
if __name__ == "__main__":
unittest.main()
|