/github/repos_releases_test.go

https://gitlab.com/mayakarya/go-github · Go · 352 lines · 287 code · 61 blank · 4 comment · 69 complexity · 8688a794fe9743b21730970c0dd7734f MD5 · raw file

  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. package github
  6. import (
  7. "bytes"
  8. "encoding/json"
  9. "fmt"
  10. "io/ioutil"
  11. "net/http"
  12. "os"
  13. "reflect"
  14. "strings"
  15. "testing"
  16. )
  17. func TestRepositoriesService_ListReleases(t *testing.T) {
  18. setup()
  19. defer teardown()
  20. mux.HandleFunc("/repos/o/r/releases", func(w http.ResponseWriter, r *http.Request) {
  21. testMethod(t, r, "GET")
  22. testFormValues(t, r, values{"page": "2"})
  23. fmt.Fprint(w, `[{"id":1}]`)
  24. })
  25. opt := &ListOptions{Page: 2}
  26. releases, _, err := client.Repositories.ListReleases("o", "r", opt)
  27. if err != nil {
  28. t.Errorf("Repositories.ListReleases returned error: %v", err)
  29. }
  30. want := []*RepositoryRelease{{ID: Int(1)}}
  31. if !reflect.DeepEqual(releases, want) {
  32. t.Errorf("Repositories.ListReleases returned %+v, want %+v", releases, want)
  33. }
  34. }
  35. func TestRepositoriesService_GetRelease(t *testing.T) {
  36. setup()
  37. defer teardown()
  38. mux.HandleFunc("/repos/o/r/releases/1", func(w http.ResponseWriter, r *http.Request) {
  39. testMethod(t, r, "GET")
  40. fmt.Fprint(w, `{"id":1}`)
  41. })
  42. release, resp, err := client.Repositories.GetRelease("o", "r", 1)
  43. if err != nil {
  44. t.Errorf("Repositories.GetRelease returned error: %v\n%v", err, resp.Body)
  45. }
  46. want := &RepositoryRelease{ID: Int(1)}
  47. if !reflect.DeepEqual(release, want) {
  48. t.Errorf("Repositories.GetRelease returned %+v, want %+v", release, want)
  49. }
  50. }
  51. func TestRepositoriesService_GetLatestRelease(t *testing.T) {
  52. setup()
  53. defer teardown()
  54. mux.HandleFunc("/repos/o/r/releases/latest", func(w http.ResponseWriter, r *http.Request) {
  55. testMethod(t, r, "GET")
  56. fmt.Fprint(w, `{"id":3}`)
  57. })
  58. release, resp, err := client.Repositories.GetLatestRelease("o", "r")
  59. if err != nil {
  60. t.Errorf("Repositories.GetLatestRelease returned error: %v\n%v", err, resp.Body)
  61. }
  62. want := &RepositoryRelease{ID: Int(3)}
  63. if !reflect.DeepEqual(release, want) {
  64. t.Errorf("Repositories.GetLatestRelease returned %+v, want %+v", release, want)
  65. }
  66. }
  67. func TestRepositoriesService_GetReleaseByTag(t *testing.T) {
  68. setup()
  69. defer teardown()
  70. mux.HandleFunc("/repos/o/r/releases/tags/foo", func(w http.ResponseWriter, r *http.Request) {
  71. testMethod(t, r, "GET")
  72. fmt.Fprint(w, `{"id":13}`)
  73. })
  74. release, resp, err := client.Repositories.GetReleaseByTag("o", "r", "foo")
  75. if err != nil {
  76. t.Errorf("Repositories.GetReleaseByTag returned error: %v\n%v", err, resp.Body)
  77. }
  78. want := &RepositoryRelease{ID: Int(13)}
  79. if !reflect.DeepEqual(release, want) {
  80. t.Errorf("Repositories.GetReleaseByTag returned %+v, want %+v", release, want)
  81. }
  82. }
  83. func TestRepositoriesService_CreateRelease(t *testing.T) {
  84. setup()
  85. defer teardown()
  86. input := &RepositoryRelease{Name: String("v1.0")}
  87. mux.HandleFunc("/repos/o/r/releases", func(w http.ResponseWriter, r *http.Request) {
  88. v := new(RepositoryRelease)
  89. json.NewDecoder(r.Body).Decode(v)
  90. testMethod(t, r, "POST")
  91. if !reflect.DeepEqual(v, input) {
  92. t.Errorf("Request body = %+v, want %+v", v, input)
  93. }
  94. fmt.Fprint(w, `{"id":1}`)
  95. })
  96. release, _, err := client.Repositories.CreateRelease("o", "r", input)
  97. if err != nil {
  98. t.Errorf("Repositories.CreateRelease returned error: %v", err)
  99. }
  100. want := &RepositoryRelease{ID: Int(1)}
  101. if !reflect.DeepEqual(release, want) {
  102. t.Errorf("Repositories.CreateRelease returned %+v, want %+v", release, want)
  103. }
  104. }
  105. func TestRepositoriesService_EditRelease(t *testing.T) {
  106. setup()
  107. defer teardown()
  108. input := &RepositoryRelease{Name: String("n")}
  109. mux.HandleFunc("/repos/o/r/releases/1", func(w http.ResponseWriter, r *http.Request) {
  110. v := new(RepositoryRelease)
  111. json.NewDecoder(r.Body).Decode(v)
  112. testMethod(t, r, "PATCH")
  113. if !reflect.DeepEqual(v, input) {
  114. t.Errorf("Request body = %+v, want %+v", v, input)
  115. }
  116. fmt.Fprint(w, `{"id":1}`)
  117. })
  118. release, _, err := client.Repositories.EditRelease("o", "r", 1, input)
  119. if err != nil {
  120. t.Errorf("Repositories.EditRelease returned error: %v", err)
  121. }
  122. want := &RepositoryRelease{ID: Int(1)}
  123. if !reflect.DeepEqual(release, want) {
  124. t.Errorf("Repositories.EditRelease returned = %+v, want %+v", release, want)
  125. }
  126. }
  127. func TestRepositoriesService_DeleteRelease(t *testing.T) {
  128. setup()
  129. defer teardown()
  130. mux.HandleFunc("/repos/o/r/releases/1", func(w http.ResponseWriter, r *http.Request) {
  131. testMethod(t, r, "DELETE")
  132. })
  133. _, err := client.Repositories.DeleteRelease("o", "r", 1)
  134. if err != nil {
  135. t.Errorf("Repositories.DeleteRelease returned error: %v", err)
  136. }
  137. }
  138. func TestRepositoriesService_ListReleaseAssets(t *testing.T) {
  139. setup()
  140. defer teardown()
  141. mux.HandleFunc("/repos/o/r/releases/1/assets", func(w http.ResponseWriter, r *http.Request) {
  142. testMethod(t, r, "GET")
  143. testFormValues(t, r, values{"page": "2"})
  144. fmt.Fprint(w, `[{"id":1}]`)
  145. })
  146. opt := &ListOptions{Page: 2}
  147. assets, _, err := client.Repositories.ListReleaseAssets("o", "r", 1, opt)
  148. if err != nil {
  149. t.Errorf("Repositories.ListReleaseAssets returned error: %v", err)
  150. }
  151. want := []*ReleaseAsset{{ID: Int(1)}}
  152. if !reflect.DeepEqual(assets, want) {
  153. t.Errorf("Repositories.ListReleaseAssets returned %+v, want %+v", assets, want)
  154. }
  155. }
  156. func TestRepositoriesService_GetReleaseAsset(t *testing.T) {
  157. setup()
  158. defer teardown()
  159. mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) {
  160. testMethod(t, r, "GET")
  161. fmt.Fprint(w, `{"id":1}`)
  162. })
  163. asset, _, err := client.Repositories.GetReleaseAsset("o", "r", 1)
  164. if err != nil {
  165. t.Errorf("Repositories.GetReleaseAsset returned error: %v", err)
  166. }
  167. want := &ReleaseAsset{ID: Int(1)}
  168. if !reflect.DeepEqual(asset, want) {
  169. t.Errorf("Repositories.GetReleaseAsset returned %+v, want %+v", asset, want)
  170. }
  171. }
  172. func TestRepositoriesService_DownloadReleaseAsset_Stream(t *testing.T) {
  173. setup()
  174. defer teardown()
  175. mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) {
  176. testMethod(t, r, "GET")
  177. testHeader(t, r, "Accept", defaultMediaType)
  178. w.Header().Set("Content-Type", "application/octet-stream")
  179. w.Header().Set("Content-Disposition", "attachment; filename=hello-world.txt")
  180. fmt.Fprint(w, "Hello World")
  181. })
  182. reader, _, err := client.Repositories.DownloadReleaseAsset("o", "r", 1)
  183. if err != nil {
  184. t.Errorf("Repositories.DownloadReleaseAsset returned error: %v", err)
  185. }
  186. want := []byte("Hello World")
  187. content, err := ioutil.ReadAll(reader)
  188. if err != nil {
  189. t.Errorf("Repositories.DownloadReleaseAsset returned bad reader: %v", err)
  190. }
  191. if !bytes.Equal(want, content) {
  192. t.Errorf("Repositories.DownloadReleaseAsset returned %+v, want %+v", content, want)
  193. }
  194. }
  195. func TestRepositoriesService_DownloadReleaseAsset_Redirect(t *testing.T) {
  196. setup()
  197. defer teardown()
  198. mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) {
  199. testMethod(t, r, "GET")
  200. testHeader(t, r, "Accept", defaultMediaType)
  201. http.Redirect(w, r, "/yo", http.StatusFound)
  202. })
  203. _, got, err := client.Repositories.DownloadReleaseAsset("o", "r", 1)
  204. if err != nil {
  205. t.Errorf("Repositories.DownloadReleaseAsset returned error: %v", err)
  206. }
  207. want := "/yo"
  208. if !strings.HasSuffix(got, want) {
  209. t.Errorf("Repositories.DownloadReleaseAsset returned %+v, want %+v", got, want)
  210. }
  211. }
  212. func TestRepositoriesService_DownloadReleaseAsset_APIError(t *testing.T) {
  213. setup()
  214. defer teardown()
  215. mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) {
  216. testMethod(t, r, "GET")
  217. testHeader(t, r, "Accept", defaultMediaType)
  218. w.WriteHeader(http.StatusNotFound)
  219. fmt.Fprint(w, `{"message":"Not Found","documentation_url":"https://developer.github.com/v3"}`)
  220. })
  221. resp, loc, err := client.Repositories.DownloadReleaseAsset("o", "r", 1)
  222. if err == nil {
  223. t.Error("Repositories.DownloadReleaseAsset did not return an error")
  224. }
  225. if resp != nil {
  226. resp.Close()
  227. t.Error("Repositories.DownloadReleaseAsset returned stream, want nil")
  228. }
  229. if loc != "" {
  230. t.Errorf(`Repositories.DownloadReleaseAsset returned "%s", want empty ""`, loc)
  231. }
  232. }
  233. func TestRepositoriesService_EditReleaseAsset(t *testing.T) {
  234. setup()
  235. defer teardown()
  236. input := &ReleaseAsset{Name: String("n")}
  237. mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) {
  238. v := new(ReleaseAsset)
  239. json.NewDecoder(r.Body).Decode(v)
  240. testMethod(t, r, "PATCH")
  241. if !reflect.DeepEqual(v, input) {
  242. t.Errorf("Request body = %+v, want %+v", v, input)
  243. }
  244. fmt.Fprint(w, `{"id":1}`)
  245. })
  246. asset, _, err := client.Repositories.EditReleaseAsset("o", "r", 1, input)
  247. if err != nil {
  248. t.Errorf("Repositories.EditReleaseAsset returned error: %v", err)
  249. }
  250. want := &ReleaseAsset{ID: Int(1)}
  251. if !reflect.DeepEqual(asset, want) {
  252. t.Errorf("Repositories.EditReleaseAsset returned = %+v, want %+v", asset, want)
  253. }
  254. }
  255. func TestRepositoriesService_DeleteReleaseAsset(t *testing.T) {
  256. setup()
  257. defer teardown()
  258. mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) {
  259. testMethod(t, r, "DELETE")
  260. })
  261. _, err := client.Repositories.DeleteReleaseAsset("o", "r", 1)
  262. if err != nil {
  263. t.Errorf("Repositories.DeleteReleaseAsset returned error: %v", err)
  264. }
  265. }
  266. func TestRepositoriesService_UploadReleaseAsset(t *testing.T) {
  267. setup()
  268. defer teardown()
  269. mux.HandleFunc("/repos/o/r/releases/1/assets", func(w http.ResponseWriter, r *http.Request) {
  270. testMethod(t, r, "POST")
  271. testHeader(t, r, "Content-Type", "text/plain; charset=utf-8")
  272. testHeader(t, r, "Content-Length", "12")
  273. testFormValues(t, r, values{"name": "n"})
  274. testBody(t, r, "Upload me !\n")
  275. fmt.Fprintf(w, `{"id":1}`)
  276. })
  277. file, dir, err := openTestFile("upload.txt", "Upload me !\n")
  278. if err != nil {
  279. t.Fatalf("Unable to create temp file: %v", err)
  280. }
  281. defer os.RemoveAll(dir)
  282. opt := &UploadOptions{Name: "n"}
  283. asset, _, err := client.Repositories.UploadReleaseAsset("o", "r", 1, opt, file)
  284. if err != nil {
  285. t.Errorf("Repositories.UploadReleaseAssert returned error: %v", err)
  286. }
  287. want := &ReleaseAsset{ID: Int(1)}
  288. if !reflect.DeepEqual(asset, want) {
  289. t.Errorf("Repositories.UploadReleaseAssert returned %+v, want %+v", asset, want)
  290. }
  291. }