web_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package web
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. "testing"
  12. "github.com/kellegous/go/context"
  13. )
  14. type env struct {
  15. mux *http.ServeMux
  16. dir string
  17. ctx *context.Context
  18. }
  19. func (e *env) destroy() {
  20. os.RemoveAll(e.dir)
  21. }
  22. func (e *env) callAPI(method, name string, body io.Reader) (*msg, error) {
  23. req, err := http.NewRequest(method, fmt.Sprintf("/api/url/%s", name), body)
  24. if err != nil {
  25. return nil, err
  26. }
  27. res := mockResponse{
  28. header: map[string][]string{},
  29. }
  30. e.mux.ServeHTTP(&res, req)
  31. var m msg
  32. if err := json.NewDecoder(&res).Decode(&m); err != nil {
  33. return nil, err
  34. }
  35. return &m, nil
  36. }
  37. func newEnv() (*env, error) {
  38. dir, err := ioutil.TempDir("", "")
  39. if err != nil {
  40. return nil, err
  41. }
  42. ctx, err := context.Open(filepath.Join(dir, "data"))
  43. if err != nil {
  44. os.RemoveAll(dir)
  45. return nil, err
  46. }
  47. return &env{
  48. mux: allRoutes(ctx),
  49. dir: dir,
  50. ctx: ctx,
  51. }, nil
  52. }
  53. type mockResponse struct {
  54. header http.Header
  55. bytes.Buffer
  56. status int
  57. }
  58. func (r *mockResponse) Header() http.Header {
  59. return r.header
  60. }
  61. func (r *mockResponse) WriteHeader(status int) {
  62. r.status = status
  63. }
  64. func assertJustOk(t *testing.T, m *msg) {
  65. if !m.Ok {
  66. t.Fatal("expected OK message, but it's not OK")
  67. }
  68. if m.Error != "" {
  69. t.Fatalf("expected no error, but got %s", m.Error)
  70. }
  71. if m.Route != nil {
  72. t.Fatalf("expected no route, got %v", m.Route)
  73. }
  74. }
  75. func TestAPIGet(t *testing.T) {
  76. e, err := newEnv()
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. defer e.destroy()
  81. names := []string{"", "nothing", "nothing/there"}
  82. for _, name := range names {
  83. m, err := e.callAPI("GET", name, nil)
  84. if err != nil {
  85. t.Fatal(err)
  86. }
  87. assertJustOk(t, m)
  88. }
  89. }