From 3c51b761e00602d761fe730e92113b046ef6bfb0 Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Mon, 16 Feb 2026 00:56:28 +0530 Subject: [PATCH 1/4] Add RequestRepository integration tests with H2 in-memory database --- .../Repositories/RequestRepositoryTest.java | 179 ++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 src/test/java/com/hithomelabs/CFTunnels/Repositories/RequestRepositoryTest.java diff --git a/src/test/java/com/hithomelabs/CFTunnels/Repositories/RequestRepositoryTest.java b/src/test/java/com/hithomelabs/CFTunnels/Repositories/RequestRepositoryTest.java new file mode 100644 index 0000000..257c315 --- /dev/null +++ b/src/test/java/com/hithomelabs/CFTunnels/Repositories/RequestRepositoryTest.java @@ -0,0 +1,179 @@ +package com.hithomelabs.CFTunnels.Repositories; + +import com.hithomelabs.CFTunnels.Entity.Mapping; +import com.hithomelabs.CFTunnels.Entity.Protocol; +import com.hithomelabs.CFTunnels.Entity.Request; +import com.hithomelabs.CFTunnels.Entity.Tunnel; +import com.hithomelabs.CFTunnels.Entity.User; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.TestPropertySource; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@TestPropertySource(properties = { + "spring.jpa.hibernate.ddl-auto=create-drop", + "spring.jpa.show-sql=false", + "spring.sql.init.mode=never" +}) +class RequestRepositoryTest { + + @Autowired + private RequestRepository requestRepository; + + @Autowired + private TunnelRepository tunnelRepository; + + @Autowired + private MappingRepository mappingRepository; + + @Autowired + private UserRepository userRepository; + + private Tunnel tunnel; + private User createdByUser; + private User acceptedByUser; + private Mapping mapping; + + @BeforeEach + void setUp() { + tunnel = new Tunnel(); + tunnel.setId(UUID.randomUUID()); + tunnel.setEnvironment("test"); + tunnel.setName("test-tunnel"); + tunnel = tunnelRepository.save(tunnel); + + createdByUser = new User(); + createdByUser.setEmail("creator@example.com"); + createdByUser.setName("Creator User"); + createdByUser = userRepository.save(createdByUser); + + acceptedByUser = new User(); + acceptedByUser.setEmail("approver@example.com"); + acceptedByUser.setName("Approver User"); + acceptedByUser = userRepository.save(acceptedByUser); + + mapping = new Mapping(); + mapping.setTunnel(tunnel); + mapping.setPort(8080); + mapping.setProtocol(Protocol.HTTP); + mapping.setSubdomain("test-subdomain"); + mapping = mappingRepository.save(mapping); + } + + @Test + @DisplayName("findAllWithDetails should return requests with all relationships loaded") + void findAllWithDetails_ShouldReturnRequestsWithAllRelationships() { + Request request = new Request(); + request.setMapping(mapping); + request.setCreatedBy(createdByUser); + request.setAcceptedBy(acceptedByUser); + request.setStatus(Request.RequestStatus.PENDING); + requestRepository.save(request); + + List results = requestRepository.findAllWithDetails(); + + assertThat(results).hasSize(1); + Request result = results.get(0); + assertThat(result.getMapping()).isNotNull(); + assertThat(result.getMapping().getTunnel()).isNotNull(); + assertThat(result.getCreatedBy()).isNotNull(); + assertThat(result.getAcceptedBy()).isNotNull(); + } + + @Test + @DisplayName("findByIdWithDetails should return request with all relationships loaded") + void findByIdWithDetails_ShouldReturnRequestWithAllRelationships() { + Request request = new Request(); + request.setMapping(mapping); + request.setCreatedBy(createdByUser); + request.setAcceptedBy(acceptedByUser); + request.setStatus(Request.RequestStatus.PENDING); + UUID requestId = requestRepository.save(request).getId(); + + Optional result = requestRepository.findByIdWithDetails(requestId); + + assertThat(result).isPresent(); + assertThat(result.get().getMapping()).isNotNull(); + assertThat(result.get().getMapping().getTunnel()).isNotNull(); + assertThat(result.get().getCreatedBy()).isNotNull(); + assertThat(result.get().getAcceptedBy()).isNotNull(); + } + + @Test + @DisplayName("findByIdWithDetails should return empty for non-existent id") + void findByIdWithDetails_ShouldReturnEmptyForNonExistentId() { + Optional result = requestRepository.findByIdWithDetails(UUID.randomUUID()); + + assertThat(result).isEmpty(); + } + + @Test + @DisplayName("findAllWithDetails should return empty list when no requests exist") + void findAllWithDetails_ShouldReturnEmptyListWhenNoRequests() { + List results = requestRepository.findAllWithDetails(); + + assertThat(results).isEmpty(); + } + + @Test + @DisplayName("findAllWithDetails should handle multiple requests with different statuses") + void findAllWithDetails_ShouldHandleMultipleRequests() { + Mapping mapping1 = new Mapping(); + mapping1.setTunnel(tunnel); + mapping1.setPort(8080); + mapping1.setProtocol(Protocol.HTTP); + mapping1.setSubdomain("pending-subdomain"); + mapping1 = mappingRepository.save(mapping1); + + Mapping mapping2 = new Mapping(); + mapping2.setTunnel(tunnel); + mapping2.setPort(8081); + mapping2.setProtocol(Protocol.HTTP); + mapping2.setSubdomain("approved-subdomain"); + mapping2 = mappingRepository.save(mapping2); + + Mapping mapping3 = new Mapping(); + mapping3.setTunnel(tunnel); + mapping3.setPort(8082); + mapping3.setProtocol(Protocol.HTTP); + mapping3.setSubdomain("rejected-subdomain"); + mapping3 = mappingRepository.save(mapping3); + + Request pendingRequest = new Request(); + pendingRequest.setMapping(mapping1); + pendingRequest.setCreatedBy(createdByUser); + pendingRequest.setStatus(Request.RequestStatus.PENDING); + requestRepository.save(pendingRequest); + + Request approvedRequest = new Request(); + approvedRequest.setMapping(mapping2); + approvedRequest.setCreatedBy(createdByUser); + approvedRequest.setAcceptedBy(acceptedByUser); + approvedRequest.setStatus(Request.RequestStatus.APPROVED); + requestRepository.save(approvedRequest); + + Request rejectedRequest = new Request(); + rejectedRequest.setMapping(mapping3); + rejectedRequest.setCreatedBy(createdByUser); + rejectedRequest.setAcceptedBy(acceptedByUser); + rejectedRequest.setStatus(Request.RequestStatus.REJECTED); + requestRepository.save(rejectedRequest); + + List results = requestRepository.findAllWithDetails(); + + assertThat(results).hasSize(3); + } +} -- 2.45.2 From 3fcea268a985d6b24fd114f21e63da96ef51c3d6 Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Mon, 16 Feb 2026 01:10:31 +0530 Subject: [PATCH 2/4] Update JPA config to use update mode and disable SQL init --- src/main/resources/application-local.properties | 1 + src/main/resources/application-prod.properties | 3 ++- src/main/resources/application-test.properties | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 60ec5d5..0bdba38 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -9,4 +9,5 @@ debug=true spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true +spring.sql.init.mode=never spring.datasource.url=jdbc:postgresql://localhost:5432/cftunnel diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index cb15c36..09de097 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -9,4 +9,5 @@ spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=false -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.sql.init.mode=never \ No newline at end of file diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index b257503..4d768ec 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -10,3 +10,4 @@ spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.sql.init.mode=never -- 2.45.2 From 5823d2b6a0d5832d091eea967ab7714e75b3f6d6 Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Mon, 16 Feb 2026 01:11:20 +0530 Subject: [PATCH 3/4] Revert "Update JPA config to use update mode and disable SQL init" This reverts commit 3fcea268a985d6b24fd114f21e63da96ef51c3d6. --- src/main/resources/application-local.properties | 1 - src/main/resources/application-prod.properties | 3 +-- src/main/resources/application-test.properties | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 0bdba38..60ec5d5 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -9,5 +9,4 @@ debug=true spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true -spring.sql.init.mode=never spring.datasource.url=jdbc:postgresql://localhost:5432/cftunnel diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 09de097..cb15c36 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -9,5 +9,4 @@ spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=false -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.sql.init.mode=never \ No newline at end of file +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 4d768ec..b257503 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -10,4 +10,3 @@ spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.sql.init.mode=never -- 2.45.2 From 042c7064079c06ab6bafccfb759924472c2d57fe Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Mon, 16 Feb 2026 01:12:32 +0530 Subject: [PATCH 4/4] Update prod JPA config --- src/main/resources/application-prod.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index cb15c36..7522890 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -7,6 +7,6 @@ spring.datasource.password=${POSTGRES_PASSWORD} spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=false spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect \ No newline at end of file -- 2.45.2