diff --git a/confluence-mdx/tests/test_reverse_sync_patch_builder.py b/confluence-mdx/tests/test_reverse_sync_patch_builder.py index ef32f8ac6..e07645279 100644 --- a/confluence-mdx/tests/test_reverse_sync_patch_builder.py +++ b/confluence-mdx/tests/test_reverse_sync_patch_builder.py @@ -2967,6 +2967,57 @@ def test_image_anchor_list_keeps_collapsed_text_diff(self): ) assert patches[0]['new_plain_text'] == '목록 좌측 상단에서 Delete 버튼을 클릭합니다.' + def test_image_anchor_list_marker_ws_change_produces_patch(self): + """이미지 preserved anchor 리스트의 마커 뒤 공백 변경도 패치를 생성한다.""" + xhtml = ( + '
  1. 목록 좌측 상단에서 Delete 버튼을 클릭합니다.

    ' + '' + '' + '

' + ) + old_content = ( + '4. 목록 좌측 상단에서 Delete 버튼을 클릭합니다.
\n' + '
\n' + ' img\n' + '
\n' + ) + new_content = ( + '4. 목록 좌측 상단에서 Delete 버튼을 클릭합니다.
\n' + '
\n' + ' img\n' + '
\n' + ) + change = _make_change(0, old_content, new_content, type_='list') + mapping = BlockMapping( + block_id='list-image-ws-1', + type='list', + xhtml_xpath='ol[1]', + xhtml_text=xhtml, + xhtml_plain_text='목록 좌측 상단에서 Delete 버튼을 클릭합니다.', + xhtml_element_index=0, + children=[], + ) + roundtrip_sidecar = _make_roundtrip_sidecar([ + SidecarBlock(0, 'ol[1]', xhtml, sha256_text(old_content), (1, 4)) + ]) + + patches, _, skipped = build_patches( + [change], [change.old_block], [change.new_block], + mappings=[mapping], + roundtrip_sidecar=roundtrip_sidecar, + ) + + assert len(patches) == 1, ( + f"마커 공백만 변경된 이미지 preserved anchor 리스트도 패치를 생성해야 합니다. skipped={skipped}" + ) + assert patches[0].get('action') == 'replace_fragment', ( + f"preserved anchor 리스트는 replace_fragment 패치여야 합니다: {patches[0]}" + ) + new_xhtml = patches[0].get('new_element_xhtml', '') + assert '