beets/test/ui/test_field_diff.py
2025-12-27 14:30:35 +00:00

59 lines
2.7 KiB
Python

import pytest
from beets.library import Item
from beets.ui import _field_diff
p = pytest.param
class TestFieldDiff:
@pytest.fixture(autouse=True)
def configure_color(self, config, color):
config["ui"]["color"] = color
@pytest.fixture(autouse=True)
def patch_colorize(self, monkeypatch):
"""Patch to return a deterministic string format instead of ANSI codes."""
monkeypatch.setattr(
"beets.ui.colorize",
lambda color_name, text: f"[{color_name}]{text}[/]",
)
@staticmethod
def diff_fmt(old, new):
return f"[text_diff_removed]{old}[/] -> [text_diff_added]{new}[/]"
@pytest.mark.parametrize(
"old_data, new_data, field, expected_diff",
[
p({"title": "foo"}, {"title": "foo"}, "title", None, id="no_change"),
p({"bpm": 120.0}, {"bpm": 120.005}, "bpm", None, id="float_close_enough"),
p({"bpm": 120.0}, {"bpm": 121.0}, "bpm", f"bpm: {diff_fmt('120', '121')}", id="float_changed"),
p({"title": "foo"}, {"title": "bar"}, "title", f"title: {diff_fmt('foo', 'bar')}", id="string_full_replace"),
p({"title": "prefix foo"}, {"title": "prefix bar"}, "title", "title: prefix [text_diff_removed]foo[/] -> prefix [text_diff_added]bar[/]", id="string_partial_change"),
p({"year": 2000}, {"year": 2001}, "year", f"year: {diff_fmt('2000', '2001')}", id="int_changed"),
p({}, {"genre": "Rock"}, "genre", "genre: -> [text_diff_added]Rock[/]", id="field_added"),
p({"genre": "Rock"}, {}, "genre", "genre: [text_diff_removed]Rock[/] -> ", id="field_removed"),
p({"track": 1}, {"track": 2}, "track", f"track: {diff_fmt('01', '02')}", id="formatted_value_changed"),
p({"mb_trackid": None}, {"mb_trackid": "1234"}, "mb_trackid", "mb_trackid: -> [text_diff_added]1234[/]", id="none_to_value"),
p({}, {"new_flex": "foo"}, "new_flex", "[text_diff_added]new_flex: foo[/]", id="flex_field_added"),
p({"old_flex": "foo"}, {}, "old_flex", "[text_diff_removed]old_flex: foo[/]", id="flex_field_removed"),
],
) # fmt: skip
@pytest.mark.parametrize("color", [True], ids=["color_enabled"])
def test_field_diff_colors(self, old_data, new_data, field, expected_diff):
old_item = Item(**old_data)
new_item = Item(**new_data)
diff = _field_diff(field, old_item.formatted(), new_item.formatted())
assert diff == expected_diff
@pytest.mark.parametrize("color", [False], ids=["color_disabled"])
def test_field_diff_no_color(self):
old_item = Item(title="foo")
new_item = Item(title="bar")
diff = _field_diff("title", old_item.formatted(), new_item.formatted())
assert diff == "title: foo -> bar"