"""Tests for the exact-file preview shown before Pre-edit Backup restoration.""" import pytest from hosts.core.restore_preview import RestorePreviewError, create_restore_preview def test_preview_pairs_current_and_restored_lines_in_changed_hunks(tmp_path): """The current Hosts File is the left/before side of the preview.""" backup = tmp_path / "hosts.backup" hosts_file = tmp_path / "hosts" backup.write_text("127.0.0.1 localhost\n192.0.2.1 restored.test\n") hosts_file.write_text("127.0.0.1 localhost\n192.0.2.2 current.test\n") preview = create_restore_preview(backup, hosts_file) assert preview.has_changes row = preview.changed_hunks[0].rows[1] assert row.current_line_number == 2 assert row.restored_line_number == 2 assert row.current_text == "192.0.2.2 current.test" assert row.restored_text == "192.0.2.1 restored.test" def test_preview_distinguishes_missing_final_newlines(tmp_path): backup = tmp_path / "hosts.backup" hosts_file = tmp_path / "hosts" backup.write_bytes(b"127.0.0.1 localhost\n") hosts_file.write_bytes(b"127.0.0.1 localhost") preview = create_restore_preview(backup, hosts_file) assert preview.has_changes assert preview.restored_has_final_newline assert not preview.current_has_final_newline def test_preview_rejects_files_that_cannot_be_decoded_as_hosts_text(tmp_path): backup = tmp_path / "hosts.backup" hosts_file = tmp_path / "hosts" backup.write_bytes(b"\xff") hosts_file.write_text("127.0.0.1 localhost\n") with pytest.raises(RestorePreviewError, match="Pre-edit Backup"): create_restore_preview(backup, hosts_file) def test_preview_detects_when_either_reviewed_file_changes(tmp_path): backup = tmp_path / "hosts.backup" hosts_file = tmp_path / "hosts" backup.write_text("127.0.0.1 localhost\n") hosts_file.write_text("192.0.2.2 current.test\n") preview = create_restore_preview(backup, hosts_file) hosts_file.write_text("192.0.2.3 changed.test\n") assert not preview.matches_files() def test_full_preview_keeps_lines_outside_changed_hunk_context(tmp_path): """Full mode retains the complete files after changed hunks are calculated.""" backup = tmp_path / "hosts.backup" hosts_file = tmp_path / "hosts" current_lines = [f"192.0.2.{index} host-{index}.test" for index in range(1, 41)] restored_lines = current_lines.copy() restored_lines[19] = "192.0.2.20 restored.test" hosts_file.write_text("\n".join(current_lines) + "\n") backup.write_text("\n".join(restored_lines) + "\n") preview = create_restore_preview(backup, hosts_file) assert len(preview.changed_hunks[0].rows) == 7 assert len(preview.full_hunks[0].rows) == 40