channels_test.go
4434 bytes
1package ytrssil_test
2
3import (
4 "bytes"
5 "context"
6 "encoding/json"
7 "fmt"
8 "net/http"
9 "net/http/httptest"
10 "strings"
11 "testing"
12
13 "github.com/stretchr/testify/suite"
14
15 "github.com/TheEdgeOfRage/ytrssil-api/models"
16)
17
18type ChannelsTestSuite struct {
19 EndpointsTestSuite
20}
21
22func TestChannelsTestSuite(t *testing.T) {
23 suite.Run(t, new(ChannelsTestSuite))
24}
25
26func (s *ChannelsTestSuite) TestSubscribeToChannelJSON() {
27 channelID := "test-channel-123"
28
29 w := httptest.NewRecorder()
30 requestBody := fmt.Sprintf(`{"channel_id":"%s"}`, channelID)
31 req, _ := http.NewRequest("POST", "/api/channels/subscribe", bytes.NewBufferString(requestBody))
32 req.Header.Set("Authorization", s.cfg.AuthToken)
33 req.Header.Set("Content-Type", "application/json")
34 s.server.Handler.ServeHTTP(w, req)
35
36 s.Equal(http.StatusOK, w.Code)
37
38 var response models.Channel
39 err := json.Unmarshal(w.Body.Bytes(), &response)
40 s.Require().NoError(err)
41 s.Equal(channelID, response.ID)
42 s.Equal(fmt.Sprintf("Test Channel %s", channelID), response.Name)
43 s.True(response.Subscribed)
44}
45
46func (s *ChannelsTestSuite) TestSubscribeToChannelJSONWithURL() {
47 channelURL := "https://m.youtube.com/@channel-234"
48
49 w := httptest.NewRecorder()
50 requestBody := fmt.Sprintf(`{"channel_id":"%s"}`, channelURL)
51 req, _ := http.NewRequest("POST", "/api/channels/subscribe", bytes.NewBufferString(requestBody))
52 req.Header.Set("Authorization", s.cfg.AuthToken)
53 req.Header.Set("Content-Type", "application/json")
54 s.server.Handler.ServeHTTP(w, req)
55
56 s.Equal(http.StatusOK, w.Code)
57
58 var response models.Channel
59 err := json.Unmarshal(w.Body.Bytes(), &response)
60 s.Require().NoError(err)
61 s.Equal("channel-234", response.ID)
62}
63
64func (s *ChannelsTestSuite) TestUnsubscribeFromChannelJSON() {
65 channelID := "test-channel-456"
66
67 ctx := context.Background()
68 err := s.db.SubscribeToChannel(ctx, models.Channel{
69 ID: channelID,
70 Name: "Test Channel",
71 Subscribed: true,
72 })
73 s.Require().NoError(err)
74
75 w := httptest.NewRecorder()
76 req, _ := http.NewRequest("POST", fmt.Sprintf("/api/channels/%s/unsubscribe", channelID), nil)
77 req.Header.Set("Authorization", s.cfg.AuthToken)
78 s.server.Handler.ServeHTTP(w, req)
79
80 s.Equal(http.StatusOK, w.Code)
81
82 var response map[string]string
83 err = json.Unmarshal(w.Body.Bytes(), &response)
84 s.Require().NoError(err)
85 s.Equal("unsubscribed from channel successfully", response["msg"])
86}
87
88func (s *ChannelsTestSuite) TestChannelsPage() {
89 ctx := context.Background()
90
91 err := s.db.SubscribeToChannel(ctx, models.Channel{
92 ID: "channel-606",
93 Name: "Test Channel Page",
94 Subscribed: true,
95 ImageURL: "https://example.com/image.jpg",
96 })
97 s.Require().NoError(err)
98
99 w := httptest.NewRecorder()
100 req, _ := http.NewRequest("GET", "/channels", nil)
101 req.AddCookie(&http.Cookie{Name: "token", Value: s.cfg.AuthToken})
102 s.server.Handler.ServeHTTP(w, req)
103
104 s.Equal(http.StatusOK, w.Code)
105 s.Contains(w.Body.String(), "Test Channel Page")
106}
107
108func (s *ChannelsTestSuite) TestSubscribeToChannelPage() {
109 w := httptest.NewRecorder()
110 req, _ := http.NewRequest("POST", "/subscribe", strings.NewReader(`{"channelID":"https://youtube.com/@channel-707"}`))
111 req.Header.Set("Content-Type", "application/json")
112 req.AddCookie(&http.Cookie{Name: "token", Value: s.cfg.AuthToken})
113 s.server.Handler.ServeHTTP(w, req)
114
115 s.Equal(http.StatusOK, w.Code)
116 s.Contains(w.Header().Get("Content-Type"), "text/event-stream")
117}
118
119func (s *ChannelsTestSuite) TestUnsubscribeFromChannelPage() {
120 ctx := context.Background()
121 channelID := "channel-808"
122
123 err := s.db.SubscribeToChannel(ctx, models.Channel{
124 ID: channelID,
125 Name: "Test Channel",
126 Subscribed: true,
127 })
128 s.Require().NoError(err)
129
130 w := httptest.NewRecorder()
131 req, _ := http.NewRequest("POST", fmt.Sprintf("/channels/%s/unsubscribe", channelID), nil)
132 req.AddCookie(&http.Cookie{Name: "token", Value: s.cfg.AuthToken})
133 s.server.Handler.ServeHTTP(w, req)
134
135 s.Equal(http.StatusOK, w.Code)
136}
137
138func (s *ChannelsTestSuite) TestSubscribeRequiresAuth() {
139 w := httptest.NewRecorder()
140 req, _ := http.NewRequest("POST", "/api/channels/subscribe", nil)
141 s.server.Handler.ServeHTTP(w, req)
142
143 s.Equal(http.StatusUnauthorized, w.Code)
144}
145
146func (s *ChannelsTestSuite) TestUnsubscribeRequiresAuth() {
147 w := httptest.NewRecorder()
148 req, _ := http.NewRequest("POST", "/api/channels/test/unsubscribe", nil)
149 s.server.Handler.ServeHTTP(w, req)
150
151 s.Equal(http.StatusUnauthorized, w.Code)
152}