github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+incompatible/cf/api/service_plan_test.go (about)

     1  package api_test
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/cli/cf/api/apifakes"
     9  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    10  	"code.cloudfoundry.org/cli/cf/models"
    11  	"code.cloudfoundry.org/cli/cf/net"
    12  	"code.cloudfoundry.org/cli/cf/terminal/terminalfakes"
    13  	testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration"
    14  	testnet "code.cloudfoundry.org/cli/cf/util/testhelpers/net"
    15  
    16  	. "code.cloudfoundry.org/cli/cf/api"
    17  	"code.cloudfoundry.org/cli/cf/trace/tracefakes"
    18  	. "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers"
    19  	. "github.com/onsi/ginkgo"
    20  	. "github.com/onsi/gomega"
    21  )
    22  
    23  var _ = Describe("Service Plan Repository", func() {
    24  	var (
    25  		testServer  *httptest.Server
    26  		testHandler *testnet.TestHandler
    27  		configRepo  coreconfig.ReadWriter
    28  		repo        CloudControllerServicePlanRepository
    29  	)
    30  
    31  	BeforeEach(func() {
    32  		configRepo = testconfig.NewRepositoryWithDefaults()
    33  		gateway := net.NewCloudControllerGateway(configRepo, time.Now, new(terminalfakes.FakeUI), new(tracefakes.FakePrinter), "")
    34  		repo = NewCloudControllerServicePlanRepository(configRepo, gateway)
    35  	})
    36  
    37  	AfterEach(func() {
    38  		testServer.Close()
    39  	})
    40  
    41  	setupTestServer := func(reqs ...testnet.TestRequest) {
    42  		testServer, testHandler = testnet.NewServer(reqs)
    43  		configRepo.SetAPIEndpoint(testServer.URL)
    44  	}
    45  
    46  	Describe(".Search", func() {
    47  		Context("No query parameters", func() {
    48  			BeforeEach(func() {
    49  				setupTestServer(firstPlanRequest, secondPlanRequest)
    50  			})
    51  
    52  			It("returns service plans", func() {
    53  				servicePlansFields, err := repo.Search(map[string]string{})
    54  
    55  				Expect(err).NotTo(HaveOccurred())
    56  				Expect(testHandler).To(HaveAllRequestsCalled())
    57  				Expect(len(servicePlansFields)).To(Equal(2))
    58  				Expect(servicePlansFields[0].Name).To(Equal("The big one"))
    59  				Expect(servicePlansFields[0].GUID).To(Equal("the-big-guid"))
    60  				Expect(servicePlansFields[0].Free).To(BeTrue())
    61  				Expect(servicePlansFields[0].Public).To(BeTrue())
    62  				Expect(servicePlansFields[0].Active).To(BeTrue())
    63  				Expect(servicePlansFields[1].Name).To(Equal("The small second"))
    64  				Expect(servicePlansFields[1].GUID).To(Equal("the-small-second"))
    65  				Expect(servicePlansFields[1].Free).To(BeTrue())
    66  				Expect(servicePlansFields[1].Public).To(BeFalse())
    67  				Expect(servicePlansFields[1].Active).To(BeFalse())
    68  			})
    69  		})
    70  		Context("With query parameters", func() {
    71  			BeforeEach(func() {
    72  				setupTestServer(firstPlanRequestWithParams, secondPlanRequestWithParams)
    73  			})
    74  
    75  			It("returns service plans", func() {
    76  				servicePlansFields, err := repo.Search(map[string]string{"service_guid": "Foo"})
    77  
    78  				Expect(err).NotTo(HaveOccurred())
    79  				Expect(testHandler).To(HaveAllRequestsCalled())
    80  				Expect(len(servicePlansFields)).To(Equal(2))
    81  				Expect(servicePlansFields[0].Name).To(Equal("The big one"))
    82  				Expect(servicePlansFields[0].GUID).To(Equal("the-big-guid"))
    83  				Expect(servicePlansFields[0].Free).To(BeTrue())
    84  				Expect(servicePlansFields[0].Public).To(BeTrue())
    85  				Expect(servicePlansFields[0].Active).To(BeTrue())
    86  				Expect(servicePlansFields[1].Name).To(Equal("The small second"))
    87  				Expect(servicePlansFields[1].GUID).To(Equal("the-small-second"))
    88  				Expect(servicePlansFields[1].Free).To(BeTrue())
    89  				Expect(servicePlansFields[1].Public).To(BeFalse())
    90  				Expect(servicePlansFields[1].Active).To(BeFalse())
    91  			})
    92  		})
    93  	})
    94  
    95  	Describe(".Update", func() {
    96  		BeforeEach(func() {
    97  			setupTestServer(apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
    98  				Method:   "PUT",
    99  				Path:     "/v2/service_plans/my-service-plan-guid",
   100  				Matcher:  testnet.RequestBodyMatcher(`{"public":true}`),
   101  				Response: testnet.TestResponse{Status: http.StatusCreated},
   102  			}))
   103  		})
   104  
   105  		It("updates public on the service to whatever is passed", func() {
   106  			servicePlan := models.ServicePlanFields{
   107  				Name:        "my-service-plan",
   108  				GUID:        "my-service-plan-guid",
   109  				Description: "descriptive text",
   110  				Free:        true,
   111  				Public:      false,
   112  			}
   113  
   114  			err := repo.Update(servicePlan, "service-guid", true)
   115  			Expect(testHandler).To(HaveAllRequestsCalled())
   116  			Expect(err).NotTo(HaveOccurred())
   117  		})
   118  	})
   119  
   120  	Describe(".ListPlansFromManyServices", func() {
   121  		BeforeEach(func() {
   122  			setupTestServer(manyServiceRequest1, manyServiceRequest2)
   123  		})
   124  
   125  		It("returns all service plans for a list of service guids", func() {
   126  			serviceGUIDs := []string{"service-guid1", "service-guid2"}
   127  
   128  			servicePlansFields, err := repo.ListPlansFromManyServices(serviceGUIDs)
   129  			Expect(err).NotTo(HaveOccurred())
   130  
   131  			Expect(testHandler).To(HaveAllRequestsCalled())
   132  			Expect(len(servicePlansFields)).To(Equal(2))
   133  
   134  			Expect(servicePlansFields[0].Name).To(Equal("plan one"))
   135  			Expect(servicePlansFields[0].GUID).To(Equal("plan1"))
   136  
   137  			Expect(servicePlansFields[1].Name).To(Equal("plan two"))
   138  			Expect(servicePlansFields[1].GUID).To(Equal("plan2"))
   139  		})
   140  	})
   141  })
   142  
   143  var firstPlanRequest = apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
   144  	Method: "GET",
   145  	Path:   "/v2/service_plans",
   146  	Response: testnet.TestResponse{
   147  		Status: http.StatusOK,
   148  		Body: `{
   149    "total_results": 2,
   150    "total_pages": 2,
   151    "next_url": "/v2/service_plans?page=2",
   152    "resources": [
   153      {
   154        "metadata": {
   155          "guid": "the-big-guid"
   156        },
   157        "entity": {
   158          "name": "The big one",
   159          "free": true,
   160          "public": true,
   161          "active": true
   162        }
   163      }
   164    ]
   165  }`,
   166  	},
   167  })
   168  
   169  var secondPlanRequest = apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
   170  	Method: "GET",
   171  	Path:   "/v2/service_plans?page=2",
   172  	Response: testnet.TestResponse{
   173  		Status: http.StatusOK,
   174  		Body: `{
   175    "total_results": 2,
   176    "total_pages": 2,
   177    "resources": [
   178      {
   179        "metadata": {
   180          "guid": "the-small-second"
   181        },
   182        "entity": {
   183          "name": "The small second",
   184          "free": true,
   185          "public": false,
   186          "active": false
   187        }
   188      }
   189    ]
   190  }`,
   191  	},
   192  })
   193  
   194  var firstPlanRequestWithParams = apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
   195  	Method: "GET",
   196  	Path:   "/v2/service_plans?q=service_guid%3AFoo",
   197  	Response: testnet.TestResponse{
   198  		Status: http.StatusOK,
   199  		Body: `{
   200    "total_results": 2,
   201    "total_pages": 2,
   202    "next_url": "/v2/service_plans?q=service_guid%3AFoo&page=2",
   203    "resources": [
   204      {
   205        "metadata": {
   206          "guid": "the-big-guid"
   207        },
   208        "entity": {
   209          "name": "The big one",
   210          "free": true,
   211          "public": true,
   212          "active": true
   213        }
   214      }
   215    ]
   216  }`,
   217  	},
   218  })
   219  
   220  var secondPlanRequestWithParams = apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
   221  	Method: "GET",
   222  	Path:   "/v2/service_plans?q=service_guid%3AFoo&page=2",
   223  	Response: testnet.TestResponse{
   224  		Status: http.StatusOK,
   225  		Body: `{
   226    "total_results": 2,
   227    "total_pages": 2,
   228    "resources": [
   229      {
   230        "metadata": {
   231          "guid": "the-small-second"
   232        },
   233        "entity": {
   234          "name": "The small second",
   235          "free": true,
   236          "public": false,
   237          "active": false
   238        }
   239      }
   240    ]
   241  }`,
   242  	},
   243  })
   244  
   245  var manyServiceRequest1 = apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
   246  	Method: "GET",
   247  	Path:   "/v2/service_plans?q=service_guid+IN+service-guid1,service-guid2",
   248  	Response: testnet.TestResponse{
   249  		Status: http.StatusOK,
   250  		Body: `{
   251    "total_results": 2,
   252    "total_pages": 2,
   253    "next_url": "/v2/service_plans?q=service_guid+IN+service-guid1,service-guid2&page=2",
   254    "resources": [
   255      {
   256        "metadata": {
   257          "guid": "plan1"
   258        },
   259        "entity": {
   260          "name": "plan one",
   261          "free": true,
   262          "public": true,
   263          "active": true
   264        }
   265      }
   266    ]
   267  }`,
   268  	},
   269  })
   270  
   271  var manyServiceRequest2 = apifakes.NewCloudControllerTestRequest(testnet.TestRequest{
   272  	Method: "GET",
   273  	Path:   "/v2/service_plans?q=service_guid+IN+service-guid1,service-guid2&page=2",
   274  	Response: testnet.TestResponse{
   275  		Status: http.StatusOK,
   276  		Body: `{
   277    "total_results": 2,
   278    "total_pages": 1,
   279    "next_url": null,
   280    "prev_url": "/v2/service_plans?q=service_guid+IN+service-guid1,service-guid2",
   281    "resources": [
   282      {
   283        "metadata": {
   284          "guid": "plan2"
   285        },
   286        "entity": {
   287          "name": "plan two",
   288          "free": true,
   289          "public": true,
   290          "active": true
   291        }
   292      }
   293    ]
   294  }`,
   295  	},
   296  })