Refactor tests for TopicResource class 90/88290/1
authorTomek Kaminski <tomasz.kaminski@nokia.com>
Wed, 22 May 2019 17:35:27 +0000 (19:35 +0200)
committerTomek Kaminski <tomasz.kaminski@nokia.com>
Wed, 22 May 2019 17:35:27 +0000 (19:35 +0200)
Change-Id: Iff89df7e1b43ec13b200282a2d74882d95c3d84e
Issue-ID: DMAAP-1209
Signed-off-by: Tomek Kaminski <tomasz.kaminski@nokia.com>
src/main/java/org/onap/dmaap/dbcapi/model/Topic.java
src/main/java/org/onap/dmaap/dbcapi/resources/TopicResource.java
src/test/java/org/onap/dmaap/dbcapi/resources/TopicResourceTest.java

index cffe448..b715a24 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.dmaap.dbcapi.model;
 
+import com.google.common.base.Objects;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Date;
@@ -330,4 +331,25 @@ public class Topic extends DmaapObject  {
        public byte[] getBytes() {
                return toProvJSON().getBytes(StandardCharsets.UTF_8);
        }
+
+
+       @Override
+       public boolean equals(Object o) {
+               if (this == o) {
+                       return true;
+               }
+               if (o == null || getClass() != o.getClass()) {
+                       return false;
+               }
+               Topic topic = (Topic) o;
+               return Objects.equal(fqtn, topic.fqtn) &&
+                       Objects.equal(topicName, topic.topicName) &&
+                       Objects.equal(tnxEnabled, topic.tnxEnabled) &&
+                       Objects.equal(owner, topic.owner);
+       }
+
+       @Override
+       public int hashCode() {
+               return Objects.hashCode(fqtn, topicName, tnxEnabled, owner);
+       }
 }
