Skip to content

Commit

Permalink
QuarkusUnitTest: addResource() and overwriteConfigProperty() fix
Browse files Browse the repository at this point in the history
  • Loading branch information
mkouba committed Sep 10, 2024
1 parent 311a6d5 commit 5c5ac89
Showing 1 changed file with 67 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,13 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.io.StringReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
Expand All @@ -33,9 +30,13 @@
import java.util.logging.Handler;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.stream.Collectors;

import org.jboss.logmanager.Logger;
import org.jboss.shrinkwrap.api.Node;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.Asset;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.exporter.ExplodedExporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.extension.AfterAllCallback;
Expand Down Expand Up @@ -87,6 +88,7 @@ public class QuarkusUnitTest

public static final String THE_BUILD_WAS_EXPECTED_TO_FAIL = "The build was expected to fail";
private static final String APP_ROOT = "app-root";
private static final String APPLICATION_PROPERTIES = "application.properties";

private static final Logger rootLogger;
private Handler[] originalHandlers;
Expand Down Expand Up @@ -348,9 +350,40 @@ private void exportArchives(Path deploymentDir, Class<?> testClass) {
archive.addClass(c);
c = c.getSuperclass();
}

Node applicationProperties = archive.get(APPLICATION_PROPERTIES);
if (customApplicationProperties != null) {
archive.add(new PropertiesAsset(customApplicationProperties), "application.properties");
if (applicationProperties != null) {
// We need to merge the existing "application.properties" asset and the overriden config properties
Properties mergedProperties = new Properties();
Asset asset = applicationProperties.getAsset();
if (asset instanceof StringAsset strAsset) {
mergedProperties.load(new StringReader(strAsset.getSource()));
} else {
try (InputStream in = asset.openStream()) {
mergedProperties.load(in);
}
}
// overrideConfigKey() takes precedence
customApplicationProperties.forEach(mergedProperties::put);

if (Boolean.parseBoolean(System.getProperty("quarkus.test.log-merged-properties"))) {
System.out.println("Merged config properties:\n" + mergedProperties.entrySet().stream()
.map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining("\n")));
} else {
System.out.println(
"NOTE: overrideConfigKey() and application.properties were merged; use quarkus.test.log-merged-properties=true to list the specific values");
}

// MemoryMapArchiveBase#addAsset(ArchivePath,Asset) does not overwrite the existing node correctly
// https://github.com/shrinkwrap/shrinkwrap/issues/179
archive.delete(APPLICATION_PROPERTIES);
archive.add(new PropertiesAsset(mergedProperties), APPLICATION_PROPERTIES);
} else {
archive.add(new PropertiesAsset(customApplicationProperties), APPLICATION_PROPERTIES);
}
}

archive.as(ExplodedExporter.class).exportExplodedInto(deploymentDir.resolve(APP_ROOT).toFile());

for (JavaArchive dependency : additionalDependencies) {
Expand Down Expand Up @@ -816,24 +849,39 @@ public QuarkusUnitTest setAfterUndeployListener(Runnable afterUndeployListener)
return this;
}

/**
* Add an {@code application.properties} asset loaded from the specified resource file in the test {@link JavaArchive}.
* <p>
* Configuration properties added with {@link #overrideConfigKey(String, String)} take precedence over the properties from
* the specified resource file.
*
* @param resourceName
* @return the test configuration
*/
public QuarkusUnitTest withConfigurationResource(String resourceName) {
if (customApplicationProperties == null) {
customApplicationProperties = new Properties();
}
try {
URL systemResource = ClassLoader.getSystemResource(resourceName);
if (systemResource == null) {
throw new FileNotFoundException("Resource '" + resourceName + "' not found");
}
try (InputStream in = systemResource.openStream()) {
customApplicationProperties.load(in);
}
return this;
} catch (IOException e) {
throw new UncheckedIOException("Could not load resource: '" + resourceName + "'", e);
if (archiveProducer != null) {
final Supplier<JavaArchive> producer = archiveProducer;
setArchiveProducer(new Supplier<JavaArchive>() {

@Override
public JavaArchive get() {
JavaArchive ret = producer.get();
ret.addAsResource(resourceName, "application.properties");
return ret;
}
});
}
return this;
}

/**
* Overriden configuration properties take precedence over the {@code application.properties} asset added in the test
* {@link JavaArchive}.
*
* @param propertyKey
* @param propertyValue
* @return the test configuration
*/
public QuarkusUnitTest overrideConfigKey(final String propertyKey, final String propertyValue) {
if (customApplicationProperties == null) {
customApplicationProperties = new Properties();
Expand Down

0 comments on commit 5c5ac89

Please sign in to comment.