AtlatestRepositorytube

tube / tree / testtest-youtube.sgl

1;;; Test suite for (tube youtube)
2;;;
3;;; Tests YouTube helper functions using fixture data.
4;;; Does not require a YouTube API connection.
5
6(import (sigil test)
7 (sigil string)
8 (sigil struct)
9 (sigil dict)
10 (youtube)
11 (youtube live)
12 (youtube playlist)
13 (tube config)
14 (tube youtube))
16;; ========== Client Construction ==========
18(test-group "require-youtube-client"
19 (test "raises when no credentials set"
20 (let ((config (tube-config)))
21 (assert-error (require-youtube-client config))))
23 (test "creates client with access token"
24 (let* ((config (tube-config youtube-access-token: "test-token"))
25 (client (require-youtube-client config)))
26 (assert-true (youtube-client? client))
27 (assert-equal "test-token" (youtube-client-access-token client))))
29 (test "creates client with api key only"
30 (let* ((config (tube-config youtube-api-key: "test-key"))
31 (client (require-youtube-client config)))
32 (assert-true (youtube-client? client))
33 (assert-equal "test-key" (youtube-client-api-key client)))))
35;; ========== Formatting ==========
37(test-group "format-video"
38 (test "formats video with stats"
39 (let* ((video (youtube-video
40 id: "abc123"
41 title: "Test Video"
42 description: "A test"
43 statistics: #{ viewCount: "1000"
44 likeCount: "50"
45 commentCount: "10" }))
46 (result (format-video video)))
47 (assert-true (string-contains? result "abc123"))
48 (assert-true (string-contains? result "Test Video"))
49 (assert-true (string-contains? result "1000"))
50 (assert-true (string-contains? result "50"))
51 (assert-true (string-contains? result "10"))))
53 (test "formats video without stats"
54 (let* ((video (youtube-video
55 id: "def456"
56 title: "No Stats Video"))
57 (result (format-video video)))
58 (assert-true (string-contains? result "def456"))
59 (assert-true (string-contains? result "No Stats Video")))))
61(test-group "format-broadcast"
62 (test "formats broadcast with schedule"
63 (let* ((broadcast (youtube-broadcast
64 id: "bc123"
65 title: "Weekly Stream"
66 lifecycle-status: "upcoming"
67 scheduled-start: "2026-03-28T18:00:00Z"))
68 (result (format-broadcast broadcast)))
69 (assert-true (string-contains? result "bc123"))
70 (assert-true (string-contains? result "Weekly Stream"))
71 (assert-true (string-contains? result "upcoming"))
72 (assert-true (string-contains? result "2026-03-28"))))
74 (test "formats broadcast without schedule"
75 (let* ((broadcast (youtube-broadcast
76 id: "bc456"
77 title: "Ad Hoc Stream"
78 lifecycle-status: "live"))
79 (result (format-broadcast broadcast)))
80 (assert-true (string-contains? result "live")))))
82(test-group "format-playlist"
83 (test "formats playlist"
84 (let* ((playlist (youtube-playlist
85 id: "pl123"
86 title: "My Playlist"
87 item-count: 42
88 privacy-status: "public"))
89 (result (format-playlist playlist)))
90 (assert-true (string-contains? result "pl123"))
91 (assert-true (string-contains? result "My Playlist"))
92 (assert-true (string-contains? result "42"))
93 (assert-true (string-contains? result "public")))))
95;; ========== Analytics Formatting ==========
97(test-group "format-analytics-row"
98 (test "formats mixed string and number row"
99 (let ((result (format-analytics-row '("2026-03-20" 150 320 45 5))))
100 (assert-equal "2026-03-20\t150\t320\t45\t5" result)))
102 (test "formats all-string row"
103 (let ((result (format-analytics-row '("a" "b" "c"))))
104 (assert-equal "a\tb\tc" result))))
106(run-tests)