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 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); + } +}