AtlatestRepositorytube
1
;;; Test suite for (tube youtube)2
;;;3
;;; Tests YouTube helper functions using fixture data.4
;;; Does not require a YouTube API connection.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-video40
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-video55
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-broadcast64
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-broadcast76
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-playlist85
id: "pl123"86
title: "My Playlist"87
item-count: 4288
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)