/******************************************************************************* * Copyright (c) 2012 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package com.openshift.internal.client.response; import static org.fest.assertions.Assertions.assertThat; import static org.junit.Assert.assertNotNull; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.fest.assertions.Condition; import org.junit.Test; import com.openshift.client.ApplicationScale; import com.openshift.client.HttpMethod; import com.openshift.client.IField; import com.openshift.client.Message; import com.openshift.client.Messages; import com.openshift.client.utils.CartridgeTestUtils; import com.openshift.client.utils.MessageAssert; import com.openshift.client.utils.ResourcePropertyAssert; import com.openshift.client.utils.Samples; import com.openshift.internal.client.CartridgeType; import com.openshift.internal.client.GearProfile; public class OpenShiftJsonDTOFactoryTest { private static final String LINK_ADD_APPLICATION = "ADD_APPLICATION"; private IRestResponseFactory factory = new OpenShiftJsonDTOFactory(); private static final class ValidLinkCondition extends Condition<Map<?, ?>> { @Override public boolean matches(Map<?, ?> links) { for (Entry<?, ?> entry : links.entrySet()) { Link link = (Link) entry.getValue(); if (link.getHref() == null || link.getHttpMethod() == null || link.getRel() == null) { return false; } } return true; } } @Test public void shouldUnmarshallGetUserResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_USER.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.user); UserResourceDTO userResourceDTO = response.getData(); assertThat(userResourceDTO.getRhLogin()).isEqualTo("foo@redhat.com"); assertThat(userResourceDTO.getMaxGears()).isEqualTo(10); assertThat(userResourceDTO.getConsumedGears()).isEqualTo(3); assertThat(userResourceDTO.getLinks()).hasSize(2); } @Test public void shouldUnmarshallGetUserNoKeyResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_USER_KEYS_NONE.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.keys); List<KeyResourceDTO> keys = response.getData(); assertThat(keys).isEmpty(); } @Test public void shouldUnmarshallGetUserSingleKeyResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_USER_KEYS_1KEY.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.keys); List<KeyResourceDTO> keys = response.getData(); assertThat(keys).hasSize(1); final KeyResourceDTO key = keys.get(0); assertThat(key.getLinks()).hasSize(3); assertThat(key.getName()).isEqualTo("somekey"); assertThat(key.getType()).isEqualTo("ssh-rsa"); assertThat(key.getContent()).isEqualTo("ABBA"); } @Test public void shouldUnmarshallGetUserMultipleKeyResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_USER_KEYS_2KEYS.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.keys); List<KeyResourceDTO> keys = response.getData(); final KeyResourceDTO key = keys.get(0); assertThat(key.getLinks()).hasSize(3); assertThat(key.getName()).isEqualTo("default"); assertThat(key.getType()).isEqualTo("ssh-rsa"); assertThat(key.getContent()).isEqualTo("ABBA"); } @Test public void shouldUnmarshallGetRootAPIResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_API.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.links); final Map<String, Link> links = response.getData(); assertThat(links).hasSize(12); assertThat(links).satisfies(new ValidLinkCondition()); } @Test public void shouldUnmarshallGetDomainsWith2ExistingResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_DOMAINS.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.domains); final List<DomainResourceDTO> domainDTOs = response.getData(); assertThat(domainDTOs).isNotEmpty(); assertThat(domainDTOs).hasSize(2); final DomainResourceDTO domainDTO = domainDTOs.get(0); assertThat(domainDTO.getId()).isEqualTo("foobarz"); assertThat(domainDTO.getLinks()).hasSize(5); final Link link = domainDTO.getLink(LINK_ADD_APPLICATION); assertThat(link).isNotNull(); assertThat(link.getHref()).isEqualTo("https://openshift.redhat.com/broker/rest/domains/foobarz/applications"); assertThat(link.getRel()).isEqualTo("Create new application"); assertThat(link.getHttpMethod()).isEqualTo(HttpMethod.POST); final List<LinkParameter> requiredParams = link.getRequiredParams(); assertThat(requiredParams).hasSize(1); } @Test public void shouldUnmarshallGetDomainsWithNoExistingResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_DOMAINS_EMPTY.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.domains); final List<DomainResourceDTO> domains = response.getData(); assertThat(domains).isEmpty(); } @Test public void shouldUnmarshallGetDomainResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_DOMAINS_FOOBARZ.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.domain); final DomainResourceDTO domain = response.getData(); assertNotNull(domain); assertThat(domain.getId()).isEqualTo("foobarz"); assertThat(domain.getLinks()).hasSize(5); } @Test public void shouldUnmarshallDeleteDomainKoNotFoundResponseBody() throws Throwable { // pre-conditions String content = Samples.DELETE_DOMAINS_FOOBAR_KO.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isNull(); assertThat(response.getMessages().size()).isEqualTo(1); } @Test public void shouldUnmarshallGetApplicationsWith2AppsResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_DOMAINS_FOOBARZ_APPLICATIONS_2EMBEDDED.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.applications); final List<ApplicationResourceDTO> applications = response.getData(); assertThat(applications).hasSize(2); ApplicationResourceDTO applicationDTO = applications.get(1); assertThat(applicationDTO.getDomainId()).isEqualTo("foobarz"); assertThat(applicationDTO.getCreationTime()).isEqualTo("2013-09-20T21:28:53Z"); assertThat(applicationDTO.getApplicationUrl()).isEqualTo("http://springeap6-foobarz.rhcloud.com/"); assertThat(applicationDTO.getSshUrl()).isEqualTo("ssh://523cbe15e0b8cd0a520001b6@springeap6-foobarz.rhcloud.com"); assertThat(applicationDTO.getFramework()).isEqualTo(CartridgeTestUtils.JBOSSEAP_6_NAME); assertThat(applicationDTO.getName()).isEqualTo("springeap6"); assertThat(applicationDTO.getApplicationScale()).isEqualTo(ApplicationScale.NO_SCALE); assertThat(applicationDTO.getGitUrl()).isEqualTo( "ssh://523cbe15e0b8cd0a520001b6@springeap6-foobarz.rhcloud.com/~/git/springeap6.git/"); assertThat(applicationDTO.getInitialGitUrl()) .isEqualTo("git://github.com/openshift/spring-eap6-quickstart.git"); assertThat(applicationDTO.getUuid()).isEqualTo("523cbe15e0b8cd0a520001b6"); assertThat(applicationDTO.getGearProfile()).isEqualTo(new GearProfile("small")); assertThat(applicationDTO.getAliases()).containsExactly("jbosstools.org"); assertThat(applicationDTO.getUuid()).isEqualTo("523cbe15e0b8cd0a520001b6"); assertThat(applicationDTO.getCartridges().keySet()).containsOnly( CartridgeTestUtils.JBOSSEAP_6_NAME, CartridgeTestUtils.MONGODB_22_NAME, CartridgeTestUtils.MYSQL_51_NAME); CartridgeResourceDTO cartridgeResourceDTO = applicationDTO.getCartridges().get(CartridgeTestUtils.MONGODB_22_NAME); assertThat(cartridgeResourceDTO).isNotNull(); assertThat(cartridgeResourceDTO.getType()).isEqualTo(CartridgeType.EMBEDDED); assertThat(cartridgeResourceDTO.getName()).isEqualTo(CartridgeTestUtils.MONGODB_22_NAME); assertThat(cartridgeResourceDTO.getDescription()).startsWith("MongoDB is a scalable, high-performance, "); assertThat(cartridgeResourceDTO.getDisplayName()).startsWith("MongoDB NoSQL Database "); assertThat(cartridgeResourceDTO.getMessages()).isNull(); // dito assertThat(cartridgeResourceDTO.getLinks()).hasSize(7); List<CartridgeResourceProperty> properties = cartridgeResourceDTO.getProperties().getAll(); assertThat(properties).onProperty("name").containsExactly( "username", "password", "database_name", "connection_url"); } /** * Should unmarshall get application response body. * * @throws Throwable */ @Test public void shouldUnmarshallGetApplicationWithAliasesResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_DOMAINS_FOOBARZ_APPLICATIONS_SPRINGEAP6_2ALIAS.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getDataType()).isEqualTo(EnumDataType.application); final ApplicationResourceDTO application = response.getData(); assertThat(application.getUuid()).hasSize(24); assertThat(application.getCreationTime()).startsWith("2013-"); assertThat(application.getDomainId()).isEqualTo("foobarz"); assertThat(application.getFramework()).isEqualTo(CartridgeTestUtils.JBOSSEAP_6_NAME); assertThat(application.getName()).isEqualTo("springeap6"); assertThat(application.getLinks()).hasSize(18); assertThat(application.getAliases()).contains("jbosstools.org", "redhat.com"); } /** * Should unmarshall get application response body. * * @throws Throwable */ @Test public void shouldUnmarshallAddApplicationEmbeddedCartridgeResponseBody() throws Throwable { // pre-conditions String content = Samples.POST_MYSQL_DOMAINS_FOOBARZ_APPLICATIONS_SPRINGEAP6_CARTRIDGES.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications Messages messages = response.getMessages(); assertThat(messages.size()).isEqualTo(3); Collection<Message> defaultMessages = messages.getBy(IField.DEFAULT); assertThat(defaultMessages).isNotEmpty(); new MessageAssert(defaultMessages.iterator().next()) .hasField(IField.DEFAULT) .hasExitCode(-1) .hasText("Added mysql-5.1 to application springeap6"); Collection<Message> resultMessages = messages.getBy(IField.RESULT); assertThat(resultMessages).isNotEmpty(); new MessageAssert(resultMessages.iterator().next()) .hasField(IField.RESULT) .hasExitCode(0) .hasText( "\nMySQL 5.1 database added. Please make note of these credentials:\n\n" + " Root User: adminnFC22YQ\n Root Password: U1IX8AIlrEcl\n Database Name: springeap6\n\n" + "Connection URL: mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/\n\n" + "You can manage your new MySQL database by also embedding phpmyadmin-3.4.\n" + "The phpmyadmin username and password will be the same as the MySQL credentials above.\n"); Collection<Message> appInfoMessages = messages.getBy(IField.APPINFO); assertThat(appInfoMessages).isNotEmpty(); new MessageAssert(appInfoMessages.iterator().next()) .hasField(IField.APPINFO) .hasExitCode(0) .hasText("Connection URL: mysql://127.13.125.1:3306/\n"); assertThat(response.getDataType()).isEqualTo(EnumDataType.cartridge); final CartridgeResourceDTO cartridge = response.getData(); assertThat(cartridge.getName()).isEqualTo(CartridgeTestUtils.MYSQL_51_NAME); assertThat(cartridge.getDisplayName()).isEqualTo("MySQL Database 5.1"); assertThat(cartridge.getDescription()).isEqualTo("MySQL is a multi-user, multi-threaded SQL database server."); assertThat(cartridge.getType()).isEqualTo(CartridgeType.EMBEDDED); assertThat(cartridge.getUrl()).isNull(); CartridgeResourceProperties properties = cartridge.getProperties(); assertThat(properties).isNotNull(); assertThat(properties.size()).isEqualTo(4); new ResourcePropertyAssert(properties.getAll().get(0)) .hasName("username") .hasDescription("Root user on mysql database") .hasType("cart_data") .hasValue("adminnFC22YQ"); new ResourcePropertyAssert(properties.getAll().get(1)) .hasName("password") .hasDescription("Password for root user on mysql database") .hasType("cart_data") .hasValue("U1IX8AIlrEcl"); new ResourcePropertyAssert(properties.getAll().get(2)) .hasName("database_name") .hasDescription("MySQL DB name") .hasType("cart_data") .hasValue("springeap6"); new ResourcePropertyAssert(properties.getAll().get(3)) .hasName("connection_url") .hasDescription("MySQL DB connection URL") .hasType("cart_data") .hasValue("mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/"); assertThat(cartridge.getLinks()).hasSize(7); } /** * Should unmarshall get application response body. * * @throws Throwable */ @Test public void shouldUnmarshallGetApplicationCartridgesWith1ElementResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_DOMAINS_FOOBARZ_APPLICATIONS_SPRINGEAP6_CARTRIDGES_2EMBEDDED.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getMessages().size()).isEqualTo(0); assertThat(response.getDataType()).isEqualTo(EnumDataType.cartridges); final Map<String, CartridgeResourceDTO> cartridges = response.getData(); assertThat(cartridges).hasSize(3); // mysql, mongo, jbosseap assertThat(cartridges.values()).onProperty("name").containsOnly( CartridgeTestUtils.MONGODB_22_NAME, CartridgeTestUtils.MYSQL_51_NAME, CartridgeTestUtils.JBOSSEAP_6_NAME); } @Test public void shouldUnmarshallGetApplicationCartridgesWith3ElementsResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_DOMAINS_FOOBARZ_APPLICATIONS_SPRINGEAP6_CARTRIDGES_2EMBEDDED.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications assertThat(response.getMessages().size()).isEqualTo(0); assertThat(response.getDataType()).isEqualTo(EnumDataType.cartridges); Map<String, CartridgeResourceDTO> cartridges = response.getData(); assertThat(cartridges).hasSize(3); assertThat(cartridges.values()).onProperty("name").containsOnly( CartridgeTestUtils.MONGODB_22_NAME, CartridgeTestUtils.MYSQL_51_NAME, CartridgeTestUtils.JBOSSEAP_6_NAME); } @Test public void shouldUnmarshallGetApplicationGearGroupsResponseBody() throws Throwable { // pre-conditions String content = Samples.GET_DOMAINS_FOOBARZ_APPLICATIONS_SPRINGEAP6_GEARGROUPS.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications Collection<GearGroupResourceDTO> gearGroups = response.getData(); assertThat(gearGroups.size()).isEqualTo(2); GearGroupResourceDTO gearGroup = gearGroups.iterator().next(); assertThat(gearGroup.getName()).isEqualTo("514207b84382ec1fef0000ab"); assertThat(gearGroup.getUuid()).isEqualTo("514207b84382ec1fef0000ab"); assertThat(gearGroup.getGears()).hasSize(2); final GearResourceDTO gear = gearGroup.getGears().iterator().next(); assertThat(gear.getUuid()).isEqualTo("514207b84382ec1fef000098"); assertThat(gear.getState()).isEqualTo("idle"); } @Test public void shouldUnmarshallSingleValidOptionInResponseBody() throws Throwable { // pre-conditions String content = Samples.POST_MYSQL_DOMAINS_FOOBARZ_APPLICATIONS_SPRINGEAP6_CARTRIDGES.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications final CartridgeResourceDTO cartridge = response.getData(); final Link link = cartridge.getLink("RESTART"); assertThat(link.getOptionalParams()).hasSize(0); assertThat(link.getRequiredParams().get(0).getValidOptions()).containsExactly("restart"); } @Test public void shouldUnmarshallMultipleValidOptionInResponseBody() throws Throwable { // pre-conditions String content = Samples.PUT_BBCC_DSA_USER_KEYS_SOMEKEY.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications final KeyResourceDTO key = response.getData(); final Link link = key.getLink("UPDATE"); assertThat(link.getOptionalParams()).hasSize(0); assertThat(link.getRequiredParams().get(0).getValidOptions()).contains("ssh-rsa", "ssh-dss"); } @Test public void shouldUnmarshallLinksUnknownLinkParameterType() throws Throwable { // pre-conditions String content = Samples.LINKS_UNKNOWN_LINKPARAMETERTYPE.getContentAsString(); assertNotNull(content); // operation RestResponse response = factory.get(content); // verifications final Map<String, Link> links = response.getData(); assertThat(links.size()).isEqualTo(1); final Link link = links.get("POST1"); assertThat(link).isNotNull(); assertThat(link.getHref()).isEqualTo("https://openshift.redhat.com/broker/rest/post1"); assertThat(link.getHttpMethod()).isEqualTo(HttpMethod.POST); assertThat(link.getOptionalParams().size()).isEqualTo(0); assertThat(link.getRequiredParams().size()).isEqualTo(1); LinkParameter linkParameter = link.getRequiredParams().get(0); assertThat(linkParameter).isNotNull(); assertThat(linkParameter.getName()).isEqualTo("post1Required1Name"); assertThat(linkParameter.getDescription()).isEqualTo("post1Required1Description"); assertThat(linkParameter.getType()).isNotNull().isEqualTo(new LinkParameterType("unknown")); } @Test public void shouldSkipLinksWithUnknownVerbsWithoutError() { String content = Samples.LINKS_UNKNOWN_VERB.getContentAsString(); assertNotNull(content); RestResponse response = factory.get(content); final Map<String, Link> links = response.getData(); assertThat(links.size()).isEqualTo(0); } }