diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomFormLoginServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomFormLoginServiceImpl.java index e5cb633980..39f7fbe4aa 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomFormLoginServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomFormLoginServiceImpl.java @@ -33,6 +33,7 @@ public class CustomFormLoginServiceImpl implements ReactiveUserDetailsService { @Override public Mono findByUsername(String username) { return repository.findByEmail(username) + .switchIfEmpty(repository.findByCaseInsensitiveEmail(username)) .switchIfEmpty(Mono.error(new UsernameNotFoundException("Unable to find username: " + username))) .onErrorMap(error -> { log.error("Can't find user {}", username); diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/authentication/handlers/CustomFormLoginServiceImplUnitTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/authentication/handlers/CustomFormLoginServiceImplUnitTest.java new file mode 100644 index 0000000000..5a108ea2cb --- /dev/null +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/authentication/handlers/CustomFormLoginServiceImplUnitTest.java @@ -0,0 +1,57 @@ +package com.appsmith.server.authentication.handlers; + +import com.appsmith.server.domains.User; +import com.appsmith.server.repositories.UserRepository; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringJUnit4ClassRunner.class) +public class CustomFormLoginServiceImplUnitTest { + @MockBean + private UserRepository repository; + + private ReactiveUserDetailsService reactiveUserDetailsService; + + @Before + public void setUp() { + reactiveUserDetailsService = new CustomFormLoginServiceImpl(repository); + } + + @Test + public void findByUsername_WhenUserNameNotFound_ThrowsException() { + String sampleEmail = "sample-email@example.com"; + Mockito.when(repository.findByEmail(sampleEmail)).thenReturn(Mono.empty()); + Mockito.when(repository.findByCaseInsensitiveEmail(sampleEmail)).thenReturn(Mono.empty()); + + StepVerifier.create(reactiveUserDetailsService.findByUsername(sampleEmail)) + .expectError(UsernameNotFoundException.class) + .verify(); + } + + @Test + public void findByUsername_WhenUserNameExistsWithOtherCase_ReturnsUser() { + String sampleEmail2 = "sampleEmail@example.com"; + User user = new User(); + user.setPassword("1234"); + user.setEmail(sampleEmail2.toLowerCase()); + + Mockito.when(repository.findByEmail(sampleEmail2)).thenReturn(Mono.empty()); + Mockito.when(repository.findByCaseInsensitiveEmail(sampleEmail2)).thenReturn(Mono.just(user)); + + StepVerifier.create(reactiveUserDetailsService.findByUsername(sampleEmail2)) + .assertNext(userDetails -> { + assertThat(userDetails.getUsername()).isEqualTo(sampleEmail2.toLowerCase()); + assertThat(userDetails.getPassword()).isEqualTo("1234"); + }) + .verifyComplete(); + } +} \ No newline at end of file