|
9 | 9 | import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;
|
10 | 10 | import static java.util.Collections.emptyMap;
|
11 | 11 | import static org.assertj.core.api.Assertions.assertThat;
|
| 12 | +import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRED; |
12 | 13 |
|
13 | 14 | import com.introproventures.graphql.jpa.query.autoconfigure.support.AdditionalGraphQLType;
|
14 | 15 | import com.introproventures.graphql.jpa.query.autoconfigure.support.MutationRoot;
|
|
26 | 27 | import graphql.annotations.annotationTypes.GraphQLInvokeDetached;
|
27 | 28 | import graphql.annotations.annotationTypes.GraphQLName;
|
28 | 29 | import graphql.annotations.annotationTypes.directives.definition.GraphQLDirectiveDefinition;
|
| 30 | +import graphql.execution.AsyncSerialExecutionStrategy; |
29 | 31 | import graphql.scalars.ExtendedScalars;
|
30 | 32 | import graphql.schema.DataFetcher;
|
31 | 33 | import graphql.schema.GraphQLCodeRegistry;
|
|
54 | 56 | import java.util.function.Supplier;
|
55 | 57 | import java.util.stream.Collectors;
|
56 | 58 | import java.util.stream.Stream;
|
| 59 | +import org.assertj.core.api.InstanceOfAssertFactories; |
57 | 60 | import org.junit.jupiter.api.Test;
|
58 | 61 | import org.reactivestreams.Publisher;
|
59 | 62 | import org.reflections.Reflections;
|
|
65 | 68 | import org.springframework.context.annotation.Bean;
|
66 | 69 | import org.springframework.context.annotation.Configuration;
|
67 | 70 | import org.springframework.core.io.Resource;
|
| 71 | +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
68 | 72 | import org.springframework.stereotype.Component;
|
| 73 | +import org.springframework.transaction.TransactionDefinition; |
| 74 | +import org.springframework.transaction.support.DefaultTransactionDefinition; |
69 | 75 | import org.springframework.util.StringUtils;
|
70 | 76 | import reactor.core.publisher.Flux;
|
71 | 77 | import reactor.test.StepVerifier;
|
@@ -106,6 +112,40 @@ GraphQLSchemaEntityManager persistentContextEntityManager() {
|
106 | 112 | return () -> entityManager;
|
107 | 113 | }
|
108 | 114 |
|
| 115 | + @Bean |
| 116 | + TransactionalExecutionStrategyCustomizer<QueryExecutionStrategyProvider> queryExecutionStrategyCustomizer( |
| 117 | + ThreadPoolTaskExecutor threadPoolTaskExecutor |
| 118 | + ) { |
| 119 | + return builder -> |
| 120 | + builder |
| 121 | + .executor(threadPoolTaskExecutor) |
| 122 | + .delegate(new AsyncSerialExecutionStrategy()) |
| 123 | + .transactionTemplate(transactionTemplate -> transactionTemplate.setTimeout(999)); |
| 124 | + } |
| 125 | + |
| 126 | + @Bean |
| 127 | + TransactionalExecutionStrategyCustomizer<MutationExecutionStrategyProvider> mutationExecutionStrategyCustomizer( |
| 128 | + ThreadPoolTaskExecutor threadPoolTaskExecutor |
| 129 | + ) { |
| 130 | + return builder -> |
| 131 | + builder |
| 132 | + .executor(threadPoolTaskExecutor) |
| 133 | + .delegate(new AsyncSerialExecutionStrategy()) |
| 134 | + .transactionTemplate(transactionTemplate -> transactionTemplate.setTimeout(999)); |
| 135 | + } |
| 136 | + |
| 137 | + @Bean |
| 138 | + TransactionalExecutionStrategyCustomizer<SubscriptionExecutionStrategyProvider> subscriptionExecutionStrategyCustomizer( |
| 139 | + ThreadPoolTaskExecutor threadPoolTaskExecutor |
| 140 | + ) { |
| 141 | + return builder -> |
| 142 | + builder |
| 143 | + .executor(threadPoolTaskExecutor) |
| 144 | + .delegate(new AsyncSerialExecutionStrategy()) |
| 145 | + .transactionTemplate(transactionTemplate -> transactionTemplate.setTimeout(999)) |
| 146 | + .transactionTemplate(transactionTemplate -> transactionTemplate.setReadOnly(true)); |
| 147 | + } |
| 148 | + |
109 | 149 | @Configuration
|
110 | 150 | static class GraphQLAnnotationsSchemaConfigurer implements GraphQLSchemaConfigurer {
|
111 | 151 |
|
@@ -415,4 +455,70 @@ void configuresSharedEntityManager() {
|
415 | 455 | // given
|
416 | 456 | assertThat(graphQLJpaSchemaBuilder.getEntityManager()).isEqualTo(entityManagerSupplier.get());
|
417 | 457 | }
|
| 458 | + |
| 459 | + @Test |
| 460 | + void configuresQueryTransactionalExecutionStrategyCustomizer() { |
| 461 | + // given |
| 462 | + assertThat(queryExecutionStrategy) |
| 463 | + .isInstanceOf(QueryExecutionStrategyProvider.class) |
| 464 | + .extracting(Supplier::get) |
| 465 | + .asInstanceOf(InstanceOfAssertFactories.type(TransactionalDelegateExecutionStrategy.class)) |
| 466 | + .satisfies(result -> { |
| 467 | + assertThat(result.getDelegate()).isInstanceOf(AsyncSerialExecutionStrategy.class); |
| 468 | + assertThat(result.getExecutor()).extracting(Supplier::get).isInstanceOf(ThreadPoolTaskExecutor.class); |
| 469 | + assertThat(result.getTransactionTemplate()) |
| 470 | + .extracting(DefaultTransactionDefinition::getTimeout) |
| 471 | + .isEqualTo(999); |
| 472 | + assertThat(result.getTransactionTemplate()) |
| 473 | + .extracting(DefaultTransactionDefinition::getPropagationBehavior) |
| 474 | + .isEqualTo(PROPAGATION_REQUIRED); |
| 475 | + assertThat(result.getTransactionTemplate()) |
| 476 | + .extracting(DefaultTransactionDefinition::isReadOnly) |
| 477 | + .isEqualTo(true); |
| 478 | + }); |
| 479 | + } |
| 480 | + |
| 481 | + @Test |
| 482 | + void configuresMutationTransactionalExecutionStrategyCustomizer() { |
| 483 | + // given |
| 484 | + assertThat(mutationExecutionStrategy) |
| 485 | + .isInstanceOf(MutationExecutionStrategyProvider.class) |
| 486 | + .extracting(Supplier::get) |
| 487 | + .asInstanceOf(InstanceOfAssertFactories.type(TransactionalDelegateExecutionStrategy.class)) |
| 488 | + .satisfies(result -> { |
| 489 | + assertThat(result.getDelegate()).isInstanceOf(AsyncSerialExecutionStrategy.class); |
| 490 | + assertThat(result.getExecutor()).extracting(Supplier::get).isInstanceOf(ThreadPoolTaskExecutor.class); |
| 491 | + assertThat(result.getTransactionTemplate()) |
| 492 | + .extracting(DefaultTransactionDefinition::getTimeout) |
| 493 | + .isEqualTo(999); |
| 494 | + assertThat(result.getTransactionTemplate()) |
| 495 | + .extracting(DefaultTransactionDefinition::getPropagationBehavior) |
| 496 | + .isEqualTo(TransactionDefinition.PROPAGATION_REQUIRES_NEW); |
| 497 | + assertThat(result.getTransactionTemplate()) |
| 498 | + .extracting(DefaultTransactionDefinition::isReadOnly) |
| 499 | + .isEqualTo(false); |
| 500 | + }); |
| 501 | + } |
| 502 | + |
| 503 | + @Test |
| 504 | + void configuresSubscriptionTransactionalExecutionStrategyCustomizer() { |
| 505 | + // given |
| 506 | + assertThat(subscriptionExecutionStrategy) |
| 507 | + .isInstanceOf(SubscriptionExecutionStrategyProvider.class) |
| 508 | + .extracting(Supplier::get) |
| 509 | + .asInstanceOf(InstanceOfAssertFactories.type(TransactionalDelegateExecutionStrategy.class)) |
| 510 | + .satisfies(result -> { |
| 511 | + assertThat(result.getDelegate()).isInstanceOf(AsyncSerialExecutionStrategy.class); |
| 512 | + assertThat(result.getExecutor()).extracting(Supplier::get).isInstanceOf(ThreadPoolTaskExecutor.class); |
| 513 | + assertThat(result.getTransactionTemplate()) |
| 514 | + .extracting(DefaultTransactionDefinition::getTimeout) |
| 515 | + .isEqualTo(999); |
| 516 | + assertThat(result.getTransactionTemplate()) |
| 517 | + .extracting(DefaultTransactionDefinition::getPropagationBehavior) |
| 518 | + .isEqualTo(TransactionDefinition.PROPAGATION_SUPPORTS); |
| 519 | + assertThat(result.getTransactionTemplate()) |
| 520 | + .extracting(DefaultTransactionDefinition::isReadOnly) |
| 521 | + .isEqualTo(true); |
| 522 | + }); |
| 523 | + } |
418 | 524 | }
|
0 commit comments