AtlatestRepositorytube

tube / tree / testtest-twitch.sgl

1;;; Test suite for (tube twitch)
2;;;
3;;; Tests Twitch helper functions using fixture data.
4;;; Does not require a Twitch API connection.
5
6(import (sigil test)
7 (sigil string)
8 (sigil struct)
9 (sigil dict)
10 (twitch)
11 (twitch schedule)
12 (twitch analytics)
13 (tube config)
14 (tube twitch))
16;; ========== Client Construction ==========
18(test-group "require-twitch-client"
19 (test "raises when no credentials set"
20 (let ((config (tube-config)))
21 (assert-error (require-twitch-client config))))
23 (test "raises when only client-id set"
24 (let ((config (tube-config twitch-client-id: "test-id")))
25 (assert-error (require-twitch-client config))))
27 (test "raises when only access-token set"
28 (let ((config (tube-config twitch-access-token: "test-token")))
29 (assert-error (require-twitch-client config))))
31 (test "creates client with both credentials"
32 (let* ((config (tube-config
33 twitch-client-id: "test-id"
34 twitch-access-token: "test-token"))
35 (client (require-twitch-client config)))
36 (assert-true (twitch-client? client))
37 (assert-equal "test-id" (twitch-client-client-id client))
38 (assert-equal "test-token" (twitch-client-access-token client)))))
40;; ========== Formatting ==========
42(test-group "format-twitch-channel"
43 (test "formats channel with title and game"
44 (let* ((channel (twitch-channel
45 id: "123"
46 name: "systemcrafters"
47 title: "Building with Sigil"
48 game-name: "Science & Technology"))
49 (result (format-twitch-channel channel)))
50 (assert-true (string-contains? result "systemcrafters"))
51 (assert-true (string-contains? result "Building with Sigil"))
52 (assert-true (string-contains? result "Science & Technology"))))
54 (test "formats channel without title"
55 (let* ((channel (twitch-channel
56 id: "123"
57 name: "systemcrafters"
58 title: ""))
59 (result (format-twitch-channel channel)))
60 (assert-true (string-contains? result "systemcrafters"))
61 (assert-false (string-contains? result " - ")))))
63(test-group "format-schedule-segment"
64 (test "formats recurring segment"
65 (let* ((seg (twitch-schedule-segment
66 id: "seg1"
67 start-time: "2026-03-28T18:00:00Z"
68 end-time: "2026-03-28T20:00:00Z"
69 title: "Weekly Stream"
70 category: #{ name: "Just Chatting" }
71 is-recurring: #t))
72 (result (format-schedule-segment seg)))
73 (assert-true (string-contains? result "2026-03-28T18:00:00Z"))
74 (assert-true (string-contains? result "Weekly Stream"))
75 (assert-true (string-contains? result "Just Chatting"))
76 (assert-true (string-contains? result "recurring"))))
78 (test "formats non-recurring segment without category"
79 (let* ((seg (twitch-schedule-segment
80 id: "seg2"
81 start-time: "2026-04-01T20:00:00Z"
82 end-time: "2026-04-01T22:00:00Z"
83 title: "Special Event"
84 is-recurring: #f))
85 (result (format-schedule-segment seg)))
86 (assert-true (string-contains? result "Special Event"))
87 (assert-false (string-contains? result "recurring")))))
89(test-group "format-twitch-clip"
90 (test "formats clip"
91 (let* ((clip (twitch-clip
92 id: "clip1"
93 url: "https://clips.twitch.tv/test"
94 title: "Amazing Moment"
95 view-count: 500))
96 (result (format-twitch-clip clip)))
97 (assert-true (string-contains? result "Amazing Moment"))
98 (assert-true (string-contains? result "500"))
99 (assert-true (string-contains? result "https://clips.twitch.tv/test")))))
101(test-group "format-twitch-video"
102 (test "formats video"
103 (let* ((video (twitch-video
104 id: "v123"
105 title: "Past Stream"
106 type: "archive"
107 view-count: 200))
108 (result (format-twitch-video video)))
109 (assert-true (string-contains? result "v123"))
110 (assert-true (string-contains? result "Past Stream"))
111 (assert-true (string-contains? result "archive"))
112 (assert-true (string-contains? result "200")))))
114(run-tests)