github.com/google/go-github/v71@v71.0.0/github/strings_test.go (about)

     1  // Copyright 2013 The go-github AUTHORS. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package github
     7  
     8  import (
     9  	"fmt"
    10  	"testing"
    11  	"time"
    12  )
    13  
    14  func TestStringify(t *testing.T) {
    15  	t.Parallel()
    16  	var nilPointer *string
    17  
    18  	var tests = []struct {
    19  		in  interface{}
    20  		out string
    21  	}{
    22  		// basic types
    23  		{"foo", `"foo"`},
    24  		{123, `123`},
    25  		{1.5, `1.5`},
    26  		{false, `false`},
    27  		{
    28  			[]string{"a", "b"},
    29  			`["a" "b"]`,
    30  		},
    31  		{
    32  			struct {
    33  				A []string
    34  			}{nil},
    35  			// nil slice is skipped
    36  			`{}`,
    37  		},
    38  		{
    39  			struct {
    40  				A string
    41  			}{"foo"},
    42  			// structs not of a named type get no prefix
    43  			`{A:"foo"}`,
    44  		},
    45  
    46  		// pointers
    47  		{nilPointer, `<nil>`},
    48  		{Ptr("foo"), `"foo"`},
    49  		{Ptr(123), `123`},
    50  		{Ptr(false), `false`},
    51  		{
    52  			//nolint:sliceofpointers
    53  			[]*string{Ptr("a"), Ptr("b")},
    54  			`["a" "b"]`,
    55  		},
    56  
    57  		// actual GitHub structs
    58  		{
    59  			Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)},
    60  			`github.Timestamp{2006-01-02 15:04:05 +0000 UTC}`,
    61  		},
    62  		{
    63  			&Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)},
    64  			`github.Timestamp{2006-01-02 15:04:05 +0000 UTC}`,
    65  		},
    66  		{
    67  			User{ID: Ptr(int64(123)), Name: Ptr("n")},
    68  			`github.User{ID:123, Name:"n"}`,
    69  		},
    70  		{
    71  			Repository{Owner: &User{ID: Ptr(int64(123))}},
    72  			`github.Repository{Owner:github.User{ID:123}}`,
    73  		},
    74  	}
    75  
    76  	for i, tt := range tests {
    77  		s := Stringify(tt.in)
    78  		if s != tt.out {
    79  			t.Errorf("%d. Stringify(%q) => %q, want %q", i, tt.in, s, tt.out)
    80  		}
    81  	}
    82  }
    83  
    84  // Directly test the String() methods on various GitHub types. We don't do an
    85  // exhaustive test of all the various field types, since TestStringify() above
    86  // takes care of that. Rather, we just make sure that Stringify() is being
    87  // used to build the strings, which we do by verifying that pointers are
    88  // stringified as their underlying value.
    89  func TestString(t *testing.T) {
    90  	t.Parallel()
    91  	var tests = []struct {
    92  		in  interface{}
    93  		out string
    94  	}{
    95  		{CodeResult{Name: Ptr("n")}, `github.CodeResult{Name:"n"}`},
    96  		{CommitAuthor{Name: Ptr("n")}, `github.CommitAuthor{Name:"n"}`},
    97  		{CommitFile{SHA: Ptr("s")}, `github.CommitFile{SHA:"s"}`},
    98  		{CommitStats{Total: Ptr(1)}, `github.CommitStats{Total:1}`},
    99  		{CommitsComparison{TotalCommits: Ptr(1)}, `github.CommitsComparison{TotalCommits:1}`},
   100  		{Commit{SHA: Ptr("s")}, `github.Commit{SHA:"s"}`},
   101  		{Event{ID: Ptr("1")}, `github.Event{ID:"1"}`},
   102  		{GistComment{ID: Ptr(int64(1))}, `github.GistComment{ID:1}`},
   103  		{GistFile{Size: Ptr(1)}, `github.GistFile{Size:1}`},
   104  		{Gist{ID: Ptr("1")}, `github.Gist{ID:"1"}`},
   105  		{GitObject{SHA: Ptr("s")}, `github.GitObject{SHA:"s"}`},
   106  		{Gitignore{Name: Ptr("n")}, `github.Gitignore{Name:"n"}`},
   107  		{Hook{ID: Ptr(int64(1))}, `github.Hook{ID:1}`},
   108  		{IssueComment{ID: Ptr(int64(1))}, `github.IssueComment{ID:1}`},
   109  		{Issue{Number: Ptr(1)}, `github.Issue{Number:1}`},
   110  		{Key{ID: Ptr(int64(1))}, `github.Key{ID:1}`},
   111  		{Label{ID: Ptr(int64(1)), Name: Ptr("l")}, `github.Label{ID:1, Name:"l"}`},
   112  		{Organization{ID: Ptr(int64(1))}, `github.Organization{ID:1}`},
   113  		{PullRequestComment{ID: Ptr(int64(1))}, `github.PullRequestComment{ID:1}`},
   114  		{PullRequest{Number: Ptr(1)}, `github.PullRequest{Number:1}`},
   115  		{PullRequestReview{ID: Ptr(int64(1))}, `github.PullRequestReview{ID:1}`},
   116  		{DraftReviewComment{Position: Ptr(1)}, `github.DraftReviewComment{Position:1}`},
   117  		{PullRequestReviewRequest{Body: Ptr("r")}, `github.PullRequestReviewRequest{Body:"r"}`},
   118  		{PullRequestReviewDismissalRequest{Message: Ptr("r")}, `github.PullRequestReviewDismissalRequest{Message:"r"}`},
   119  		{HeadCommit{SHA: Ptr("s")}, `github.HeadCommit{SHA:"s"}`},
   120  		{PushEvent{PushID: Ptr(int64(1))}, `github.PushEvent{PushID:1}`},
   121  		{Reference{Ref: Ptr("r")}, `github.Reference{Ref:"r"}`},
   122  		{ReleaseAsset{ID: Ptr(int64(1))}, `github.ReleaseAsset{ID:1}`},
   123  		{RepoStatus{ID: Ptr(int64(1))}, `github.RepoStatus{ID:1}`},
   124  		{RepositoryComment{ID: Ptr(int64(1))}, `github.RepositoryComment{ID:1}`},
   125  		{RepositoryCommit{SHA: Ptr("s")}, `github.RepositoryCommit{SHA:"s"}`},
   126  		{RepositoryContent{Name: Ptr("n")}, `github.RepositoryContent{Name:"n"}`},
   127  		{RepositoryRelease{ID: Ptr(int64(1))}, `github.RepositoryRelease{ID:1}`},
   128  		{Repository{ID: Ptr(int64(1))}, `github.Repository{ID:1}`},
   129  		{Team{ID: Ptr(int64(1))}, `github.Team{ID:1}`},
   130  		{TreeEntry{SHA: Ptr("s")}, `github.TreeEntry{SHA:"s"}`},
   131  		{Tree{SHA: Ptr("s")}, `github.Tree{SHA:"s"}`},
   132  		{User{ID: Ptr(int64(1))}, `github.User{ID:1}`},
   133  		{WebHookAuthor{Name: Ptr("n")}, `github.CommitAuthor{Name:"n"}`},
   134  		{WebHookCommit{ID: Ptr("1")}, `github.HeadCommit{ID:"1"}`},
   135  		{WebHookPayload{Ref: Ptr("r")}, `github.PushEvent{Ref:"r"}`},
   136  	}
   137  
   138  	for i, tt := range tests {
   139  		s := tt.in.(fmt.Stringer).String()
   140  		if s != tt.out {
   141  			t.Errorf("%d. String() => %q, want %q", i, tt.in, tt.out)
   142  		}
   143  	}
   144  }