github.com/jasonkeene/cli@v6.14.1-0.20160816203908-ca5715166dfb+incompatible/cf/api/user_provided_service_instances_test.go (about)

     1  package api_test
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"time"
     7  
     8  	"github.com/cloudfoundry/cli/cf/api/apifakes"
     9  	"github.com/cloudfoundry/cli/cf/models"
    10  	"github.com/cloudfoundry/cli/cf/net"
    11  	"github.com/cloudfoundry/cli/cf/terminal/terminalfakes"
    12  	testconfig "github.com/cloudfoundry/cli/testhelpers/configuration"
    13  	testnet "github.com/cloudfoundry/cli/testhelpers/net"
    14  
    15  	. "github.com/cloudfoundry/cli/cf/api"
    16  	"github.com/cloudfoundry/cli/cf/trace/tracefakes"
    17  	. "github.com/cloudfoundry/cli/testhelpers/matchers"
    18  	. "github.com/onsi/ginkgo"
    19  	. "github.com/onsi/gomega"
    20  )
    21  
    22  var _ = Describe("UserProvidedServiceRepository", func() {
    23  
    24  	Context("Create()", func() {
    25  		It("creates a user provided service with a name and credentials", func() {
    26  			req := apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
    27  				Method:   "POST",
    28  				Path:     "/v2/user_provided_service_instances",
    29  				Matcher:  testnet.RequestBodyMatcher(`{"name":"my-custom-service","credentials":{"host":"example.com","password":"secret","user":"me"},"space_guid":"my-space-guid","syslog_drain_url":"","route_service_url":""}`),
    30  				Response: testnet.TestResponse{Status: http.StatusCreated},
    31  			})
    32  
    33  			ts, handler, repo := createUserProvidedServiceInstanceRepo([]testnet.TestRequest{req})
    34  			defer ts.Close()
    35  
    36  			apiErr := repo.Create("my-custom-service", "", "", map[string]interface{}{
    37  				"host":     "example.com",
    38  				"user":     "me",
    39  				"password": "secret",
    40  			})
    41  			Expect(handler).To(HaveAllRequestsCalled())
    42  			Expect(apiErr).NotTo(HaveOccurred())
    43  		})
    44  
    45  		It("creates user provided service instances with syslog drains", func() {
    46  			req := apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
    47  				Method:   "POST",
    48  				Path:     "/v2/user_provided_service_instances",
    49  				Matcher:  testnet.RequestBodyMatcher(`{"name":"my-custom-service","credentials":{"host":"example.com","password":"secret","user":"me"},"space_guid":"my-space-guid","syslog_drain_url":"syslog://example.com","route_service_url":""}`),
    50  				Response: testnet.TestResponse{Status: http.StatusCreated},
    51  			})
    52  
    53  			ts, handler, repo := createUserProvidedServiceInstanceRepo([]testnet.TestRequest{req})
    54  			defer ts.Close()
    55  
    56  			apiErr := repo.Create("my-custom-service", "syslog://example.com", "", map[string]interface{}{
    57  				"host":     "example.com",
    58  				"user":     "me",
    59  				"password": "secret",
    60  			})
    61  			Expect(handler).To(HaveAllRequestsCalled())
    62  			Expect(apiErr).NotTo(HaveOccurred())
    63  		})
    64  
    65  		It("creates user provided service instances with route service url", func() {
    66  			req := apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
    67  				Method:   "POST",
    68  				Path:     "/v2/user_provided_service_instances",
    69  				Matcher:  testnet.RequestBodyMatcher(`{"name":"my-custom-service","credentials":{"host":"example.com","password":"secret","user":"me"},"space_guid":"my-space-guid","syslog_drain_url":"","route_service_url":"https://example.com"}`),
    70  				Response: testnet.TestResponse{Status: http.StatusCreated},
    71  			})
    72  
    73  			ts, handler, repo := createUserProvidedServiceInstanceRepo([]testnet.TestRequest{req})
    74  			defer ts.Close()
    75  
    76  			apiErr := repo.Create("my-custom-service", "", "https://example.com", map[string]interface{}{
    77  				"host":     "example.com",
    78  				"user":     "me",
    79  				"password": "secret",
    80  			})
    81  			Expect(handler).To(HaveAllRequestsCalled())
    82  			Expect(apiErr).NotTo(HaveOccurred())
    83  		})
    84  	})
    85  
    86  	Context("Update()", func() {
    87  		It("can update a user provided service, given a service instance with a guid", func() {
    88  			req := apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
    89  				Method:   "PUT",
    90  				Path:     "/v2/user_provided_service_instances/my-instance-guid",
    91  				Matcher:  testnet.RequestBodyMatcher(`{"credentials":{"host":"example.com","password":"secret","user":"me"},"syslog_drain_url":"syslog://example.com","route_service_url":""}`),
    92  				Response: testnet.TestResponse{Status: http.StatusCreated},
    93  			})
    94  
    95  			ts, handler, repo := createUserProvidedServiceInstanceRepo([]testnet.TestRequest{req})
    96  			defer ts.Close()
    97  
    98  			params := map[string]interface{}{
    99  				"host":     "example.com",
   100  				"user":     "me",
   101  				"password": "secret",
   102  			}
   103  			serviceInstance := models.ServiceInstanceFields{}
   104  			serviceInstance.GUID = "my-instance-guid"
   105  			serviceInstance.Params = params
   106  			serviceInstance.SysLogDrainURL = "syslog://example.com"
   107  			serviceInstance.RouteServiceURL = ""
   108  
   109  			apiErr := repo.Update(serviceInstance)
   110  			Expect(handler).To(HaveAllRequestsCalled())
   111  			Expect(apiErr).NotTo(HaveOccurred())
   112  		})
   113  	})
   114  
   115  	Context("GetSummaries()", func() {
   116  		It("returns all user created service in []models.UserProvidedService", func() {
   117  			responseStr := testnet.TestResponse{Status: http.StatusOK, Body: `
   118  {
   119     "total_results": 2,
   120     "total_pages": 1,
   121     "prev_url": null,
   122     "next_url": null,
   123     "resources": [
   124        {
   125           "metadata": {
   126              "guid": "2d0a1eb6-b6e5-4b92-b1da-91c5e826b3b4",
   127              "url": "/v2/user_provided_service_instances/2d0a1eb6-b6e5-4b92-b1da-91c5e826b3b4",
   128              "created_at": "2015-01-15T22:57:08Z",
   129              "updated_at": null
   130           },
   131           "entity": {
   132              "name": "test_service",
   133              "credentials": {},
   134              "space_guid": "f36dbf3e-eff1-4336-ae5c-aff01dd8ce94",
   135              "type": "user_provided_service_instance",
   136              "syslog_drain_url": "",
   137              "space_url": "/v2/spaces/f36dbf3e-eff1-4336-ae5c-aff01dd8ce94",
   138              "service_bindings_url": "/v2/user_provided_service_instances/2d0a1eb6-b6e5-4b92-b1da-91c5e826b3b4/service_bindings"
   139           }
   140        },
   141        {
   142           "metadata": {
   143              "guid": "9d0a1eb6-b6e5-4b92-b1da-91c5ed26b3b4",
   144              "url": "/v2/user_provided_service_instances/9d0a1eb6-b6e5-4b92-b1da-91c5e826b3b4",
   145              "created_at": "2015-01-15T22:57:08Z",
   146              "updated_at": null
   147           },
   148           "entity": {
   149              "name": "test_service2",
   150              "credentials": {
   151  							"password": "admin",
   152                "username": "admin"
   153  						},
   154              "space_guid": "f36dbf3e-eff1-4336-ae5c-aff01dd8ce94",
   155              "type": "user_provided_service_instance",
   156              "syslog_drain_url": "sample/drainURL",
   157              "space_url": "/v2/spaces/f36dbf3e-eff1-4336-ae5c-aff01dd8ce94",
   158              "service_bindings_url": "/v2/user_provided_service_instances/2d0a1eb6-b6e5-4b92-b1da-91c5e826b3b4/service_bindings"
   159           }
   160        }
   161     ]
   162  }`}
   163  
   164  			req := apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
   165  				Method:   "GET",
   166  				Path:     "/v2/user_provided_service_instances",
   167  				Response: responseStr,
   168  			})
   169  
   170  			ts, handler, repo := createUserProvidedServiceInstanceRepo([]testnet.TestRequest{req})
   171  			defer ts.Close()
   172  
   173  			summaries, apiErr := repo.GetSummaries()
   174  			Expect(apiErr).NotTo(HaveOccurred())
   175  			Expect(handler).To(HaveAllRequestsCalled())
   176  			Expect(len(summaries.Resources)).To(Equal(2))
   177  
   178  			Expect(summaries.Resources[0].Name).To(Equal("test_service"))
   179  			Expect(summaries.Resources[1].Name).To(Equal("test_service2"))
   180  			Expect(summaries.Resources[1].Credentials["username"]).To(Equal("admin"))
   181  			Expect(summaries.Resources[1].SysLogDrainURL).To(Equal("sample/drainURL"))
   182  		})
   183  	})
   184  
   185  })
   186  
   187  func createUserProvidedServiceInstanceRepo(req []testnet.TestRequest) (ts *httptest.Server, handler *testnet.TestHandler, repo UserProvidedServiceInstanceRepository) {
   188  	ts, handler = testnet.NewServer(req)
   189  	configRepo := testconfig.NewRepositoryWithDefaults()
   190  	configRepo.SetAPIEndpoint(ts.URL)
   191  	gateway := net.NewCloudControllerGateway(configRepo, time.Now, new(terminalfakes.FakeUI), new(tracefakes.FakePrinter), "")
   192  	repo = NewCCUserProvidedServiceInstanceRepository(configRepo, gateway)
   193  	return
   194  }