/*
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.cloudfoundry.reactor.client.v2.buildpacks;
import org.cloudfoundry.client.v2.Metadata;
import org.cloudfoundry.client.v2.buildpacks.BuildpackEntity;
import org.cloudfoundry.client.v2.buildpacks.BuildpackResource;
import org.cloudfoundry.client.v2.buildpacks.CreateBuildpackRequest;
import org.cloudfoundry.client.v2.buildpacks.CreateBuildpackResponse;
import org.cloudfoundry.client.v2.buildpacks.DeleteBuildpackRequest;
import org.cloudfoundry.client.v2.buildpacks.DeleteBuildpackResponse;
import org.cloudfoundry.client.v2.buildpacks.GetBuildpackRequest;
import org.cloudfoundry.client.v2.buildpacks.GetBuildpackResponse;
import org.cloudfoundry.client.v2.buildpacks.ListBuildpacksRequest;
import org.cloudfoundry.client.v2.buildpacks.ListBuildpacksResponse;
import org.cloudfoundry.client.v2.buildpacks.UpdateBuildpackRequest;
import org.cloudfoundry.client.v2.buildpacks.UpdateBuildpackResponse;
import org.cloudfoundry.client.v2.buildpacks.UploadBuildpackRequest;
import org.cloudfoundry.client.v2.buildpacks.UploadBuildpackResponse;
import org.cloudfoundry.client.v2.jobs.JobEntity;
import org.cloudfoundry.reactor.InteractionContext;
import org.cloudfoundry.reactor.TestRequest;
import org.cloudfoundry.reactor.TestResponse;
import org.cloudfoundry.reactor.client.AbstractClientApiTest;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import reactor.test.StepVerifier;
import java.io.IOException;
import java.nio.charset.Charset;
import java.time.Duration;
import static io.netty.handler.codec.http.HttpMethod.DELETE;
import static io.netty.handler.codec.http.HttpMethod.GET;
import static io.netty.handler.codec.http.HttpMethod.POST;
import static io.netty.handler.codec.http.HttpMethod.PUT;
import static io.netty.handler.codec.http.HttpResponseStatus.CREATED;
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
import static org.assertj.core.api.Assertions.assertThat;
import static org.cloudfoundry.util.tuple.TupleUtils.consumer;
public final class ReactorBuildpacksTest extends AbstractClientApiTest {
private ReactorBuildpacks buildpacks = new ReactorBuildpacks(CONNECTION_CONTEXT, this.root, TOKEN_PROVIDER);
@Test
public void create() {
mockRequest(InteractionContext.builder()
.request(TestRequest.builder()
.method(POST).path("/v2/buildpacks")
.payload("fixtures/client/v2/buildpacks/POST_request.json")
.build())
.response(TestResponse.builder()
.status(CREATED)
.payload("fixtures/client/v2/buildpacks/POST_response.json")
.build())
.build());
this.buildpacks
.create(CreateBuildpackRequest.builder()
.name("Golang_buildpack")
.build())
.as(StepVerifier::create)
.expectNext(CreateBuildpackResponse.builder()
.metadata(Metadata.builder()
.createdAt("2016-03-17T21:41:28Z")
.id("9c38753c-960c-44aa-ac46-37ad61b87e35")
.url("/v2/buildpacks/9c38753c-960c-44aa-ac46-37ad61b87e35")
.build())
.entity(BuildpackEntity.builder()
.enabled(true)
.locked(false)
.name("Golang_buildpack")
.position(1)
.build())
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void delete() {
mockRequest(InteractionContext.builder()
.request(TestRequest.builder()
.method(DELETE).path("/v2/buildpacks/test-buildpack-id?async=true")
.build())
.response(TestResponse.builder()
.status(OK)
.payload("fixtures/client/v2/buildpacks/DELETE_{id}_response.json")
.build())
.build());
this.buildpacks
.delete(DeleteBuildpackRequest.builder()
.async(true)
.buildpackId("test-buildpack-id")
.build())
.as(StepVerifier::create)
.expectNext(DeleteBuildpackResponse.builder()
.metadata(Metadata.builder()
.createdAt("2015-07-27T22:43:34Z")
.id("c900719e-c70a-4c75-9e6a-9535f118acc3")
.url("/v2/jobs/c900719e-c70a-4c75-9e6a-9535f118acc3")
.build())
.entity(JobEntity.builder()
.id("c900719e-c70a-4c75-9e6a-9535f118acc3")
.status("queued")
.build())
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void get() {
mockRequest(InteractionContext.builder()
.request(TestRequest.builder()
.method(GET).path("/v2/buildpacks/test-buildpack-id")
.build())
.response(TestResponse.builder()
.status(OK)
.payload("fixtures/client/v2/buildpacks/GET_{id}_response.json")
.build())
.build());
this.buildpacks
.get(GetBuildpackRequest.builder()
.buildpackId("test-buildpack-id")
.build())
.as(StepVerifier::create)
.expectNext(GetBuildpackResponse.builder()
.metadata(Metadata.builder()
.createdAt("2016-03-17T21:41:28Z")
.id("35d3fa06-08db-4b9e-b2a7-58724a179687")
.url("/v2/buildpacks/35d3fa06-08db-4b9e-b2a7-58724a179687")
.build()
)
.entity(BuildpackEntity.builder()
.enabled(true)
.filename("name-2302")
.locked(false)
.name("name_1")
.position(1)
.build())
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void list() {
mockRequest(InteractionContext.builder()
.request(TestRequest.builder()
.method(GET).path("/v2/buildpacks?q=name:test-name&page=-1")
.build())
.response(TestResponse.builder()
.status(OK)
.payload("fixtures/client/v2/buildpacks/GET_response.json")
.build())
.build());
this.buildpacks
.list(ListBuildpacksRequest.builder()
.name("test-name")
.page(-1)
.build())
.as(StepVerifier::create)
.expectNext(ListBuildpacksResponse.builder()
.totalResults(3)
.totalPages(1)
.resource(BuildpackResource.builder()
.metadata(Metadata.builder()
.id("45203d32-475b-4d55-9d34-3ffc935edd49")
.url("/v2/buildpacks/45203d32-475b-4d55-9d34-3ffc935edd49")
.createdAt("2016-03-17T21:41:28Z")
.build())
.entity(BuildpackEntity.builder()
.enabled(true)
.filename("name-2308")
.locked(false)
.name("name_1")
.position(1)
.build())
.build())
.resource(BuildpackResource.builder()
.metadata(Metadata.builder()
.id("1aeb95ef-7058-495c-b260-dea2e8efb976")
.url("/v2/buildpacks/1aeb95ef-7058-495c-b260-dea2e8efb976")
.createdAt("2016-03-17T21:41:28Z")
.build())
.entity(BuildpackEntity.builder()
.enabled(true)
.filename("name-2309")
.locked(false)
.name("name_2")
.position(2)
.build())
.build())
.resource(BuildpackResource.builder()
.metadata(Metadata.builder()
.id("4dd0046a-7a54-4f57-a31f-06d7e57eb463")
.url("/v2/buildpacks/4dd0046a-7a54-4f57-a31f-06d7e57eb463")
.createdAt("2016-03-17T21:41:28Z")
.build())
.entity(BuildpackEntity.builder()
.enabled(true)
.filename("name-2310")
.locked(false)
.name("name_3")
.position(3)
.build())
.build())
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void update() {
mockRequest(InteractionContext.builder()
.request(TestRequest.builder()
.method(PUT).path("/v2/buildpacks/test-buildpack-id")
.payload("fixtures/client/v2/buildpacks/PUT_{id}_request.json")
.build())
.response(TestResponse.builder()
.status(CREATED)
.payload("fixtures/client/v2/buildpacks/PUT_{id}_response.json")
.build())
.build());
this.buildpacks
.update(UpdateBuildpackRequest.builder()
.buildpackId("test-buildpack-id")
.enabled(false)
.build())
.as(StepVerifier::create)
.expectNext(UpdateBuildpackResponse.builder()
.metadata(Metadata.builder()
.createdAt("2016-03-17T21:41:28Z")
.id("edd64481-e13c-4193-b6cc-2a727a62e817")
.updatedAt("2016-03-17T21:41:28Z")
.url("/v2/buildpacks/edd64481-e13c-4193-b6cc-2a727a62e817")
.build())
.entity(BuildpackEntity.builder()
.enabled(false)
.filename("name-2314")
.locked(false)
.name("name_1")
.position(1)
.build())
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
public void upload() throws IOException {
mockRequest(InteractionContext.builder()
.request(TestRequest.builder()
.method(PUT).path("/v2/buildpacks/test-buildpack-id/bits")
.contents(consumer((headers, body) -> {
String boundary = extractBoundary(headers);
assertThat(body.readString(Charset.defaultCharset()))
.isEqualTo("\r\n--" + boundary + "\r\n" +
"content-disposition: form-data; name=\"buildpack\"; filename=\"test-filename\"\r\n" +
"content-length: 13\r\n" +
"content-type: application/zip\r\n" +
"\r\n" +
"test-content\n" +
"\r\n" +
"--" + boundary + "--");
}))
.build())
.response(TestResponse.builder()
.status(CREATED)
.payload("fixtures/client/v2/buildpacks/PUT_{id}_bits_response.json")
.build())
.build());
this.buildpacks
.upload(UploadBuildpackRequest.builder()
.buildpack(new ClassPathResource("fixtures/client/v2/buildpacks/test-buildpack.zip").getFile().toPath())
.buildpackId("test-buildpack-id")
.filename("test-filename")
.build())
.as(StepVerifier::create)
.expectNext(UploadBuildpackResponse.builder()
.metadata(Metadata.builder()
.createdAt("2016-04-21T08:51:39Z")
.id("353360ea-59bb-414b-a90e-100c37317a02")
.updatedAt("2016-04-21T09:38:16Z")
.url("/v2/buildpacks/353360ea-59bb-414b-a90e-100c37317a02")
.build())
.entity(BuildpackEntity.builder()
.enabled(true)
.filename("binary_buildpack-cached-v1.0.1.zip")
.locked(false)
.name("binary_buildpack")
.position(8)
.build())
.build())
.expectComplete()
.verify(Duration.ofSeconds(5));
}
}