diff --git a/pkg/activity/activity_test.go b/pkg/activity/activity_test.go index c10a092..a8c8898 100644 --- a/pkg/activity/activity_test.go +++ b/pkg/activity/activity_test.go @@ -4,12 +4,10 @@ package activity import ( - "bytes" - "fmt" + "io" "math" "net/http" "reflect" - "strings" "testing" "github.com/eat-pray-ai/yutu/pkg/common" @@ -325,32 +323,7 @@ func TestActivity_Get(t *testing.T) { } func TestActivity_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = `{"id": "id"}` - } - jsonItems := "[" + strings.Join(items, ",") + "]" - _, _ = fmt.Fprintf( - w, `{ - "items": %s, - "nextPageToken": "page-2" - }`, jsonItems, - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "21"}, {"id": "22"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - + svc := common.NewTestService(t, common.PaginationHandler("activity")) a := NewActivity( WithService(svc), WithChannelId("channel-id"), @@ -366,79 +339,16 @@ func TestActivity_Get_Pagination(t *testing.T) { } func TestActivity_List(t *testing.T) { - mockResponse := `{ - "items": [ - { - "id": "activity-1", - "snippet": { - "title": "Activity 1", - "type": "upload", - "publishedAt": "2024-01-01T00:00:00Z" - } - } - ], - "nextPageToken": "" - }` - - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write([]byte(mockResponse)) - }, - ), + common.RunListTest( + t, + `{"items": [{"id": "activity-1", "snippet": {"title": "Activity 1", "type": "upload", "publishedAt": "2024-01-01T00:00:00Z"}}], "nextPageToken": ""}`, + func(svc *youtube.Service, output string) func(io.Writer) error { + a := NewActivity( + WithService(svc), + WithOutput(output), + WithChannelId("channel-id"), + ) + return a.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list activities json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithChannelId("channel-id"), - }, - output: "json", - wantErr: false, - }, - { - name: "list activities yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithChannelId("channel-id"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list activities table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithChannelId("channel-id"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - a := NewActivity(tt.opts...) - var buf bytes.Buffer - if err := a.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Activity.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Activity.List() output is empty") - } - }, - ) - } } diff --git a/pkg/auth/BUILD.bazel b/pkg/auth/BUILD.bazel index 9abc67e..8ff5201 100644 --- a/pkg/auth/BUILD.bazel +++ b/pkg/auth/BUILD.bazel @@ -27,6 +27,7 @@ go_test( embed = [":auth"], deps = [ "//pkg", + "@org_golang_google_api//youtube/v3:youtube", "@org_golang_x_oauth2//:oauth2", ], ) diff --git a/pkg/caption/caption_test.go b/pkg/caption/caption_test.go index 0376b12..ea6029d 100644 --- a/pkg/caption/caption_test.go +++ b/pkg/caption/caption_test.go @@ -7,6 +7,7 @@ import ( "bytes" "context" "errors" + "io" "net/http" "net/http/httptest" "os" @@ -308,80 +309,18 @@ func TestCaption_Get(t *testing.T) { } func TestCaption_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ - "items": [ - { - "id": "caption-1", - "snippet": { - "videoId": "video-1", - "name": "English", - "language": "en" - } - } - ] - }`), - ) - }, - ), + common.RunListTest( + t, + `{"items": [{"id": "caption-1", "snippet": {"videoId": "video-1", "name": "English", "language": "en"}}]}`, + func(svc *youtube.Service, output string) func(io.Writer) error { + c := NewCaption( + WithService(svc), + WithOutput(output), + WithVideoId("video-1"), + ) + return c.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list captions json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithVideoId("video-1"), - }, - output: "json", - wantErr: false, - }, - { - name: "list captions yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithVideoId("video-1"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list captions table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithVideoId("video-1"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - c := NewCaption(tt.opts...) - var buf bytes.Buffer - if err := c.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Caption.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Caption.List() output is empty") - } - }, - ) - } } func TestCaption_Insert(t *testing.T) { diff --git a/pkg/channel/channel_test.go b/pkg/channel/channel_test.go index b4dcd68..971fa17 100644 --- a/pkg/channel/channel_test.go +++ b/pkg/channel/channel_test.go @@ -5,11 +5,10 @@ package channel import ( "bytes" - "fmt" + "io" "math" "net/http" "reflect" - "strings" "testing" "github.com/eat-pray-ai/yutu/pkg/common" @@ -412,34 +411,7 @@ func TestChannel_Get(t *testing.T) { } func TestChannel_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "channel-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "channel-20"}, {"id": "channel-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - + svc := common.NewTestService(t, common.PaginationHandler("channel")) c := NewChannel( WithService(svc), WithMaxResults(22), @@ -454,79 +426,18 @@ func TestChannel_Get_Pagination(t *testing.T) { } func TestChannel_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ - "items": [ - { - "id": "channel-1", - "snippet": { - "title": "Channel 1", - "country": "US" - } - } - ] - }`), - ) - }, - ), + common.RunListTest( + t, + `{"items": [{"id": "channel-1", "snippet": {"title": "Channel 1", "country": "US"}}]}`, + func(svc *youtube.Service, output string) func(io.Writer) error { + c := NewChannel( + WithService(svc), + WithOutput(output), + WithIds([]string{"channel-1"}), + ) + return c.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list channels json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithIds([]string{"channel-1"}), - }, - output: "json", - wantErr: false, - }, - { - name: "list channels yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithIds([]string{"channel-1"}), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list channels table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithIds([]string{"channel-1"}), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - c := NewChannel(tt.opts...) - var buf bytes.Buffer - if err := c.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Channel.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Channel.List() output is empty") - } - }, - ) - } } func TestChannel_Update(t *testing.T) { diff --git a/pkg/channelSection/channelSection_test.go b/pkg/channelSection/channelSection_test.go index 0c4f7bf..6af001e 100644 --- a/pkg/channelSection/channelSection_test.go +++ b/pkg/channelSection/channelSection_test.go @@ -5,6 +5,7 @@ package channelSection import ( "bytes" + "io" "net/http" "reflect" "testing" @@ -260,12 +261,7 @@ func TestChannelSection_Get(t *testing.T) { } func TestChannelSection_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "section-1", @@ -275,66 +271,12 @@ func TestChannelSection_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + cs := NewChannelSection(WithService(svc), WithOutput(output), WithChannelId("channel-1")) + return cs.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list channel sections json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithChannelId("channel-1"), - }, - output: "json", - wantErr: false, - }, - { - name: "list channel sections yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithChannelId("channel-1"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list channel sections table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithChannelId("channel-1"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - cs := NewChannelSection(tt.opts...) - var buf bytes.Buffer - if err := cs.List(&buf); (err != nil) != tt.wantErr { - t.Errorf( - "ChannelSection.List() error = %v, wantErr %v", err, tt.wantErr, - ) - } - if buf.Len() == 0 { - t.Errorf("ChannelSection.List() output is empty") - } - }, - ) - } } func TestChannelSection_Delete(t *testing.T) { diff --git a/pkg/comment/comment_test.go b/pkg/comment/comment_test.go index da1c880..bc01879 100644 --- a/pkg/comment/comment_test.go +++ b/pkg/comment/comment_test.go @@ -5,11 +5,10 @@ package comment import ( "bytes" - "fmt" + "io" "math" "net/http" "reflect" - "strings" "testing" "github.com/eat-pray-ai/yutu/pkg/common" @@ -278,34 +277,7 @@ func TestComment_Get(t *testing.T) { } func TestComment_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "comment-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "comment-20"}, {"id": "comment-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - + svc := common.NewTestService(t, common.PaginationHandler("comment")) c := NewComment( WithService(svc), WithMaxResults(22), @@ -320,12 +292,9 @@ func TestComment_Get_Pagination(t *testing.T) { } func TestComment_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest( + t, + `{ "items": [ { "id": "comment-1", @@ -336,67 +305,17 @@ func TestComment_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + c := NewComment( + WithService(svc), + WithOutput(output), + WithIds([]string{"comment-1"}), + WithMaxResults(1), + ) + return c.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list comments json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithIds([]string{"comment-1"}), - WithMaxResults(1), - }, - output: "json", - wantErr: false, - }, - { - name: "list comments yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithIds([]string{"comment-1"}), - WithMaxResults(1), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list comments table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithIds([]string{"comment-1"}), - WithMaxResults(1), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - c := NewComment(tt.opts...) - var buf bytes.Buffer - if err := c.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Comment.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Comment.List() output is empty") - } - }, - ) - } } func TestComment_Insert(t *testing.T) { diff --git a/pkg/commentThread/commentThread_test.go b/pkg/commentThread/commentThread_test.go index 32f029b..985dea1 100644 --- a/pkg/commentThread/commentThread_test.go +++ b/pkg/commentThread/commentThread_test.go @@ -5,11 +5,10 @@ package commentThread import ( "bytes" - "fmt" + "io" "math" "net/http" "reflect" - "strings" "testing" "github.com/eat-pray-ai/yutu/pkg/common" @@ -308,34 +307,7 @@ func TestCommentThread_Get(t *testing.T) { } func TestCommentThread_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "thread-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "thread-20"}, {"id": "thread-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - + svc := common.NewTestService(t, common.PaginationHandler("thread")) c := NewCommentThread( WithService(svc), WithMaxResults(22), @@ -350,12 +322,9 @@ func TestCommentThread_Get_Pagination(t *testing.T) { } func TestCommentThread_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest( + t, + `{ "items": [ { "id": "thread-1", @@ -370,69 +339,17 @@ func TestCommentThread_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + c := NewCommentThread( + WithService(svc), + WithOutput(output), + WithIds([]string{"thread-1"}), + WithMaxResults(1), + ) + return c.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list comment threads json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithIds([]string{"thread-1"}), - WithMaxResults(1), - }, - output: "json", - wantErr: false, - }, - { - name: "list comment threads yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithIds([]string{"thread-1"}), - WithMaxResults(1), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list comment threads table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithIds([]string{"thread-1"}), - WithMaxResults(1), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - c := NewCommentThread(tt.opts...) - var buf bytes.Buffer - if err := c.List(&buf); (err != nil) != tt.wantErr { - t.Errorf( - "CommentThread.List() error = %v, wantErr %v", err, tt.wantErr, - ) - } - if buf.Len() == 0 { - t.Errorf("CommentThread.List() output is empty") - } - }, - ) - } } func TestCommentThread_Insert(t *testing.T) { diff --git a/pkg/common/BUILD.bazel b/pkg/common/BUILD.bazel index df0217a..203ff66 100644 --- a/pkg/common/BUILD.bazel +++ b/pkg/common/BUILD.bazel @@ -1,4 +1,4 @@ -load("@rules_go//go:def.bzl", "go_library") +load("@rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "common", @@ -18,3 +18,13 @@ go_library( "@org_golang_google_api//youtube/v3:youtube", ], ) + +go_test( + name = "common_test", + srcs = ["common_test.go"], + embed = [":common"], + deps = [ + "@com_github_jedib0t_go_pretty_v6//table", + "@org_golang_google_api//youtube/v3:youtube", + ], +) diff --git a/pkg/common/testutil.go b/pkg/common/testutil.go index cf4dc31..d05594e 100644 --- a/pkg/common/testutil.go +++ b/pkg/common/testutil.go @@ -4,9 +4,13 @@ package common import ( + "bytes" "context" + "fmt" + "io" "net/http" "net/http/httptest" + "strings" "testing" "google.golang.org/api/option" @@ -30,3 +34,76 @@ func NewTestService(t *testing.T, handler http.Handler) *youtube.Service { } return svc } + +// PaginationHandler returns an http.HandlerFunc that simulates 2-page pagination. +// idPrefix is used for item IDs (e.g., "channel", "video"). +// An optional itemFmt function can override the default item JSON template; +// it receives the idPrefix and index, and returns the JSON for one item. +func PaginationHandler(idPrefix string, itemFmt ...func(string, int) string) http.HandlerFunc { + fmtItem := func(prefix string, i int) string { + return fmt.Sprintf(`{"id": "%s-%d"}`, prefix, i) + } + if len(itemFmt) > 0 && itemFmt[0] != nil { + fmtItem = itemFmt[0] + } + return func(w http.ResponseWriter, r *http.Request) { + pageToken := r.URL.Query().Get("pageToken") + w.Header().Set("Content-Type", "application/json") + if pageToken == "" { + items := make([]string, 20) + for i := range 20 { + items[i] = fmtItem(idPrefix, i) + } + _, _ = w.Write( + fmt.Appendf( + nil, + `{"items": [%s], "nextPageToken": "page-2"}`, + strings.Join(items, ","), + ), + ) + } else if pageToken == "page-2" { + _, _ = w.Write( + []byte( + fmt.Sprintf( + `{"items": [%s, %s], "nextPageToken": ""}`, + fmtItem(idPrefix, 20), fmtItem(idPrefix, 21), + ), + ), + ) + } + } +} + +// RunListTest runs the standard json/yaml/table output test matrix. +// mockResponse is the JSON the mock server returns. +// listFn receives a *youtube.Service and output format, returns a function +// that calls List on the resource with a writer. +func RunListTest( + t *testing.T, + mockResponse string, + listFn func(svc *youtube.Service, output string) func(io.Writer) error, +) { + t.Helper() + svc := NewTestService( + t, http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(mockResponse)) + }, + ), + ) + + for _, output := range []string{"json", "yaml", "table"} { + t.Run( + "list "+output, func(t *testing.T) { + var buf bytes.Buffer + if err := listFn(svc, output)(&buf); err != nil { + t.Errorf("List(%s) error = %v", output, err) + } + if buf.Len() == 0 { + t.Errorf("List(%s) output is empty", output) + } + }, + ) + } +} diff --git a/pkg/i18nLanguage/i18nLanguage_test.go b/pkg/i18nLanguage/i18nLanguage_test.go index 8965577..423587d 100644 --- a/pkg/i18nLanguage/i18nLanguage_test.go +++ b/pkg/i18nLanguage/i18nLanguage_test.go @@ -4,7 +4,7 @@ package i18nLanguage import ( - "bytes" + "io" "net/http" "reflect" "testing" @@ -135,12 +135,7 @@ func TestI18nLanguage_Get(t *testing.T) { } func TestI18nLanguage_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "en", @@ -150,59 +145,10 @@ func TestI18nLanguage_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + i := NewI18nLanguage(WithService(svc), WithOutput(output)) + return i.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list i18n languages json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - }, - output: "json", - wantErr: false, - }, - { - name: "list i18n languages yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list i18n languages table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - i := NewI18nLanguage(tt.opts...) - var buf bytes.Buffer - if err := i.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("I18nLanguage.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("I18nLanguage.List() output is empty") - } - }, - ) - } } diff --git a/pkg/i18nRegion/i18nRegion_test.go b/pkg/i18nRegion/i18nRegion_test.go index 7298c7c..330d8c0 100644 --- a/pkg/i18nRegion/i18nRegion_test.go +++ b/pkg/i18nRegion/i18nRegion_test.go @@ -4,7 +4,7 @@ package i18nRegion import ( - "bytes" + "io" "net/http" "reflect" "testing" @@ -135,12 +135,7 @@ func TestI18nRegion_Get(t *testing.T) { } func TestI18nRegion_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "US", @@ -150,59 +145,10 @@ func TestI18nRegion_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + i := NewI18nRegion(WithService(svc), WithOutput(output)) + return i.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list i18n regions json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - }, - output: "json", - wantErr: false, - }, - { - name: "list i18n regions yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list i18n regions table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - i := NewI18nRegion(tt.opts...) - var buf bytes.Buffer - if err := i.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("I18nRegion.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("I18nRegion.List() output is empty") - } - }, - ) - } } diff --git a/pkg/member/member_test.go b/pkg/member/member_test.go index 2117cfa..d32ac7f 100644 --- a/pkg/member/member_test.go +++ b/pkg/member/member_test.go @@ -4,12 +4,10 @@ package member import ( - "bytes" - "fmt" + "io" "math" "net/http" "reflect" - "strings" "testing" "github.com/eat-pray-ai/yutu/pkg/common" @@ -233,33 +231,7 @@ func TestMember_Get(t *testing.T) { } func TestMember_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = `{"kind": "youtube#member"}` - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"kind": "youtube#member"}, {"kind": "youtube#member"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) + svc := common.NewTestService(t, common.PaginationHandler("member")) m := NewMember( WithService(svc), @@ -275,78 +247,28 @@ func TestMember_Get_Pagination(t *testing.T) { } func TestMember_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ - "items": [ - { - "snippet": { - "memberDetails": { - "channelId": "channel-1", - "displayName": "Member 1" - } + mockResponse := `{ + "items": [ + { + "snippet": { + "memberDetails": { + "channelId": "channel-1", + "displayName": "Member 1" } } - ] - }`), - ) - }, - ), + } + ] + }` + + common.RunListTest( + t, mockResponse, + func(svc *youtube.Service, output string) func(io.Writer) error { + m := NewMember( + WithService(svc), + WithOutput(output), + WithMaxResults(1), + ) + return m.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list members json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithMaxResults(1), - }, - output: "json", - wantErr: false, - }, - { - name: "list members yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithMaxResults(1), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list members table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithMaxResults(1), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - m := NewMember(tt.opts...) - var buf bytes.Buffer - if err := m.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Member.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Member.List() output is empty") - } - }, - ) - } } diff --git a/pkg/membershipsLevel/membershipsLevel_test.go b/pkg/membershipsLevel/membershipsLevel_test.go index ebf38bd..d374b17 100644 --- a/pkg/membershipsLevel/membershipsLevel_test.go +++ b/pkg/membershipsLevel/membershipsLevel_test.go @@ -4,7 +4,7 @@ package membershipsLevel import ( - "bytes" + "io" "net/http" "reflect" "testing" @@ -100,12 +100,7 @@ func TestMembershipsLevel_Get(t *testing.T) { } func TestMembershipsLevel_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "level-1", @@ -116,61 +111,10 @@ func TestMembershipsLevel_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + m := NewMembershipsLevel(WithService(svc), WithOutput(output)) + return m.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list memberships levels json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - }, - output: "json", - wantErr: false, - }, - { - name: "list memberships levels yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list memberships levels table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - m := NewMembershipsLevel(tt.opts...) - var buf bytes.Buffer - if err := m.List(&buf); (err != nil) != tt.wantErr { - t.Errorf( - "MembershipsLevel.List() error = %v, wantErr %v", err, tt.wantErr, - ) - } - if buf.Len() == 0 { - t.Errorf("MembershipsLevel.List() output is empty") - } - }, - ) - } } diff --git a/pkg/playlist/playlist_test.go b/pkg/playlist/playlist_test.go index ff3d49f..10e38d7 100644 --- a/pkg/playlist/playlist_test.go +++ b/pkg/playlist/playlist_test.go @@ -6,7 +6,7 @@ package playlist import ( "bytes" "encoding/json" - "fmt" + "io" "math" "net/http" "reflect" @@ -322,38 +322,8 @@ func TestPlaylist_Get(t *testing.T) { } func TestPlaylist_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "playlist-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "playlist-20"}, {"id": "playlist-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - - p := NewPlaylist( - WithService(svc), - WithMaxResults(22), - ) + svc := common.NewTestService(t, common.PaginationHandler("playlist")) + p := NewPlaylist(WithService(svc), WithMaxResults(22)) got, err := p.Get() if err != nil { t.Errorf("Playlist.Get() error = %v", err) @@ -364,12 +334,7 @@ func TestPlaylist_Get_Pagination(t *testing.T) { } func TestPlaylist_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "playlist-1", @@ -379,64 +344,12 @@ func TestPlaylist_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + p := NewPlaylist(WithService(svc), WithOutput(output), WithIds([]string{"playlist-1"})) + return p.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list playlists json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithIds([]string{"playlist-1"}), - }, - output: "json", - wantErr: false, - }, - { - name: "list playlists yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithIds([]string{"playlist-1"}), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list playlists table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithIds([]string{"playlist-1"}), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - p := NewPlaylist(tt.opts...) - var buf bytes.Buffer - if err := p.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Playlist.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Playlist.List() output is empty") - } - }, - ) - } } func TestPlaylist_Insert(t *testing.T) { diff --git a/pkg/playlistImage/playlistImage_test.go b/pkg/playlistImage/playlistImage_test.go index 96c1d27..89e8c69 100644 --- a/pkg/playlistImage/playlistImage_test.go +++ b/pkg/playlistImage/playlistImage_test.go @@ -5,7 +5,7 @@ package playlistImage import ( "bytes" - "fmt" + "io" "math" "net/http" "os" @@ -250,38 +250,8 @@ func TestPlaylistImage_Get(t *testing.T) { } func TestPlaylistImage_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "image-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "image-20"}, {"id": "image-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - - pi := NewPlaylistImage( - WithService(svc), - WithMaxResults(22), - ) + svc := common.NewTestService(t, common.PaginationHandler("image")) + pi := NewPlaylistImage(WithService(svc), WithMaxResults(22)) got, err := pi.Get() if err != nil { t.Errorf("PlaylistImage.Get() error = %v", err) @@ -292,12 +262,7 @@ func TestPlaylistImage_Get_Pagination(t *testing.T) { } func TestPlaylistImage_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "image-1", @@ -308,63 +273,12 @@ func TestPlaylistImage_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + pi := NewPlaylistImage(WithService(svc), WithOutput(output)) + return pi.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list playlist images json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - }, - output: "json", - wantErr: false, - }, - { - name: "list playlist images yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list playlist images table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - pi := NewPlaylistImage(tt.opts...) - var buf bytes.Buffer - if err := pi.List(&buf); (err != nil) != tt.wantErr { - t.Errorf( - "PlaylistImage.List() error = %v, wantErr %v", err, tt.wantErr, - ) - } - if buf.Len() == 0 { - t.Errorf("PlaylistImage.List() output is empty") - } - }, - ) - } } func TestPlaylistImage_Insert(t *testing.T) { diff --git a/pkg/playlistItem/playlistItem_test.go b/pkg/playlistItem/playlistItem_test.go index df3ec83..71a8038 100644 --- a/pkg/playlistItem/playlistItem_test.go +++ b/pkg/playlistItem/playlistItem_test.go @@ -5,7 +5,7 @@ package playlistItem import ( "bytes" - "fmt" + "io" "math" "net/http" "reflect" @@ -286,38 +286,8 @@ func TestPlaylistItem_Get(t *testing.T) { } func TestPlaylistItem_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "item-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "item-20"}, {"id": "item-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - - pi := NewPlaylistItem( - WithService(svc), - WithMaxResults(22), - ) + svc := common.NewTestService(t, common.PaginationHandler("item")) + pi := NewPlaylistItem(WithService(svc), WithMaxResults(22)) got, err := pi.Get() if err != nil { t.Errorf("PlaylistItem.Get() error = %v", err) @@ -328,12 +298,7 @@ func TestPlaylistItem_Get_Pagination(t *testing.T) { } func TestPlaylistItem_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "item-1", @@ -346,64 +311,12 @@ func TestPlaylistItem_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + pi := NewPlaylistItem(WithService(svc), WithOutput(output), WithIds([]string{"item-1"})) + return pi.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list playlist items json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithIds([]string{"item-1"}), - }, - output: "json", - wantErr: false, - }, - { - name: "list playlist items yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithIds([]string{"item-1"}), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list playlist items table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithIds([]string{"item-1"}), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - pi := NewPlaylistItem(tt.opts...) - var buf bytes.Buffer - if err := pi.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("PlaylistItem.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("PlaylistItem.List() output is empty") - } - }, - ) - } } func TestPlaylistItem_Insert(t *testing.T) { diff --git a/pkg/search/search_test.go b/pkg/search/search_test.go index 5d56b0b..e5ed183 100644 --- a/pkg/search/search_test.go +++ b/pkg/search/search_test.go @@ -4,8 +4,8 @@ package search import ( - "bytes" "fmt" + "io" "math" "net/http" "reflect" @@ -446,34 +446,13 @@ func TestSearch_Get(t *testing.T) { } func TestSearch_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": {"videoId": "video-%d"}}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": {"videoId": "video-20"}}, {"id": {"videoId": "video-21"}}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - + svc := common.NewTestService( + t, common.PaginationHandler( + "search", func(prefix string, i int) string { + return fmt.Sprintf(`{"id": {"videoId": "%s-%d"}}`, prefix, i) + }, + ), + ) s := NewSearch( WithService(svc), WithMaxResults(22), @@ -488,12 +467,9 @@ func TestSearch_Get_Pagination(t *testing.T) { } func TestSearch_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest( + t, + `{ "items": [ { "id": { @@ -505,62 +481,14 @@ func TestSearch_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + s := NewSearch( + WithService(svc), + WithOutput(output), + WithQ("test"), + ) + return s.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list search results json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithQ("test"), - }, - output: "json", - wantErr: false, - }, - { - name: "list search results yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithQ("test"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list search results table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithQ("test"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - s := NewSearch(tt.opts...) - var buf bytes.Buffer - if err := s.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Search.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Search.List() output is empty") - } - }, - ) - } } diff --git a/pkg/subscription/subscription_test.go b/pkg/subscription/subscription_test.go index ed3b74f..de22ee8 100644 --- a/pkg/subscription/subscription_test.go +++ b/pkg/subscription/subscription_test.go @@ -6,11 +6,10 @@ package subscription import ( "bytes" "encoding/json" - "fmt" + "io" "math" "net/http" "reflect" - "strings" "testing" "github.com/eat-pray-ai/yutu/pkg/common" @@ -351,38 +350,8 @@ func TestSubscription_Get(t *testing.T) { } func TestSubscription_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "sub-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "sub-20"}, {"id": "sub-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - - s := NewSubscription( - WithService(svc), - WithMaxResults(22), - ) + svc := common.NewTestService(t, common.PaginationHandler("sub")) + s := NewSubscription(WithService(svc), WithMaxResults(22)) got, err := s.Get() if err != nil { t.Errorf("Subscription.Get() error = %v", err) @@ -393,12 +362,7 @@ func TestSubscription_Get_Pagination(t *testing.T) { } func TestSubscription_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "sub-1", @@ -411,64 +375,12 @@ func TestSubscription_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + s := NewSubscription(WithService(svc), WithOutput(output), WithIds([]string{"sub-1"})) + return s.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list subscriptions json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithIds([]string{"sub-1"}), - }, - output: "json", - wantErr: false, - }, - { - name: "list subscriptions yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithIds([]string{"sub-1"}), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list subscriptions table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithIds([]string{"sub-1"}), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - s := NewSubscription(tt.opts...) - var buf bytes.Buffer - if err := s.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Subscription.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Subscription.List() output is empty") - } - }, - ) - } } func TestSubscription_Insert(t *testing.T) { diff --git a/pkg/superChatEvent/superChatEvent_test.go b/pkg/superChatEvent/superChatEvent_test.go index 4f41157..34bea52 100644 --- a/pkg/superChatEvent/superChatEvent_test.go +++ b/pkg/superChatEvent/superChatEvent_test.go @@ -4,12 +4,10 @@ package superChatEvent import ( - "bytes" - "fmt" + "io" "math" "net/http" "reflect" - "strings" "testing" "github.com/eat-pray-ai/yutu/pkg/common" @@ -190,38 +188,8 @@ func TestSuperChatEvent_Get(t *testing.T) { } func TestSuperChatEvent_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "event-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "event-20"}, {"id": "event-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) - - s := NewSuperChatEvent( - WithService(svc), - WithMaxResults(22), - ) + svc := common.NewTestService(t, common.PaginationHandler("event")) + s := NewSuperChatEvent(WithService(svc), WithMaxResults(22)) got, err := s.Get() if err != nil { t.Errorf("SuperChatEvent.Get() error = %v", err) @@ -232,12 +200,7 @@ func TestSuperChatEvent_Get_Pagination(t *testing.T) { } func TestSuperChatEvent_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "event-1", @@ -250,61 +213,10 @@ func TestSuperChatEvent_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + s := NewSuperChatEvent(WithService(svc), WithOutput(output)) + return s.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list super chat events json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - }, - output: "json", - wantErr: false, - }, - { - name: "list super chat events yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list super chat events table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - s := NewSuperChatEvent(tt.opts...) - var buf bytes.Buffer - if err := s.List(&buf); (err != nil) != tt.wantErr { - t.Errorf( - "SuperChatEvent.List() error = %v, wantErr %v", err, tt.wantErr, - ) - } - if buf.Len() == 0 { - t.Errorf("SuperChatEvent.List() output is empty") - } - }, - ) - } } diff --git a/pkg/video/video_test.go b/pkg/video/video_test.go index e0125d6..29da478 100644 --- a/pkg/video/video_test.go +++ b/pkg/video/video_test.go @@ -6,7 +6,7 @@ package video import ( "bytes" "encoding/json" - "fmt" + "io" "math" "mime" "mime/multipart" @@ -401,33 +401,7 @@ func TestVideo_Get(t *testing.T) { } func TestVideo_Get_Pagination(t *testing.T) { - handler := func(w http.ResponseWriter, r *http.Request) { - pageToken := r.URL.Query().Get("pageToken") - w.Header().Set("Content-Type", "application/json") - if pageToken == "" { - items := make([]string, 20) - for i := range 20 { - items[i] = fmt.Sprintf(`{"id": "video-%d"}`, i) - } - _, _ = w.Write( - fmt.Appendf( - nil, - `{ - "items": [%s], - "nextPageToken": "page-2" - }`, strings.Join(items, ","), - ), - ) - } else if pageToken == "page-2" { - _, _ = w.Write( - []byte(`{ - "items": [{"id": "video-20"}, {"id": "video-21"}], - "nextPageToken": "" - }`), - ) - } - } - svc := common.NewTestService(t, http.HandlerFunc(handler)) + svc := common.NewTestService(t, common.PaginationHandler("video")) v := NewVideo( WithService(svc), @@ -443,82 +417,32 @@ func TestVideo_Get_Pagination(t *testing.T) { } func TestVideo_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ - "items": [ - { - "id": "video-1", - "snippet": { - "channelId": "channel-1", - "title": "Video 1" - }, - "statistics": { - "viewCount": 100 - } + mockResponse := `{ + "items": [ + { + "id": "video-1", + "snippet": { + "channelId": "channel-1", + "title": "Video 1" + }, + "statistics": { + "viewCount": 100 } - ] - }`), - ) - }, - ), + } + ] + }` + + common.RunListTest( + t, mockResponse, + func(svc *youtube.Service, output string) func(io.Writer) error { + v := NewVideo( + WithService(svc), + WithOutput(output), + WithIds([]string{"video-1"}), + ) + return v.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list videos json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithIds([]string{"video-1"}), - }, - output: "json", - wantErr: false, - }, - { - name: "list videos yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithIds([]string{"video-1"}), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list videos table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithIds([]string{"video-1"}), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - v := NewVideo(tt.opts...) - var buf bytes.Buffer - if err := v.List(&buf); (err != nil) != tt.wantErr { - t.Errorf("Video.List() error = %v, wantErr %v", err, tt.wantErr) - } - if buf.Len() == 0 { - t.Errorf("Video.List() output is empty") - } - }, - ) - } } func TestVideo_Insert(t *testing.T) { diff --git a/pkg/videoAbuseReportReason/videoAbuseReportReason_test.go b/pkg/videoAbuseReportReason/videoAbuseReportReason_test.go index 298f7be..767daa1 100644 --- a/pkg/videoAbuseReportReason/videoAbuseReportReason_test.go +++ b/pkg/videoAbuseReportReason/videoAbuseReportReason_test.go @@ -4,7 +4,7 @@ package videoAbuseReportReason import ( - "bytes" + "io" "net/http" "reflect" "testing" @@ -165,12 +165,7 @@ func TestVideoAbuseReportReason_Get(t *testing.T) { } func TestVideoAbuseReportReason_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ + common.RunListTest(t, `{ "items": [ { "id": "reason-1", @@ -179,62 +174,10 @@ func TestVideoAbuseReportReason_List(t *testing.T) { } } ] - }`), - ) - }, - ), + }`, + func(svc *youtube.Service, output string) func(io.Writer) error { + va := NewVideoAbuseReportReason(WithService(svc), WithOutput(output)) + return va.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list video abuse report reasons json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - }, - output: "json", - wantErr: false, - }, - { - name: "list video abuse report reasons yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list video abuse report reasons table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - va := NewVideoAbuseReportReason(tt.opts...) - var buf bytes.Buffer - if err := va.List(&buf); (err != nil) != tt.wantErr { - t.Errorf( - "VideoAbuseReportReason.List() error = %v, wantErr %v", err, - tt.wantErr, - ) - } - if buf.Len() == 0 { - t.Errorf("VideoAbuseReportReason.List() output is empty") - } - }, - ) - } } diff --git a/pkg/videoCategory/videoCategory_test.go b/pkg/videoCategory/videoCategory_test.go index c7cdc45..f5f6209 100644 --- a/pkg/videoCategory/videoCategory_test.go +++ b/pkg/videoCategory/videoCategory_test.go @@ -4,7 +4,7 @@ package videoCategory import ( - "bytes" + "io" "net/http" "reflect" "testing" @@ -187,79 +187,27 @@ func TestVideoCategory_Get(t *testing.T) { } func TestVideoCategory_List(t *testing.T) { - svc := common.NewTestService( - t, http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write( - []byte(`{ - "items": [ - { - "id": "category-1", - "snippet": { - "title": "Category 1", - "assignable": true - } + mockResponse := `{ + "items": [ + { + "id": "category-1", + "snippet": { + "title": "Category 1", + "assignable": true } - ] - }`), - ) - }, - ), + } + ] + }` + + common.RunListTest( + t, mockResponse, + func(svc *youtube.Service, output string) func(io.Writer) error { + vc := NewVideoCategory( + WithService(svc), + WithOutput(output), + WithIds([]string{"category-1"}), + ) + return vc.List + }, ) - - tests := []struct { - name string - opts []Option - output string - wantErr bool - }{ - { - name: "list video categories json", - opts: []Option{ - WithService(svc), - WithOutput("json"), - WithIds([]string{"category-1"}), - }, - output: "json", - wantErr: false, - }, - { - name: "list video categories yaml", - opts: []Option{ - WithService(svc), - WithOutput("yaml"), - WithIds([]string{"category-1"}), - }, - output: "yaml", - wantErr: false, - }, - { - name: "list video categories table", - opts: []Option{ - WithService(svc), - WithOutput("table"), - WithIds([]string{"category-1"}), - }, - output: "table", - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run( - tt.name, func(t *testing.T) { - vc := NewVideoCategory(tt.opts...) - var buf bytes.Buffer - if err := vc.List(&buf); (err != nil) != tt.wantErr { - t.Errorf( - "VideoCategory.List() error = %v, wantErr %v", err, tt.wantErr, - ) - } - if buf.Len() == 0 { - t.Errorf("VideoCategory.List() output is empty") - } - }, - ) - } }