From f33d7231fa7f9f11250a592e28601df6b8f564c7 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 4 Apr 2026 12:34:34 -0500 Subject: fix: debug-wttrin-show-raw broken by async API change debug-wttrin-show-raw called wttrin--get-cached-or-fetch with 1 arg, but the function now requires 2 (location + callback) since the async refactor. Rewrote to use the callback pattern. Also handles nil response gracefully. --- tests/test-debug-wttrin-show-raw.el | 104 ++++++++++++++++++++++++++++++++++++ wttrin-debug.el | 29 +++++----- 2 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 tests/test-debug-wttrin-show-raw.el diff --git a/tests/test-debug-wttrin-show-raw.el b/tests/test-debug-wttrin-show-raw.el new file mode 100644 index 0000000..ae2f750 --- /dev/null +++ b/tests/test-debug-wttrin-show-raw.el @@ -0,0 +1,104 @@ +;;; test-debug-wttrin-show-raw.el --- Tests for debug-wttrin-show-raw -*- lexical-binding: t; -*- + +;; Copyright (C) 2025 Craig Jennings + +;;; Commentary: + +;; Unit tests for debug-wttrin-show-raw function. +;; Tests that the debug display shows raw weather data with line numbers. + +;;; Code: + +(require 'ert) +(require 'wttrin) +(require 'testutil-wttrin) + +;; Load wttrin-debug for the function under test +(require 'wttrin-debug + (expand-file-name "wttrin-debug.el" + (file-name-directory (locate-library "wttrin")))) + +;;; Setup and Teardown + +(defun test-debug-wttrin-show-raw-setup () + "Setup for debug-wttrin-show-raw tests." + (testutil-wttrin-setup) + (when (get-buffer "*wttrin-debug*") + (kill-buffer "*wttrin-debug*"))) + +(defun test-debug-wttrin-show-raw-teardown () + "Teardown for debug-wttrin-show-raw tests." + (testutil-wttrin-teardown) + (when (get-buffer "*wttrin-debug*") + (kill-buffer "*wttrin-debug*"))) + +;;; Normal Cases + +(ert-deftest test-debug-wttrin-show-raw-normal-creates-debug-buffer () + "Calling show-raw should create the *wttrin-debug* buffer." + (test-debug-wttrin-show-raw-setup) + (unwind-protect + (progn + (testutil-wttrin-mock-http-response "Line one\nLine two\nLine three" + (debug-wttrin-show-raw "Paris")) + (should (get-buffer "*wttrin-debug*"))) + (test-debug-wttrin-show-raw-teardown))) + +(ert-deftest test-debug-wttrin-show-raw-normal-adds-line-numbers () + "Each line of raw data should be prefixed with its line number." + (test-debug-wttrin-show-raw-setup) + (unwind-protect + (progn + (testutil-wttrin-mock-http-response "Alpha\nBravo\nCharlie" + (debug-wttrin-show-raw "Paris")) + (with-current-buffer "*wttrin-debug*" + (let ((contents (buffer-string))) + (should (string-match-p "^ *1: Alpha" contents)) + (should (string-match-p "^ *2: Bravo" contents)) + (should (string-match-p "^ *3: Charlie" contents))))) + (test-debug-wttrin-show-raw-teardown))) + +(ert-deftest test-debug-wttrin-show-raw-normal-fetches-correct-location () + "The function should fetch weather for the specified location." + (test-debug-wttrin-show-raw-setup) + (unwind-protect + (let ((fetched-location nil)) + (cl-letf (((symbol-function 'wttrin--get-cached-or-fetch) + (lambda (location callback) + (setq fetched-location location) + (funcall callback "data")))) + (debug-wttrin-show-raw "Berlin, DE") + (should (equal fetched-location "Berlin, DE")))) + (test-debug-wttrin-show-raw-teardown))) + +;;; Boundary Cases + +(ert-deftest test-debug-wttrin-show-raw-boundary-single-line () + "Single-line response should get line number 1." + (test-debug-wttrin-show-raw-setup) + (unwind-protect + (progn + (testutil-wttrin-mock-http-response "Just one line" + (debug-wttrin-show-raw "Paris")) + (with-current-buffer "*wttrin-debug*" + (let ((contents (buffer-string))) + (should (string-match-p "^ *1: Just one line" contents))))) + (test-debug-wttrin-show-raw-teardown))) + +;;; Error Cases + +(ert-deftest test-debug-wttrin-show-raw-error-nil-response-should-not-crash () + "When the fetch returns nil, the function should handle it gracefully." + (test-debug-wttrin-show-raw-setup) + (unwind-protect + (cl-letf (((symbol-function 'wttrin--get-cached-or-fetch) + (lambda (_location callback) + (funcall callback nil)))) + ;; Should not crash + (debug-wttrin-show-raw "BadLocation") + ;; Buffer should exist even on error + (should (get-buffer "*wttrin-debug*"))) + (test-debug-wttrin-show-raw-teardown))) + +(provide 'test-debug-wttrin-show-raw) +;;; test-debug-wttrin-show-raw.el ends here diff --git a/wttrin-debug.el b/wttrin-debug.el index a0576a4..e1d4697 100644 --- a/wttrin-debug.el +++ b/wttrin-debug.el @@ -41,19 +41,22 @@ "Fetch and display raw wttr.in data for LOCATION with line numbers. This is useful for debugging header parsing issues." (interactive "sLocation: ") - (let ((raw-string (wttrin--get-cached-or-fetch location))) - (with-current-buffer (get-buffer-create "*wttrin-debug*") - (erase-buffer) - (insert raw-string) - (goto-char (point-min)) - (let ((line-num 1)) - (while (not (eobp)) - (beginning-of-line) - (insert (format "%2d: " line-num)) - (setq line-num (1+ line-num)) - (forward-line 1))) - (goto-char (point-min)) - (switch-to-buffer (current-buffer))))) + (wttrin--get-cached-or-fetch + location + (lambda (raw-string) + (with-current-buffer (get-buffer-create "*wttrin-debug*") + (erase-buffer) + (when raw-string + (insert raw-string)) + (goto-char (point-min)) + (let ((line-num 1)) + (while (not (eobp)) + (beginning-of-line) + (insert (format "%2d: " line-num)) + (setq line-num (1+ line-num)) + (forward-line 1))) + (goto-char (point-min)) + (switch-to-buffer (current-buffer)))))) ;;;###autoload (defun debug-wttrin-enable () -- cgit v1.2.3