content: package com.konsol.beatstream.security;
  
  import static org.assertj.core.api.Assertions.assertThat;
  import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
  
  import com.konsol.beatstream.IntegrationTest;
  import com.konsol.beatstream.domain.User;
  import com.konsol.beatstream.repository.UserRepository;
  import com.konsol.beatstream.service.UserService;
  import java.util.Locale;
  import org.apache.commons.lang3.RandomStringUtils;
  import org.junit.jupiter.api.AfterEach;
  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.Qualifier;
  import org.springframework.security.core.userdetails.UserDetails;
  import org.springframework.security.core.userdetails.UserDetailsService;
  
  /**
   * Integrations tests for {@link DomainUserDetailsService}.
   */
  @IntegrationTest
  class DomainUserDetailsServiceIT {
  
      private static final String USER_ONE_LOGIN = "test-user-one";
      private static final String USER_ONE_EMAIL = "test-user-one@localhost";
      private static final String USER_TWO_LOGIN = "test-user-two";
      private static final String USER_TWO_EMAIL = "test-user-two@localhost";
      private static final String USER_THREE_LOGIN = "test-user-three";
      private static final String USER_THREE_EMAIL = "test-user-three@localhost";
  
      @Autowired
      private UserRepository userRepository;
  
      @Autowired
      private UserService userService;
  
      @Autowired
      @Qualifier("userDetailsService")
      private UserDetailsService domainUserDetailsService;
  
      public User getUserOne() {
          User userOne = new User();
          userOne.setLogin(USER_ONE_LOGIN);
          userOne.setPassword(RandomStringUtils.randomAlphanumeric(60));
          userOne.setActivated(true);
          userOne.setEmail(USER_ONE_EMAIL);
          userOne.setFirstName("userOne");
          userOne.setLastName("doe");
          userOne.setLangKey("en");
          return userOne;
      }
  
      public User getUserTwo() {
          User userTwo = new User();
          userTwo.setLogin(USER_TWO_LOGIN);
          userTwo.setPassword(RandomStringUtils.randomAlphanumeric(60));
          userTwo.setActivated(true);
          userTwo.setEmail(USER_TWO_EMAIL);
          userTwo.setFirstName("userTwo");
          userTwo.setLastName("doe");
          userTwo.setLangKey("en");
          return userTwo;
      }
  
      public User getUserThree() {
          User userThree = new User();
          userThree.setLogin(USER_THREE_LOGIN);
          userThree.setPassword(RandomStringUtils.randomAlphanumeric(60));
          userThree.setActivated(false);
          userThree.setEmail(USER_THREE_EMAIL);
          userThree.setFirstName("userThree");
          userThree.setLastName("doe");
          userThree.setLangKey("en");
          return userThree;
      }
  
      @BeforeEach
      public void init() {
          userRepository.save(getUserOne());
          userRepository.save(getUserTwo());
          userRepository.save(getUserThree());
      }
  
      @AfterEach
      public void cleanup() {
          userService.deleteUser(USER_ONE_LOGIN);
          userService.deleteUser(USER_TWO_LOGIN);
          userService.deleteUser(USER_THREE_LOGIN);
      }
  
      @Test
      void assertThatUserCanBeFoundByLogin() {
          UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN);
          assertThat(userDetails).isNotNull();
          assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN);
      }
  
      @Test
      void assertThatUserCanBeFoundByLoginIgnoreCase() {
          UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN.toUpperCase(Locale.ENGLISH));
          assertThat(userDetails).isNotNull();
          assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN);
      }
  
      @Test
      void assertThatUserCanBeFoundByEmail() {
          UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL);
          assertThat(userDetails).isNotNull();
          assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN);
      }
  
      @Test
      void assertThatUserCanBeFoundByEmailIgnoreCase() {
          UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL.toUpperCase(Locale.ENGLISH));
          assertThat(userDetails).isNotNull();
          assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN);
      }
  
      @Test
      void assertThatEmailIsPrioritizedOverLogin() {
          UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_EMAIL);
          assertThat(userDetails).isNotNull();
          assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN);
      }
  
      @Test
      void assertThatUserNotActivatedExceptionIsThrownForNotActivatedUsers() {
          assertThatExceptionOfType(UserNotActivatedException.class).isThrownBy(() ->
              domainUserDetailsService.loadUserByUsername(USER_THREE_LOGIN)
          );
      }
  }
  