def test_tags_dialog(window): """ Test the behaviour of the dialog where a user can edit tags. """ QTest.mouseClick(window.left_menu_button_popular, Qt.LeftButton) widget = window.popular_page wait_for_list_populated(widget.content_table) # Test the tag modification dialog idx = widget.content_table.model().index(0, 0) widget.content_table.on_edit_tags_clicked(idx) screenshot(window, name="edit_tags_dialog") assert widget.content_table.add_tags_dialog wait_for_signal(widget.content_table.add_tags_dialog.suggestions_loaded) # Edit the first tag tags_input = widget.content_table.add_tags_dialog.dialog_widget.edit_tags_input num_tags = len( tags_input.tags ) - 1 # To account for the 'dummy' tag at the end of the input field. QTest.mouseClick(tags_input, Qt.LeftButton, pos=tags_input.tags[0].rect.center().toPoint()) QTest.keyClick(tags_input, Qt.Key_Home) assert tags_input.editing_index == 0 assert tags_input.cursor_ind == 0 screenshot(window, name="edit_tags_dialog_edit_first_tag") # Test selecting a single character QTest.keyClick(tags_input, Qt.Key_Right) QTest.keySequence(tags_input, QKeySequence.SelectPreviousChar) assert tags_input.select_size == 1 QTest.keySequence(tags_input, QKeySequence.SelectNextChar) screenshot(window, name="edit_tags_dialog_first_tag_partial_selection") assert tags_input.select_size == 1 # Test navigating between the first and second tag using the keyboard buttons QTest.keyClick(tags_input, Qt.Key_Home) for _ in range(len(tags_input.tags[0].text) + 1): QTest.keyClick(tags_input, Qt.Key_Right) assert tags_input.editing_index == 1 QTest.keyClick(tags_input, Qt.Key_Left) assert tags_input.editing_index == 0 # Select all text of the first tag QTest.keySequence(tags_input, QKeySequence.SelectAll) screenshot(window, name="edit_tags_dialog_edit_first_tag_selected") # Remove the second tag cross_rect = tags_input.compute_cross_rect(tags_input.tags[1].rect) QTest.mouseClick(tags_input, Qt.LeftButton, pos=cross_rect.center().toPoint()) QTest.qWait( 100 ) # It can take some time for the GUI to remove the tag after the click event assert len(tags_input.tags) == num_tags - 1 screenshot(window, name="edit_tags_dialog_second_tags_removed") # Try saving a tag with too few characters QTest.keyClick(tags_input, Qt.Key_End) QTest.keyClick(tags_input, Qt.Key_Space) for _ in range(MIN_TAG_LENGTH - 1): QTest.keyClick(tags_input, "a") QTest.keyClick(tags_input, Qt.Key_Return) screenshot(window, name="edit_tags_dialog_error") assert widget.content_table.add_tags_dialog.dialog_widget.error_text_label.isVisible( ) QTest.keyClick(tags_input, "c") assert tags_input.tags[-1].text == "aac" # Test creating a new tag by clicking to the right of the right-most tag QTest.mouseClick(tags_input, Qt.LeftButton, pos=tags_input.tags[-1].rect.topRight().toPoint() + QPoint(10, 0)) QTest.keyClick(tags_input, "a") QTest.keyClick(tags_input, "b") QTest.keyClick(tags_input, "c") screenshot(window, name="edit_tags_dialog_created_new_tag") # Try to remove the newly created tag cur_editing_index = tags_input.editing_index for _ in range( 4): # This should put us in a state where we edit the previous tag QTest.keyClick(tags_input, Qt.Key_Backspace) assert tags_input.editing_index == cur_editing_index - 1 # Try adding a tag that overflows to the next line for _ in range(70): QTest.keyClick(tags_input, "b") QTest.qWait(100) # Let the dialog resize screenshot(window, name="edit_tags_dialog_two_lines") # We now remove focus from the input area QTest.keyClick(tags_input, Qt.Key_Home) QTest.keyClick(tags_input, Qt.Key_Tab) screenshot(window, name="edit_tags_dialog_out_of_focus") assert not tags_input.hasFocus() # Click on a suggestion tag_suggestion_buttons = widget.content_table.add_tags_dialog.dialog_widget.suggestions.findChildren( TagButton) assert tag_suggestion_buttons QTest.mouseClick(tag_suggestion_buttons[0], Qt.LeftButton) screenshot(window, name="edit_tags_dialog_suggestion_clicked") QTest.mouseClick( widget.content_table.add_tags_dialog.dialog_widget.save_button, Qt.LeftButton) wait_for_signal(widget.content_table.edited_tags) QTest.qWait(200) # It can take a bit of time to hide the dialog