QueryCaptureExtension.java

package li.selman.persistencetest.capture.junit;

import li.selman.persistencetest.capture.QueryCaptureContext;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;

/**
 * Resets {@link QueryCaptureContext#current()} before each test and, optionally, injects it as a test
 * method parameter.
 *
 * <pre>{@code
 * @ExtendWith(QueryCaptureExtension.class)
 * class OrderRepositoryTest {
 *
 *     @Test
 *     void findsOrdersByCustomer(QueryCaptureContext queries) {
 *         orderRepository.findByCustomerId(customerId);
 *
 *         assertThat(queries.capturedQueries()).hasSize(1);
 *     }
 * }
 * }</pre>
 *
 * <p>Only resets state - it does not itself wrap any {@link javax.sql.DataSource}. Pair it with
 * {@link li.selman.persistencetest.capture.QueryCapture#wrap} wherever the {@code DataSource} bean is
 * created.
 */
public final class QueryCaptureExtension implements BeforeEachCallback, ParameterResolver {

    @Override
    public void beforeEach(ExtensionContext context) {
        QueryCaptureContext.current().reset();
    }

    @Override
    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
            throws ParameterResolutionException {
        return parameterContext.getParameter().getType() == QueryCaptureContext.class;
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
            throws ParameterResolutionException {
        return QueryCaptureContext.current();
    }
}