From e20c10f0187e3e888a0ea47c92851cd2885112fe Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 18 Feb 2024 12:30:11 -0500 Subject: [PATCH] implementation for bael-7284 (#15636) * implementation * feedback --------- Co-authored-by: technoddy --- .../java/com/baeldung/findby/Account.java | 69 ++++++++++++ .../baeldung/findby/AccountApplication.java | 11 ++ .../baeldung/findby/AccountRepository.java | 18 +++ .../java/com/baeldung/findby/Permission.java | 24 ++++ .../baeldung/findby/PermissionRepository.java | 9 ++ .../findby/AccountRepositoryUnitTest.java | 105 ++++++++++++++++++ 6 files changed, 236 insertions(+) create mode 100644 persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/Account.java create mode 100644 persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/AccountApplication.java create mode 100644 persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/AccountRepository.java create mode 100644 persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/Permission.java create mode 100644 persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/PermissionRepository.java create mode 100644 persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/findby/AccountRepositoryUnitTest.java diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/Account.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/Account.java new file mode 100644 index 0000000000..e70e699303 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/Account.java @@ -0,0 +1,69 @@ +package com.baeldung.findby; + +import jakarta.persistence.*; + +import java.sql.Timestamp; + +@Entity +@Table(name = "ACCOUNTS") +public class Account { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "accounts_seq") + @SequenceGenerator(name = "accounts_seq", sequenceName = "accounts_seq", allocationSize = 1) + @Column(name = "user_id") + private int userId; + private String username; + private String password; + private String email; + private Timestamp createdOn; + private Timestamp lastLogin; + + @OneToOne + @JoinColumn(name = "permissions_id") + private Permission permission; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setEmail(String email) { + this.email = email; + } + + public Timestamp getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Timestamp createdOn) { + this.createdOn = createdOn; + } + + public void setLastLogin(Timestamp lastLogin) { + this.lastLogin = lastLogin; + } + + public Permission getPermission() { + return permission; + } + + public void setPermission(Permission permission) { + this.permission = permission; + } + + public String getEmail() { + return email; + } + + @Override + public String toString() { + return "Account{" + "userId=" + userId + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + ", createdOn=" + createdOn + ", lastLogin=" + lastLogin + ", permission=" + permission + '}'; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/AccountApplication.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/AccountApplication.java new file mode 100644 index 0000000000..45d0560529 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/AccountApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.findby; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AccountApplication { + public static void main(String[] args) { + SpringApplication.run(AccountApplication.class, args); + } +} diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/AccountRepository.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/AccountRepository.java new file mode 100644 index 0000000000..b6504bff3c --- /dev/null +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/AccountRepository.java @@ -0,0 +1,18 @@ +package com.baeldung.findby; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AccountRepository extends JpaRepository { + + Account findByEmail(String email); + + Account findByUsernameAndEmail(String username, String email); + + Account findByUsernameOrEmail(String username, String email); + + List findByUsernameInOrEmailIn(List usernames, List emails); +} diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/Permission.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/Permission.java new file mode 100644 index 0000000000..06c9d3d213 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/Permission.java @@ -0,0 +1,24 @@ +package com.baeldung.findby; + +import jakarta.persistence.*; + +@Entity +@Table(name = "PERMISSIONS") +public class Permission { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "permissions_id_sq") + @SequenceGenerator(name = "permissions_id_sq", sequenceName = "permissions_id_sq", allocationSize = 1) + private int id; + + private String type; + + public void setType(String type) { + this.type = type; + } + + @Override + public String toString() { + return "Permission{" + "id=" + id + ", type='" + type + '\'' + '}'; + } +} diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/PermissionRepository.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/PermissionRepository.java new file mode 100644 index 0000000000..294b81bd15 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/findby/PermissionRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.findby; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PermissionRepository extends JpaRepository { + Permission findByType(String type); +} \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/findby/AccountRepositoryUnitTest.java b/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/findby/AccountRepositoryUnitTest.java new file mode 100644 index 0000000000..ce0a7d8f3e --- /dev/null +++ b/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/findby/AccountRepositoryUnitTest.java @@ -0,0 +1,105 @@ +package com.baeldung.boot.findby; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.sql.Timestamp; +import java.time.Instant; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +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.boot.test.context.SpringBootTest; + +import com.baeldung.findby.Account; +import com.baeldung.findby.AccountApplication; +import com.baeldung.findby.AccountRepository; +import com.baeldung.findby.Permission; +import com.baeldung.findby.PermissionRepository; + +@SpringBootTest(classes = AccountApplication.class) +public class AccountRepositoryUnitTest { + + @Autowired + private AccountRepository accountRepository; + + @Autowired + private PermissionRepository permissionRepository; + + @BeforeEach + void setup() { + saveAccount(); + } + + @AfterEach + void tearDown() { + accountRepository.deleteAll(); + permissionRepository.deleteAll(); + } + + @Test + void givenAccountInDb_whenPerformFindByEmail_thenReturnsAccount() { + String email = "test@test.com"; + Account account = accountRepository.findByEmail(email); + assertThat(account.getEmail()).isEqualTo(email); + } + + @Test + void givenAccountInDb_whenPerformFindByUsernameAndEmail_thenReturnsAccount() { + String email = "test@test.com"; + String username = "user_admin"; + Account account = accountRepository.findByUsernameAndEmail(username, email); + assertThat(account.getUsername()).isEqualTo(username); + assertThat(account.getEmail()).isEqualTo(email); + } + + @Test + void givenAccountInDb_whenPerformFindByUsernameOrEmail_thenReturnsAccount() { + String email = "test@test.com"; + String username = "user_editor"; + Account account = accountRepository.findByUsernameOrEmail(username, email); + assertThat(account.getUsername()).isNotEqualTo(username); + assertThat(account.getEmail()).isEqualTo(email); + } + + @Test + void givenAccountInDb_whenPerformFindByUsernameInOrEmailIn_thenReturnsAccounts() { + List emails = Arrays.asList("test@test.com", "abc@abc.com", "pqr@pqr.com"); + List usernames = Arrays.asList("user_editor", "user_admin"); + List byUsernameInOrEmailIn = accountRepository.findByUsernameInOrEmailIn(usernames, emails); + assertThat(byUsernameInOrEmailIn.size()).isEqualTo(1); + assertThat(byUsernameInOrEmailIn.get(0) + .getEmail()).isEqualTo("test@test.com"); + } + + private Permission getPermissions() { + Permission editor = new Permission(); + editor.setType("editor"); + permissionRepository.save(editor); + return editor; + } + + private void saveAccount() { + List> sampleRecords = Arrays.asList( + Arrays.asList("test@test.com", "user_admin"), + Arrays.asList("test1@test.com", "user_admin_1"), + Arrays.asList("test2@test.com", "user_admin_2") + ); + + sampleRecords.forEach(sampleRecord -> { + Account account = new Account(); + account.setEmail(sampleRecord.get(0)); + account.setUsername(sampleRecord.get(1)); + account.setPermission(getPermissions()); + account.setPassword(UUID.randomUUID() + .toString()); + account.setCreatedOn(Timestamp.from(Instant.now())); + account.setLastLogin(Timestamp.from(Instant.now())); + accountRepository.save(account); + System.out.println(account.toString()); + }); + } +}