TestStepsConsumer.java

package io.github.giulong.spectrum.utils.web_driver_events;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import io.github.giulong.spectrum.pojos.events.Event;
import io.github.giulong.spectrum.types.TestData;
import io.github.giulong.spectrum.utils.FileUtils;
import io.github.giulong.spectrum.utils.FreeMarkerWrapper;
import io.github.giulong.spectrum.utils.events.EventsConsumer;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.extension.ExtensionContext;

import java.nio.file.Path;
import java.util.Map;

import static io.github.giulong.spectrum.extensions.resolvers.DriverResolver.TEST_STEP_BUILDER_CONSUMER;
import static io.github.giulong.spectrum.extensions.resolvers.TestDataResolver.TEST_DATA;
import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL;

@Slf4j
@Getter
public class TestStepsConsumer extends EventsConsumer {

    @JsonIgnore
    private final FreeMarkerWrapper freeMarkerWrapper = FreeMarkerWrapper.getInstance();

    @JsonIgnore
    private final FileUtils fileUtils = FileUtils.getInstance();

    @JsonPropertyDescription("Path to the template to be used, relative to src/test/resources/template. The report produced will match the template's extension")
    private final String template = "test-steps.txt";

    @JsonPropertyDescription("Where to produce the output, relative to the root of the project")
    private final String output = "target/spectrum/tests-steps";

    @Override
    public void accept(final Event event) {
        log.debug("Building test steps report");

        final ExtensionContext.Store store = event.getContext().getStore(GLOBAL);
        final TestData testData = store.get(TEST_DATA, TestData.class);
        final TestStepBuilderConsumer testStepBuilderConsumer = store.get(TEST_STEP_BUILDER_CONSUMER, TestStepBuilderConsumer.class);
        final String fileName = String.format("%s.%s", testData.getTestId(), fileUtils.getExtensionOf(template));
        final Path path = Path.of(output, fileName);
        final String interpolatedTemplate = freeMarkerWrapper.interpolateTemplate(template, Map.of("steps", testStepBuilderConsumer.getTestSteps()));

        fileUtils.write(path, interpolatedTemplate);
    }
}