/*
 * Copyright 2015 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
 *
 *      https://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.springframework.cloud.netflix.eureka;

import org.junit.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration.ConditionalOnRefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import static org.assertj.core.api.Assertions.assertThat;

/**
 * @author Dave Syer
 * @author Biju Kunjummen
 */
public class ConditionalOnRefreshScopeTests {

	@Test
	public void refreshScopeIncluded() {
		new ApplicationContextRunner()
			.withConfiguration(AutoConfigurations.of(RefreshAutoConfiguration.class))
			.withUserConfiguration(Beans.class).run(c -> {
			assertThat(c).hasSingleBean(
				org.springframework.cloud.context.scope.refresh.RefreshScope.class);
			assertThat(c.getBean("foo")).isEqualTo("foo");
		});
	}

	@Test
	public void refreshScopeIncludedAndPropertyDisabled() {
		new ApplicationContextRunner()
			.withConfiguration(AutoConfigurations.of(RefreshAutoConfiguration.class))
			.withPropertyValues("eureka.client.refresh.enable=false")
			.withUserConfiguration(Beans.class).run(c -> {
			assertThat(c).hasSingleBean(
				org.springframework.cloud.context.scope.refresh.RefreshScope.class);
			assertThat(c).doesNotHaveBean("foo");
		});
	}

	@Test
	public void refreshScopeNotIncluded() {
		new ApplicationContextRunner().withUserConfiguration(Beans.class).run(c -> {
			assertThat(c).doesNotHaveBean("foo");
		});
	}

	@Configuration
	protected static class Beans {
		@Bean
		@ConditionalOnRefreshScope
		public String foo() {
			return "foo";
		}
	}

}

@@ -902,16 +902,128 @@
 ration;%0A
+import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration.ConditionalOnMissingRefreshScope;%0A
 import o
@@ -1111,32 +1111,32 @@
 OnRefreshScope;%0A
-
 import org.sprin
@@ -1746,32 +1746,73 @@
 EqualTo(%22foo%22);%0A
+%09%09%09assertThat(c).doesNotHaveBean(%22bar%22);%0A
 %09%09%7D);%0A%09%7D%0A%0A%09@Test
@@ -2228,32 +2228,82 @@
 aveBean(%22foo%22);%0A
+%09%09%09assertThat(c.getBean(%22bar%22)).isEqualTo(%22bar%22);%0A
 %09%09%7D);%0A%09%7D%0A%0A%09@Test
@@ -2460,24 +2460,316 @@
 ean(%22foo%22);%0A
+%09%09%09assertThat(c.getBean(%22bar%22)).isEqualTo(%22bar%22);%0A%09%09%7D);%0A%0A%09%09new ApplicationContextRunner().withUserConfiguration(Beans.class)%0A%09%09%09.withPropertyValues(%22eureka.client.refresh.enable=false%22)%0A%09%09%09.run(c -%3E %7B%0A%09%09%09assertThat(c).doesNotHaveBean(%22foo%22);%0A%09%09%09assertThat(c.getBean(%22bar%22)).isEqualTo(%22bar%22);%0A
 %09%09%7D);%0A%09%7D%0A%0A%09@
@@ -2875,16 +2875,16 @@
 foo() %7B%0A
-
 %09%09%09retur
@@ -2895,15 +2895,105 @@
 oo%22;%0A%09%09%7D
+%0A%0A%09%09@Bean%0A%09%09@ConditionalOnMissingRefreshScope%0A%09%09public String bar() %7B%0A%09%09%09return %22bar%22;%0A%09%09%7D
 %0A%09%7D%0A%0A%7D%0A

Add more tests for @ConditionalOnRefreshScope