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 }