package com.codenotfound.kafka;

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

import java.util.concurrent.TimeUnit;

import org.junit.ClassRule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.listener.KafkaMessageListenerContainer;
import org.springframework.kafka.listener.config.ContainerProperties;
import org.springframework.kafka.test.rule.KafkaEmbedded;

import com.codenotfound.kafka.consumer.Receiver;
import com.codenotfound.kafka.consumer.ReceiverConfig;
import com.codenotfound.kafka.producer.SenderConfig;

public class SpringKafkaMainTest {

  private static final Logger LOGGER =
      LoggerFactory.getLogger(SpringKafkaMainTest.class);

  private final static String JAVA_TOPIC = "topic1";

  @ClassRule
  public static KafkaEmbedded embeddedKafka =
      new KafkaEmbedded(1, true, JAVA_TOPIC);

  @Test
  public void testReceive() throws Exception {
    String bootstrapServers = embeddedKafka.getBrokersAsString();
    LOGGER.info("bootstrapServers='{}'", bootstrapServers);

    ContainerProperties containerProperties =
        new ContainerProperties(JAVA_TOPIC);
    Receiver receiver = new Receiver();

    KafkaMessageListenerContainer<String, String> messageListenerContainer =
        ReceiverConfig.createMessageListenerContainer(
            containerProperties, bootstrapServers);
    messageListenerContainer.setupMessageListener(receiver);
    messageListenerContainer.start();

    // wait a bit for the container to start
    Thread.sleep(1000);

    KafkaTemplate<String, String> kafkaTemplate =
        SenderConfig.createKafkaTemplate(bootstrapServers);
    kafkaTemplate.send(JAVA_TOPIC, "Hello Java!");

    receiver.getLatch().await(10000, TimeUnit.MILLISECONDS);
    assertThat(receiver.getLatch().getCount()).isEqualTo(0);

    messageListenerContainer.stop();
  }
}