content: package com.example.demo.config.timezone;
  
  import static java.lang.String.format;
  import static org.assertj.core.api.Assertions.assertThat;
  
  import com.example.demo.IntegrationTest;
  import com.example.demo.repository.timezone.DateTimeWrapper;
  import com.example.demo.repository.timezone.DateTimeWrapperRepository;
  import java.time.*;
  import java.time.format.DateTimeFormatter;
  import org.junit.jupiter.api.BeforeEach;
  import org.junit.jupiter.api.Test;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.annotation.Value;
  import org.springframework.jdbc.core.JdbcTemplate;
  import org.springframework.jdbc.support.rowset.SqlRowSet;
  import org.springframework.transaction.annotation.Transactional;
  
  /**
   * Integration tests for the ZoneId Hibernate configuration.
   */
  @IntegrationTest
  class HibernateTimeZoneIT {
  
      @Autowired
      private DateTimeWrapperRepository dateTimeWrapperRepository;
  
      @Autowired
      private JdbcTemplate jdbcTemplate;
  
      @Value("${spring.jpa.properties.hibernate.jdbc.time_zone:UTC}")
      private String zoneId;
  
      private DateTimeWrapper dateTimeWrapper;
      private DateTimeFormatter dateTimeFormatter;
      private DateTimeFormatter timeFormatter;
      private DateTimeFormatter dateFormatter;
  
      @BeforeEach
      public void setup() {
          dateTimeWrapper = new DateTimeWrapper();
          dateTimeWrapper.setInstant(Instant.parse("2014-11-12T05:50:00.0Z"));
          dateTimeWrapper.setLocalDateTime(LocalDateTime.parse("2014-11-12T07:50:00.0"));
          dateTimeWrapper.setOffsetDateTime(OffsetDateTime.parse("2011-12-14T08:30:00.0Z"));
          dateTimeWrapper.setZonedDateTime(ZonedDateTime.parse("2011-12-14T08:30:00.0Z"));
          dateTimeWrapper.setLocalTime(LocalTime.parse("14:30:00"));
          dateTimeWrapper.setOffsetTime(OffsetTime.parse("14:30:00+02:00"));
          dateTimeWrapper.setLocalDate(LocalDate.parse("2016-09-10"));
  
          dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S").withZone(ZoneId.of(zoneId));
  
          timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.of(zoneId));
  
          dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
      }
  
      @Test
      @Transactional
      void storeInstantWithZoneIdConfigShouldBeStoredOnGMTTimeZone() {
          dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
  
          String request = generateSqlRequest("instant", dateTimeWrapper.getId());
          SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
          String expectedValue = dateTimeFormatter.format(dateTimeWrapper.getInstant());
  
          assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
      }
  
      @Test
      @Transactional
      void storeLocalDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() {
          dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
  
          String request = generateSqlRequest("local_date_time", dateTimeWrapper.getId());
          SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
          String expectedValue = dateTimeWrapper.getLocalDateTime().atZone(ZoneId.systemDefault()).format(dateTimeFormatter);
  
          assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
      }
  
      @Test
      @Transactional
      void storeOffsetDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() {
          dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
  
          String request = generateSqlRequest("offset_date_time", dateTimeWrapper.getId());
          SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
          String expectedValue = dateTimeWrapper.getOffsetDateTime().format(dateTimeFormatter);
  
          assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
      }
  
      @Test
      @Transactional
      void storeZoneDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() {
          dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
  
          String request = generateSqlRequest("zoned_date_time", dateTimeWrapper.getId());
          SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
          String expectedValue = dateTimeWrapper.getZonedDateTime().format(dateTimeFormatter);
  
          assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
      }
  
      @Test
      @Transactional
      void storeLocalTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() {
          dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
  
          String request = generateSqlRequest("local_time", dateTimeWrapper.getId());
          SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
          String expectedValue = dateTimeWrapper
              .getLocalTime()
              .atDate(LocalDate.of(1970, Month.JANUARY, 1))
              .atZone(ZoneId.systemDefault())
              .format(timeFormatter);
  
          assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
      }
  
      @Test
      @Transactional
      void storeOffsetTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() {
          dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
  
          String request = generateSqlRequest("offset_time", dateTimeWrapper.getId());
          SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
          String expectedValue = dateTimeWrapper
              .getOffsetTime()
              .toLocalTime()
              .atDate(LocalDate.of(1970, Month.JANUARY, 1))
              .atZone(ZoneId.systemDefault())
              .format(timeFormatter);
  
          assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
      }
  
      @Test
      @Transactional
      void storeLocalDateWithZoneIdConfigShouldBeStoredWithoutTransformation() {
          dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper);
  
          String request = generateSqlRequest("local_date", dateTimeWrapper.getId());
          SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request);
          String expectedValue = dateTimeWrapper.getLocalDate().format(dateFormatter);
  
          assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue);
      }
  
      private String generateSqlRequest(String fieldName, long id) {
          return format("SELECT %s FROM jhi_date_time_wrapper where id=%d", fieldName, id);
      }
  
      private void assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(SqlRowSet sqlRowSet, String expectedValue) {
          while (sqlRowSet.next()) {
              String dbValue = sqlRowSet.getString(1);
  
              assertThat(dbValue).isNotNull();
              assertThat(dbValue).isEqualTo(expectedValue);
          }
      }
  }
  