diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/Credentials.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/Credentials.java new file mode 100644 index 0000000000..e51937cf57 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/Credentials.java @@ -0,0 +1,28 @@ +package com.baeldung.boot.configurationproperties; + +public class Credentials { + + private String username; + private String password; + + public Credentials(String username, String password) { + this.username = username; + this.password = password; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/CustomCredentialsConverter.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/CustomCredentialsConverter.java new file mode 100644 index 0000000000..ef160c8c9a --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/CustomCredentialsConverter.java @@ -0,0 +1,16 @@ +package com.baeldung.boot.configurationproperties; + +import org.springframework.boot.context.properties.ConfigurationPropertiesBinding; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationPropertiesBinding +public class CustomCredentialsConverter implements Converter { + + @Override + public Credentials convert(String source) { + String[] data = source.split(","); + return new Credentials(data[0], data[1]); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java new file mode 100644 index 0000000000..e23b30759b --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java @@ -0,0 +1,59 @@ +package com.baeldung.boot.configurationproperties; + +import java.util.Map; + +import javax.validation.Valid; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.validation.annotation.Validated; + +@Configuration +@ConfigurationProperties(prefix = "validate") +@PropertySource("classpath:property-validation.properties") +@Validated +public class MailServer { + + @NotNull + @NotEmpty + private Map propertiesMap; + + @Valid + private MailConfig mailConfig = new MailConfig(); + + public static class MailConfig { + + @NotBlank + @Email + private String address; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + } + + public Map getPropertiesMap() { + return propertiesMap; + } + + public void setPropertiesMap(Map propertiesMap) { + this.propertiesMap = propertiesMap; + } + + public MailConfig getMailConfig() { + return mailConfig; + } + + public void setMailConfig(MailConfig mailConfig) { + this.mailConfig = mailConfig; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/PropertyConversion.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/PropertyConversion.java new file mode 100644 index 0000000000..9b2ea39299 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/PropertyConversion.java @@ -0,0 +1,67 @@ +package com.baeldung.boot.configurationproperties; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.convert.DataSizeUnit; +import org.springframework.boot.convert.DurationUnit; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.unit.DataSize; +import org.springframework.util.unit.DataUnit; + +@Configuration +@ConfigurationProperties(prefix = "server") +public class PropertyConversion { + + private DataSize uploadSpeed; + + @DataSizeUnit(DataUnit.GIGABYTES) + private DataSize downloadSpeed; + + private Duration backupDay; + + @DurationUnit(ChronoUnit.HOURS) + private Duration backupHour; + + private Credentials credentials; + + public Duration getBackupDay() { + return backupDay; + } + + public void setBackupDay(Duration backupDay) { + this.backupDay = backupDay; + } + + public Duration getBackupHour() { + return backupHour; + } + + public void setBackupHour(Duration backupHour) { + this.backupHour = backupHour; + } + + public DataSize getUploadSpeed() { + return uploadSpeed; + } + + public void setUploadSpeed(DataSize uploadSpeed) { + this.uploadSpeed = uploadSpeed; + } + + public DataSize getDownloadSpeed() { + return downloadSpeed; + } + + public void setDownloadSpeed(DataSize downloadSpeed) { + this.downloadSpeed = downloadSpeed; + } + + public Credentials getCredentials() { + return credentials; + } + + public void setCredentials(Credentials credentials) { + this.credentials = credentials; + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfig.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfig.java new file mode 100644 index 0000000000..0c9e62445a --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfig.java @@ -0,0 +1,43 @@ +package com.baeldung.boot.configurationproperties; + +import java.util.Map; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "server") +public class ServerConfig { + + private Address address; + private Map resourcesPath; + + public static class Address { + + private String ip; + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + public Map getResourcesPath() { + return resourcesPath; + } + + public void setResourcesPath(Map resourcesPath) { + this.resourcesPath = resourcesPath; + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfigFactory.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfigFactory.java new file mode 100644 index 0000000000..ca85d59112 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfigFactory.java @@ -0,0 +1,15 @@ +package com.baeldung.boot.configurationproperties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ServerConfigFactory { + + @Bean(name = "default_bean") + @ConfigurationProperties(prefix = "server.default") + public ServerConfig getDefaultConfigs() { + return new ServerConfig(); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/main/resources/property-validation.properties b/spring-boot-modules/spring-boot-testing/src/main/resources/property-validation.properties new file mode 100644 index 0000000000..6b4c881dc0 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/resources/property-validation.properties @@ -0,0 +1,4 @@ +validate.propertiesMap.first=prop1 +validate.propertiesMap.second=prop2 + +validate.mail_config.address=user1@test \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToBeanMethodsUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToBeanMethodsUnitTest.java new file mode 100644 index 0000000000..82c2a55c32 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToBeanMethodsUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.boot.configurationproperties; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@EnableConfigurationProperties(value = ServerConfig.class) +@ContextConfiguration(classes = ServerConfigFactory.class) +@TestPropertySource("classpath:server-config-test.properties") +public class BindingPropertiesToBeanMethodsUnitTest { + + @Autowired + @Qualifier("default_bean") + private ServerConfig serverConfig; + + @Test + void givenBeanAnnotatedMethod_whenBindingProperties_thenAllFieldsAreSet() { + assertEquals("192.168.0.2", serverConfig.getAddress() + .getIp()); + + Map expectedResourcesPath = new HashMap<>(); + expectedResourcesPath.put("imgs", "/root/def/imgs"); + assertEquals(expectedResourcesPath, serverConfig.getResourcesPath()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToUserDefinedPOJOUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToUserDefinedPOJOUnitTest.java new file mode 100644 index 0000000000..9db906fa04 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToUserDefinedPOJOUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.boot.configurationproperties; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@EnableConfigurationProperties(value = ServerConfig.class) +@TestPropertySource("classpath:server-config-test.properties") +public class BindingPropertiesToUserDefinedPOJOUnitTest { + + @Autowired + private ServerConfig serverConfig; + + @Test + void givenUserDefinedPOJO_whenBindingPropertiesFile_thenAllFieldsAreSet() { + assertEquals("192.168.0.1", serverConfig.getAddress() + .getIp()); + + Map expectedResourcesPath = new HashMap<>(); + expectedResourcesPath.put("imgs", "/root/imgs"); + assertEquals(expectedResourcesPath, serverConfig.getResourcesPath()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingYMLPropertiesUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingYMLPropertiesUnitTest.java new file mode 100644 index 0000000000..5543f5e9e8 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingYMLPropertiesUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.boot.configurationproperties; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) +@EnableConfigurationProperties(value = ServerConfig.class) +@ActiveProfiles("test") +public class BindingYMLPropertiesUnitTest { + + @Autowired + private ServerConfig serverConfig; + + @Test + void whenBindingYMLConfigFile_thenAllFieldsAreSet() { + assertEquals("192.168.0.4", serverConfig.getAddress() + .getIp()); + + Map expectedResourcesPath = new HashMap<>(); + expectedResourcesPath.put("imgs", "/etc/test/imgs"); + assertEquals(expectedResourcesPath, serverConfig.getResourcesPath()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/OverridingConfigurationPropertiesUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/OverridingConfigurationPropertiesUnitTest.java new file mode 100644 index 0000000000..2779b0a313 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/OverridingConfigurationPropertiesUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.boot.configurationproperties; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@EnableConfigurationProperties(value = MailServer.class) +@TestPropertySource(properties = { "validate.mail_config.address=new_user@test" }) +public class OverridingConfigurationPropertiesUnitTest { + + @Autowired + private MailServer mailServer; + + @Test + void givenUsingPropertiesAttribute_whenAssiginingNewValueToProprty_thenSpringUsesNewValue() { + assertEquals("new_user@test", mailServer.getMailConfig() + .getAddress()); + + Map expectedMap = new HashMap<>(); + expectedMap.put("first", "prop1"); + expectedMap.put("second", "prop2"); + assertEquals(expectedMap, mailServer.getPropertiesMap()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java new file mode 100644 index 0000000000..939471dd67 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.boot.configurationproperties; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import javax.validation.Validation; +import javax.validation.Validator; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@EnableConfigurationProperties(value = MailServer.class) +@TestPropertySource("classpath:property-validation-test.properties") +public class PropertyValidationUnitTest { + + @Autowired + private MailServer mailServer; + + private static Validator propertyValidator; + + @BeforeAll + public static void setup() { + propertyValidator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } + + @Test + void whenBindingPropertiesToValidatedBeans_thenConstrainsAreChecked() { + assertEquals(0, propertyValidator.validate(mailServer.getPropertiesMap()) + .size()); + assertEquals(0, propertyValidator.validate(mailServer.getMailConfig()) + .size()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/SpringPropertiesConversionUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/SpringPropertiesConversionUnitTest.java new file mode 100644 index 0000000000..3f2da2a669 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/SpringPropertiesConversionUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.boot.configurationproperties; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.time.Duration; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.util.unit.DataSize; + +@ExtendWith(SpringExtension.class) +@EnableConfigurationProperties(value = PropertyConversion.class) +@ContextConfiguration(classes = CustomCredentialsConverter.class) +@TestPropertySource("classpath:spring-conversion-test.properties") +public class SpringPropertiesConversionUnitTest { + + @Autowired + private PropertyConversion propertyConversion; + + @Test + void whenUsingSpringDefaultSizeConversion_thenDataSizeObjectIsSet() { + assertEquals(DataSize.ofMegabytes(500), propertyConversion.getUploadSpeed()); + assertEquals(DataSize.ofGigabytes(10), propertyConversion.getDownloadSpeed()); + } + + @Test + void whenUsingSpringDefaultDurationConversion_thenDurationObjectIsSet() { + assertEquals(Duration.ofDays(1), propertyConversion.getBackupDay()); + assertEquals(Duration.ofHours(8), propertyConversion.getBackupHour()); + } + + @Test + void whenRegisteringCustomCredentialsConverter_thenCredentialsAreParsed() { + assertEquals("user", propertyConversion.getCredentials() + .getUsername()); + assertEquals("123", propertyConversion.getCredentials() + .getPassword()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/application.yml b/spring-boot-modules/spring-boot-testing/src/test/resources/application.yml new file mode 100644 index 0000000000..1b46b0f1ff --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/resources/application.yml @@ -0,0 +1,15 @@ +spring: + profiles: test +server: + address: + ip: 192.168.0.4 + resources_path: + imgs: /etc/test/imgs +--- +spring: + profiles: dev +server: + address: + ip: 192.168.0.5 + resources_path: + imgs: /etc/dev/imgs \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation-test.properties b/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation-test.properties new file mode 100644 index 0000000000..6b4c881dc0 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation-test.properties @@ -0,0 +1,4 @@ +validate.propertiesMap.first=prop1 +validate.propertiesMap.second=prop2 + +validate.mail_config.address=user1@test \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/server-config-test.properties b/spring-boot-modules/spring-boot-testing/src/test/resources/server-config-test.properties new file mode 100644 index 0000000000..62b23ed1d6 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/resources/server-config-test.properties @@ -0,0 +1,6 @@ +server.address.ip=192.168.0.1 +server.resources_path.imgs=/root/imgs + +# default config +server.default.address.ip=192.168.0.2 +server.default.resources_path.imgs=/root/def/imgs \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/spring-conversion-test.properties b/spring-boot-modules/spring-boot-testing/src/test/resources/spring-conversion-test.properties new file mode 100644 index 0000000000..87444cee10 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/resources/spring-conversion-test.properties @@ -0,0 +1,10 @@ +# bandwidth +server.upload_speed=500MB +server.download_speed=10 + +# backup date +server.backup_day=1d +server.backup_hour=8 + +# custom converter +server.credentials=user,123 \ No newline at end of file