aboutsummaryrefslogtreecommitdiff
path: root/tests/test-gloss-fetch--libxml-probe.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-04-28 18:16:28 -0500
committerCraig Jennings <c@cjennings.net>2026-04-28 19:09:22 -0500
commit3491d9b799f9678f6095149a348330e2a05a1924 (patch)
tree496069dd668ce30d036090486b2c30dd6f681872 /tests/test-gloss-fetch--libxml-probe.el
parentdc0db0f0e12d8af6d1d54a5dde1cd16cf890a33d (diff)
downloadgloss-3491d9b799f9678f6095149a348330e2a05a1924.tar.gz
gloss-3491d9b799f9678f6095149a348330e2a05a1924.zip
feat: implement gloss-fetch network layer
Walks the `gloss-fetch--sources' registry in the order set by the `gloss-fetch-sources' defcustom and aggregates per-source results into the public `gloss-fetch-definitions' shape. The Wiktionary REST fetcher GETs the page-definition endpoint, parses JSON, walks only English (`en') entries, and HTML-strips each sense via `libxml-parse-html-region'. A sense whose strip fails is dropped while the source keeps its `:ok' status with N-1 entries. The HTTP-status taxonomy is five values: `:ok', `:no-defs' (404 or no English senses on a 200), `:rate-limited' (429), `:server-error' (5xx, malformed JSON, schema mismatch, 4xx other than 404 or 429), and `:unreachable' (nil from `url-retrieve-synchronously', or a signaled error). The `:reason' string carries technical detail to *gloss-debug* and never reaches the user. libxml is probed once per session at first fetch. When absent, online fetch is disabled package-wide and every call signals `user-error' with the install hint. `url-retrieve-synchronously' is wrapped with the `gloss-fetch-timeout' defcustom (default 5 seconds). Tested with `make test'. 60 of 62 tests pass. The two pending failures load Wiktionary fixtures via `gloss-test--load-wiktionary-fixture', which is provided on a parallel branch and will pass once both branches land. The implementation has been verified against the captured fixtures end-to-end (anaphora returns 4 senses, SBIR returns 2, matching the design's expected counts).
Diffstat (limited to 'tests/test-gloss-fetch--libxml-probe.el')
-rw-r--r--tests/test-gloss-fetch--libxml-probe.el8
1 files changed, 5 insertions, 3 deletions
diff --git a/tests/test-gloss-fetch--libxml-probe.el b/tests/test-gloss-fetch--libxml-probe.el
index 830a278..758c185 100644
--- a/tests/test-gloss-fetch--libxml-probe.el
+++ b/tests/test-gloss-fetch--libxml-probe.el
@@ -17,7 +17,8 @@
(ert-deftest test-gloss-fetch-libxml-absent-signals-user-error ()
"Error: with libxml unavailable, the first fetch signals user-error and disables online."
- (let ((gloss-fetch--libxml-disabled nil))
+ (let ((gloss-fetch--libxml-disabled nil)
+ (gloss-fetch--libxml-checked nil))
(cl-letf (((symbol-function 'gloss-fetch--libxml-available-p)
(lambda () nil)))
(should-error (gloss-fetch-definitions "anything") :type 'user-error)
@@ -26,7 +27,8 @@
(ert-deftest test-gloss-fetch-libxml-error-mentions-libxml2 ()
"Error: the user-error message names libxml2 so the user can act."
- (let ((gloss-fetch--libxml-disabled nil))
+ (let ((gloss-fetch--libxml-disabled nil)
+ (gloss-fetch--libxml-checked nil))
(cl-letf (((symbol-function 'gloss-fetch--libxml-available-p)
(lambda () nil)))
(let ((err (should-error (gloss-fetch-definitions "x") :type 'user-error)))
@@ -56,7 +58,7 @@
(lambda (_url) (gloss-fetch-test--ok-response "{}"))
(let ((result (gloss-fetch-definitions "term")))
(should (eq (car result) :empty))
- (should (member 'wiktionary (plist-get result :no-defs))))))))
+ (should (member 'wiktionary (plist-get (cdr result) :no-defs))))))))
(provide 'test-gloss-fetch--libxml-probe)
;;; test-gloss-fetch--libxml-probe.el ends here