AtlatestRepositorytube
1
;;; Test suite for (tube twitch)2
;;;3
;;; Tests Twitch helper functions using fixture data.4
;;; Does not require a Twitch API connection.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-config33
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-channel45
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-channel56
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-segment66
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-segment80
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-clip92
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-video104
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)