(t *testing.T)
| 94 | } |
| 95 | |
| 96 | func TestFetchLatestRelease(t *testing.T) { |
| 97 | tests := []struct { |
| 98 | name string |
| 99 | responseStatus int |
| 100 | responseBody string |
| 101 | expectedTag string |
| 102 | expectedErr error |
| 103 | errorMessage string |
| 104 | }{ |
| 105 | { |
| 106 | name: "found (200)", |
| 107 | responseStatus: 200, |
| 108 | responseBody: `{"tag_name": "v1.2.3"}`, |
| 109 | expectedTag: "v1.2.3", |
| 110 | }, |
| 111 | { |
| 112 | name: "not found (404)", |
| 113 | responseStatus: 404, |
| 114 | expectedErr: ErrReleaseNotFound, |
| 115 | }, |
| 116 | { |
| 117 | name: "server error (500)", |
| 118 | responseStatus: 500, |
| 119 | errorMessage: "HTTP 500", |
| 120 | }, |
| 121 | } |
| 122 | |
| 123 | for _, tt := range tests { |
| 124 | t.Run(tt.name, func(t *testing.T) { |
| 125 | fakeHTTP := &httpmock.Registry{} |
| 126 | defer fakeHTTP.Verify(t) |
| 127 | |
| 128 | repo, err := ghrepo.FromFullName("owner/repo") |
| 129 | require.NoError(t, err) |
| 130 | |
| 131 | if tt.responseStatus > 299 { |
| 132 | fakeHTTP.Register( |
| 133 | httpmock.REST("GET", "repos/owner/repo/releases/latest"), |
| 134 | httpmock.JSONErrorResponse(tt.responseStatus, api.HTTPError{ |
| 135 | StatusCode: tt.responseStatus, |
| 136 | Message: "some error", |
| 137 | }), |
| 138 | ) |
| 139 | } else { |
| 140 | fakeHTTP.Register( |
| 141 | httpmock.REST("GET", "repos/owner/repo/releases/latest"), |
| 142 | httpmock.StatusStringResponse(tt.responseStatus, tt.responseBody), |
| 143 | ) |
| 144 | } |
| 145 | |
| 146 | release, err := FetchLatestRelease(context.Background(), &http.Client{Transport: fakeHTTP}, repo) |
| 147 | |
| 148 | switch { |
| 149 | case tt.expectedErr != nil: |
| 150 | require.ErrorIs(t, err, tt.expectedErr) |
| 151 | case tt.errorMessage != "": |
| 152 | require.Error(t, err) |
| 153 | assert.Contains(t, err.Error(), tt.errorMessage) |
nothing calls this directly
no test coverage detected