|
1 | 1 | package ca.uhn.fhir.jpa.subscription.match.registry;
|
2 | 2 |
|
3 | 3 | import ca.uhn.fhir.context.FhirContext;
|
| 4 | +import ca.uhn.fhir.interceptor.model.ReadPartitionIdRequestDetails; |
4 | 5 | import ca.uhn.fhir.interceptor.model.RequestPartitionId;
|
5 | 6 | import ca.uhn.fhir.jpa.model.config.SubscriptionSettings;
|
| 7 | +import ca.uhn.fhir.jpa.partition.IRequestPartitionHelperSvc; |
6 | 8 | import ca.uhn.fhir.jpa.subscription.model.CanonicalSubscription;
|
7 | 9 | import ca.uhn.fhir.jpa.subscription.model.CanonicalSubscriptionChannelType;
|
8 | 10 | import ca.uhn.fhir.jpa.subscription.model.CanonicalTopicSubscriptionFilter;
|
9 | 11 | import ca.uhn.fhir.model.api.ExtensionDt;
|
10 | 12 | import ca.uhn.fhir.model.primitive.BooleanDt;
|
| 13 | +import ca.uhn.fhir.rest.api.Constants; |
| 14 | +import ca.uhn.fhir.rest.api.server.RequestDetails; |
11 | 15 | import ca.uhn.fhir.subscription.SubscriptionConstants;
|
12 | 16 | import ca.uhn.fhir.subscription.SubscriptionTestDataHelper;
|
13 | 17 | import ca.uhn.fhir.util.HapiExtensions;
|
14 | 18 | import jakarta.annotation.Nonnull;
|
15 | 19 | import org.assertj.core.api.AssertionsForClassTypes;
|
| 20 | +import org.hl7.fhir.instance.model.api.IBaseResource; |
16 | 21 | import org.hl7.fhir.r4.model.BooleanType;
|
17 | 22 | import org.hl7.fhir.r4.model.Extension;
|
18 | 23 | import org.hl7.fhir.r4.model.Subscription;
|
19 | 24 | import org.hl7.fhir.r5.model.Coding;
|
20 | 25 | import org.hl7.fhir.r5.model.Enumerations;
|
| 26 | +import org.jetbrains.annotations.NotNull; |
| 27 | +import org.jetbrains.annotations.Nullable; |
21 | 28 | import org.junit.jupiter.api.Test;
|
22 | 29 | import org.junit.jupiter.params.ParameterizedTest;
|
23 | 30 | import org.junit.jupiter.params.provider.MethodSource;
|
24 | 31 | import org.junit.jupiter.params.provider.ValueSource;
|
25 | 32 |
|
| 33 | +import java.util.Set; |
26 | 34 | import java.util.stream.Stream;
|
27 | 35 |
|
28 | 36 | import static ca.uhn.fhir.rest.api.Constants.CT_FHIR_JSON_NEW;
|
|
37 | 45 |
|
38 | 46 | class SubscriptionCanonicalizerTest {
|
39 | 47 |
|
| 48 | + private static final Integer NON_NULL_DEFAULT_PARTITION_ID = 666; |
| 49 | + |
40 | 50 | FhirContext r4Context = FhirContext.forR4();
|
41 | 51 |
|
42 | 52 | private final SubscriptionCanonicalizer testedSC = new SubscriptionCanonicalizer(r4Context, new SubscriptionSettings());
|
@@ -172,6 +182,90 @@ private static Stream<RequestPartitionId> crossPartitionParams() {
|
172 | 182 | return Stream.of(null, RequestPartitionId.fromPartitionId(1), RequestPartitionId.defaultPartition()) ;
|
173 | 183 | }
|
174 | 184 |
|
| 185 | + private class FakeNonNullDefaultPartitionIDHelper implements IRequestPartitionHelperSvc { |
| 186 | + |
| 187 | + @Override |
| 188 | + public @Nullable Integer getDefaultPartitionId() { |
| 189 | + return NON_NULL_DEFAULT_PARTITION_ID; |
| 190 | + } |
| 191 | + |
| 192 | + @Override |
| 193 | + public boolean isDefaultPartition(@NotNull RequestPartitionId theRequestPartitionId) { |
| 194 | + return theRequestPartitionId.getPartitionIds().get(0).equals(NON_NULL_DEFAULT_PARTITION_ID); |
| 195 | + } |
| 196 | + |
| 197 | + @Override |
| 198 | + public boolean hasDefaultPartitionId(@NotNull RequestPartitionId theRequestPartitionId) { |
| 199 | + return theRequestPartitionId.getPartitionIds().stream().anyMatch(part -> part.equals(NON_NULL_DEFAULT_PARTITION_ID)); |
| 200 | + } |
| 201 | + |
| 202 | + @Override |
| 203 | + public RequestPartitionId determineReadPartitionForRequest(@Nullable RequestDetails theRequest, @NotNull ReadPartitionIdRequestDetails theDetails) { |
| 204 | + return null; |
| 205 | + } |
| 206 | + |
| 207 | + @Override |
| 208 | + public RequestPartitionId determineGenericPartitionForRequest(RequestDetails theRequestDetails) { |
| 209 | + return null; |
| 210 | + } |
| 211 | + |
| 212 | + @Override |
| 213 | + public @NotNull RequestPartitionId determineCreatePartitionForRequest(@Nullable RequestDetails theRequest, @NotNull IBaseResource theResource, @NotNull String theResourceType) { |
| 214 | + return null; |
| 215 | + } |
| 216 | + |
| 217 | + @Override |
| 218 | + public @NotNull Set<Integer> toReadPartitions(@NotNull RequestPartitionId theRequestPartitionId) { |
| 219 | + return Set.of(); |
| 220 | + } |
| 221 | + |
| 222 | + @Override |
| 223 | + public boolean isResourcePartitionable(String theResourceType) { |
| 224 | + return false; |
| 225 | + } |
| 226 | + |
| 227 | + @Override |
| 228 | + public RequestPartitionId validateAndNormalizePartitionIds(RequestPartitionId theRequestPartitionId) { |
| 229 | + return null; |
| 230 | + } |
| 231 | + |
| 232 | + @Override |
| 233 | + public RequestPartitionId validateAndNormalizePartitionNames(RequestPartitionId theRequestPartitionId) { |
| 234 | + return null; |
| 235 | + } |
| 236 | + } |
| 237 | + @Test |
| 238 | + public void testNonNullDefaultPartitionIDCanonicalizesToCrossPartition() { |
| 239 | + IRequestPartitionHelperSvc myHelperSvc = new FakeNonNullDefaultPartitionIDHelper(); |
| 240 | + final SubscriptionSettings subscriptionSettings = new SubscriptionSettings(); |
| 241 | + |
| 242 | + subscriptionSettings.setCrossPartitionSubscriptionEnabled(true); |
| 243 | + final SubscriptionCanonicalizer subscriptionCanonicalizer = new SubscriptionCanonicalizer(FhirContext.forR4(), subscriptionSettings); |
| 244 | + subscriptionCanonicalizer.setPartitionHelperSvc(myHelperSvc); |
| 245 | + Subscription subscription = buildMdmSubscriptionR4("test-subscription", "Patient?"); |
| 246 | + CanonicalSubscription canonicalize = subscriptionCanonicalizer.canonicalize(subscription); |
| 247 | + |
| 248 | + assertThat(canonicalize.isCrossPartitionEnabled()).isTrue(); |
| 249 | + |
| 250 | + } |
| 251 | + private Subscription buildMdmSubscriptionR4(String theId, String theCriteria) { |
| 252 | + Subscription retval = new Subscription(); |
| 253 | + retval.setId(theId); |
| 254 | + retval.setReason("MDM Simulacrum Subscription"); |
| 255 | + retval.setStatus(Subscription.SubscriptionStatus.REQUESTED); |
| 256 | + retval.setCriteria(theCriteria); |
| 257 | + retval.addExtension() |
| 258 | + .setUrl(HapiExtensions.EXTENSION_SUBSCRIPTION_CROSS_PARTITION) |
| 259 | + .setValue(new BooleanType().setValue(true)); |
| 260 | + Subscription.SubscriptionChannelComponent channel = retval.getChannel(); |
| 261 | + channel.setType(Subscription.SubscriptionChannelType.MESSAGE); |
| 262 | + channel.setEndpoint("channel:test"); |
| 263 | + channel.setPayload(Constants.CT_JSON); |
| 264 | + RequestPartitionId retPartId = RequestPartitionId.fromPartitionId(NON_NULL_DEFAULT_PARTITION_ID); |
| 265 | + retval.setUserData(Constants.RESOURCE_PARTITION_ID, retPartId); |
| 266 | + return retval; |
| 267 | + } |
| 268 | + |
175 | 269 | @ParameterizedTest
|
176 | 270 | @MethodSource("crossPartitionParams")
|
177 | 271 | void testSubscriptionCrossPartitionEnableProperty_forDstu2WithExtensionAndPartitions(RequestPartitionId theRequestPartitionId) {
|
|
0 commit comments