summaryrefslogtreecommitdiff
path: root/tests/test-wttrin--make-cache-key.el
blob: ad2238d51d92d287fc274e45cf2bf417c31cbdb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;;; test-wttrin--make-cache-key.el --- Tests for wttrin--make-cache-key -*- lexical-binding: t; -*-

;; Copyright (C) 2024 Craig Jennings

;;; Commentary:
;; Unit tests for wttrin--make-cache-key function.
;; Tests cache key generation to ensure different configurations produce different keys.

;;; Code:

(require 'ert)
(require 'wttrin)

;;; Normal Cases

(ert-deftest test-wttrin--make-cache-key-normal-location-with-metric ()
  "Test cache key generation with metric unit system."
  (let ((wttrin-unit-system "m"))
    (should (string= "Paris|m" (wttrin--make-cache-key "Paris")))))

(ert-deftest test-wttrin--make-cache-key-normal-location-with-imperial ()
  "Test cache key generation with USCS/imperial unit system."
  (let ((wttrin-unit-system "u"))
    (should (string= "London|u" (wttrin--make-cache-key "London")))))

(ert-deftest test-wttrin--make-cache-key-normal-location-with-nil-system ()
  "Test cache key generation with nil unit system (default)."
  (let ((wttrin-unit-system nil))
    (should (string= "Tokyo|default" (wttrin--make-cache-key "Tokyo")))))

(ert-deftest test-wttrin--make-cache-key-normal-different-locations-different-keys ()
  "Test that different locations produce different cache keys."
  (let ((wttrin-unit-system "m"))
    (should-not (string= (wttrin--make-cache-key "Paris")
                        (wttrin--make-cache-key "London")))))

;;; Boundary Cases

(ert-deftest test-wttrin--make-cache-key-boundary-same-location-different-units ()
  "Test that same location with different unit systems produces different keys.
This is critical - cache misses would occur if keys were the same."
  (let* ((location "Paris")
         (key-metric (let ((wttrin-unit-system "m"))
                      (wttrin--make-cache-key location)))
         (key-imperial (let ((wttrin-unit-system "u"))
                        (wttrin--make-cache-key location)))
         (key-default (let ((wttrin-unit-system nil))
                       (wttrin--make-cache-key location))))
    (should-not (string= key-metric key-imperial))
    (should-not (string= key-metric key-default))
    (should-not (string= key-imperial key-default))))

(ert-deftest test-wttrin--make-cache-key-boundary-location-with-special-chars ()
  "Test cache key generation with special characters in location."
  (let ((wttrin-unit-system "m"))
    (should (string= "São Paulo|m" (wttrin--make-cache-key "São Paulo")))))

(ert-deftest test-wttrin--make-cache-key-boundary-location-with-unicode ()
  "Test cache key generation with Unicode characters."
  (let ((wttrin-unit-system nil))
    (should (string= "北京|default" (wttrin--make-cache-key "北京")))))

(ert-deftest test-wttrin--make-cache-key-boundary-location-with-comma ()
  "Test cache key generation with comma in location (e.g., 'City, Country')."
  (let ((wttrin-unit-system "m"))
    (should (string= "London, GB|m" (wttrin--make-cache-key "London, GB")))))

(ert-deftest test-wttrin--make-cache-key-boundary-empty-string-location ()
  "Test cache key generation with empty string location."
  (let ((wttrin-unit-system "m"))
    (should (string= "|m" (wttrin--make-cache-key "")))))

(ert-deftest test-wttrin--make-cache-key-boundary-location-with-pipe-char ()
  "Test cache key with location containing pipe character (separator).
This could potentially cause cache key parsing issues."
  (let ((wttrin-unit-system "m"))
    (let ((key (wttrin--make-cache-key "Test|Location")))
      (should (string-match-p "|" key))
      ;; Should contain TWO pipe characters: one from location, one as separator
      (should (= 2 (cl-count ?| key))))))

;;; Error Cases

(ert-deftest test-wttrin--make-cache-key-error-consistent-keys ()
  "Test that calling with same inputs always produces same key (idempotent)."
  (let ((wttrin-unit-system "m"))
    (let ((key1 (wttrin--make-cache-key "Paris"))
          (key2 (wttrin--make-cache-key "Paris"))
          (key3 (wttrin--make-cache-key "Paris")))
      (should (string= key1 key2))
      (should (string= key2 key3)))))

(provide 'test-wttrin--make-cache-key)
;;; test-wttrin--make-cache-key.el ends here