summaryrefslogtreecommitdiff
path: root/tests/test-calendar-sync--get-exdates.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-calendar-sync--get-exdates.el')
-rw-r--r--tests/test-calendar-sync--get-exdates.el121
1 files changed, 121 insertions, 0 deletions
diff --git a/tests/test-calendar-sync--get-exdates.el b/tests/test-calendar-sync--get-exdates.el
new file mode 100644
index 00000000..3283bbae
--- /dev/null
+++ b/tests/test-calendar-sync--get-exdates.el
@@ -0,0 +1,121 @@
+;;; test-calendar-sync--get-exdates.el --- Tests for EXDATE extraction -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Unit tests for calendar-sync--get-exdates function.
+;; Tests extraction of EXDATE properties from VEVENT strings.
+;; Following quality-engineer.org guidelines: one function per file.
+
+;;; Code:
+
+(require 'ert)
+(add-to-list 'load-path (expand-file-name "." (file-name-directory load-file-name)))
+(add-to-list 'load-path (expand-file-name "../modules" (file-name-directory load-file-name)))
+(require 'testutil-calendar-sync)
+(require 'calendar-sync)
+
+;;; Normal Cases
+
+(ert-deftest test-calendar-sync--get-exdates-normal-single-returns-list ()
+ "Test extracting single EXDATE returns list with one value."
+ (let ((event "BEGIN:VEVENT
+DTSTART:20260203T130000
+RRULE:FREQ=WEEKLY;BYDAY=TU
+EXDATE:20260210T130000
+SUMMARY:Weekly Meeting
+END:VEVENT"))
+ (let ((result (calendar-sync--get-exdates event)))
+ (should (listp result))
+ (should (= 1 (length result)))
+ (should (string= "20260210T130000" (car result))))))
+
+(ert-deftest test-calendar-sync--get-exdates-normal-multiple-returns-all ()
+ "Test extracting multiple EXDATEs returns all values."
+ (let ((event "BEGIN:VEVENT
+DTSTART:20260203T130000
+RRULE:FREQ=WEEKLY;BYDAY=TU
+EXDATE:20260210T130000
+EXDATE:20260217T130000
+EXDATE:20260224T130000
+SUMMARY:Weekly Meeting
+END:VEVENT"))
+ (let ((result (calendar-sync--get-exdates event)))
+ (should (= 3 (length result)))
+ (should (member "20260210T130000" result))
+ (should (member "20260217T130000" result))
+ (should (member "20260224T130000" result)))))
+
+(ert-deftest test-calendar-sync--get-exdates-normal-with-tzid-returns-value ()
+ "Test extracting EXDATE with TZID parameter extracts value correctly."
+ (let ((event "BEGIN:VEVENT
+DTSTART;TZID=America/New_York:20260203T130000
+RRULE:FREQ=WEEKLY;BYDAY=TU
+EXDATE;TZID=America/New_York:20260210T130000
+SUMMARY:Weekly Meeting
+END:VEVENT"))
+ (let ((result (calendar-sync--get-exdates event)))
+ (should (= 1 (length result)))
+ (should (string= "20260210T130000" (car result))))))
+
+(ert-deftest test-calendar-sync--get-exdates-normal-with-z-suffix-returns-value ()
+ "Test extracting UTC EXDATE with Z suffix."
+ (let ((event "BEGIN:VEVENT
+DTSTART:20260203T180000Z
+RRULE:FREQ=WEEKLY;BYDAY=TU
+EXDATE:20260210T180000Z
+SUMMARY:Weekly UTC Meeting
+END:VEVENT"))
+ (let ((result (calendar-sync--get-exdates event)))
+ (should (= 1 (length result)))
+ (should (string= "20260210T180000Z" (car result))))))
+
+;;; Boundary Cases
+
+(ert-deftest test-calendar-sync--get-exdates-boundary-no-exdate-returns-nil ()
+ "Test that event without EXDATE returns nil."
+ (let ((event "BEGIN:VEVENT
+DTSTART:20260203T130000
+RRULE:FREQ=WEEKLY;BYDAY=TU
+SUMMARY:Weekly Meeting
+END:VEVENT"))
+ (should (null (calendar-sync--get-exdates event)))))
+
+(ert-deftest test-calendar-sync--get-exdates-boundary-date-only-returns-value ()
+ "Test extracting all-day EXDATE (date only, no time)."
+ (let ((event "BEGIN:VEVENT
+DTSTART;VALUE=DATE:20260203
+RRULE:FREQ=WEEKLY;BYDAY=TU
+EXDATE;VALUE=DATE:20260210
+SUMMARY:All Day Event
+END:VEVENT"))
+ (let ((result (calendar-sync--get-exdates event)))
+ (should (= 1 (length result)))
+ (should (string= "20260210" (car result))))))
+
+(ert-deftest test-calendar-sync--get-exdates-boundary-multiple-params-returns-value ()
+ "Test extracting EXDATE with VALUE=DATE-TIME and TZID parameters."
+ (let ((event "BEGIN:VEVENT
+DTSTART;TZID=America/Chicago:20260203T130000
+RRULE:FREQ=WEEKLY;BYDAY=TU
+EXDATE;VALUE=DATE-TIME;TZID=America/Chicago:20260210T130000
+SUMMARY:Multi-param Meeting
+END:VEVENT"))
+ (let ((result (calendar-sync--get-exdates event)))
+ (should (= 1 (length result)))
+ (should (string= "20260210T130000" (car result))))))
+
+;;; Error Cases
+
+(ert-deftest test-calendar-sync--get-exdates-error-empty-string-returns-nil ()
+ "Test that empty string returns nil."
+ (should (null (calendar-sync--get-exdates ""))))
+
+(ert-deftest test-calendar-sync--get-exdates-error-nil-input-returns-nil ()
+ "Test that nil input returns nil."
+ (should (null (calendar-sync--get-exdates nil))))
+
+(ert-deftest test-calendar-sync--get-exdates-error-malformed-returns-nil ()
+ "Test that malformed event string returns nil."
+ (should (null (calendar-sync--get-exdates "not a vevent"))))
+
+(provide 'test-calendar-sync--get-exdates)
+;;; test-calendar-sync--get-exdates.el ends here