From 752e2f825b1ee3eb513e27f2c03bcaef30eec767 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 4 Apr 2026 13:24:01 -0500 Subject: fix: cache timestamp reflects request time, not response time float-time was captured in the outer let* before the async fetch. The callback used this stale value, making cache entries appear slightly older than they are. Move the float-time call into the callback so the timestamp reflects when the data actually arrived. --- tests/test-wttrin--get-cached-or-fetch.el | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'tests') diff --git a/tests/test-wttrin--get-cached-or-fetch.el b/tests/test-wttrin--get-cached-or-fetch.el index fa6b9d0..75b4e8b 100644 --- a/tests/test-wttrin--get-cached-or-fetch.el +++ b/tests/test-wttrin--get-cached-or-fetch.el @@ -328,5 +328,33 @@ Proactive refresh keeps data fresh; on-demand reads always use cache." (should (equal callback-result test-wttrin--get-cached-or-fetch-new-weather)))) (test-wttrin--get-cached-or-fetch-teardown))) +(ert-deftest test-wttrin--get-cached-or-fetch-normal-timestamp-reflects-response-time () + "Cache timestamp should reflect when the response arrived, not when +the request was initiated. A stale request-time timestamp would make +the cached data appear older than it actually is." + (test-wttrin--get-cached-or-fetch-setup) + (unwind-protect + (let* ((location "Paris") + (cache-key (wttrin--make-cache-key location)) + (response-time 5000.0)) + (cl-letf (((symbol-function 'float-time) + (lambda () response-time)) + ((symbol-function 'wttrin-fetch-raw-string) + (lambda (_query callback) + ;; Simulate time passing: response arrives later + (setq response-time 5005.0) + (funcall callback "fresh data"))) + ((symbol-function 'wttrin--cleanup-cache-if-needed) + (lambda () nil))) + (let ((wttrin--force-refresh t)) + (wttrin--get-cached-or-fetch + location + (lambda (_data) nil))) + ;; Timestamp should be 5005 (when callback ran), not 5000 (when request started) + (let ((cached (gethash cache-key wttrin--cache))) + (should cached) + (should (= (car cached) 5005.0))))) + (test-wttrin--get-cached-or-fetch-teardown))) + (provide 'test-wttrin--get-cached-or-fetch) ;;; test-wttrin--get-cached-or-fetch.el ends here -- cgit v1.2.3