+ @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());
+ }