Skip to content

Commit a64201a

Browse files
aidenkeatinggmlewis
authored andcommitted
Allow media type to be specified in release asset upload (google#1102)
Helps google#1097.
1 parent d1818e1 commit a64201a

File tree

3 files changed

+62
-24
lines changed

3 files changed

+62
-24
lines changed

github/github.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,8 @@ type ListOptions struct {
191191

192192
// UploadOptions specifies the parameters to methods that support uploads.
193193
type UploadOptions struct {
194-
Name string `url:"name,omitempty"`
194+
Name string `url:"name,omitempty"`
195+
MediaType string `url:"-"`
195196
}
196197

197198
// RawType represents type of raw format of a request instead of JSON.

github/repos_releases.go

+4
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,10 @@ func (s *RepositoriesService) UploadReleaseAsset(ctx context.Context, owner, rep
356356
}
357357

358358
mediaType := mime.TypeByExtension(filepath.Ext(file.Name()))
359+
if opt.MediaType != "" {
360+
mediaType = opt.MediaType
361+
}
362+
359363
req, err := s.client.NewUploadRequest(u, file, stat.Size(), mediaType)
360364
if err != nil {
361365
return nil, nil, err

github/repos_releases_test.go

+56-23
Original file line numberDiff line numberDiff line change
@@ -354,32 +354,65 @@ func TestRepositoriesService_DeleteReleaseAsset(t *testing.T) {
354354
}
355355

356356
func TestRepositoriesService_UploadReleaseAsset(t *testing.T) {
357+
uploadTests := []struct {
358+
uploadOpts *UploadOptions
359+
fileName string
360+
expectedMediaType string
361+
}{
362+
// No file extension and no explicit media type.
363+
{
364+
&UploadOptions{Name: "n"},
365+
"upload",
366+
defaultMediaType,
367+
},
368+
// File extension and no explicit media type.
369+
{
370+
&UploadOptions{Name: "n"},
371+
"upload.txt",
372+
"text/plain; charset=utf-8",
373+
},
374+
// No file extension and explicit media type.
375+
{
376+
&UploadOptions{Name: "n", MediaType: "image/png"},
377+
"upload",
378+
"image/png",
379+
},
380+
// File extension and explicit media type.
381+
{
382+
&UploadOptions{Name: "n", MediaType: "image/png"},
383+
"upload.png",
384+
"image/png",
385+
},
386+
}
387+
357388
client, mux, _, teardown := setup()
358389
defer teardown()
359390

360-
mux.HandleFunc("/repos/o/r/releases/1/assets", func(w http.ResponseWriter, r *http.Request) {
361-
testMethod(t, r, "POST")
362-
testHeader(t, r, "Content-Type", "text/plain; charset=utf-8")
363-
testHeader(t, r, "Content-Length", "12")
364-
testFormValues(t, r, values{"name": "n"})
365-
testBody(t, r, "Upload me !\n")
366-
367-
fmt.Fprintf(w, `{"id":1}`)
368-
})
369-
370-
file, dir, err := openTestFile("upload.txt", "Upload me !\n")
371-
if err != nil {
372-
t.Fatalf("Unable to create temp file: %v", err)
373-
}
374-
defer os.RemoveAll(dir)
391+
for key, test := range uploadTests {
392+
releaseEndpoint := fmt.Sprintf("/repos/o/r/releases/%d/assets", key)
393+
mux.HandleFunc(releaseEndpoint, func(w http.ResponseWriter, r *http.Request) {
394+
testMethod(t, r, "POST")
395+
testHeader(t, r, "Content-Type", test.expectedMediaType)
396+
testHeader(t, r, "Content-Length", "12")
397+
testFormValues(t, r, values{"name": "n"})
398+
testBody(t, r, "Upload me !\n")
399+
400+
fmt.Fprintf(w, `{"id":1}`)
401+
})
402+
403+
file, dir, err := openTestFile(test.fileName, "Upload me !\n")
404+
if err != nil {
405+
t.Fatalf("Unable to create temp file: %v", err)
406+
}
407+
defer os.RemoveAll(dir)
375408

376-
opt := &UploadOptions{Name: "n"}
377-
asset, _, err := client.Repositories.UploadReleaseAsset(context.Background(), "o", "r", 1, opt, file)
378-
if err != nil {
379-
t.Errorf("Repositories.UploadReleaseAssert returned error: %v", err)
380-
}
381-
want := &ReleaseAsset{ID: Int64(1)}
382-
if !reflect.DeepEqual(asset, want) {
383-
t.Errorf("Repositories.UploadReleaseAssert returned %+v, want %+v", asset, want)
409+
asset, _, err := client.Repositories.UploadReleaseAsset(context.Background(), "o", "r", int64(key), test.uploadOpts, file)
410+
if err != nil {
411+
t.Errorf("Repositories.UploadReleaseAssert returned error: %v", err)
412+
}
413+
want := &ReleaseAsset{ID: Int64(1)}
414+
if !reflect.DeepEqual(asset, want) {
415+
t.Errorf("Repositories.UploadReleaseAssert returned %+v, want %+v", asset, want)
416+
}
384417
}
385418
}

0 commit comments

Comments
 (0)