143 lines
5.1 KiB
Python
143 lines
5.1 KiB
Python
import pytest
|
|
import aqt.operations.note
|
|
from plugin.edit import Edit, DecentPreviewer, history
|
|
|
|
|
|
def test_edit_dialog_opens(setup):
|
|
Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
|
|
|
|
def test_edit_dialog_opens_only_once(setup):
|
|
dialog1 = Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
dialog2 = Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
assert dialog1 is dialog2
|
|
|
|
|
|
def test_edit_dialog_fails_to_open_with_invalid_note(setup):
|
|
with pytest.raises(Exception):
|
|
Edit.open_dialog_and_show_note_with_id(123)
|
|
|
|
|
|
def test_browser_dialog_opens(setup):
|
|
dialog = Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
dialog.show_browser()
|
|
|
|
|
|
class TestPreviewDialog:
|
|
def test_opens(self, setup):
|
|
edit_dialog = Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
edit_dialog.show_preview()
|
|
|
|
@pytest.fixture
|
|
def dialog(self, setup):
|
|
edit_dialog = Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
preview_dialog: DecentPreviewer = edit_dialog.show_preview()
|
|
|
|
def press_next_button(times=0):
|
|
for _ in range(times):
|
|
preview_dialog._last_render = 0 # render without delay
|
|
preview_dialog._on_next()
|
|
|
|
preview_dialog.press_next_button = press_next_button
|
|
|
|
yield preview_dialog
|
|
|
|
@pytest.mark.parametrize(
|
|
"next_button_presses, current_card, "
|
|
"showing_question_only, previous_enabled, next_enabled",
|
|
[
|
|
pytest.param(0, 0, True, False, True,
|
|
id="next button pressed 0 times; first card, question"),
|
|
pytest.param(1, 0, False, True, True,
|
|
id="next button pressed 1 time; first card, answer"),
|
|
pytest.param(2, 1, True, True, True,
|
|
id="next button pressed 2 times; second card, question"),
|
|
pytest.param(3, 1, False, True, False,
|
|
id="next button pressed 3 times; second card, answer"),
|
|
pytest.param(4, 1, False, True, False,
|
|
id="next button pressed 4 times; second card still, answer"),
|
|
]
|
|
)
|
|
def test_navigation(self, dialog, next_button_presses, current_card,
|
|
showing_question_only, previous_enabled, next_enabled):
|
|
dialog.press_next_button(times=next_button_presses)
|
|
assert dialog.adapter.current == current_card
|
|
assert dialog.showing_question_and_can_show_answer() is showing_question_only
|
|
assert dialog._should_enable_prev() is previous_enabled
|
|
assert dialog._should_enable_next() is next_enabled
|
|
|
|
|
|
class TestHistory:
|
|
@pytest.fixture(autouse=True)
|
|
def cleanup(self):
|
|
history.note_ids = []
|
|
|
|
def test_single_note(self, setup):
|
|
assert history.note_ids == []
|
|
Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
assert history.note_ids == [setup.note1_id]
|
|
|
|
def test_two_notes(self, setup):
|
|
Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
Edit.open_dialog_and_show_note_with_id(setup.note2_id)
|
|
assert history.note_ids == [setup.note1_id, setup.note2_id]
|
|
|
|
def test_old_note_reopened(self, setup):
|
|
Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
Edit.open_dialog_and_show_note_with_id(setup.note2_id)
|
|
Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
assert history.note_ids == [setup.note2_id, setup.note1_id]
|
|
|
|
def test_navigation(self, setup):
|
|
dialog = Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
Edit.open_dialog_and_show_note_with_id(setup.note2_id)
|
|
|
|
dialog.show_previous()
|
|
assert dialog.note.id == setup.note1_id
|
|
|
|
dialog.show_previous()
|
|
assert dialog.note.id == setup.note1_id
|
|
|
|
dialog.show_next()
|
|
assert dialog.note.id == setup.note2_id
|
|
|
|
dialog.show_next()
|
|
assert dialog.note.id == setup.note2_id
|
|
|
|
|
|
class TestNoteDeletionElsewhere:
|
|
@pytest.fixture
|
|
def delete_note(self, run_background_tasks_on_main_thread):
|
|
"""
|
|
Yields a function that accepts a single note id and deletes the note,
|
|
running the required hooks in sync
|
|
"""
|
|
return (
|
|
lambda note_id: aqt.operations.note
|
|
.remove_notes(parent=None, note_ids=[note_id]) # noqa
|
|
.run_in_background()
|
|
)
|
|
|
|
@staticmethod
|
|
def edit_dialog_is_open():
|
|
return aqt.dialogs._dialogs[Edit.dialog_registry_tag][1] is not None # noqa
|
|
|
|
@pytest.fixture
|
|
def dialog(self, setup):
|
|
Edit.open_dialog_and_show_note_with_id(setup.note1_id)
|
|
yield Edit.open_dialog_and_show_note_with_id(setup.note2_id)
|
|
|
|
def test_one_of_the_history_notes_is_deleted_and_dialog_stays(self,
|
|
setup, dialog, delete_note):
|
|
assert dialog.note.id == setup.note2_id
|
|
|
|
delete_note(setup.note2_id)
|
|
assert self.edit_dialog_is_open()
|
|
assert dialog.note.id == setup.note1_id
|
|
|
|
def test_all_of_the_history_notes_are_deleted_and_dialog_closes(self,
|
|
setup, dialog, delete_note):
|
|
delete_note(setup.note1_id)
|
|
delete_note(setup.note2_id)
|
|
assert not self.edit_dialog_is_open()
|