diff options
Diffstat (limited to 'tests/test_delimiters_category.py')
| -rw-r--r-- | tests/test_delimiters_category.py | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/tests/test_delimiters_category.py b/tests/test_delimiters_category.py new file mode 100644 index 0000000..df5e950 --- /dev/null +++ b/tests/test_delimiters_category.py @@ -0,0 +1,257 @@ +"""Tests for the Delimiters category in settings dialog.""" + +from unittest.mock import Mock, patch + +import pytest +from PySide6 import QtWidgets + +from tidal_dl_ng.dialog import DialogPreferences +from tidal_dl_ng.ui.dialog_settings import Ui_DialogSettings + + +@pytest.fixture +def qapp(): + """Create QApplication instance for tests.""" + app = QtWidgets.QApplication.instance() + if app is None: + app = QtWidgets.QApplication([]) + yield app + + +class TestDelimitersPage: + """Test the Delimiters page specifically.""" + + def test_delimiters_page_exists(self, qapp): + """Test that the Delimiters page exists.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + assert hasattr(ui, "page_delimiters") + assert ui.page_delimiters is not None + + def test_delimiters_page_is_fifth(self, qapp): + """Test that the Delimiters page is at index 4.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + assert ui.sw_categories.widget(4) == ui.page_delimiters + + def test_delimiters_groupbox_exists(self, qapp): + """Test that the Delimiters GroupBox exists.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + assert hasattr(ui, "gb_delimiters") + assert ui.gb_delimiters is not None + assert isinstance(ui.gb_delimiters, QtWidgets.QGroupBox) + + def test_delimiters_page_has_four_line_edits(self, qapp): + """Test that the Delimiters page has 4 line edits.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + line_edits = ui.page_delimiters.findChildren(QtWidgets.QLineEdit) + assert len(line_edits) == 4, "Delimiters page should have 4 line edits" + + def test_all_delimiter_line_edits_accessible(self, qapp): + """Test that all delimiter line edits are accessible.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + line_edit_names = [ + "le_metadata_delimiter_artist", + "le_metadata_delimiter_album_artist", + "le_filename_delimiter_artist", + "le_filename_delimiter_album_artist", + ] + + for name in line_edit_names: + line_edit = getattr(ui, name, None) + assert line_edit is not None, f"LineEdit {name} not found" + assert isinstance(line_edit, QtWidgets.QLineEdit) + + def test_delimiter_line_edits_have_max_width(self, qapp): + """Test that delimiter line edits have a maximum width set.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + line_edit_names = [ + "le_metadata_delimiter_artist", + "le_metadata_delimiter_album_artist", + "le_filename_delimiter_artist", + "le_filename_delimiter_album_artist", + ] + + for name in line_edit_names: + line_edit = getattr(ui, name) + # Should have max width of 100px + assert line_edit.maximumWidth() == 100, f"{name} should have max width of 100px" + + def test_delimiter_labels_exist(self, qapp): + """Test that labels and icon labels exist for each delimiter.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + label_names = [ + ("l_metadata_delimiter_artist", "l_icon_metadata_delimiter_artist"), + ("l_metadata_delimiter_album_artist", "l_icon_metadata_delimiter_album_artist"), + ("l_filename_delimiter_artist", "l_icon_filename_delimiter_artist"), + ("l_filename_delimiter_album_artist", "l_icon_filename_delimiter_album_artist"), + ] + + for label_name, icon_label_name in label_names: + label = getattr(ui, label_name, None) + icon_label = getattr(ui, icon_label_name, None) + + assert label is not None, f"Label {label_name} not found" + assert icon_label is not None, f"Icon label {icon_label_name} not found" + assert isinstance(label, QtWidgets.QLabel) + assert isinstance(icon_label, QtWidgets.QLabel) + + +class TestDelimitersIntegration: + """Test Delimiters integration with DialogPreferences.""" + + @pytest.fixture + def mock_settings(self): + """Create a mock Settings object with delimiter attributes.""" + settings = Mock() + settings.data = Mock() + + # Boolean flags + for attr in [ + "lyrics_embed", + "lyrics_file", + "use_primary_album_artist", + "video_download", + "download_dolby_atmos", + "download_delay", + "video_convert_mp4", + "extract_flac", + "metadata_cover_embed", + "mark_explicit", + "cover_album_file", + "skip_existing", + "symlink_to_track", + "playlist_create", + ]: + setattr(settings.data, attr, False) + + # Paths + for attr in [ + "download_base_path", + "format_album", + "format_playlist", + "format_mix", + "format_track", + "format_video", + "path_binary_ffmpeg", + ]: + setattr(settings.data, attr, f"/test/{attr}") + + # Delimiters + settings.data.metadata_delimiter_artist = ", " + settings.data.metadata_delimiter_album_artist = ", " + settings.data.filename_delimiter_artist = ", " + settings.data.filename_delimiter_album_artist = ", " + + # Numbers + settings.data.album_track_num_pad_min = 2 + settings.data.downloads_concurrent_max = 3 + + # Enums + settings.data.quality_audio = Mock() + settings.data.quality_video = Mock() + settings.data.metadata_cover_dimension = Mock() + + return settings + + @patch.object(DialogPreferences, "exec") + def test_delimiters_category_added_to_list(self, mock_exec, mock_settings, qapp): + """Test that Delimiters category is added to the list.""" + from PySide6.QtCore import Signal as QtSignal + + settings_save = QtSignal() + + with patch.object(DialogPreferences, "gui_populate"): + dialog = DialogPreferences(mock_settings, settings_save) + + # Should have 5 categories now + assert dialog.ui.lw_categories.count() == 5 + assert dialog.ui.lw_categories.item(4).text() == "Delimiters" + + @patch.object(DialogPreferences, "exec") + def test_delimiter_line_edits_in_parameters(self, mock_exec, mock_settings, qapp): + """Test that delimiter line edits are in parameters_line_edit.""" + from PySide6.QtCore import Signal as QtSignal + + settings_save = QtSignal() + + with patch.object(DialogPreferences, "gui_populate"): + dialog = DialogPreferences(mock_settings, settings_save) + + # Check that all 4 delimiters are in the list + assert "metadata_delimiter_artist" in dialog.parameters_line_edit + assert "metadata_delimiter_album_artist" in dialog.parameters_line_edit + assert "filename_delimiter_artist" in dialog.parameters_line_edit + assert "filename_delimiter_album_artist" in dialog.parameters_line_edit + + @patch.object(DialogPreferences, "exec") + def test_navigate_to_delimiters_page(self, mock_exec, mock_settings, qapp): + """Test navigation to Delimiters page.""" + from PySide6.QtCore import Signal as QtSignal + + settings_save = QtSignal() + + with patch.object(DialogPreferences, "gui_populate"): + dialog = DialogPreferences(mock_settings, settings_save) + + # Navigate to Delimiters (index 4) + dialog.ui.lw_categories.setCurrentRow(4) + assert dialog.ui.sw_categories.currentIndex() == 4 + assert dialog.ui.sw_categories.currentWidget() == dialog.ui.page_delimiters + + +class TestDelimitersStructure: + """Test the structural integrity of the Delimiters page.""" + + def test_stacked_widget_has_five_pages(self, qapp): + """Test that the stacked widget now contains 5 pages.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + assert ui.sw_categories.count() == 5, "Should have 5 pages including Delimiters" + + def test_delimiters_page_has_layout(self, qapp): + """Test that Delimiters page has a proper layout.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + assert ui.page_delimiters.layout() is not None + assert isinstance(ui.page_delimiters.layout(), QtWidgets.QVBoxLayout) + + def test_delimiters_page_has_spacer(self, qapp): + """Test that Delimiters page has a vertical spacer.""" + dialog = QtWidgets.QDialog() + ui = Ui_DialogSettings() + ui.setupUi(dialog) + + # Check that there's a spacer in the layout + layout = ui.page_delimiters.layout() + spacer_found = False + for i in range(layout.count()): + item = layout.itemAt(i) + if item.spacerItem(): + spacer_found = True + break + + assert spacer_found, "Delimiters page should have a vertical spacer" |
