SpectrumInterceptor.java

package io.github.giulong.spectrum.extensions.interceptors;

import com.aventstack.extentreports.ExtentTest;
import io.github.giulong.spectrum.types.TestData;
import io.github.giulong.spectrum.utils.*;
import io.github.giulong.spectrum.utils.events.EventsDispatcher;
import io.github.giulong.spectrum.utils.video.Video;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.extension.DynamicTestInvocationContext;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.InvocationInterceptor;

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

import static io.github.giulong.spectrum.enums.Result.FAILED;
import static io.github.giulong.spectrum.enums.Result.SUCCESSFUL;
import static io.github.giulong.spectrum.extensions.resolvers.ConfigurationResolver.CONFIGURATION;
import static io.github.giulong.spectrum.extensions.resolvers.StatefulExtentTestResolver.STATEFUL_EXTENT_TEST;
import static io.github.giulong.spectrum.extensions.resolvers.TestDataResolver.TEST_DATA;
import static io.github.giulong.spectrum.utils.events.EventsDispatcher.*;
import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL;

@Slf4j
public class SpectrumInterceptor implements InvocationInterceptor {

    private final EventsDispatcher eventsDispatcher = EventsDispatcher.getInstance();
    private final ExtentReporter extentReporter = ExtentReporter.getInstance();
    private final FileUtils fileUtils = FileUtils.getInstance();
    private final ContextManager contextManager = ContextManager.getInstance();

    @SuppressWarnings("checkstyle:IllegalCatch")
    @Override
    public void interceptDynamicTest(final Invocation<Void> invocation, final DynamicTestInvocationContext invocationContext, final ExtensionContext context) throws Throwable {
        log.debug("Intercepting dynamic test invocation");

        final ExtensionContext.Store store = context.getStore(GLOBAL);
        final TestData testData = store.get(TEST_DATA, TestData.class);
        final StatefulExtentTest statefulExtentTest = store.get(STATEFUL_EXTENT_TEST, StatefulExtentTest.class);
        final Video video = store.get(CONFIGURATION, Configuration.class).getVideo();
        final Video.ExtentTest videoExtentTest = video.getExtentTest();
        final String className = context.getParent().orElse(context.getRoot()).getDisplayName();
        final String testName = context.getDisplayName();
        final Path dynamicVideoPath = Path.of(String.format("%s-%s.mp4", fileUtils.removeExtensionFrom(testData.getVideoPath().toString()), testName));
        final ExtentTest currentNode = statefulExtentTest.createNode(testName);

        testData.setFrameNumber(0);
        testData.setDisplayName(testName);
        testData.setDynamicVideoPath(dynamicVideoPath);
        statefulExtentTest.setDisplayName(testName);
        contextManager.initWithParentFor(context);

        if (!video.isDisabled() && videoExtentTest.isAttach()) {
            final String fullId = String.format("%s-%s", testData.getTestId(), testName);
            extentReporter.attachVideo(currentNode, videoExtentTest, fullId, dynamicVideoPath);
        }

        try {
            eventsDispatcher.fire(className, testName, BEFORE, null, Set.of(DYNAMIC_TEST), context);
            invocation.proceed();
            eventsDispatcher.fire(className, testName, AFTER, SUCCESSFUL, Set.of(DYNAMIC_TEST), context);
        } catch (Throwable t) {
            currentNode.fail(t);
            eventsDispatcher.fire(className, testName, AFTER, FAILED, Set.of(DYNAMIC_TEST), context);

            throw t;
        } finally {
            statefulExtentTest.closeNode();
        }
    }
}