All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.quarkus.test.bootstrap.AbstractCliCommand Maven / Gradle / Ivy

package io.quarkus.test.bootstrap;

import static java.util.stream.Collectors.toSet;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Stream;

import org.junit.jupiter.api.Assertions;

import io.quarkus.test.utils.ClassPathUtils;
import io.quarkus.test.utils.FileUtils;

public abstract class AbstractCliCommand {

    protected final QuarkusCliClient cliClient;
    protected final QuarkusCliRestService app;

    public AbstractCliCommand(String appName, QuarkusCliClient.CreateApplicationRequest appReq,
            QuarkusCliClient cliClient, File testDirectory) {
        this.cliClient = cliClient;
        testDirectory.mkdirs();
        this.app = this.cliClient.createApplication(appName, appReq, testDirectory.getAbsolutePath());
    }

    public AbstractCliCommand(String appName, String targetSubDir, QuarkusCliClient.CreateApplicationRequest appReq,
            QuarkusCliClient cliClient) {
        this(appName, appReq, cliClient,
                Path.of("target").resolve(targetSubDir).resolve(UUID.randomUUID().toString()).toFile());
    }

    public abstract AbstractCliCommand addToApplicationProperties(String... additions);

    public File getApplicationProperties() {
        var pathToSrcMainResources = "src" + File.separator + "main" + File.separator + "resources";
        return app.getFileFromApplication(pathToSrcMainResources, "application.properties");
    }

    public String getApplicationPropertiesAsString() {
        return FileUtils.loadFile(getApplicationProperties());
    }

    public QuarkusCliCommandResult buildAppAndExpectSuccess(Class... unitTests) {
        copyUnitTestsToCreatedApp(unitTests);
        return buildAppAndExpectSuccess();
    }

    public QuarkusCliCommandResult buildAppAndExpectSuccess() {
        var result = app.buildOnJvm();
        assertTrue(result.isSuccessful(),
                "Expected successful JVM build, but build command failed with output: " + result.getOutput());
        return new QuarkusCliCommandResult(result.getOutput(), getApplicationPropertiesAsString(), this);
    }

    public QuarkusCliCommandResult buildAppAndExpectFailure(Class... unitTests) {
        copyUnitTestsToCreatedApp(unitTests);
        return buildAppAndExpectFailure();
    }

    public QuarkusCliCommandResult buildAppAndExpectFailure() {
        var result = app.buildOnJvm();
        assertFalse(result.isSuccessful(),
                "Expected JVM build failure, but build command succeed with output: " + result.getOutput());
        return new QuarkusCliCommandResult(result.getOutput(), getApplicationPropertiesAsString(), this);
    }

    public void removeApplicationProperties() {
        var appProps = getApplicationProperties();
        if (!appProps.delete()) {
            throw new IllegalStateException("Failed to delete application.properties file: " + appProps);
        }
    }

    protected QuarkusCliCommandResult runCommand(String baseCmd, List subCmdArgs) {
        var allConfigCommandArgs = new ArrayList<>();
        allConfigCommandArgs.add(baseCmd);
        allConfigCommandArgs.addAll(subCmdArgs);
        var result = cliClient.run(app.getServiceFolder(), allConfigCommandArgs.toArray(String[]::new));
        if (!result.isSuccessful()) {
            Assertions.fail("Quarkus %s command with arguments '%s' failed with output: %s".formatted(baseCmd,
                    allConfigCommandArgs, result.getOutput()));
        }
        return new QuarkusCliCommandResult(result.getOutput(), getApplicationPropertiesAsString(), this);
    }

    private void copyUnitTestsToCreatedApp(Class[] unitTests) {
        if (unitTests == null || unitTests.length == 0) {
            return;
        }
        var normalizedUnitTests = Stream.of(unitTests).map(Class::getName).collect(toSet());
        var srcTestJavaPath = Path.of("src").resolve("test").resolve("java");
        try (Stream stream = Files.walk(srcTestJavaPath)) {
            stream
                    .filter(path -> path.toString().endsWith(".java"))
                    .filter(path -> {
                        var normalizedClassName = ClassPathUtils.normalizeClassName(path.toString(), ".java");
                        return normalizedUnitTests.stream().anyMatch(normalizedClassName::endsWith);
                    })
                    .map(Path::toFile)
                    .forEach(unitTestFile -> FileUtils.copyFileTo(unitTestFile,
                            app.getServiceFolder().resolve(srcTestJavaPath)));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public QuarkusCliRestService getApp() {
        return app;
    }

    public QuarkusCliClient getCliClient() {
        return cliClient;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy