http_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package megauploader
  2. import (
  3. "encoding/json"
  4. "flag"
  5. "io/ioutil"
  6. "net/http"
  7. "net/http/httptest"
  8. "os"
  9. "strings"
  10. "testing"
  11. "github.com/headzoo/surf"
  12. )
  13. var (
  14. doHTTP = flag.Bool("http-tests", false, "run HTTP integration tests")
  15. )
  16. func TestMain(m *testing.M) {
  17. flag.Parse()
  18. result := m.Run()
  19. os.Exit(result)
  20. }
  21. func getServer(cfg string) *httptest.Server {
  22. conf, err := ParseConf([]byte(cfg))
  23. if err != nil {
  24. panic("Error parsing conf in getServer")
  25. }
  26. mu := NewMegaUploader(conf)
  27. ts := httptest.NewServer(mu.SetupRoutes())
  28. return ts
  29. }
  30. // ask home page without authentication; 401 expected
  31. func TestAuthDeny(t *testing.T) {
  32. if !*doHTTP {
  33. return
  34. }
  35. ts := getServer(``)
  36. defer ts.Close()
  37. resp, err := ts.Client().Get(ts.URL)
  38. if err != nil {
  39. t.Fatalf("Error asking home to test server")
  40. return
  41. }
  42. if resp.StatusCode != 401 {
  43. t.Errorf("Viewing home should require authentication; got `%s` instead",
  44. resp.Status,
  45. )
  46. }
  47. }
  48. // ask for non-existing page without authentication; 404 expected
  49. func TestNotFoundWhenUnauthenticated(t *testing.T) {
  50. if !*doHTTP {
  51. return
  52. }
  53. ts := getServer(``)
  54. defer ts.Close()
  55. resp, err := ts.Client().Get(ts.URL + "/dontexist")
  56. if err != nil {
  57. t.Fatalf("Error asking non-existent URL to test server: \n%s\n", err)
  58. return
  59. }
  60. if resp.StatusCode != 404 {
  61. t.Errorf("Asked not existing endpoint, expected 404; got `%s` instead",
  62. resp.Status,
  63. )
  64. }
  65. }
  66. func userRequest(url, user string, t *testing.T) *http.Request {
  67. req, err := http.NewRequest("GET", url, nil)
  68. if err != nil {
  69. t.Fatalf("error preparing request: \n%s\n", err)
  70. return nil
  71. }
  72. req.Header.Add("X-Forwarded-User", user)
  73. return req
  74. }
  75. // ask for home with valid user
  76. func TestAuthOk(t *testing.T) {
  77. if !*doHTTP {
  78. return
  79. }
  80. ts := getServer(``)
  81. defer ts.Close()
  82. cl := ts.Client()
  83. req := userRequest(ts.URL, "someone", t)
  84. resp, err := cl.Do(req)
  85. if err != nil {
  86. t.Fatalf("Error asking home to test server")
  87. return
  88. }
  89. if resp.StatusCode != 200 {
  90. t.Errorf("Viewing home should require authentication; got `%s` instead",
  91. resp.Status,
  92. )
  93. }
  94. }
  95. func getShareList(ts *httptest.Server, user string, t *testing.T) []Share {
  96. req := userRequest(ts.URL+"/api/share", user, t)
  97. cl := ts.Client()
  98. resp, err := cl.Do(req)
  99. if err != nil {
  100. t.Fatalf("Error asking share list to test server: \n%s\n", err)
  101. return []Share{}
  102. }
  103. body, err := ioutil.ReadAll(resp.Body)
  104. if err != nil {
  105. t.Fatal("Error reading response", err)
  106. return []Share{}
  107. }
  108. var shares []Share
  109. err = json.Unmarshal(body, &shares)
  110. if err != nil {
  111. t.Fatal("Invalid JSON received", err)
  112. return []Share{}
  113. }
  114. return shares
  115. }
  116. // share list with invalid user
  117. func TestShareRejected(t *testing.T) {
  118. if !*doHTTP {
  119. return
  120. }
  121. ts := getServer(`
  122. global:
  123. excluded:
  124. - john@doe.us
  125. - foo bar
  126. shares:
  127. - name: foo
  128. authorized: ["*"]
  129. description: foo
  130. `)
  131. defer ts.Close()
  132. shares := getShareList(ts, "john@doe.us", t)
  133. if len(shares) != 0 {
  134. t.Fatal("Asked share list with banned user, expected empty, got", shares)
  135. return
  136. }
  137. }
  138. // share list with valid user
  139. func TestShareOk(t *testing.T) {
  140. if !*doHTTP {
  141. return
  142. }
  143. ts := getServer(`
  144. global:
  145. excluded:
  146. - john@doe.us
  147. - foo bar
  148. shares:
  149. - name: foo
  150. authorized: ["*"]
  151. description: foo
  152. `)
  153. defer ts.Close()
  154. shares := getShareList(ts, "someone elese", t)
  155. if len(shares) == 0 {
  156. t.Fatal("Asked share list with not banned user, expected [foo], got", shares)
  157. return
  158. }
  159. if shares[0].Name != "foo" {
  160. t.Error("The only share should be `foo`, got", shares[0].Name)
  161. return
  162. }
  163. }
  164. func TestSurfUpload(t *testing.T) {
  165. if !*doHTTP {
  166. return
  167. }
  168. ts := getServer(`
  169. shares:
  170. - name: foo
  171. dir: /tmp/foo
  172. authorized: ["*"]
  173. description: example
  174. sizelimit: 1M
  175. `)
  176. bow := surf.NewBrowser()
  177. bow.AddRequestHeader("X-Forwarded-User", "someone")
  178. // TODO: add x-forwarded-user
  179. var err error
  180. if err = bow.Open(ts.URL); err != nil {
  181. t.Fatal("error opening home", err)
  182. return
  183. }
  184. if err = bow.Click("li a"); err != nil {
  185. t.Fatal("error clicking on share", err)
  186. return
  187. }
  188. form, err := bow.Form("form")
  189. if err != nil {
  190. t.Fatal("can't find form", err)
  191. return
  192. }
  193. form.SetFile("file", "foo.txt", strings.NewReader("example content"))
  194. if err = form.Submit(); err != nil {
  195. t.Error("error submitting form", err)
  196. }
  197. if bow.StatusCode() > 299 {
  198. t.Error("Invalid status code", bow.StatusCode(), bow.Body())
  199. }
  200. }