index 3206cf7..01926b7 100644 (file)
@@ -63,6 +63,7 @@ public class TopicResource extends BaseLoggingClass {
        private TopicService mr_topicService = new TopicService();
        private ResponseBuilder responseBuilder = new ResponseBuilder();
        private RequiredChecker checker = new RequiredChecker();
+       static final String UNSUPPORTED_PUT_MSG = "Method /PUT not supported for /topics";
        
        public TopicResource() {
                DmaapConfig p = (DmaapConfig)DmaapConfig.getConfig();
@@ -157,7 +158,7 @@ public class TopicResource extends BaseLoggingClass {
                ApiError apiError = new ApiError();
 
                apiError.setCode(Status.BAD_REQUEST.getStatusCode());
-               apiError.setMessage( "Method /PUT not supported for /topics");
+               apiError.setMessage(UNSUPPORTED_PUT_MSG);
                
                return responseBuilder.error(apiError);
        }
index 04c1bda..5b7c46d 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * org.onap.dmaap
  * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019 Nokia Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  */
 package org.onap.dmaap.dbcapi.resources;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 
+import java.util.List;
 import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.Application;
+import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.eclipse.jetty.http.HttpStatus;
 import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onap.dmaap.dbcapi.database.DatabaseClass;
+import org.onap.dmaap.dbcapi.model.ApiError;
 import org.onap.dmaap.dbcapi.model.DcaeLocation;
-import org.onap.dmaap.dbcapi.model.Dmaap;
+import org.onap.dmaap.dbcapi.model.DmaapObject.DmaapObject_Status;
+import org.onap.dmaap.dbcapi.model.FqtnType;
 import org.onap.dmaap.dbcapi.model.MR_Cluster;
+import org.onap.dmaap.dbcapi.model.ReplicationType;
 import org.onap.dmaap.dbcapi.model.Topic;
 import org.onap.dmaap.dbcapi.testframework.DmaapObjectFactory;
 
+public class TopicResourceTest {
 
-public class TopicResourceTest extends JerseyTest {
-
-       static DmaapObjectFactory factory = new DmaapObjectFactory();
-
-       @Override
-       protected Application configure() {
-
-               return new ResourceConfig()
-                               .register( TopicResource.class )
-                               .register( MR_ClusterResource.class )
-                               .register( DcaeLocationResource.class )
-                               .register( DmaapResource.class );
-       }
-
-       private static final String  fmt = "%24s: %s%n";
-
-       private boolean is2xx(int val ) {
-               if ( val >= 200 && val < 300 ) {
-                       return true;
-               }
-               return false;
-       }
-
-       @Before
-       public void preTest() throws Exception {
-               DatabaseClass.clearDatabase();
-               try {
-
-                       Dmaap dmaap = factory.genDmaap();
-                       Entity<Dmaap> reqEntity = Entity.entity( dmaap, MediaType.APPLICATION_JSON );
-                       Response resp = target( "dmaap").request().post( reqEntity, Response.class );
-                       System.out.println( "POST dmaap resp=" + resp.getStatus() );
-                       assertTrue( is2xx( resp.getStatus()) );
-               
-               }catch (Exception e ) {
-               }
-               try {
-                       DcaeLocation loc = factory.genDcaeLocation( "central" );
-                       Entity<DcaeLocation> reqEntity = Entity.entity( loc, MediaType.APPLICATION_JSON );
-                       Response resp = target( "dcaeLocations").request().post( reqEntity, Response.class );
-                       System.out.println( "POST dcaeLocation resp=" + resp.getStatus() + " " + resp.readEntity( String.class ));
-                       if ( resp.getStatus() != 409 ) {
-                               assertTrue( is2xx( resp.getStatus())  );
-                       }
-               } catch (Exception e ) {
-               }
-               try {
-                       MR_Cluster cluster = factory.genMR_Cluster( "central" );
-                       Entity<MR_Cluster> reqEntity = Entity.entity( cluster, MediaType.APPLICATION_JSON );
-                       Response resp = target( "mr_clusters").request().post( reqEntity, Response.class );
-                       System.out.println( "POST MR_Cluster resp=" + resp.getStatus() + " " + resp.readEntity( String.class ) );
-                       if (resp.getStatus() != 409 ) {
-                               assertTrue( is2xx( resp.getStatus()) );
-                       }       
-               } catch (Exception e ) {
-                       
-               }
-
-       }
-       /*  may conflict with test framework! 
-       @After
-       public void tearDown() throws Exception {
-       }
-*/
-
-
-       @Test
-       public void GetTest() {
-               Response resp = target( "topics").request().get( Response.class );
-               System.out.println( "GET feed resp=" + resp.getStatus() );
-
-               assertTrue( resp.getStatus() == 200 );
-       }
-       
-
-       @Test
-       public void PostTest() {
-               Topic topic = factory.genSimpleTopic( "test1" );
-               Entity<Topic> reqEntity = Entity.entity( topic, MediaType.APPLICATION_JSON );
-               Response resp = target( "topics").request().post( reqEntity, Response.class );
-               System.out.println( "POST Topic resp=" + resp.getStatus() + " " + resp.readEntity( String.class ) );
-               if (resp.getStatus() != 409 ) {
-                       assertTrue( resp.getStatus() == 201);
-               }
-               resp = target( "topics").
-                               path( topic.genFqtn() ).request().get( Response.class );
-               System.out.println( "GET Topic resp=" + resp.getStatus() + " " + resp.readEntity( String.class ) );
-       
-               assertTrue( resp.getStatus() == 200 );
-               
-       }
-
-
-       @Test
-       public void PutTest() {
-
-               Topic topic = factory.genSimpleTopic( "test2" );
-               Entity<Topic> reqEntity = Entity.entity( topic, MediaType.APPLICATION_JSON );
-               Response resp = target( "topics").request().post( reqEntity, Response.class );
-               String json = resp.readEntity(String.class);
-               System.out.println( "POST Topic resp=" + resp.getStatus() + " " + json );
-               if (resp.getStatus() != 409 ) {
-                       assertTrue( resp.getStatus() == 201);
-               }
-
-               
-               // now change a field
-               topic.setOwner( "newbody" );
-               reqEntity = Entity.entity( topic, MediaType.APPLICATION_JSON );
-
-               // update with incorrect key
-               resp = target( "topics")
-                                       .path( "org.onap.dmaap.notATopic" )
-                                       .request()
-                                       .put( reqEntity, Response.class );
-               
-               System.out.println( "PUT Topic resp=" + resp.getStatus() + " expect 400" );
-               assertTrue( resp.getStatus() == 400 );
-
-               // update with correct key
-               topic = new Topic( json );
-               reqEntity = Entity.entity( topic, MediaType.APPLICATION_JSON );
-               resp = target( "topics")
-                                       .path( topic.getFqtn())
-                                       .request()
-                                       .put( reqEntity, Response.class );
-               System.out.println( "PUT Topic resp=" + resp.getStatus() + " " + resp.readEntity(String.class));
-               assertTrue( resp.getStatus() == 400 );  // PUT is not allowed even with the right key
-       }
-
-       @Test
-       public void DelTest() {
-
-               Topic topic = factory.genSimpleTopic( "test3" );
-               topic.setFqtn( "org.onap.unittest.test3" );
-               
-               Response resp = target( "topics").
-                               path( topic.getFqtn() ).
-                               request().
-                               delete( Response.class );
-
-               // confirm topic is not there 
-               System.out.println( "DELETE Topic resp=" + resp.getStatus() + " " + resp.readEntity( String.class ) );
-               assertTrue( resp.getStatus() == 404 );
-               
-               // now, add it
-               Entity<Topic> reqEntity = Entity.entity( topic, MediaType.APPLICATION_JSON );
-               resp = target( "topics").request().post( reqEntity, Response.class );
-               String json = resp.readEntity( String.class );
-               System.out.println( "POST Topic resp=" + resp.getStatus() + " " + json );
-               assertTrue( resp.getStatus() == 201 );
-               
-               topic = new Topic( json );
-               // now really delete it 
-                resp = target( "topics").
-                               path( topic.getFqtn()).
-                               request().
-                               delete( Response.class );
-               System.out.println( "DELETE Topic resp=" + resp.getStatus() + " " + resp.readEntity( String.class ) );
-               assertTrue( resp.getStatus() == 204 );
-
-       }
+    private static final DmaapObjectFactory DMAAP_OBJECT_FACTORY = new DmaapObjectFactory();
+    private static final String TOPICS_TARGET = "topics";
 
+    private static FastJerseyTestContainer testContainer;
 
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+        //TODO: init is still needed here to assure that dmaap is not null
+        DatabaseClass.getDmaap().init(DMAAP_OBJECT_FACTORY.genDmaap());
+
+        testContainer = new FastJerseyTestContainer(new ResourceConfig()
+            .register(TopicResource.class));
+        testContainer.init();
+    }
+
+    @AfterClass
+    public static void tearDownClass() throws Exception {
+        testContainer.destroy();
+    }
+
+    @Before
+    public void setUpClusterAndLocation() {
+        DatabaseClass.clearDatabase();
+
+        DcaeLocation centralDcaeLoc = DMAAP_OBJECT_FACTORY.genDcaeLocation("central");
+        centralDcaeLoc.setStatus(DmaapObject_Status.VALID);
+        DatabaseClass.getDcaeLocations().put(centralDcaeLoc.getDcaeLocationName(), centralDcaeLoc);
+
+        MR_Cluster cluster = DMAAP_OBJECT_FACTORY.genMR_Cluster("central");
+        cluster.setStatus(DmaapObject_Status.VALID);
+        DatabaseClass.getMr_clusters().put(cluster.getDcaeLocationName(), cluster);
+    }
+
+    @Test
+    public void getTopics_shouldReturnEmptyList_whenNoTopicsInDataBase() {
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().get(Response.class);
+
+        //then
+        assertEquals(HttpStatus.OK_200, resp.getStatus());
+        assertTrue(resp.hasEntity());
+
+        List<Topic> topics = resp.readEntity(new GenericType<List<Topic>>() {
+        });
+        assertTrue(topics.isEmpty());
+    }
+
+    @Test
+    public void getTopics_shouldReturnTopicsRegisteredInDataBase() {
+        //given
+        Topic topic1 = DMAAP_OBJECT_FACTORY.genSimpleTopic("testTopic1");
+        Topic topic2 = DMAAP_OBJECT_FACTORY.genSimpleTopic("testTopic2");
+        DatabaseClass.getTopics().put(topic1.getFqtn(), topic1);
+        DatabaseClass.getTopics().put(topic2.getFqtn(), topic2);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().get(Response.class);
+
+        //then
+        assertEquals(HttpStatus.OK_200, resp.getStatus());
+        assertTrue(resp.hasEntity());
+
+        List<Topic> topics = resp.readEntity(new GenericType<List<Topic>>() {
+        });
+        assertEquals(2, topics.size());
+        assertTrue(topics.contains(topic1));
+        assertTrue(topics.contains(topic2));
+    }
+
+    @Test
+    public void getTopics_shouldReturnValidationError_whenTopicNameIsInvalid() {
+        //given
+        String topicName = "wrong Topic Name";
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).path(topicName).request().get(Response.class);
+
+        //then
+        assertEquals(HttpStatus.BAD_REQUEST_400, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals("topicName", errorObj.getFields());
+    }
+
+    @Test
+    public void getTopic_shouldReturnError_whenRequestedTopicNotFound() {
+        //given
+        String topicName = "notExistingTopic";
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).path(topicName).request().get(Response.class);
+
+        //then
+        assertEquals(HttpStatus.NOT_FOUND_404, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals("fqtn", errorObj.getFields());
+    }
+
+    @Test
+    public void getTopic_shouldReturnTopicInformation_whenRequestedTopicExists() {
+        //given
+        Topic topic1 = DMAAP_OBJECT_FACTORY.genSimpleTopic("testTopic1");
+        DatabaseClass.getTopics().put(topic1.getFqtn(), topic1);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).path(topic1.getFqtn()).request().get(Response.class);
+
+        //then
+        assertEquals(HttpStatus.OK_200, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        Topic retrievedTopic = resp.readEntity(Topic.class);
+        assertEquals(topic1, retrievedTopic);
+    }
+
+
+    @Test
+    public void deleteTopic_shouldReturnError_whenTopicNotFound() {
+        //given
+        String topicName = "notExisting";
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).path(topicName).request().delete(Response.class);
+
+        //then
+        assertEquals(HttpStatus.NOT_FOUND_404, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals("fqtn", errorObj.getFields());
+    }
+
+    @Test
+    public void deleteTopic_shouldDeleteTopicFromDataBase_whenFound() {
+        //given
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("testTopic");
+        DatabaseClass.getTopics().put(topic.getFqtn(), topic);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).path(topic.getFqtn()).request().delete(Response.class);
+
+        //then
+        assertEquals(HttpStatus.NO_CONTENT_204, resp.getStatus());
+        assertFalse(resp.hasEntity());
+    }
+
+    @Test
+    public void addTopic_shouldReturnValidationError_whenTopicNameIsInvalid() {
+        //given
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("wrong topic name with spaces");
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().post(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.BAD_REQUEST_400, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals("topicName", errorObj.getFields());
+    }
+
+    @Test
+    public void addTopic_shouldReturnValidationError_whenTopicDescriptionNotProvided() {
+        //given
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("topicName");
+        topic.setTopicDescription(null);
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().post(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.BAD_REQUEST_400, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals("topicDescription", errorObj.getFields());
+    }
+
+    @Test
+    public void addTopic_shouldReturnValidationError_whenTopicOwnerNotProvided() {
+        //given
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("topicName");
+        topic.setOwner(null);
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().post(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.BAD_REQUEST_400, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals("owner", errorObj.getFields());
+    }
+
+    @Test
+    public void addTopic_shouldReturnError_whenTopicAlreadyExist() {
+        //given
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("topicName");
+        DatabaseClass.getTopics().put(topic.getFqtn(), topic);
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().post(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.CONFLICT_409, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals("fqtn", errorObj.getFields());
+    }
+
+    @Test
+    public void addTopic_shouldReturnExistingTopic_whenTopicAlreadyExist_andUseExistingQueryParamUsed() {
+        //given
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("topicName");
+        DatabaseClass.getTopics().put(topic.getFqtn(), topic);
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).queryParam("useExisting", true).request()
+            .post(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.CREATED_201, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        assertEquals(topic, resp.readEntity(Topic.class));
+    }
+
+    @Test
+    public void addTopic_shouldReturnError_whenAddingTopicWithInvalidGlobalMRclusterHostname() {
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("topicName");
+        topic.setReplicationCase(ReplicationType.REPLICATION_CENTRAL_TO_GLOBAL);
+        topic.setGlobalMrURL("some.invalid.Glob$al.M@R.ur)l");
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().post(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR_500, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals("globalMrURL", errorObj.getFields());
+    }
+
+    @Test
+    public void addTopic_shouldAddTopicWithDefaultOptionalValues_whenNotProvided() {
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("topicName");
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().post(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.CREATED_201, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        Topic createdTopic = resp.readEntity(Topic.class);
+        assertEquals(topic, createdTopic);
+        assertEquals(FqtnType.FQTN_LEGACY_FORMAT, createdTopic.getFqtnStyle());
+        assertEquals("2", createdTopic.getPartitionCount());
+        assertEquals("1", createdTopic.getReplicationCount());
+    }
+
+    @Test
+    public void addTopic_shouldAddTopicWithOriginalOptionalValues_whenProvided() {
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("topicName");
+        topic.setFqtnStyle(FqtnType.FQTN_PROJECTID_FORMAT);
+        topic.setFqtn(topic.genFqtn());
+        topic.setPartitionCount("6");
+        topic.setReplicationCount("9");
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).request().post(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.CREATED_201, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        Topic createdTopic = resp.readEntity(Topic.class);
+        assertEquals(topic, createdTopic);
+        assertEquals(FqtnType.FQTN_PROJECTID_FORMAT, createdTopic.getFqtnStyle());
+        assertEquals("6", createdTopic.getPartitionCount());
+        assertEquals("9", createdTopic.getReplicationCount());
+    }
+
+    @Test
+    public void updateTopic_shouldReturnError_withInformationThatItIsNotSupported() {
+        //given
+        Topic topic = DMAAP_OBJECT_FACTORY.genSimpleTopic("topicName");
+        DatabaseClass.getTopics().put(topic.getFqtn(), topic);
+        topic.setOwner("newOwner");
+        Entity<Topic> requestedEntity = Entity.entity(topic, MediaType.APPLICATION_JSON);
+
+        //when
+        Response resp = testContainer.target(TOPICS_TARGET).path(topic.getFqtn()).request()
+            .put(requestedEntity, Response.class);
+
+        //then
+        assertEquals(HttpStatus.BAD_REQUEST_400, resp.getStatus());
+        assertTrue(resp.hasEntity());
+        ApiError errorObj = resp.readEntity(ApiError.class);
+        assertEquals(TopicResource.UNSUPPORTED_PUT_MSG, errorObj.getMessage());
+    }
 
 }