diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..c91c1fc3 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,33 @@ +version: "3.8" +services: + mongodb: + image: mongo + container_name: mongo + ports: + - "27017:27017" + volumes: + - data:/data + environment: + - MONGO_INITDB_ROOT_USERNAME=mongodb_user + - MONGO_INITDB_ROOT_PASSWORD=mongodb_pwd + + mongo-express: + image: mongo-express + container_name: mongo-express + restart: always + ports: + - "9090:8081" + environment: + - ME_CONFIG_MONGODB_ADMINUSERNAME=mongodb_user + - ME_CONFIG_MONGODB_ADMINPASSWORD=mongodb_pwd + - ME_CONFIG_MONGODB_SERVER=mongo + - ME_CONFIG_MONGODB_AUTH_USERNAME=admin + - ME_CONFIG_MONGODB_AUTH_PASSWORD=pass + +volumes: + data: {} + +networks: + default: + name: mongodb_network + diff --git a/pom.xml b/pom.xml index 928fef47..d861aa3e 100644 --- a/pom.xml +++ b/pom.xml @@ -28,24 +28,24 @@ org.springframework.boot - spring-boot-starter-actuator + spring-boot-configuration-processor + true org.springframework.boot - spring-boot-starter-webflux + spring-boot-starter-actuator - org.springframework.boot - spring-boot-devtools - runtime - true + spring-boot-starter-webflux + org.springframework.boot - spring-boot-configuration-processor - true + spring-boot-starter-data-mongodb + + org.springframework.boot spring-boot-starter-thymeleaf @@ -55,17 +55,52 @@ thymeleaf-extras-springsecurity6 + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-docker-compose + org.projectlombok lombok true + org.springframework.boot spring-boot-starter-test test + + org.springframework.boot + spring-boot-testcontainers + test + + + org.testcontainers + mongodb + ${testcontainers.version} + test + + + org.testcontainers + testcontainers + ${testcontainers.version} + test + + + org.testcontainers + junit-jupiter + ${testcontainers.version} + test + + diff --git a/src/main/java/com/github/nramc/dev/journey/api/JourneyApiApplication.java b/src/main/java/com/github/nramc/dev/journey/api/JourneyApiApplication.java index 3dedba23..ad5fddce 100644 --- a/src/main/java/com/github/nramc/dev/journey/api/JourneyApiApplication.java +++ b/src/main/java/com/github/nramc/dev/journey/api/JourneyApiApplication.java @@ -1,13 +1,31 @@ package com.github.nramc.dev.journey.api; +import com.github.nramc.dev.journey.api.data.entity.LocationEntity; +import com.github.nramc.dev.journey.api.data.repository.LocationRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; @SpringBootApplication +@Slf4j public class JourneyApiApplication { - public static void main(String[] args) { - SpringApplication.run(JourneyApiApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(JourneyApiApplication.class, args); + } + + @Bean + CommandLineRunner commandLineRunner(LocationRepository locationRepository) { + return args -> { + LocationEntity entity = new LocationEntity("Munich"); + locationRepository.save(entity); + + log.info("Number of documents found: {}", locationRepository.count()); + + locationRepository.findAll().forEach(location -> log.info("Found: {}", location)); + }; + } } diff --git a/src/main/java/com/github/nramc/dev/journey/api/data/entity/LocationEntity.java b/src/main/java/com/github/nramc/dev/journey/api/data/entity/LocationEntity.java new file mode 100644 index 00000000..dbf602f1 --- /dev/null +++ b/src/main/java/com/github/nramc/dev/journey/api/data/entity/LocationEntity.java @@ -0,0 +1,18 @@ +package com.github.nramc.dev.journey.api.data.entity; + +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("location") +@Data +public class LocationEntity { + @Id + private String id; + + private String name; + + public LocationEntity(String name) { + this.name = name; + } +} diff --git a/src/main/java/com/github/nramc/dev/journey/api/data/repository/LocationRepository.java b/src/main/java/com/github/nramc/dev/journey/api/data/repository/LocationRepository.java new file mode 100644 index 00000000..297e646a --- /dev/null +++ b/src/main/java/com/github/nramc/dev/journey/api/data/repository/LocationRepository.java @@ -0,0 +1,7 @@ +package com.github.nramc.dev.journey.api.data.repository; + +import com.github.nramc.dev.journey.api.data.entity.LocationEntity; +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface LocationRepository extends MongoRepository { +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 00000000..b65064d4 --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,7 @@ +spring: + data: + mongodb: + database: ${DATABASE_NAME} + uri: ${MONGODB_CONNECTION_URL} + + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a98e838d..ecdcaf6c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,10 @@ spring: application: name: ${app.name} + data: + mongodb: + database: journey-dev + auto-index-creation: true app: name: Journey API diff --git a/src/test/java/com/github/nramc/dev/journey/api/JourneyApiApplicationTests.java b/src/test/java/com/github/nramc/dev/journey/api/JourneyApiApplicationTests.java index 9e0e0ef5..eb238187 100644 --- a/src/test/java/com/github/nramc/dev/journey/api/JourneyApiApplicationTests.java +++ b/src/test/java/com/github/nramc/dev/journey/api/JourneyApiApplicationTests.java @@ -4,11 +4,21 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.ApplicationContext; import org.springframework.test.web.reactive.server.WebTestClient; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; +@Testcontainers @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class JourneyApiApplicationTests { + @Container + @ServiceConnection + static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:latest")); + @Autowired private ApplicationContext applicationContext; @Autowired diff --git a/src/test/java/com/github/nramc/dev/journey/api/web/resources/mvc/home/HomeResourceTest.java b/src/test/java/com/github/nramc/dev/journey/api/web/resources/mvc/home/HomeResourceTest.java index 4a7f607b..c6065325 100644 --- a/src/test/java/com/github/nramc/dev/journey/api/web/resources/mvc/home/HomeResourceTest.java +++ b/src/test/java/com/github/nramc/dev/journey/api/web/resources/mvc/home/HomeResourceTest.java @@ -1,10 +1,12 @@ package com.github.nramc.dev.journey.api.web.resources.mvc.home; import com.github.nramc.dev.journey.api.config.ApplicationProperties; +import com.github.nramc.dev.journey.api.data.repository.LocationRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -15,6 +17,7 @@ @WebMvcTest(HomeResource.class) @ActiveProfiles({"prod", "test"}) @EnableConfigurationProperties({ApplicationProperties.class}) +@MockBean({LocationRepository.class}) class HomeResourceTest { @Autowired private MockMvc mvc;