2f50c747fb
getNoteTags returns [str ...] of tags for a given note (note: int) updateNoteTags removes the existing tags and sets new tags updateNote combines the old updateNoteFields and the new updateNoteTags Closes #369
164 lines
5.5 KiB
Python
Executable File
164 lines
5.5 KiB
Python
Executable File
import pytest
|
|
from anki.errors import NotFoundError # noqa
|
|
|
|
from conftest import ac
|
|
|
|
|
|
def make_note(*, front="front1", allow_duplicates=False):
|
|
note = {
|
|
"deckName": "test_deck",
|
|
"modelName": "Basic",
|
|
"fields": {"Front": front, "Back": "back1"},
|
|
"tags": ["tag1"],
|
|
}
|
|
|
|
if allow_duplicates:
|
|
return {**note, "options": {"allowDuplicate": True}}
|
|
else:
|
|
return note
|
|
|
|
|
|
##############################################################################
|
|
|
|
|
|
class TestNoteAddition:
|
|
def test_addNote(self, setup):
|
|
result = ac.addNote(note=make_note())
|
|
assert isinstance(result, int)
|
|
|
|
def test_addNote_will_not_allow_duplicates_by_default(self, setup):
|
|
ac.addNote(make_note())
|
|
with pytest.raises(Exception, match="it is a duplicate"):
|
|
ac.addNote(make_note())
|
|
|
|
def test_addNote_will_allow_duplicates_if_options_say_aye(self, setup):
|
|
ac.addNote(make_note())
|
|
ac.addNote(make_note(allow_duplicates=True))
|
|
|
|
def test_addNotes(self, setup):
|
|
result = ac.addNotes(notes=[
|
|
make_note(front="foo"),
|
|
make_note(front="bar"),
|
|
make_note(front="foo"),
|
|
])
|
|
|
|
assert len(result) == 3
|
|
assert isinstance(result[0], int)
|
|
assert isinstance(result[1], int)
|
|
assert result[2] is None
|
|
|
|
def test_bug164(self, setup):
|
|
note = {
|
|
"deckName": "test_deck",
|
|
"modelName": "Basic",
|
|
"fields": {"Front": " Whitespace\n", "Back": ""},
|
|
"options": {"allowDuplicate": False, "duplicateScope": "deck"}
|
|
}
|
|
|
|
ac.addNote(note=note)
|
|
with pytest.raises(Exception, match="it is a duplicate"):
|
|
ac.addNote(note=note)
|
|
|
|
|
|
def test_notesInfo(setup):
|
|
result = ac.notesInfo(notes=[setup.note1_id])
|
|
assert len(result) == 1
|
|
assert result[0]["noteId"] == setup.note1_id
|
|
assert result[0]["tags"] == ["tag1"]
|
|
assert result[0]["fields"]["field1"]["value"] == "note1 field1"
|
|
|
|
|
|
class TestTags:
|
|
def test_addTags(self, setup):
|
|
ac.addTags(notes=[setup.note1_id], tags="tag2")
|
|
tags = ac.notesInfo(notes=[setup.note1_id])[0]["tags"]
|
|
assert {*tags} == {"tag1", "tag2"}
|
|
|
|
def test_getTags(self, setup):
|
|
result = ac.getTags()
|
|
assert {*result} == {"tag1", "tag2"}
|
|
|
|
def test_removeTags(self, setup):
|
|
ac.removeTags(notes=[setup.note2_id], tags="tag2")
|
|
assert ac.notesInfo(notes=[setup.note2_id])[0]["tags"] == []
|
|
|
|
def test_replaceTags(self, setup):
|
|
ac.replaceTags(notes=[setup.note1_id, 123],
|
|
tag_to_replace="tag1", replace_with_tag="foo")
|
|
notes_info = ac.notesInfo(notes=[setup.note1_id])
|
|
assert notes_info[0]["tags"] == ["foo"]
|
|
|
|
def test_replaceTagsInAllNotes(self, setup):
|
|
ac.replaceTagsInAllNotes(tag_to_replace="tag1", replace_with_tag="foo")
|
|
notes_info = ac.notesInfo(notes=[setup.note1_id])
|
|
assert notes_info[0]["tags"] == ["foo"]
|
|
|
|
def test_clearUnusedTags(self, setup):
|
|
ac.removeTags(notes=[setup.note2_id], tags="tag2")
|
|
ac.clearUnusedTags()
|
|
assert ac.getTags() == ["tag1"]
|
|
|
|
def test_updateNoteTags_and_getNoteTags(self, setup):
|
|
ac.updateNoteTags(note=setup.note1_id, tags="footag")
|
|
assert ac.getNoteTags(note=setup.note1_id) == ["footag"]
|
|
ac.updateNoteTags(note=setup.note1_id, tags=["foo", "bar", "baz"])
|
|
assert len(ac.getNoteTags(note=setup.note1_id)) == 3
|
|
|
|
|
|
class TestUpdateNoteFields:
|
|
def test_updateNoteFields(self, setup):
|
|
new_fields = {"field1": "foo", "field2": "bar"}
|
|
good_note = {"id": setup.note1_id, "fields": new_fields}
|
|
ac.updateNoteFields(note=good_note)
|
|
notes_info = ac.notesInfo(notes=[setup.note1_id])
|
|
assert notes_info[0]["fields"]["field2"]["value"] == "bar"
|
|
|
|
def test_updateNoteFields_will_not_update_invalid_notes(self, setup):
|
|
bad_note = {"id": 123, "fields": make_note()["fields"]}
|
|
with pytest.raises(NotFoundError):
|
|
ac.updateNoteFields(note=bad_note)
|
|
|
|
|
|
class TestUpdateNote:
|
|
def test_updateNote(self, setup):
|
|
new_fields = {"field1": "frontbar", "field2": "backbar"}
|
|
new_tags = ["foobar"]
|
|
good_note = {"id": setup.note1_id, "fields": new_fields, "tags": new_tags}
|
|
ac.updateNote(note=good_note)
|
|
notes_info = ac.notesInfo(notes=[setup.note1_id])
|
|
assert notes_info[0]["fields"]["field2"]["value"] == "backbar"
|
|
assert notes_info[0]["tags"] == ["foobar"]
|
|
|
|
def test_updateNote_requires_either_fields_or_tags(self, setup):
|
|
with pytest.raises(Exception, match="ust provide"):
|
|
ac.updateNote(note={"id": setup.note1_id})
|
|
|
|
|
|
class TestCanAddNotes:
|
|
foo_bar_notes = [make_note(front="foo"), make_note(front="bar")]
|
|
|
|
def test_canAddNotes(self, setup):
|
|
result = ac.canAddNotes(notes=self.foo_bar_notes)
|
|
assert result == [True, True]
|
|
|
|
def test_canAddNotes_will_not_add_duplicates_if_options_do_not_say_aye(self, setup):
|
|
ac.addNotes(notes=self.foo_bar_notes)
|
|
notes = [
|
|
make_note(front="foo"),
|
|
make_note(front="baz"),
|
|
make_note(front="foo", allow_duplicates=True)
|
|
]
|
|
result = ac.canAddNotes(notes=notes)
|
|
assert result == [False, True, True]
|
|
|
|
|
|
def test_findNotes(setup):
|
|
result = ac.findNotes(query="deck:test_deck")
|
|
assert {*result} == {setup.note1_id, setup.note2_id}
|
|
|
|
|
|
def test_deleteNotes(setup):
|
|
ac.deleteNotes(notes=[setup.note1_id, setup.note2_id])
|
|
result = ac.findNotes(query="deck:test_deck")
|
|
assert result == []
|