From d30f8950b9cb8ddc8cb4b626190b3b50792be38c 2023-01-03 12:43:16
From: Emilio Graff <1@emil.io>
Date: 2023-01-03 12:43:16
Subject: [PATCH] TST: smoke test for `get_inputhook_name_and_func`

---

diff --git a/IPython/terminal/tests/test_pt_inputhooks.py b/IPython/terminal/tests/test_pt_inputhooks.py
new file mode 100644
index 0000000..b9aa476
--- /dev/null
+++ b/IPython/terminal/tests/test_pt_inputhooks.py
@@ -0,0 +1,48 @@
+import os
+import importlib
+
+import pytest
+
+from IPython.terminal.pt_inputhooks import set_qt_api, get_inputhook_name_and_func
+
+
+guis_avail = []
+
+
+def _get_qt_vers():
+    """If any version of Qt is available, this will populate `guis_avail` with 'qt' and 'qtx'. Due
+    to the import mechanism, we can't import multiple versions of Qt in one session."""
+    for gui in ['qt', 'qt6', 'qt5', 'qt4']:
+        print(f'Trying {gui}')
+        try:
+            set_qt_api(gui)
+            importlib.import_module("IPython.terminal.pt_inputhooks.qt")
+            guis_avail.append(gui)
+            if 'QT_API' in os.environ.keys():
+                del os.environ['QT_API']
+        except ImportError:
+            pass  # that version of Qt isn't available.
+        except RuntimeError:
+            pass  # the version of IPython doesn't know what to do with this Qt version.
+
+
+_get_qt_vers()
+
+
+@pytest.mark.skipif(len(guis_avail) == 0, reason='No viable version of PyQt or PySide installed.')
+def test_inputhook_qt():
+    gui = guis_avail[0]
+
+    # Choose a qt version and get the input hook function. This will import Qt...
+    get_inputhook_name_and_func(gui)
+
+    # ...and now we're stuck with this version of Qt for good; can't switch.
+    for not_gui in ['qt6', 'qt5', 'qt4']:
+        if not_gui not in guis_avail:
+            break
+
+    with pytest.raises(ImportError):
+        get_inputhook_name_and_func(not_gui)
+
+    # A gui of 'qt' means "best available", or in this case, the last one that was used.
+    get_inputhook_name_and_func('qt')