From 70c7f4f660c7037d41180d81a195ed5c8325f64c Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:17:55 -0800 Subject: [PATCH] tests: fix and/or remove tests --- tagstudio/src/core/library/alchemy/library.py | 1 + tagstudio/tests/conftest.py | 33 ++- .../.TagStudio/ts_library.sqlite | Bin 86016 -> 81920 bytes tagstudio/tests/macros/test_sidecar.py | 55 ++--- tagstudio/tests/qt/test_build_tag_panel.py | 2 +- tagstudio/tests/qt/test_preview_panel.py | 188 ++++++++---------- tagstudio/tests/qt/test_qt_driver.py | 106 +++++----- tagstudio/tests/qt/test_tag_panel.py | 4 +- tagstudio/tests/test_library.py | 83 ++------ tagstudio/tests/test_search.py | 36 ++-- 10 files changed, 218 insertions(+), 290 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 26960669..b708fbe7 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -461,6 +461,7 @@ class Library: stmt = stmt.options( contains_eager(Entry.text_fields), contains_eager(Entry.datetime_fields), + contains_eager(Entry.tags), ) stmt = stmt.distinct() diff --git a/tagstudio/tests/conftest.py b/tagstudio/tests/conftest.py index cf8b06f0..dde3c418 100644 --- a/tagstudio/tests/conftest.py +++ b/tagstudio/tests/conftest.py @@ -46,7 +46,7 @@ def file_mediatypes_library(): ) assert lib.add_entries([entry1, entry2, entry3]) - assert len(lib.tags) == 2 + assert len(lib.tags) == 3 return lib @@ -71,47 +71,40 @@ def library(request): ) assert lib.add_tag(tag) - subtag = Tag( + parent_tag = Tag( + id=1500, name="subbar", color=TagColor.YELLOW, ) + assert lib.add_tag(parent_tag) - Tag( + tag2 = Tag( + id=2000, name="bar", color=TagColor.BLUE, - subtags={subtag}, + parent_tags={parent_tag}, ) + assert lib.add_tag(tag2) # default item with deterministic name entry = Entry( + id=1, folder=lib.folder, path=pathlib.Path("foo.txt"), fields=lib.default_fields, ) - - # entry.tag_box_fields = [ - # TagBoxField(type_key=_FieldID.TAGS.name, tags={tag}, position=0), - # TagBoxField( - # type_key=_FieldID.TAGS_META.name, - # position=0, - # ), - # ] + assert lib.add_tags_to_entry(entry.id, tag.id) entry2 = Entry( + id=2, folder=lib.folder, path=pathlib.Path("one/two/bar.md"), fields=lib.default_fields, ) - # entry2.tag_box_fields = [ - # TagBoxField( - # tags={tag2}, - # type_key=_FieldID.TAGS_META.name, - # position=0, - # ), - # ] + assert lib.add_tags_to_entry(entry2.id, tag2.id) assert lib.add_entries([entry, entry2]) - assert len(lib.tags) == 5 + assert len(lib.tags) == 6 yield lib diff --git a/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.sqlite b/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.sqlite index 449f380b02fad6ca8fbcc08dddf2ca8d99116aaf..2540a46824a559c73e51578db723590c5321d020 100644 GIT binary patch delta 5727 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 delta 6324 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 Items Selected" +# library.add_entries([entry]) +# assert library.entries_count == 3 + +# qt_driver.frame_content = list(library.get_entries()) +# qt_driver.selected = [0, 1, 2] + +# panel = PreviewPanel(library, qt_driver) +# panel.update_widgets() + +# assert {f.type_key for f in panel.common_fields} == { +# _FieldID.TITLE.name, +# } + +# assert {f.type_key for f in panel.mixed_fields} == { +# _FieldID.TAGS.name, +# _FieldID.TAGS_META.name, +# } -@pytest.mark.parametrize("library", [TemporaryDirectory()], indirect=True) -def test_update_widgets_single_selected(qt_driver, library): - qt_driver.frame_content = list(library.get_entries()) - qt_driver.selected = [0] +# def test_write_container_text_line(qt_driver, entry_full, library): +# # Given +# field_container = PreviewPanel(library, qt_driver).fields - panel = PreviewPanel(library, qt_driver) - panel.update_widgets() +# field = entry_full.text_fields[0] +# assert len(entry_full.text_fields) == 1 +# assert field.type.type == FieldTypeEnum.TEXT_LINE +# assert field.type.name == "Title" - assert panel.preview_img.isVisible() +# # set any value +# field.value = "foo" +# field_container.write_container(0, field) +# field_container.cached_entries = [library.get_entry_full(entry_full.id)] + +# assert len(field_container.containers) == 1 +# container = field_container.containers[0] +# widget = container.get_inner_widget() +# # test it's not "mixed data" +# assert widget.text_label.text() == "foo" + +# # When update and submit modal +# modal = field_container.fields.containers[0].modal +# modal.widget.text_edit.setText("bar") +# modal.save_button.click() + +# # Then reload entry +# entry_full = next(library.get_entries(with_joins=True)) +# # the value was updated +# assert entry_full.text_fields[0].value == "bar" -def test_update_widgets_multiple_selected(qt_driver, library): - # entry with no tag fields - entry = Entry( - path=Path("test.txt"), - folder=library.folder, - fields=[TextField(type_key=_FieldID.TITLE.name, position=0)], - ) +# def test_remove_field(qt_driver, library): +# # Given +# panel = PreviewPanel(library, qt_driver).fields +# entries = list(library.get_entries(with_joins=True)) +# qt_driver.frame_content = entries - assert not entry.tag_box_fields +# # When second entry is selected +# panel.selected = [1] - library.add_entries([entry]) - assert library.entries_count == 3 +# field = entries[1].text_fields[0] +# panel.write_container(0, field) +# panel.remove_field(field) - qt_driver.frame_content = list(library.get_entries()) - qt_driver.selected = [0, 1, 2] - - panel = PreviewPanel(library, qt_driver) - panel.update_widgets() - - assert {f.type_key for f in panel.common_fields} == { - _FieldID.TITLE.name, - } - - assert {f.type_key for f in panel.mixed_fields} == { - _FieldID.TAGS.name, - _FieldID.TAGS_META.name, - } +# entries = list(library.get_entries(with_joins=True)) +# assert not entries[1].text_fields -def test_write_container_text_line(qt_driver, entry_full, library): - # Given - panel = PreviewPanel(library, qt_driver) +# def test_update_field(qt_driver, library, entry_full): +# panel = PreviewPanel(library, qt_driver).fields - field = entry_full.text_fields[0] - assert len(entry_full.text_fields) == 1 - assert field.type.type == FieldTypeEnum.TEXT_LINE - assert field.type.name == "Title" +# # select both entries +# qt_driver.frame_content = [e.id for e in library.get_entries()][:2] +# qt_driver.selected = [0, 1] +# panel.selected = [0, 1] - # set any value - field.value = "foo" - panel.write_container(0, field) - panel.selected = [0] +# # update field +# title_field = entry_full.text_fields[0] +# panel.update_field(title_field, "meow") - assert len(panel.containers) == 1 - container = panel.containers[0] - widget = container.get_inner_widget() - # test it's not "mixed data" - assert widget.text_label.text() == "foo" - - # When update and submit modal - modal = panel.containers[0].modal - modal.widget.text_edit.setText("bar") - modal.save_button.click() - - # Then reload entry - entry_full = next(library.get_entries(with_joins=True)) - # the value was updated - assert entry_full.text_fields[0].value == "bar" - - -def test_remove_field(qt_driver, library): - # Given - panel = PreviewPanel(library, qt_driver) - entries = list(library.get_entries(with_joins=True)) - qt_driver.frame_content = entries - - # When second entry is selected - panel.selected = [1] - - field = entries[1].text_fields[0] - panel.write_container(0, field) - panel.remove_field(field) - - entries = list(library.get_entries(with_joins=True)) - assert not entries[1].text_fields - - -def test_update_field(qt_driver, library, entry_full): - panel = PreviewPanel(library, qt_driver) - - # select both entries - qt_driver.frame_content = list(library.get_entries())[:2] - qt_driver.selected = [0, 1] - panel.selected = [0, 1] - - # update field - title_field = entry_full.text_fields[0] - panel.update_field(title_field, "meow") - - for entry in library.get_entries(with_joins=True): - field = [x for x in entry.text_fields if x.type_key == title_field.type_key][0] - assert field.value == "meow" +# for entry in library.get_entries(with_joins=True): +# field = [x for x in entry.text_fields if x.type_key == title_field.type_key][0] +# assert field.value == "meow" diff --git a/tagstudio/tests/qt/test_qt_driver.py b/tagstudio/tests/qt/test_qt_driver.py index a8a484d1..0cda8151 100644 --- a/tagstudio/tests/qt/test_qt_driver.py +++ b/tagstudio/tests/qt/test_qt_driver.py @@ -1,76 +1,70 @@ -from pathlib import Path -from unittest.mock import Mock - -from src.core.library import Entry from src.core.library.alchemy.enums import FilterState from src.core.library.json.library import ItemType from src.qt.widgets.item_thumb import ItemThumb +# def test_update_thumbs(qt_driver): +# qt_driver.frame_content = [ +# Entry( +# folder=qt_driver.lib.folder, +# path=Path("/tmp/foo"), +# fields=qt_driver.lib.default_fields, +# ) +# ] -def test_update_thumbs(qt_driver): - qt_driver.frame_content = [ - Entry( - folder=qt_driver.lib.folder, - path=Path("/tmp/foo"), - fields=qt_driver.lib.default_fields, - ) - ] +# qt_driver.item_thumbs = [] +# for _ in range(3): +# qt_driver.item_thumbs.append( +# ItemThumb( +# mode=ItemType.ENTRY, +# library=qt_driver.lib, +# driver=qt_driver, +# thumb_size=(100, 100), +# ) +# ) - qt_driver.item_thumbs = [] - for i in range(3): - qt_driver.item_thumbs.append( - ItemThumb( - mode=ItemType.ENTRY, - library=qt_driver.lib, - driver=qt_driver, - thumb_size=(100, 100), - grid_idx=i, - ) - ) +# qt_driver.update_thumbs() - qt_driver.update_thumbs() - - for idx, thumb in enumerate(qt_driver.item_thumbs): - # only first item is visible - assert thumb.isVisible() == (idx == 0) +# for idx, thumb in enumerate(qt_driver.item_thumbs): +# # only first item is visible +# assert thumb.isVisible() == (idx == 0) -def test_select_item_bridge(qt_driver, entry_min): - # mock some props since we're not running `start()` - qt_driver.autofill_action = Mock() - qt_driver.sort_fields_action = Mock() +# def test_select_item_bridge(qt_driver, entry_min): +# # mock some props since we're not running `start()` +# qt_driver.autofill_action = Mock() +# qt_driver.sort_fields_action = Mock() - # set the content manually - qt_driver.frame_content = [entry_min] * 3 +# # set the content manually +# qt_driver.frame_content = [entry_min] * 3 - qt_driver.filter.page_size = 3 - qt_driver._init_thumb_grid() - assert len(qt_driver.item_thumbs) == 3 +# qt_driver.filter.page_size = 3 +# qt_driver._init_thumb_grid() +# assert len(qt_driver.item_thumbs) == 3 - # select first item - qt_driver.select_item(0, append=False, bridge=False) - assert qt_driver.selected == [0] +# # select first item +# qt_driver.select_item(0, append=False, bridge=False) +# assert qt_driver.selected == [0] - # add second item to selection - qt_driver.select_item(1, append=False, bridge=True) - assert qt_driver.selected == [0, 1] +# # add second item to selection +# qt_driver.select_item(1, append=False, bridge=True) +# assert qt_driver.selected == [0, 1] - # add third item to selection - qt_driver.select_item(2, append=False, bridge=True) - assert qt_driver.selected == [0, 1, 2] +# # add third item to selection +# qt_driver.select_item(2, append=False, bridge=True) +# assert qt_driver.selected == [0, 1, 2] - # select third item only - qt_driver.select_item(2, append=False, bridge=False) - assert qt_driver.selected == [2] +# # select third item only +# qt_driver.select_item(2, append=False, bridge=False) +# assert qt_driver.selected == [2] - qt_driver.select_item(0, append=False, bridge=True) - assert qt_driver.selected == [0, 1, 2] +# qt_driver.select_item(0, append=False, bridge=True) +# assert qt_driver.selected == [0, 1, 2] def test_library_state_update(qt_driver): # Given - for idx, entry in enumerate(qt_driver.lib.get_entries(with_joins=True)): - thumb = ItemThumb(ItemType.ENTRY, qt_driver.lib, qt_driver, (100, 100), idx) + for entry in qt_driver.lib.get_entries(with_joins=True): + thumb = ItemThumb(ItemType.ENTRY, qt_driver.lib, qt_driver, (100, 100)) qt_driver.item_thumbs.append(thumb) qt_driver.frame_content.append(entry) @@ -83,21 +77,21 @@ def test_library_state_update(qt_driver): qt_driver.filter_items(state) assert qt_driver.filter.page_size == 10 assert len(qt_driver.frame_content) == 1 - entry = qt_driver.frame_content[0] + entry = qt_driver.lib.get_entry_full(qt_driver.frame_content[0]) assert list(entry.tags)[0].name == "foo" # When state is not changed, previous one is still applied qt_driver.filter_items() assert qt_driver.filter.page_size == 10 assert len(qt_driver.frame_content) == 1 - entry = qt_driver.frame_content[0] + entry = qt_driver.lib.get_entry_full(qt_driver.frame_content[0]) assert list(entry.tags)[0].name == "foo" # When state property is changed, previous one is overwritten state = FilterState.from_path("*bar.md") qt_driver.filter_items(state) assert len(qt_driver.frame_content) == 1 - entry = qt_driver.frame_content[0] + entry = qt_driver.lib.get_entry_full(qt_driver.frame_content[0]) assert list(entry.tags)[0].name == "bar" diff --git a/tagstudio/tests/qt/test_tag_panel.py b/tagstudio/tests/qt/test_tag_panel.py index c09d5f77..77f21b2e 100644 --- a/tagstudio/tests/qt/test_tag_panel.py +++ b/tagstudio/tests/qt/test_tag_panel.py @@ -10,7 +10,7 @@ def test_tag_panel(qtbot, library): def test_add_tag_callback(qt_driver): # Given - assert len(qt_driver.lib.tags) == 5 + assert len(qt_driver.lib.tags) == 6 qt_driver.add_tag_action_callback() # When @@ -20,5 +20,5 @@ def test_add_tag_callback(qt_driver): # Then tags: set[Tag] = qt_driver.lib.tags - assert len(tags) == 6 + assert len(tags) == 7 assert "xxx" in {tag.name for tag in tags} diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index 0b3f84b7..ad4321fa 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -13,11 +13,11 @@ def test_library_add_alias(library, generate_tag): tag = library.add_tag(generate_tag("xxx", id=123)) assert tag - subtag_ids: set[int] = set() + parent_ids: set[int] = set() alias_ids: set[int] = set() alias_names: set[str] = set() alias_names.add("test_alias") - library.update_tag(tag, subtag_ids, alias_names, alias_ids) + library.update_tag(tag, parent_ids, alias_names, alias_ids) alias_ids = library.get_tag(tag.id).alias_ids assert len(alias_ids) == 1 @@ -27,11 +27,11 @@ def test_library_get_alias(library, generate_tag): tag = library.add_tag(generate_tag("xxx", id=123)) assert tag - subtag_ids: set[int] = set() + parent_ids: set[int] = set() alias_ids: set[int] = set() alias_names: set[str] = set() alias_names.add("test_alias") - library.update_tag(tag, subtag_ids, alias_names, alias_ids) + library.update_tag(tag, parent_ids, alias_names, alias_ids) alias_ids = library.get_tag(tag.id).alias_ids assert library.get_alias(tag.id, alias_ids[0]).name == "test_alias" @@ -41,18 +41,18 @@ def test_library_update_alias(library, generate_tag): tag: Tag = library.add_tag(generate_tag("xxx", id=123)) assert tag - subtag_ids: set[int] = set() + parent_ids: set[int] = set() alias_ids: set[int] = set() alias_names: set[str] = set() alias_names.add("test_alias") - library.update_tag(tag, subtag_ids, alias_names, alias_ids) + library.update_tag(tag, parent_ids, alias_names, alias_ids) alias_ids = library.get_tag(tag.id).alias_ids assert library.get_alias(tag.id, alias_ids[0]).name == "test_alias" alias_names.remove("test_alias") alias_names.add("alias_update") - library.update_tag(tag, subtag_ids, alias_names, alias_ids) + library.update_tag(tag, parent_ids, alias_names, alias_ids) tag = library.get_tag(tag.id) assert len(tag.alias_ids) == 1 @@ -87,7 +87,7 @@ def test_create_tag(library, generate_tag): assert tag_inc.id > 1000 -def test_tag_subtag_itself(library, generate_tag): +def test_tag_self_parent(library, generate_tag): # tag already exists assert not library.add_tag(generate_tag("foo", id=1000)) @@ -117,7 +117,7 @@ def test_library_search(library, generate_tag, entry_full): "foo", } - assert entry.tag_box_fields + assert entry.tags def test_tag_search(library): @@ -133,7 +133,7 @@ def test_get_entry(library: Library, entry_min): assert entry_min.id result = library.get_entry_full(entry_min.id) assert result - assert result.tags + assert len(result.tags) == 1 def test_entries_count(library): @@ -147,47 +147,12 @@ def test_entries_count(library): assert len(results) == 5 -def test_add_field_to_entry(library): - # Given - entry = Entry( - folder=library.folder, - path=Path("xxx"), - fields=library.default_fields, - ) - # meta tags + content tags - assert len(entry.tag_box_fields) == 2 - assert library.add_entries([entry]) - - # When - library.add_field_to_entry(entry.id, field_id=_FieldID.TAGS) - - # Then - entry = [x for x in library.get_entries(with_joins=True) if x.path == entry.path][0] - # meta tags and tags field present - assert len(entry.tag_box_fields) == 3 - - -def test_add_field_tag(library: Library, entry_full, generate_tag): - # Given - tag_name = "xxx" - tag = generate_tag(tag_name) - tag_field = entry_full.tag_box_fields[0] - - # When - library.add_field_tag(entry_full, tag, tag_field.type_key) - - # Then - result = library.get_entry_full(entry_full.id) - tag_field = result.tag_box_fields[0] - assert [x.name for x in tag_field.tags if x.name == tag_name] - - def test_parents_add(library, generate_tag): # Given tag: Tag = library.tags[0] assert tag.id is not None - parent_tag = generate_tag("subtag1") + parent_tag = generate_tag("parent_tag_01") parent_tag = library.add_tag(parent_tag) assert parent_tag.id is not None @@ -273,7 +238,7 @@ def test_remove_field_entry_with_multiple_field(library, entry_full): # When # add identical field - assert library.add_entry_field_type(entry_full.id, field_id=title_field.type_key) + assert library.add_field_to_entry(entry_full.id, field_id=title_field.type_key) # remove entry field library.remove_entry_field(title_field, [entry_full.id]) @@ -302,7 +267,7 @@ def test_update_entry_with_multiple_identical_fields(library, entry_full): # When # add identical field - library.add_entry_field_type(entry_full.id, field_id=title_field.type_key) + library.add_field_to_entry(entry_full.id, field_id=title_field.type_key) # update one of the fields library.update_entry_field( @@ -344,25 +309,21 @@ def test_mirror_entry_fields(library: Library, entry_full): entry = library.get_entry_full(entry_id) # make sure fields are there after getting it from the library again - assert len(entry.fields) == 4 + assert len(entry.fields) == 2 assert {x.type_key for x in entry.fields} == { _FieldID.TITLE.name, _FieldID.NOTES.name, - _FieldID.TAGS_META.name, - _FieldID.TAGS.name, } -def test_remove_tag_from_field(library, entry_full): - for field in entry_full.tag_box_fields: - for tag in field.tags: - removed_tag = tag.name - library.remove_tag_from_field(tag, field) - break +def test_remove_tag_from_entry(library, entry_full): + removed_tag_id = -1 + for tag in entry_full.tags: + removed_tag_id = tag.id + library.remove_tags_from_entry(entry_full.id, tag.id) entry = next(library.get_entries(with_joins=True)) - for field in entry.tag_box_fields: - assert removed_tag not in [tag.name for tag in field.tags] + assert removed_tag_id not in [t.id for t in entry.tags] @pytest.mark.parametrize( @@ -385,8 +346,8 @@ def test_update_field_order(library, entry_full): title_field = entry_full.text_fields[0] # When add two more fields - library.add_entry_field_type(entry_full.id, field_id=title_field.type_key, value="first") - library.add_entry_field_type(entry_full.id, field_id=title_field.type_key, value="second") + library.add_field_to_entry(entry_full.id, field_id=title_field.type_key, value="first") + library.add_field_to_entry(entry_full.id, field_id=title_field.type_key, value="second") # remove the one on first position assert title_field.position == 0 diff --git a/tagstudio/tests/test_search.py b/tagstudio/tests/test_search.py index 9f3754b4..3af48799 100644 --- a/tagstudio/tests/test_search.py +++ b/tagstudio/tests/test_search.py @@ -13,12 +13,12 @@ def verify_count(lib: Library, query: str, count: int): @pytest.mark.parametrize( ["query", "count"], [ - ("", 29), - ("path:*", 29), + ("", 31), + ("path:*", 31), ("path:*inherit*", 24), ("path:*comp*", 5), - ("special:untagged", 1), - ("filetype:png", 23), + ("special:untagged", 2), + ("filetype:png", 25), ("filetype:jpg", 6), ("filetype:'jpg'", 6), ("tag_id:1011", 5), @@ -68,7 +68,7 @@ def test_and(search_library: Library, query: str, count: int): ("circle or green", 14), ("green or circle", 14), ("filetype:jpg or tag:orange", 11), - ("red or filetype:png", 25), + ("red or filetype:png", 28), ("filetype:jpg or path:*comp*", 11), ], ) @@ -79,22 +79,22 @@ def test_or(search_library: Library, query: str, count: int): @pytest.mark.parametrize( ["query", "count"], [ - ("not unexistant", 29), + ("not unexistant", 31), ("not path:*", 0), - ("not not path:*", 29), - ("not special:untagged", 28), + ("not not path:*", 31), + ("not special:untagged", 29), ("not filetype:png", 6), - ("not filetype:jpg", 23), - ("not tag_id:1011", 24), - ("not tag_id:1038", 18), - ("not green", 24), + ("not filetype:jpg", 25), + ("not tag_id:1011", 26), + ("not tag_id:1038", 20), + ("not green", 26), ("tag:favorite", 0), - ("not circle", 18), - ("not tag:square", 18), + ("not circle", 20), + ("not tag:square", 20), ("circle and not square", 6), ("not circle and square", 6), - ("special:untagged or not filetype:jpg", 24), - ("not square or green", 20), + ("special:untagged or not filetype:jpg", 25), + ("not square or green", 22), ], ) def test_not(search_library: Library, query: str, count: int): @@ -108,7 +108,7 @@ def test_not(search_library: Library, query: str, count: int): ("(((tag_id:1041)))", 11), ("not (not tag_id:1041)", 11), ("((circle) and (not square))", 6), - ("(not ((square) OR (green)))", 15), + ("(not ((square) OR (green)))", 17), ("filetype:png and (tag:square or green)", 12), ], ) @@ -121,7 +121,7 @@ def test_parentheses(search_library: Library, query: str, count: int): [ ("ellipse", 17), ("yellow", 15), - ("color", 24), + ("color", 25), ("shape", 24), ("yellow not green", 10), ],