func Test_InjectorSetParent(t *testing.T) { injector := inject.New() injector.MapTo("another dep", (*SpecialString)(nil)) injector2 := inject.New() injector2.SetParent(injector) expect(t, injector2.Get(inject.InterfaceOf((*SpecialString)(nil))).IsValid(), true) }
func Test_Static_Options_Logging(t *testing.T) { response := httptest.NewRecorder() var buffer bytes.Buffer m := &Martini{Injector: inject.New(), action: func() {}, logger: log.New(&buffer, "[martini] ", 0)} m.Map(m.logger) m.Map(defaultReturnHandler()) opt := StaticOptions{} m.Use(Static(currentRoot, opt)) req, err := http.NewRequest("GET", "http://localhost:3000/martini.go", nil) if err != nil { t.Error(err) } m.ServeHTTP(response, req) expect(t, response.Code, http.StatusOK) expect(t, buffer.String(), "[martini] [Static] Serving /martini.go\n") // Now without logging m.Handlers() buffer.Reset() // This should disable logging opt.SkipLogging = true m.Use(Static(currentRoot, opt)) m.ServeHTTP(response, req) expect(t, response.Code, http.StatusOK) expect(t, buffer.String(), "") }
func Test_InjectorInvoke(t *testing.T) { injector := inject.New() expect(t, injector == nil, false) dep := "some dependency" injector.Map(dep) dep2 := "another dep" injector.MapTo(dep2, (*SpecialString)(nil)) dep3 := make(chan *SpecialString) dep4 := make(chan *SpecialString) typRecv := reflect.ChanOf(reflect.RecvDir, reflect.TypeOf(dep3).Elem()) typSend := reflect.ChanOf(reflect.SendDir, reflect.TypeOf(dep4).Elem()) injector.Set(typRecv, reflect.ValueOf(dep3)) injector.Set(typSend, reflect.ValueOf(dep4)) _, err := injector.Invoke(func(d1 string, d2 SpecialString, d3 <-chan *SpecialString, d4 chan<- *SpecialString) { expect(t, d1, dep) expect(t, d2, dep2) expect(t, reflect.TypeOf(d3).Elem(), reflect.TypeOf(dep3).Elem()) expect(t, reflect.TypeOf(d4).Elem(), reflect.TypeOf(dep4).Elem()) expect(t, reflect.TypeOf(d3).ChanDir(), reflect.RecvDir) expect(t, reflect.TypeOf(d4).ChanDir(), reflect.SendDir) }) expect(t, err, nil) }
func TestInjectImplementors(t *testing.T) { injector := inject.New() g := &Greeter{"Jeremy"} injector.Map(g) expect(t, injector.Get(inject.InterfaceOf((*fmt.Stringer)(nil))).IsValid(), true) }
func (m *Martini) createContext(res http.ResponseWriter, req *http.Request) *context { c := &context{inject.New(), m.handlers, m.action, NewResponseWriter(res), 0} c.SetParent(m) c.MapTo(c, (*Context)(nil)) c.MapTo(c.rw, (*http.ResponseWriter)(nil)) c.Map(req) return c }
func Test_InjectorGet(t *testing.T) { injector := inject.New() injector.Map("some dependency") expect(t, injector.Get(reflect.TypeOf("string")).IsValid(), true) expect(t, injector.Get(reflect.TypeOf(11)).IsValid(), false) }
func Test_InjectorApply(t *testing.T) { injector := inject.New() injector.Map("a dep").MapTo("another dep", (*SpecialString)(nil)) s := TestStruct{} err := injector.Apply(&s) expect(t, err, nil) expect(t, s.Dep1, "a dep") expect(t, s.Dep2, "another dep") expect(t, s.Dep3, "") }
func Test_InjectorInvokeReturnValues(t *testing.T) { injector := inject.New() expect(t, injector == nil, false) dep := "some dependency" injector.Map(dep) dep2 := "another dep" injector.MapTo(dep2, (*SpecialString)(nil)) result, err := injector.Invoke(func(d1 string, d2 SpecialString) string { expect(t, d1, dep) expect(t, d2, dep2) return "Hello world" }) expect(t, result[0].String(), "Hello world") expect(t, err, nil) }
func Test_InjectorSet(t *testing.T) { injector := inject.New() typ := reflect.TypeOf("string") typSend := reflect.ChanOf(reflect.SendDir, typ) typRecv := reflect.ChanOf(reflect.RecvDir, typ) // instantiating unidirectional channels is not possible using reflect // http://golang.org/src/pkg/reflect/value.go?s=60463:60504#L2064 chanRecv := reflect.MakeChan(reflect.ChanOf(reflect.BothDir, typ), 0) chanSend := reflect.MakeChan(reflect.ChanOf(reflect.BothDir, typ), 0) injector.Set(typSend, chanSend) injector.Set(typRecv, chanRecv) expect(t, injector.Get(typSend).IsValid(), true) expect(t, injector.Get(typRecv).IsValid(), true) expect(t, injector.Get(chanSend.Type()).IsValid(), false) }
func Test_Static_Options_Expires(t *testing.T) { response := httptest.NewRecorder() var buffer bytes.Buffer m := &Martini{Injector: inject.New(), action: func() {}, logger: log.New(&buffer, "[martini] ", 0)} m.Map(m.logger) m.Map(defaultReturnHandler()) // Serve current directory under /public m.Use(Static(currentRoot, StaticOptions{Expires: func() string { return "46" }})) // Check file content behaviour req, err := http.NewRequest("GET", "http://localhost:3000/martini.go", nil) if err != nil { t.Error(err) } m.ServeHTTP(response, req) expect(t, response.Header().Get("Expires"), "46") }
func Test_Static_Options_ServeIndex(t *testing.T) { response := httptest.NewRecorder() var buffer bytes.Buffer m := &Martini{Injector: inject.New(), action: func() {}, logger: log.New(&buffer, "[martini] ", 0)} m.Map(m.logger) m.Map(defaultReturnHandler()) opt := StaticOptions{IndexFile: "martini.go"} // Define martini.go as index file m.Use(Static(currentRoot, opt)) req, err := http.NewRequest("GET", "http://localhost:3000/", nil) if err != nil { t.Error(err) } m.ServeHTTP(response, req) expect(t, response.Code, http.StatusOK) expect(t, buffer.String(), "[martini] [Static] Serving /martini.go\n") }
func Test_Static_Options_Fallback(t *testing.T) { response := httptest.NewRecorder() var buffer bytes.Buffer m := &Martini{Injector: inject.New(), action: func() {}, logger: log.New(&buffer, "[martini] ", 0)} m.Map(m.logger) m.Map(defaultReturnHandler()) // Serve current directory under /public m.Use(Static(currentRoot, StaticOptions{Fallback: "/martini.go"})) // Check file content behaviour req, err := http.NewRequest("GET", "http://localhost:3000/initram.go", nil) if err != nil { t.Error(err) } m.ServeHTTP(response, req) expect(t, response.Code, http.StatusOK) expect(t, buffer.String(), "[martini] [Static] Serving /martini.go\n") }
// New creates a bare bones Martini instance. Use this method if you want to have full control over the middleware that is used. func New() *Martini { m := &Martini{Injector: inject.New(), action: func() {}, logger: log.New(os.Stdout, "[martini] ", 0)} m.Map(m.logger) m.Map(defaultReturnHandler()) return m }