1414import os
1515sys .path .insert (0 , os .path .dirname (__file__ ))
1616
17- from update_dependency_changes import merge_changes , render_section
17+ from update_dependency_changes import merge_changes , render_section , normalize_version , extract_preamble
1818
1919
2020def test_update_then_revert ():
@@ -367,12 +367,83 @@ def test_document_format():
367367 print ("-" * 60 + "\n " )
368368
369369
370+ def test_extract_preamble_with_seo_block ():
371+ """Test: content with a JSON SEO block before the heading."""
372+ print ("Test 17: extract_preamble - preamble before heading" )
373+ content = (
374+ "```json\n "
375+ "//[doc-seo]\n "
376+ "{\n "
377+ ' "Description": "Some description."\n '
378+ "}\n "
379+ "```\n "
380+ "\n "
381+ "# Package Version Changes\n "
382+ "\n "
383+ "## 10.1.0-rc.1\n "
384+ )
385+ result = extract_preamble (content )
386+ assert result == "```json\n //[doc-seo]\n {\n \" Description\" : \" Some description.\" \n }\n ```\n \n " , \
387+ f"Unexpected preamble: { repr (result )} "
388+ print ("✓ Passed: preamble correctly extracted\n " )
389+
390+
391+ def test_extract_preamble_no_preamble ():
392+ """Test: heading at the very start — preamble should be empty string."""
393+ print ("Test 18: extract_preamble - no preamble before heading" )
394+ content = "# Package Version Changes\n \n ## 10.1.0-rc.1\n "
395+ result = extract_preamble (content )
396+ assert result == "" , f"Expected empty string, got: { repr (result )} "
397+ print ("✓ Passed: empty preamble returned when heading is at start\n " )
398+
399+
400+ def test_extract_preamble_no_heading ():
401+ """Test: no matching heading — returns empty string."""
402+ print ("Test 19: extract_preamble - no matching heading" )
403+ content = "Some random content without the expected heading.\n "
404+ result = extract_preamble (content )
405+ assert result == "" , f"Expected empty string, got: { repr (result )} "
406+ print ("✓ Passed: empty string returned when heading is absent\n " )
407+
408+
409+ def test_normalize_version_preview ():
410+ """Test: preview suffix is normalized to rc.1."""
411+ print ("Test 20: normalize_version - preview -> rc.1" )
412+ assert normalize_version ("10.1.0-preview" ) == "10.1.0-rc.1" , \
413+ f"Expected '10.1.0-rc.1', got: { normalize_version ('10.1.0-preview' )} "
414+ assert normalize_version ("10.2.0-preview" ) == "10.2.0-rc.1" , \
415+ f"Expected '10.2.0-rc.1', got: { normalize_version ('10.2.0-preview' )} "
416+ print ("✓ Passed: preview correctly normalized to rc.1\n " )
417+
418+
419+ def test_normalize_version_rc ():
420+ """Test: rc.N versions are unchanged."""
421+ print ("Test 21: normalize_version - rc.N unchanged" )
422+ assert normalize_version ("10.1.0-rc.1" ) == "10.1.0-rc.1" , \
423+ f"Expected '10.1.0-rc.1', got: { normalize_version ('10.1.0-rc.1' )} "
424+ assert normalize_version ("10.2.0-rc.1" ) == "10.2.0-rc.1" , \
425+ f"Expected '10.2.0-rc.1', got: { normalize_version ('10.2.0-rc.1' )} "
426+ assert normalize_version ("10.2.0-rc.2" ) == "10.2.0-rc.2" , \
427+ f"Expected '10.2.0-rc.2', got: { normalize_version ('10.2.0-rc.2' )} "
428+ print ("✓ Passed: rc.N versions unchanged\n " )
429+
430+
431+ def test_normalize_version_stable ():
432+ """Test: stable versions are unchanged."""
433+ print ("Test 22: normalize_version - stable unchanged" )
434+ assert normalize_version ("10.1.0" ) == "10.1.0" , \
435+ f"Expected '10.1.0', got: { normalize_version ('10.1.0' )} "
436+ assert normalize_version ("10.2.0" ) == "10.2.0" , \
437+ f"Expected '10.2.0', got: { normalize_version ('10.2.0' )} "
438+ print ("✓ Passed: stable versions unchanged\n " )
439+
440+
370441def run_all_tests ():
371442 """Run all test cases."""
372443 print ("=" * 70 )
373444 print ("Testing update_dependency_changes.py" )
374445 print ("=" * 70 + "\n " )
375-
446+
376447 test_update_then_revert ()
377448 test_add_then_remove_same_version ()
378449 test_remove_then_add_same_version ()
@@ -389,16 +460,24 @@ def run_all_tests():
389460 test_add_add ()
390461 test_complex_chain_ending_in_original ()
391462 test_document_format ()
392-
463+ test_extract_preamble_with_seo_block ()
464+ test_extract_preamble_no_preamble ()
465+ test_extract_preamble_no_heading ()
466+ test_normalize_version_preview ()
467+ test_normalize_version_rc ()
468+ test_normalize_version_stable ()
469+
393470 print ("=" * 70 )
394- print ("All 16 tests passed! ✓" )
471+ print ("All 22 tests passed! ✓" )
395472 print ("=" * 70 )
396473 print ("\n Test coverage summary:" )
397474 print (" ✓ Basic scenarios (update, add, remove)" )
398475 print (" ✓ Version revert handling" )
399476 print (" ✓ Complex multi-step sequences" )
400477 print (" ✓ Edge cases and duplicates" )
401478 print (" ✓ Document format validation" )
479+ print (" ✓ Preamble extraction (SEO block, no preamble, no heading)" )
480+ print (" ✓ Version normalization (preview -> rc.1)" )
402481 print ("=" * 70 )
403482
404483
0 commit comments