Add tests for the Edit dialog
This commit is contained in:
parent
8f1a2cc5fd
commit
fb892d330a
142
tests/test_edit.py
Normal file
142
tests/test_edit.py
Normal file
@ -0,0 +1,142 @@
|
||||
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()
|
Loading…
Reference in New Issue
Block a user