Parent directory

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}