package test.org.infinispan.spring.starter.remote;

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

import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.spring.starter.remote.InfinispanRemoteAutoConfiguration;
import org.infinispan.spring.starter.remote.InfinispanRemoteCacheCustomizer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

@SpringBootTest(
      classes = {
            CustomConfigurationTest.TestConfiguration.class,
            InfinispanRemoteAutoConfiguration.class
      },
      properties = {
            "spring.main.banner-mode=off"
      }
)
public class CustomConfigurationTest {
   @Autowired
   private RemoteCacheManager manager;

   @Test
   public void testConfiguredClient() {
      assertThat(manager.getConfiguration().servers().get(0).port()).isEqualTo(6667);
      assertThat(manager.getConfiguration().tcpNoDelay()).isFalse();
      assertThat(manager.getConfiguration().tcpKeepAlive()).isFalse();
   }

   @Configuration
   static class TestConfiguration {
      @Bean
      public org.infinispan.client.hotrod.configuration.Configuration customConfiguration() {
         return new ConfigurationBuilder()
               .addServers("127.0.0.1:6667")
               .tcpNoDelay(false)
               .tcpKeepAlive(true)
               .build();
      }

      @Order(Ordered.HIGHEST_PRECEDENCE)
      @Bean
      public InfinispanRemoteCacheCustomizer customizer() {
         return b -> b.tcpKeepAlive(false);
      }
   }
}