func (s *S) TestServicesInstancesHandler(c *C) { srv := service.Service{Name: "redis", Teams: []string{s.team.Name}} err := srv.Create() c.Assert(err, IsNil) instance := service.ServiceInstance{ Name: "redis-globo", ServiceName: "redis", Apps: []string{"globo"}, Teams: []string{s.team.Name}, } err = instance.Create() c.Assert(err, IsNil) request, err := http.NewRequest("GET", "/services/instances", nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = ServicesInstancesHandler(recorder, request, s.user) c.Assert(err, IsNil) body, err := ioutil.ReadAll(recorder.Body) c.Assert(err, IsNil) var instances []service.ServiceModel err = json.Unmarshal(body, &instances) c.Assert(err, IsNil) expected := []service.ServiceModel{ {Service: "redis", Instances: []string{"redis-globo"}}, } c.Assert(instances, DeepEquals, expected) }
func (s *S) TestDestroyShouldUnbindAppFromInstance(c *C) { h := testHandler{} tsg := s.t.StartGandalfTestServer(&h) defer tsg.Close() ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNoContent) })) defer ts.Close() srvc := service.Service{Name: "my", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": srvc.Name}) instance := service.ServiceInstance{Name: "MyInstance", Apps: []string{"whichapp"}, ServiceName: srvc.Name} err = instance.Create() c.Assert(err, IsNil) defer db.Session.ServiceInstances().Remove(bson.M{"_id": instance.Name}) a := App{ Name: "whichapp", Framework: "", Teams: []string{}, Units: []Unit{ {Ip: "10.10.10.10", Machine: 1}, }, } err = CreateApp(&a) c.Assert(err, IsNil) err = a.Destroy() c.Assert(err, IsNil) n, err := db.Session.ServiceInstances().Find(bson.M{"apps": bson.M{"$in": []string{a.Name}}}).Count() c.Assert(err, IsNil) c.Assert(n, Equals, 0) }
func (s *S) TestUnbindRemovesAppFromServiceInstance(c *C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNoContent) })) defer ts.Close() srvc := service.Service{Name: "mysql", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": "mysql"}) instance := service.ServiceInstance{ Name: "my-mysql", ServiceName: "mysql", Teams: []string{s.team.Name}, Apps: []string{"painkiller"}, } instance.Create() defer db.Session.ServiceInstances().Remove(bson.M{"_id": "my-mysql"}) a, err := createTestApp("painkiller", "", []string{s.team.Name}, []app.Unit{{Ip: "10.10.10.10"}}) c.Assert(err, IsNil) defer db.Session.Apps().Remove(bson.M{"name": a.Name}) err = instance.Unbind(&a) c.Assert(err, IsNil) db.Session.ServiceInstances().Find(bson.M{"_id": instance.Name}).One(&instance) c.Assert(instance.Apps, DeepEquals, []string{}) }
func (s *S) TestUnbindRemovesEnvironmentVariableFromApp(c *C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNoContent) })) defer ts.Close() srvc := service.Service{Name: "mysql", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": "mysql"}) instance := service.ServiceInstance{ Name: "my-mysql", ServiceName: "mysql", Teams: []string{s.team.Name}, Apps: []string{"painkiller"}, } err = instance.Create() c.Assert(err, IsNil) defer db.Session.ServiceInstances().Remove(bson.M{"_id": "my-mysql"}) a := app.App{ Name: "painkiller", Teams: []string{s.team.Name}, Env: map[string]bind.EnvVar{ "DATABASE_HOST": { Name: "DATABASE_HOST", Value: "arrea", Public: false, InstanceName: instance.Name, }, "MY_VAR": { Name: "MY_VAR", Value: "123", }, }, Units: []app.Unit{ { Ip: "10.10.10.10", }, }, } err = db.Session.Apps().Insert(&a) c.Assert(err, IsNil) defer db.Session.Apps().Remove(bson.M{"name": a.Name}) err = instance.Unbind(&a) c.Assert(err, IsNil) newApp := app.App{Name: a.Name} err = newApp.Get() c.Assert(err, IsNil) expected := map[string]bind.EnvVar{ "MY_VAR": { Name: "MY_VAR", Value: "123", }, } c.Assert(a.Env, DeepEquals, expected) }
func (s *S) TestGetDocHandler(c *C) { se := service.Service{Name: "some_service", Doc: "some doc", OwnerTeams: []string{s.team.Name}} se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) request, err := http.NewRequest("GET", fmt.Sprintf("/services/%s/doc?:name=%s", se.Name, se.Name), nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = GetDocHandler(recorder, request, s.user) c.Assert(err, IsNil) c.Assert(recorder.Body.String(), Equals, "some doc") }
func (s *S) TestDocHandlerReturns401WhenUserHasNoAccessToService(c *C) { srv := service.Service{ Name: "coolnosql", Doc: "some doc...", IsRestricted: true, } err := srv.Create() c.Assert(err, IsNil) recorder, request := s.makeRequestToGetDocHandler("coolnosql", c) err = Doc(recorder, request, s.user) c.Assert(err, ErrorMatches, "^This user does not have access to this service$") }
func (s *S) TestCreateInstanceHandlerReturnErrorIfTheServiceAPICallFailAndDoesNotSaveTheInstanceInTheDatabase(c *C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) })) defer ts.Close() srvc := service.Service{Name: "mysql", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": "mysql"}) recorder, request := makeRequestToCreateInstanceHandler(c) err = CreateInstanceHandler(recorder, request, s.user) c.Assert(err, NotNil) }
func (s *S) TestRemoveServiceHandlerWIthAssociatedAppsShouldFailAndReturnError(c *C) { se := service.Service{Name: "foo"} err := se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) c.Assert(err, IsNil) si := service.ServiceInstance{Name: "foo-instance", ServiceName: "foo", Apps: []string{"foo-bar"}, Teams: []string{s.team.Name}} err = si.Create() defer db.Session.ServiceInstances().Remove(bson.M{"name": si.Name}) c.Assert(err, IsNil) recorder, request := makeRequestToRemoveInstanceHandler("foo-instance", c) err = RemoveServiceInstanceHandler(recorder, request, s.user) c.Assert(err, ErrorMatches, "^This service instance has binded apps. Unbind them before removing it$") }
func (s *S) TestRemoveServiceHandlerWithoutPermissionShouldReturn401(c *C) { se := service.Service{Name: "foo"} err := se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) c.Assert(err, IsNil) si := service.ServiceInstance{Name: "foo-instance", ServiceName: "foo"} err = si.Create() defer db.Session.ServiceInstances().Remove(bson.M{"name": si.Name}) c.Assert(err, IsNil) recorder, request := makeRequestToRemoveInstanceHandler("foo-instance", c) err = RemoveServiceInstanceHandler(recorder, request, s.user) c.Assert(err, ErrorMatches, "^This user does not have access to this service instance$") }
func (s *S) TestServiceInfoHandlerReturns403WhenTheUserDoesNotHaveAccessToTheService(c *C) { se := service.Service{Name: "Mysql", IsRestricted: true} se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) request, err := http.NewRequest("DELETE", fmt.Sprintf("/services/%s?:name=%s", se.Name, se.Name), nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = ServiceInfoHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusForbidden) c.Assert(e, ErrorMatches, "^This user does not have access to this service$") }
func (s *S) TestServicesInstancesHandlerFilterInstancesPerServiceIncludingServicesThatDoesNotHaveInstances(c *C) { u := &auth.User{Email: "*****@*****.**", Password: "******"} err := u.Create() c.Assert(err, IsNil) defer db.Session.Users().Remove(bson.M{"email": u.Email}) serviceNames := []string{"redis", "mysql", "pgsql", "memcached"} defer db.Session.Services().RemoveAll(bson.M{"name": bson.M{"$in": serviceNames}}) defer db.Session.ServiceInstances().RemoveAll(bson.M{"service_name": bson.M{"$in": serviceNames}}) for _, name := range serviceNames { srv := service.Service{Name: name, Teams: []string{s.team.Name}} err = srv.Create() c.Assert(err, IsNil) instance := service.ServiceInstance{ Name: srv.Name + "1", ServiceName: srv.Name, Teams: []string{s.team.Name}, } err = instance.Create() c.Assert(err, IsNil) instance = service.ServiceInstance{ Name: srv.Name + "2", ServiceName: srv.Name, Teams: []string{s.team.Name}, } err = instance.Create() } srv := service.Service{Name: "oracle", Teams: []string{s.team.Name}} err = srv.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"name": "oracle"}) request, err := http.NewRequest("GET", "/services/instances", nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = ServicesInstancesHandler(recorder, request, s.user) c.Assert(err, IsNil) body, err := ioutil.ReadAll(recorder.Body) c.Assert(err, IsNil) var instances []service.ServiceModel err = json.Unmarshal(body, &instances) c.Assert(err, IsNil) expected := []service.ServiceModel{ {Service: "redis", Instances: []string{"redis1", "redis2"}}, {Service: "mysql", Instances: []string{"mysql1", "mysql2"}}, {Service: "pgsql", Instances: []string{"pgsql1", "pgsql2"}}, {Service: "memcached", Instances: []string{"memcached1", "memcached2"}}, {Service: "oracle", Instances: []string(nil)}, } c.Assert(instances, DeepEquals, expected) }
func (s *S) TestDeleteHandler(c *C) { se := service.Service{Name: "Mysql", OwnerTeams: []string{s.team.Name}} se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) request, err := http.NewRequest("DELETE", fmt.Sprintf("/services/%s?:name=%s", se.Name, se.Name), nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = DeleteHandler(recorder, request, s.user) c.Assert(err, IsNil) c.Assert(recorder.Code, Equals, http.StatusNoContent) query := bson.M{"_id": "Mysql"} err = db.Session.Services().Find(query).One(&se) c.Assert(err, IsNil) c.Assert(se.Status, Equals, "deleted") }
func (s *S) TestGrantAccessToTeamReturnConflictIfTheTeamAlreadyHasAccessToTheService(c *C) { se := service.Service{Name: "my_service", Teams: []string{s.team.Name}} err := se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) c.Assert(err, IsNil) url := fmt.Sprintf("/services/%s/%s?:service=%s&:team=%s", se.Name, s.team.Name, se.Name, s.team.Name) request, err := http.NewRequest("PUT", url, nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = GrantAccessToTeamHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusConflict) }
func (s *S) TestAddDocHandlerReturns403WhenTheUserDoesNotHaveAccessToTheService(c *C) { se := service.Service{Name: "Mysql"} se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) b := bytes.NewBufferString("doc") request, err := http.NewRequest("PUT", fmt.Sprintf("/services/%s/doc?:name=%s", se.Name, se.Name), b) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = AddDocHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusForbidden) c.Assert(e, ErrorMatches, "^This user does not have access to this service$") }
func (s *S) TestAddDocHandler(c *C) { se := service.Service{Name: "some_service", OwnerTeams: []string{s.team.Name}} se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) b := bytes.NewBufferString("doc") request, err := http.NewRequest("PUT", fmt.Sprintf("/services/%s/doc?:name=%s", se.Name, se.Name), b) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = AddDocHandler(recorder, request, s.user) c.Assert(err, IsNil) query := bson.M{"_id": "some_service"} var serv service.Service err = db.Session.Services().Find(query).One(&serv) c.Assert(err, IsNil) c.Assert(serv.Doc, Equals, "doc") }
func (s *S) TestRevokeAccessFromTeamReturnsForbiddenIfTheTeamIsTheOnlyWithAccessToTheService(c *C) { se := service.Service{Name: "my_service", Teams: []string{s.team.Name}} err := se.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/%s/%s?:service=%s&:team=%s", se.Name, s.team.Name, se.Name, s.team.Name) request, err := http.NewRequest("DELETE", url, nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = RevokeAccessFromTeamHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusForbidden) c.Assert(e, ErrorMatches, "^You can not revoke the access from this team, because it is the unique team with access to this service, and a service can not be orphaned$") }
func (s *S) TestRevokeAccessFromTeamReturnsNotFoundIfTheTeamDoesNotExist(c *C) { se := service.Service{Name: "my_service", Teams: []string{s.team.Name}} err := se.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/%s/nonono?:service=%s&:team=nonono", se.Name, se.Name) request, err := http.NewRequest("DELETE", url, nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = RevokeAccessFromTeamHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusNotFound) c.Assert(e, ErrorMatches, "^Team not found$") }
func (s *S) TestCreateInstanceHandlerReturnsErrorWhenUserCannotUseService(c *C) { service := service.Service{Name: "mysql", IsRestricted: true} service.Create() recorder, request := makeRequestToCreateInstanceHandler(c) err := CreateInstanceHandler(recorder, request, s.user) c.Assert(err, ErrorMatches, "^This user does not have access to this service$") }
func (s *S) TestRevokeAccessFromTeamRemovesTeamFromService(c *C) { t := &auth.Team{Name: "alle-da"} se := service.Service{Name: "my_service", Teams: []string{s.team.Name, t.Name}} err := se.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/%s/%s?:service=%s&:team=%s", se.Name, s.team.Name, se.Name, s.team.Name) request, err := http.NewRequest("DELETE", url, nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = RevokeAccessFromTeamHandler(recorder, request, s.user) c.Assert(err, IsNil) err = se.Get() c.Assert(err, IsNil) c.Assert(*s.team, Not(HasAccessTo), se) }
func (s *S) TestGrantAccessToTeamReturnForbiddenIfTheGivenUserDoesNotHaveAccessToTheService(c *C) { se := service.Service{Name: "my_service"} err := se.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/%s/%s?:service=%s&:team=%s", se.Name, s.team.Name, se.Name, s.team.Name) request, err := http.NewRequest("PUT", url, nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = GrantAccessToTeamHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusForbidden) c.Assert(e, ErrorMatches, "^This user does not have access to this service$") }
func (s *S) TestDocHandler(c *C) { doc := `Doc for coolnosql Collnosql is a really really cool nosql` srv := service.Service{ Name: "coolnosql", Doc: doc, Teams: []string{s.team.Name}, } err := srv.Create() c.Assert(err, IsNil) recorder, request := s.makeRequestToGetDocHandler("coolnosql", c) err = Doc(recorder, request, s.user) c.Assert(err, IsNil) b, err := ioutil.ReadAll(recorder.Body) c.Assert(err, IsNil) c.Assert(string(b), Equals, doc) }
func (s *S) TestRevokeAccesFromTeamReturnsForbiddenIfTheGivenUserDoesNotHasAccessToTheService(c *C) { t := &auth.Team{Name: "alle-da"} se := service.Service{Name: "my_service", Teams: []string{t.Name}} err := se.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/%s/%s?:service=%s&:team=%s", se.Name, t.Name, se.Name, t.Name) request, err := http.NewRequest("DELETE", url, nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = RevokeAccessFromTeamHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusForbidden) c.Assert(e, ErrorMatches, "^This user does not have access to this service$") }
func (s *S) TestGrantAccessToTeam(c *C) { t := &auth.Team{Name: "blaaaa"} db.Session.Teams().Insert(t) defer db.Session.Teams().Remove(bson.M{"name": t.Name}) se := service.Service{Name: "my_service", Teams: []string{s.team.Name}} err := se.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/%s/%s?:service=%s&:team=%s", se.Name, t.Name, se.Name, t.Name) request, err := http.NewRequest("PUT", url, nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = GrantAccessToTeamHandler(recorder, request, s.user) c.Assert(err, IsNil) err = se.Get() c.Assert(err, IsNil) c.Assert(*s.team, HasAccessTo, se) }
func (s *S) TestRevokeAccessFromTeamReturnNotFoundIfTheTeamDoesNotHasAccessToTheService(c *C) { t := &auth.Team{Name: "Rammlied"} db.Session.Teams().Insert(t) defer db.Session.Teams().RemoveAll(bson.M{"name": t.Name}) se := service.Service{Name: "my_service", Teams: []string{s.team.Name, s.team.Name}} err := se.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/%s/%s?:service=%s&:team=%s", se.Name, t.Name, se.Name, t.Name) request, err := http.NewRequest("DELETE", url, nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = RevokeAccessFromTeamHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusNotFound) }
func (suite *S) TestCreateInstanceHandlerSavesServiceInstanceInDb(c *C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`{"DATABASE_HOST":"localhost"}`)) })) defer ts.Close() se := service.Service{Name: "mysql", Teams: []string{suite.team.Name}, Endpoint: map[string]string{"production": ts.URL}} se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) recorder, request := makeRequestToCreateInstanceHandler(c) err := CreateInstanceHandler(recorder, request, suite.user) c.Assert(err, IsNil) var si service.ServiceInstance err = db.Session.ServiceInstances().Find(bson.M{"name": "brainSQL", "service_name": "mysql"}).One(&si) c.Assert(err, IsNil) db.Session.ServiceInstances().Update(bson.M{"name": si.Name}, si) c.Assert(si.Name, Equals, "brainSQL") c.Assert(si.ServiceName, Equals, "mysql") }
func (s *S) TestCreateInstanceHandlerIgnoresTeamAuthIfServiceIsNotRestricted(c *C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`{"DATABASE_HOST":"localhost"}`)) })) defer ts.Close() srvc := service.Service{Name: "mysql", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": "mysql"}) recorder, request := makeRequestToCreateInstanceHandler(c) err = CreateInstanceHandler(recorder, request, s.user) c.Assert(err, IsNil) var si service.ServiceInstance err = db.Session.ServiceInstances().Find(bson.M{"name": "brainSQL"}).One(&si) c.Assert(err, IsNil) c.Assert(si.Name, Equals, "brainSQL") c.Assert(si.Teams, DeepEquals, []string{s.team.Name}) }
func (s *S) TestUpdateHandlerReturns403WhenTheUserIsNotOwnerOfTheTeam(c *C) { se := service.Service{Name: "mysqlapi", Teams: []string{s.team.Name}} se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) p, err := filepath.Abs("testdata/manifest.yml") c.Assert(err, IsNil) manifest, err := ioutil.ReadFile(p) c.Assert(err, IsNil) request, err := http.NewRequest("PUT", "/services", bytes.NewBuffer(manifest)) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = UpdateHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusForbidden) c.Assert(e, ErrorMatches, "^This user does not have access to this service$") }
func (s *S) TestDeleteHandlerReturns403WhenTheServiceHasInstance(c *C) { se := service.Service{Name: "mysql", OwnerTeams: []string{s.team.Name}} err := se.Create() c.Assert(err, IsNil) defer db.Session.Services().Remove(bson.M{"_id": se.Name}) instance := service.ServiceInstance{Name: "my-mysql", ServiceName: se.Name} err = instance.Create() c.Assert(err, IsNil) defer instance.Delete() request, err := http.NewRequest("DELETE", fmt.Sprintf("/services/%s?:name=%s", se.Name, se.Name), nil) c.Assert(err, IsNil) recorder := httptest.NewRecorder() err = DeleteHandler(recorder, request, s.user) c.Assert(err, NotNil) e, ok := err.(*errors.Http) c.Assert(ok, Equals, true) c.Assert(e.Code, Equals, http.StatusForbidden) c.Assert(e, ErrorMatches, "^This service cannot be removed because it has instances.\nPlease remove these instances before removing the service.$") }
func (s *S) TestRemoveServiceShouldCallTheServiceAPI(c *C) { var called bool ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { called = r.Method == "DELETE" && r.URL.Path == "/resources/purity-instance" })) defer ts.Close() se := service.Service{Name: "purity", Endpoint: map[string]string{"production": ts.URL}} err := se.Create() defer db.Session.Services().Remove(bson.M{"_id": se.Name}) c.Assert(err, IsNil) si := service.ServiceInstance{Name: "purity-instance", ServiceName: "purity", Teams: []string{s.team.Name}} err = si.Create() c.Assert(err, IsNil) defer db.Session.ServiceInstances().Remove(bson.M{"name": si.Name}) recorder, request := makeRequestToRemoveInstanceHandler("purity-instance", c) err = RemoveServiceInstanceHandler(recorder, request, s.user) c.Assert(err, IsNil) c.Assert(called, Equals, true) }
func (s *S) TestServicesHandlerShoudGetAllServicesFromUsersTeam(c *C) { srv := service.Service{Name: "mongodb", OwnerTeams: []string{s.team.Name}} srv.Create() defer db.Session.Services().Remove(bson.M{"_id": srv.Name}) si := service.ServiceInstance{Name: "my_nosql", ServiceName: srv.Name, Teams: []string{s.team.Name}} si.Create() defer si.Delete() recorder, request := s.makeRequestToServicesHandler(c) err := ServicesHandler(recorder, request, s.user) c.Assert(err, IsNil) b, err := ioutil.ReadAll(recorder.Body) c.Assert(err, IsNil) services := make([]service.ServiceModel, 1) err = json.Unmarshal(b, &services) expected := []service.ServiceModel{ {Service: "mongodb", Instances: []string{"my_nosql"}}, } c.Assert(services, DeepEquals, expected) }