/*
 * 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.uaa.identityzones;

import org.cloudfoundry.reactor.InteractionContext;
import org.cloudfoundry.reactor.TestRequest;
import org.cloudfoundry.reactor.TestResponse;
import org.cloudfoundry.reactor.uaa.AbstractUaaApiTest;
import org.cloudfoundry.uaa.identityzones.Branding;
import org.cloudfoundry.uaa.identityzones.ClientLockoutPolicy;
import org.cloudfoundry.uaa.identityzones.CorsConfiguration;
import org.cloudfoundry.uaa.identityzones.CorsPolicy;
import org.cloudfoundry.uaa.identityzones.CreateIdentityZoneRequest;
import org.cloudfoundry.uaa.identityzones.CreateIdentityZoneResponse;
import org.cloudfoundry.uaa.identityzones.DeleteIdentityZoneRequest;
import org.cloudfoundry.uaa.identityzones.DeleteIdentityZoneResponse;
import org.cloudfoundry.uaa.identityzones.GetIdentityZoneRequest;
import org.cloudfoundry.uaa.identityzones.GetIdentityZoneResponse;
import org.cloudfoundry.uaa.identityzones.IdentityZone;
import org.cloudfoundry.uaa.identityzones.IdentityZoneConfiguration;
import org.cloudfoundry.uaa.identityzones.Links;
import org.cloudfoundry.uaa.identityzones.ListIdentityZonesRequest;
import org.cloudfoundry.uaa.identityzones.ListIdentityZonesResponse;
import org.cloudfoundry.uaa.identityzones.LogoutLink;
import org.cloudfoundry.uaa.identityzones.Prompt;
import org.cloudfoundry.uaa.identityzones.SamlConfiguration;
import org.cloudfoundry.uaa.identityzones.SelfServiceLink;
import org.cloudfoundry.uaa.identityzones.TokenPolicy;
import org.cloudfoundry.uaa.identityzones.UpdateIdentityZoneRequest;
import org.cloudfoundry.uaa.identityzones.UpdateIdentityZoneResponse;
import org.junit.Test;
import reactor.test.StepVerifier;

import java.time.Duration;
import java.util.Collections;

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;

public final class ReactorIdentityZonesTest extends AbstractUaaApiTest {

    private final ReactorIdentityZones identityZones = new ReactorIdentityZones(CONNECTION_CONTEXT, this.root, TOKEN_PROVIDER);

    @Test
    public void create() {
        mockRequest(InteractionContext.builder()
            .request(TestRequest.builder()
                .method(POST).path("/identity-zones")
                .payload("fixtures/uaa/identity-zones/POST_request.json")
                .build())
            .response(TestResponse.builder()
                .status(CREATED)
                .payload("fixtures/uaa/identity-zones/POST_response.json")
                .build())
            .build());

        this.identityZones
            .create(CreateIdentityZoneRequest.builder()
                .identityZoneId("twiglet-create")
                .subdomain("twiglet-create")
                .configuration(IdentityZoneConfiguration.builder()
                    .clientLockoutPolicy(ClientLockoutPolicy.builder()
                        .lockoutPeriodSeconds(300)
                        .lockoutAfterFailures(5)
                        .countFailuresWithin(3600)
                        .build())
                    .tokenPolicy(TokenPolicy.builder()
                        .accessTokenValidity(-1)
                        .refreshTokenValidity(-1)
                        .jwtRevocable(false)
                        .key("exampleKeyId", Collections.singletonMap("signingKey", "s1gNiNg.K3y/t3XT"))
                        .build())
                    .samlConfiguration(SamlConfiguration.builder()
                        .assertionSigned(true)
                        .requestSigned(true)
                        .wantAssertionSigned(true)
                        .wantPartnerAuthenticationRequestSigned(false)
                        .assertionTimeToLive(600)
                        .build())
                    .corsPolicy(CorsPolicy.builder()
                        .xhrConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .defaultConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .build())
                    .links(Links.builder()
                        .logout(LogoutLink.builder()
                            .redirectUrl("/login")
                            .redirectParameterName("redirect")
                            .disableRedirectParameter(true)
                            .build())
                        .homeRedirect("http://my.hosted.homepage.com/")
                        .selfService(SelfServiceLink.builder()
                            .selfServiceLinksEnabled(true)
                            .signupLink("/create_account")
                            .resetPasswordLink("/forgot_password")
                            .build())
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("username")
                        .fieldType("text")
                        .text("Email")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("password")
                        .fieldType("password")
                        .text("Password")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("passcode")
                        .fieldType("password")
                        .text("One Time Code (Get on at /passcode)")
                        .build())
                    .ldapDiscoveryEnabled(false)
                    .branding(Branding.builder()
                        .companyName("Test Company")
                        .productLogo("VGVzdFByb2R1Y3RMb2dv")
                        .squareLogo("VGVzdFNxdWFyZUxvZ28=")
                        .footerLegalText("Test footer legal text")
                        .footerLink("Support", "http://support.example.com")
                        .build())
                    .accountChooserEnabled(false)
                    .build())
                .name("The Twiglet Zone")
                .version(0)
                .description("Like the Twilight Zone but tastier.")
                .createdAt(1481728057524L)
                .lastModified(1481728057524L)
                .build())
            .as(StepVerifier::create)
            .expectNext(CreateIdentityZoneResponse.builder()
                .id("twiglet-create")
                .subdomain("twiglet-create")
                .configuration(IdentityZoneConfiguration.builder()
                    .clientLockoutPolicy(ClientLockoutPolicy.builder()
                        .lockoutPeriodSeconds(300)
                        .lockoutAfterFailures(5)
                        .countFailuresWithin(3600)
                        .build())
                    .tokenPolicy(TokenPolicy.builder()
                        .accessTokenValidity(-1)
                        .refreshTokenValidity(-1)
                        .jwtRevocable(false)
                        .key("exampleKeyId", Collections.singletonMap("signingKey", "s1gNiNg.K3y/t3XT"))
                        .build())
                    .samlConfiguration(SamlConfiguration.builder()
                        .assertionSigned(true)
                        .requestSigned(true)
                        .wantAssertionSigned(true)
                        .wantPartnerAuthenticationRequestSigned(false)
                        .assertionTimeToLive(600)
                        .build())
                    .corsPolicy(CorsPolicy.builder()
                        .xhrConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .defaultConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .build())
                    .links(Links.builder()
                        .logout(LogoutLink.builder()
                            .redirectUrl("/login")
                            .redirectParameterName("redirect")
                            .disableRedirectParameter(true)
                            .build())
                        .homeRedirect("http://my.hosted.homepage.com/")
                        .selfService(SelfServiceLink.builder()
                            .selfServiceLinksEnabled(true)
                            .signupLink("/create_account")
                            .resetPasswordLink("/forgot_password")
                            .build())
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("username")
                        .fieldType("text")
                        .text("Email")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("password")
                        .fieldType("password")
                        .text("Password")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("passcode")
                        .fieldType("password")
                        .text("One Time Code (Get on at /passcode)")
                        .build())
                    .ldapDiscoveryEnabled(false)
                    .branding(Branding.builder()
                        .companyName("Test Company")
                        .productLogo("VGVzdFByb2R1Y3RMb2dv")
                        .squareLogo("VGVzdFNxdWFyZUxvZ28=")
                        .footerLegalText("Test footer legal text")
                        .footerLink("Support", "http://support.example.com")
                        .build())
                    .accountChooserEnabled(false)
                    .build())
                .name("The Twiglet Zone")
                .version(0)
                .description("Like the Twilight Zone but tastier.")
                .createdAt(1481728057533L)
                .lastModified(1481728057533L)
                .build())
            .expectComplete()
            .verify(Duration.ofSeconds(5));
    }

    @Test
    public void delete() {
        mockRequest(InteractionContext.builder()
            .request(TestRequest.builder()
                .method(DELETE).path("/identity-zones/twiglet-delete")
                .build())
            .response(TestResponse.builder()
                .status(OK)
                .payload("fixtures/uaa/identity-zones/DELETE_{id}_response.json")
                .build())
            .build());

        this.identityZones
            .delete(DeleteIdentityZoneRequest.builder()
                .identityZoneId("twiglet-delete")
                .build())
            .as(StepVerifier::create)
            .expectNext(DeleteIdentityZoneResponse.builder()
                .id("twiglet-delete")
                .subdomain("twiglet-delete")
                .configuration(IdentityZoneConfiguration.builder()
                    .clientLockoutPolicy(ClientLockoutPolicy.builder()
                        .lockoutPeriodSeconds(-1)
                        .lockoutAfterFailures(-1)
                        .countFailuresWithin(-1)
                        .build())
                    .tokenPolicy(TokenPolicy.builder()
                        .accessTokenValidity(-1)
                        .refreshTokenValidity(-1)
                        .jwtRevocable(false)
                        .keys(Collections.emptyMap())
                        .build())
                    .samlConfiguration(SamlConfiguration.builder()
                        .assertionSigned(true)
                        .requestSigned(true)
                        .wantAssertionSigned(true)
                        .wantPartnerAuthenticationRequestSigned(false)
                        .assertionTimeToLive(600)
                        .build())
                    .corsPolicy(CorsPolicy.builder()
                        .xhrConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .defaultConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .build())
                    .links(Links.builder()
                        .logout(LogoutLink.builder()
                            .redirectUrl("/login")
                            .redirectParameterName("redirect")
                            .disableRedirectParameter(true)
                            .build())
                        .homeRedirect("http://my.hosted.homepage.com/")
                        .selfService(SelfServiceLink.builder()
                            .selfServiceLinksEnabled(true)
                            .signupLink("/create_account")
                            .resetPasswordLink("/forgot_password")
                            .build())
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("username")
                        .fieldType("text")
                        .text("Email")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("password")
                        .fieldType("password")
                        .text("Password")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("passcode")
                        .fieldType("password")
                        .text("One Time Code (Get on at /passcode)")
                        .build())
                    .ldapDiscoveryEnabled(false)
                    .branding(Branding.builder()
                        .companyName("Test Company")
                        .productLogo("VGVzdFByb2R1Y3RMb2dv")
                        .squareLogo("VGVzdFNxdWFyZUxvZ28=")
                        .footerLegalText("Test footer legal text")
                        .footerLink("Support", "http://support.example.com")
                        .build())
                    .accountChooserEnabled(false)
                    .build())
                .name("The Twiglet Zone")
                .version(0)
                .createdAt(1481728057024L)
                .lastModified(1481728057024L)
                .build())
            .expectComplete()
            .verify(Duration.ofSeconds(5));
    }

    @Test
    public void get() {
        mockRequest(InteractionContext.builder()
            .request(TestRequest.builder()
                .method(GET).path("/identity-zones/twiglet-get")
                .build())
            .response(TestResponse.builder()
                .status(OK)
                .payload("fixtures/uaa/identity-zones/GET_{id}_response.json")
                .build())
            .build());

        this.identityZones
            .get(GetIdentityZoneRequest.builder()
                .identityZoneId("twiglet-get")
                .build())
            .as(StepVerifier::create)
            .expectNext(GetIdentityZoneResponse.builder()
                .id("twiglet-get")
                .subdomain("twiglet-get")
                .configuration(IdentityZoneConfiguration.builder()
                    .clientLockoutPolicy(ClientLockoutPolicy.builder()
                        .lockoutPeriodSeconds(-1)
                        .lockoutAfterFailures(-1)
                        .countFailuresWithin(-1)
                        .build())
                    .tokenPolicy(TokenPolicy.builder()
                        .accessTokenValidity(-1)
                        .refreshTokenValidity(-1)
                        .jwtRevocable(false)
                        .keys(Collections.emptyMap())
                        .build())
                    .samlConfiguration(SamlConfiguration.builder()
                        .assertionSigned(true)
                        .requestSigned(true)
                        .wantAssertionSigned(true)
                        .wantPartnerAuthenticationRequestSigned(false)
                        .assertionTimeToLive(600)
                        .build())
                    .corsPolicy(CorsPolicy.builder()
                        .xhrConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .defaultConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .build())
                    .links(Links.builder()
                        .logout(LogoutLink.builder()
                            .redirectUrl("/login")
                            .redirectParameterName("redirect")
                            .disableRedirectParameter(true)
                            .build())
                        .homeRedirect("http://my.hosted.homepage.com/")
                        .selfService(SelfServiceLink.builder()
                            .selfServiceLinksEnabled(true)
                            .signupLink("/create_account")
                            .resetPasswordLink("/forgot_password")
                            .build())
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("username")
                        .fieldType("text")
                        .text("Email")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("password")
                        .fieldType("password")
                        .text("Password")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("passcode")
                        .fieldType("password")
                        .text("One Time Code (Get on at /passcode)")
                        .build())
                    .ldapDiscoveryEnabled(false)
                    .branding(Branding.builder()
                        .companyName("Test Company")
                        .productLogo("VGVzdFByb2R1Y3RMb2dv")
                        .squareLogo("VGVzdFNxdWFyZUxvZ28=")
                        .footerLegalText("Test footer legal text")
                        .footerLink("Support", "http://support.example.com")
                        .build())
                    .accountChooserEnabled(false)
                    .build())
                .name("The Twiglet Zone")
                .version(0)
                .createdAt(1481728057382L)
                .lastModified(1481728057382L)
                .build())
            .expectComplete()
            .verify(Duration.ofSeconds(5));
    }

    @Test
    public void list() {
        mockRequest(InteractionContext.builder()
            .request(TestRequest.builder()
                .method(GET).path("/identity-zones")
                .build())
            .response(TestResponse.builder()
                .status(OK)
                .payload("fixtures/uaa/identity-zones/GET_response.json")
                .build())
            .build());

        this.identityZones
            .list(ListIdentityZonesRequest.builder()
                .build())
            .as(StepVerifier::create)
            .expectNext(ListIdentityZonesResponse.builder()
                .identityZone(IdentityZone.builder()
                    .id("15wtczzd")
                    .subdomain("15wtczzd")
                    .configuration(IdentityZoneConfiguration.builder()
                        .clientLockoutPolicy(ClientLockoutPolicy.builder()
                            .lockoutPeriodSeconds(-1)
                            .lockoutAfterFailures(-1)
                            .countFailuresWithin(-1)
                            .build())
                        .tokenPolicy(TokenPolicy.builder()
                            .accessTokenValidity(-1)
                            .refreshTokenValidity(-1)
                            .jwtRevocable(false)
                            .keys(Collections.emptyMap())
                            .build())
                        .samlConfiguration(SamlConfiguration.builder()
                            .assertionSigned(true)
                            .requestSigned(true)
                            .wantAssertionSigned(true)
                            .wantPartnerAuthenticationRequestSigned(false)
                            .assertionTimeToLive(600)
                            .build())
                        .corsPolicy(CorsPolicy.builder()
                            .xhrConfiguration(CorsConfiguration.builder()
                                .allowedOrigin(".*")
                                .allowedUri(".*")
                                .allowedHeader("Accept")
                                .allowedHeader("Authorization")
                                .allowedHeader("Content-Type")
                                .allowedMethod("GET")
                                .allowedCredentials(false)
                                .maxAge(1728000L)
                                .build())
                            .defaultConfiguration(CorsConfiguration.builder()
                                .allowedOrigin(".*")
                                .allowedUri(".*")
                                .allowedHeader("Accept")
                                .allowedHeader("Authorization")
                                .allowedHeader("Content-Type")
                                .allowedMethod("GET")
                                .allowedCredentials(false)
                                .maxAge(1728000L)
                                .build())
                            .build())
                        .links(Links.builder()
                            .logout(LogoutLink.builder()
                                .redirectUrl("/login")
                                .redirectParameterName("redirect")
                                .disableRedirectParameter(true)
                                .build())
                            .selfService(SelfServiceLink.builder()
                                .selfServiceLinksEnabled(true)
                                .signupLink("/create_account")
                                .resetPasswordLink("/forgot_password")
                                .build())
                            .build())
                        .prompt(Prompt.builder()
                            .fieldName("username")
                            .fieldType("text")
                            .text("Email")
                            .build())
                        .prompt(Prompt.builder()
                            .fieldName("password")
                            .fieldType("password")
                            .text("Password")
                            .build())
                        .prompt(Prompt.builder()
                            .fieldName("passcode")
                            .fieldType("password")
                            .text("One Time Code (Get on at /passcode)")
                            .build())
                        .ldapDiscoveryEnabled(false)
                        .accountChooserEnabled(false)
                        .build())
                    .name("The Twiglet Zone")
                    .version(0)
                    .description("Like the Twilight Zone but tastier.")
                    .createdAt(1481728053399L)
                    .lastModified(1481728053399L)
                    .build())
                .build())
            .expectComplete()
            .verify(Duration.ofSeconds(5));
    }

    @Test
    public void update() {
        mockRequest(InteractionContext.builder()
            .request(TestRequest.builder()
                .method(PUT).path("/identity-zones/twiglet-update")
                .payload("fixtures/uaa/identity-zones/PUT_{id}_request.json")
                .build())
            .response(TestResponse.builder()
                .status(OK)
                .payload("fixtures/uaa/identity-zones/PUT_{id}_response.json")
                .build())
            .build());

        this.identityZones
            .update(UpdateIdentityZoneRequest.builder()
                .identityZoneId("twiglet-update")
                .subdomain("twiglet-update")
                .configuration(IdentityZoneConfiguration.builder()
                    .clientLockoutPolicy(ClientLockoutPolicy.builder()
                        .lockoutPeriodSeconds(-1)
                        .lockoutAfterFailures(-1)
                        .countFailuresWithin(-1)
                        .build())
                    .tokenPolicy(TokenPolicy.builder()
                        .accessTokenValidity(-1)
                        .refreshTokenValidity(-1)
                        .jwtRevocable(false)
                        .key("updatedKeyId", Collections.singletonMap("signingKey", "upD4t3d.s1gNiNg.K3y/t3XT"))
                        .build())
                    .samlConfiguration(SamlConfiguration.builder()
                        .assertionSigned(true)
                        .requestSigned(true)
                        .wantAssertionSigned(true)
                        .wantPartnerAuthenticationRequestSigned(false)
                        .assertionTimeToLive(600)
                        .build())
                    .corsPolicy(CorsPolicy.builder()
                        .xhrConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .defaultConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .build())
                    .links(Links.builder()
                        .logout(LogoutLink.builder()
                            .redirectUrl("/login")
                            .redirectParameterName("redirect")
                            .disableRedirectParameter(true)
                            .build())
                        .homeRedirect("http://my.hosted.homepage.com/")
                        .selfService(SelfServiceLink.builder()
                            .selfServiceLinksEnabled(true)
                            .signupLink("/create_account")
                            .resetPasswordLink("/forgot_password")
                            .build())
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("username")
                        .fieldType("text")
                        .text("Email")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("password")
                        .fieldType("password")
                        .text("Password")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("passcode")
                        .fieldType("password")
                        .text("One Time Code (Get on at /passcode)")
                        .build())
                    .ldapDiscoveryEnabled(false)
                    .branding(Branding.builder()
                        .companyName("Test Company")
                        .productLogo("VGVzdFByb2R1Y3RMb2dv")
                        .squareLogo("VGVzdFNxdWFyZUxvZ28=")
                        .footerLegalText("Test footer legal text")
                        .footerLink("Support", "http://support.example.com")
                        .build())
                    .accountChooserEnabled(false)
                    .build())
                .name("The Updated Twiglet Zone")
                .version(0)
                .description("Like the Twilight Zone but not tastier.")
                .createdAt(1481728057246L)
                .lastModified(1481728057246L)
                .build())
            .as(StepVerifier::create)
            .expectNext(UpdateIdentityZoneResponse.builder()
                .id("twiglet-update")
                .subdomain("twiglet-update")
                .configuration(IdentityZoneConfiguration.builder()
                    .clientLockoutPolicy(ClientLockoutPolicy.builder()
                        .lockoutPeriodSeconds(-1)
                        .lockoutAfterFailures(-1)
                        .countFailuresWithin(-1)
                        .build())
                    .tokenPolicy(TokenPolicy.builder()
                        .accessTokenValidity(-1)
                        .refreshTokenValidity(-1)
                        .jwtRevocable(false)
                        .key("updatedKeyId", Collections.singletonMap("signingKey", "upD4t3d.s1gNiNg.K3y/t3XT"))
                        .build())
                    .samlConfiguration(SamlConfiguration.builder()
                        .assertionSigned(true)
                        .requestSigned(true)
                        .wantAssertionSigned(true)
                        .wantPartnerAuthenticationRequestSigned(false)
                        .assertionTimeToLive(600)
                        .build())
                    .corsPolicy(CorsPolicy.builder()
                        .xhrConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .defaultConfiguration(CorsConfiguration.builder()
                            .allowedOrigin(".*")
                            .allowedUri(".*")
                            .allowedHeader("Accept")
                            .allowedHeader("Authorization")
                            .allowedHeader("Content-Type")
                            .allowedMethod("GET")
                            .allowedCredentials(false)
                            .maxAge(1728000L)
                            .build())
                        .build())
                    .links(Links.builder()
                        .logout(LogoutLink.builder()
                            .redirectUrl("/login")
                            .redirectParameterName("redirect")
                            .disableRedirectParameter(true)
                            .build())
                        .homeRedirect("http://my.hosted.homepage.com/")
                        .selfService(SelfServiceLink.builder()
                            .selfServiceLinksEnabled(true)
                            .signupLink("/create_account")
                            .resetPasswordLink("/forgot_password")
                            .build())
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("username")
                        .fieldType("text")
                        .text("Email")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("password")
                        .fieldType("password")
                        .text("Password")
                        .build())
                    .prompt(Prompt.builder()
                        .fieldName("passcode")
                        .fieldType("password")
                        .text("One Time Code (Get on at /passcode)")
                        .build())
                    .ldapDiscoveryEnabled(false)
                    .branding(Branding.builder()
                        .companyName("Test Company")
                        .productLogo("VGVzdFByb2R1Y3RMb2dv")
                        .squareLogo("VGVzdFNxdWFyZUxvZ28=")
                        .footerLegalText("Test footer legal text")
                        .footerLink("Support", "http://support.example.com")
                        .build())
                    .accountChooserEnabled(false)
                    .build())
                .name("The Updated Twiglet Zone")
                .version(1)
                .description("Like the Twilight Zone but not tastier.")
                .createdAt(1481728057213L)
                .lastModified(1481728057259L)
                .build())
            .expectComplete()
            .verify(Duration.ofSeconds(5));
    }

}
