github.com/grafana/pyroscope@v1.18.0/pkg/frontend/vcs/client/github_test.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  	"time"
     8  
     9  	"connectrpc.com/connect"
    10  	"github.com/google/go-github/v58/github"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/mock"
    13  	"github.com/stretchr/testify/require"
    14  
    15  	vcsv1 "github.com/grafana/pyroscope/api/gen/proto/go/vcs/v1"
    16  	mockclient "github.com/grafana/pyroscope/pkg/test/mocks/mockclient"
    17  )
    18  
    19  func TestGetCommit(t *testing.T) {
    20  	tests := []struct {
    21  		name          string
    22  		mockCommit    *github.RepositoryCommit
    23  		expected      *vcsv1.CommitInfo
    24  		expectedError error
    25  	}{
    26  		{
    27  			mockCommit: &github.RepositoryCommit{
    28  				SHA: github.String("abc123"),
    29  				Commit: &github.Commit{
    30  					Message: github.String("test commit message"),
    31  					Author: &github.CommitAuthor{
    32  						Date: &github.Timestamp{Time: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)},
    33  					},
    34  				},
    35  				Author: &github.User{
    36  					Login:     github.String("test-user"),
    37  					AvatarURL: github.String("https://example.com/avatar.png"),
    38  				},
    39  			},
    40  			expected: &vcsv1.CommitInfo{
    41  				Sha:     "abc123",
    42  				Message: "test commit message",
    43  				Author: &vcsv1.CommitAuthor{
    44  					Login:     "test-user",
    45  					AvatarURL: "https://example.com/avatar.png",
    46  				},
    47  				Date: "2024-01-01T00:00:00Z",
    48  			},
    49  		},
    50  		{
    51  			name: "example without author",
    52  			mockCommit: &github.RepositoryCommit{
    53  				SHA: github.String("abc123"),
    54  				Commit: &github.Commit{
    55  					Message: github.String("test commit message"),
    56  					Author: &github.CommitAuthor{
    57  						Date: &github.Timestamp{Time: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)},
    58  					},
    59  				},
    60  			},
    61  			expected: &vcsv1.CommitInfo{
    62  				Sha:     "abc123",
    63  				Message: "test commit message",
    64  				Date:    "2024-01-01T00:00:00Z",
    65  			},
    66  		},
    67  		{
    68  			name: "fail without commit message",
    69  			mockCommit: &github.RepositoryCommit{
    70  				Commit: &github.Commit{
    71  					Author: &github.CommitAuthor{
    72  						Date: &github.Timestamp{Time: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)},
    73  					},
    74  				},
    75  			},
    76  			expectedError: connect.NewError(connect.CodeInternal, errors.New("commit contains no message")),
    77  		},
    78  		{
    79  			name: "fail without commit date message",
    80  			mockCommit: &github.RepositoryCommit{
    81  				Commit: &github.Commit{
    82  					Message: github.String("test commit message"),
    83  				},
    84  			},
    85  			expectedError: connect.NewError(connect.CodeInternal, errors.New("commit contains no date")),
    86  		},
    87  	}
    88  
    89  	for _, tt := range tests {
    90  		t.Run(tt.name, func(t *testing.T) {
    91  			mockRepoService := &mockclient.MockrepositoryService{}
    92  			// Create a mock GitHub client
    93  			mockClient := &githubClient{
    94  				repoService: mockRepoService,
    95  			}
    96  			mockRepoService.EXPECT().GetCommit(mock.Anything, "my-owner", "my-repo", "my-ref", mock.Anything).Return(tt.mockCommit, nil, nil)
    97  			result, err := mockClient.GetCommit(context.Background(), "my-owner", "my-repo", "my-ref")
    98  
    99  			if tt.expectedError != nil {
   100  				require.Error(t, err)
   101  				assert.ErrorContains(t, err, tt.expectedError.Error())
   102  				return
   103  			}
   104  
   105  			require.NoError(t, err)
   106  			assert.Equal(t, tt.expected, result)
   107  		})
   108  	}
   109  }