summaryrefslogtreecommitdiff
path: root/tests/test_delimiters_category.py
blob: 8028e348c26e9b50243dfca5762c40b83d257ecd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
"""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


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"