tests: fix and/or remove tests

This commit is contained in:
Travis Abendshien
2025-01-06 11:17:55 -08:00
parent c1cea16451
commit 70c7f4f660
10 changed files with 218 additions and 290 deletions

View File

@@ -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()

View File

@@ -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

View File

@@ -1,36 +1,37 @@
import shutil
from pathlib import Path
from tempfile import TemporaryDirectory
# import shutil
# from pathlib import Path
# from tempfile import TemporaryDirectory
import pytest
from src.core.enums import MacroID
from src.core.library.alchemy.fields import _FieldID
# import pytest
# from src.core.enums import MacroID
# from src.core.library.alchemy.fields import _FieldID
@pytest.mark.parametrize("library", [TemporaryDirectory()], indirect=True)
# @pytest.mark.parametrize("library", [TemporaryDirectory()], indirect=True)
def test_sidecar_macro(qt_driver, library, cwd, entry_full):
entry_full.path = Path("newgrounds/foo.txt")
# TODO: Rework and finalize sidecar loading + macro systems.
pass
# entry_full.path = Path("newgrounds/foo.txt")
fixture = cwd / "fixtures/sidecar_newgrounds.json"
dst = library.library_dir / "newgrounds" / (entry_full.path.name + ".json")
dst.parent.mkdir()
shutil.copy(fixture, dst)
# fixture = cwd / "fixtures/sidecar_newgrounds.json"
# dst = library.library_dir / "newgrounds" / (entry_full.path.name + ".json")
# dst.parent.mkdir()
# shutil.copy(fixture, dst)
qt_driver.frame_content = [entry_full]
qt_driver.run_macro(MacroID.SIDECAR, 0)
# qt_driver.frame_content = [entry_full]
# qt_driver.run_macro(MacroID.SIDECAR, entry_full.id)
entry = next(library.get_entries(with_joins=True))
new_fields = (
(_FieldID.DESCRIPTION.name, "NG description"),
(_FieldID.ARTIST.name, "NG artist"),
(_FieldID.SOURCE.name, "https://ng.com"),
(_FieldID.TAGS.name, None),
)
found = [(field.type.key, field.value) for field in entry.fields]
# entry = library.get_entry_full(entry_full.id)
# new_fields = (
# (_FieldID.DESCRIPTION.name, "NG description"),
# (_FieldID.ARTIST.name, "NG artist"),
# (_FieldID.SOURCE.name, "https://ng.com"),
# )
# found = [(field.type.key, field.value) for field in entry.fields]
# `new_fields` should be subset of `found`
for field in new_fields:
assert field in found, f"Field not found: {field} / {found}"
# # `new_fields` should be subset of `found`
# for field in new_fields:
# assert field in found, f"Field not found: {field} / {found}"
expected_tags = {"ng_tag", "ng_tag2"}
assert {x.name in expected_tags for x in entry.tags}
# expected_tags = {"ng_tag", "ng_tag2"}
# assert {x.name in expected_tags for x in entry.tags}

View File

@@ -73,7 +73,7 @@ def test_build_tag_panel_remove_alias_callback(library, generate_tag):
assert alias.name not in panel.alias_names
def test_build_tag_panel_set_subtags(library, generate_tag):
def test_build_tag_panel_set_parent_tags(library, generate_tag):
parent = library.add_tag(generate_tag("parent", id=123))
child = library.add_tag(generate_tag("child", id=124))
assert parent

View File

@@ -1,124 +1,102 @@
from pathlib import Path
from tempfile import TemporaryDirectory
# def test_hide_preview_not_selected(qt_driver, library):
# qt_driver.frame_content = list(library.get_entries())
# qt_driver.selected = []
import pytest
from src.core.library import Entry
from src.core.library.alchemy.enums import FieldTypeEnum
from src.core.library.alchemy.fields import TextField, _FieldID
from src.qt.widgets.preview_panel import PreviewPanel
# panel = PreviewPanel(library, qt_driver).thumb
# panel.hide_preview()
# assert panel.preview_img.isVisible()
def test_update_widgets_not_selected(qt_driver, library):
qt_driver.frame_content = list(library.get_entries())
qt_driver.selected = []
# 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)],
# )
panel = PreviewPanel(library, qt_driver)
panel.update_widgets()
# assert not entry.tag_box_fields
assert panel.preview_img.isVisible()
assert panel.file_label.text() == "<i>No Items Selected</i>"
# 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"

View File

@@ -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"

View File

@@ -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}

View File

@@ -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

View File

@@ -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),
],