/*
 * Copyright © 2017 the original authors (http://cereebro.io)
 *
 * 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 io.cereebro.snitch.actuate;

import java.net.URI;

import org.hamcrest.Matchers;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

import io.cereebro.snitch.CereebroSnitchAutoConfiguration;
import io.cereebro.snitch.actuate.SnitchEndpointConfigurationPropertiesDetectorTest.SnitchEndpointConfigurationPropertiesDetectorTestApplication;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SnitchEndpointConfigurationPropertiesDetectorTestApplication.class,
        CereebroSnitchAutoConfiguration.class }, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles("props-detector")
public class SnitchEndpointConfigurationPropertiesDetectorTest {

    @Value("http://localhost:${local.server.port}/cereebro/snitch")
    URI snitchURI;

    @Test
    public void testPropertiesRelationships() {
        // @formatter:off
        RestAssured
            .given()
            .when()
                .get(snitchURI)
            .then()
                .statusCode(200)
                .contentType(ContentType.JSON)
                .body("componentRelationships[0].component.name", Matchers.is("app-props-detector"))
                .body("componentRelationships[0].component.type", Matchers.is("properties/application"))
                .body("componentRelationships[0].dependencies", Matchers.hasSize(2)) // one for component from props, one for neo4j
                .body("componentRelationships[0].dependencies.find { it.component.name == 'dependency' }.component.type",
                        Matchers.is("properties/dependency"))
                .body("componentRelationships[0].dependencies.find { it.component.name == 'default' }.component.type",
                        Matchers.is("database/neo4j"))
                .body("componentRelationships[0].consumers[0].component.name", Matchers.is("consumer"))
                .body("componentRelationships[0].consumers[0].component.type", Matchers.is("properties/consumer"));
        // @formatter:on
    }

    @SpringBootApplication(exclude = { RabbitAutoConfiguration.class, MongoAutoConfiguration.class })
    static class SnitchEndpointConfigurationPropertiesDetectorTestApplication {

    }

}

@@ -961,32 +961,210 @@
 oConfiguration;%0A
+import org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration;%0Aimport org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration;%0A
 import org.sprin
@@ -2734,58 +2734,11 @@
 ize(
-2
+1
 ))
- // one for component from props, one for neo4j
 %0A   
@@ -2791,34 +2791,27 @@
 dependencies
-.find %7B it
+%5B0%5D
 .component.n
@@ -2817,67 +2817,10 @@
 name
- == 'dependency' %7D.component.type%22,%0A                       
+%22,
  Mat
@@ -2829,27 +2829,16 @@
 ers.is(%22
-properties/
 dependen
@@ -2908,18 +2908,11 @@
 cies
-.find %7B it
+%5B0%5D
 .com
@@ -2922,97 +2922,132 @@
 ent.
-name == 'default' %7D.component.type%22,%0A                        Matchers.is(%22database/neo4j%22
+type%22, Matchers.is(%22properties/dependency%22))%0A                .body(%22componentRelationships%5B0%5D.consumers%22, Matchers.hasSize(1
 ))%0A 
@@ -3297,16 +3297,16 @@
 %0A    %7D%0A%0A
-
     @Spr
@@ -3395,16 +3395,104 @@
 on.class
+,%0A            Neo4jDataAutoConfiguration.class, Neo4jRepositoriesAutoConfiguration.class
  %7D)%0A    

Exclude Neo4j auto config from properties test