From 1a4ec87d5eada530b7c445b9f26021d11f91cc85 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 17 Jun 2020 12:40:04 +0200 Subject: [PATCH] Add first test for metadata mapping (Mapping is not implemented yet.) Related to MID-6275. --- .../evolveum/midpoint/prism/PrismValue.java | 7 ++ .../midpoint/prism/impl/PrismValueImpl.java | 17 ++++ .../impl/metadata/ValueMetadataAdapter.java | 7 ++ .../xml/ns/public/common/common-core-3.xsd | 6 +- .../model/intest/TestValueMetadata.java | 51 ++++++++++-- .../metadata/system-configuration.xml | 17 ++++ .../metadata/template-regular-user.xml | 46 +++++++++++ .../src/test/resources/metadata/user-bob.xml | 35 ++++++++ .../src/test/resources/schema/metadata.xsd | 1 + .../test/asserter/ExtensionAsserter.java | 13 +-- .../midpoint/test/asserter/UserAsserter.java | 11 ++- .../test/asserter/ValueMetadataAsserter.java | 82 +++++++++++++++++++ .../prism/PrismContainerValueAsserter.java | 57 ++++++------- .../asserter/prism/PrismObjectAsserter.java | 22 +++++ .../asserter/prism/PrismValueAsserter.java | 8 +- 15 files changed, 335 insertions(+), 45 deletions(-) create mode 100644 model/model-intest/src/test/resources/metadata/system-configuration.xml create mode 100644 model/model-intest/src/test/resources/metadata/template-regular-user.xml create mode 100644 model/model-intest/src/test/resources/metadata/user-bob.xml create mode 100644 repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/ValueMetadataAsserter.java diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index a8d62d7a902..f0d92ed9785 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -49,6 +49,13 @@ public interface PrismValue extends Visitable, PathVisitable, Serializable, Debu @Experimental Optional valueMetadata() throws SchemaException; + /** + * Maybe it is better to expect empty value metadata if these are absent. + * Client code would be simpler. HIGHLY EXPERIMENTAL. + */ + @Experimental + ValueMetadata getValueMetadata() throws SchemaException; + @Experimental default void createLiveMetadata() { } diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismValueImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismValueImpl.java index 1ba7fab790b..2453c3ac1a5 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismValueImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismValueImpl.java @@ -10,6 +10,7 @@ import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy; import com.evolveum.midpoint.prism.equivalence.ParameterizedEquivalenceStrategy; +import com.evolveum.midpoint.prism.impl.metadata.ValueMetadataAdapter; import com.evolveum.midpoint.prism.metadata.ValueMetadataMockUpFactory; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.util.DebugUtil; @@ -393,6 +394,22 @@ public Optional valueMetadata() throws SchemaException { } } + @Override + public ValueMetadata getValueMetadata() throws SchemaException { + if (valueMetadata != null) { + return valueMetadata; + } else { + Optional mockup = createMockUpValueMetadata(); + if (mockup.isPresent()) { + return mockup.get(); + } else if (prismContext != null && prismContext.getValueMetadataFactory() != null) { + return prismContext.getValueMetadataFactory().createEmpty(); + } else { + return ValueMetadataAdapter.holding(new PrismContainerValueImpl<>()); + } + } + } + @Override @Experimental public void createLiveMetadata() { diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/metadata/ValueMetadataAdapter.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/metadata/ValueMetadataAdapter.java index 538d082c79e..1d9f6afa99c 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/metadata/ValueMetadataAdapter.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/metadata/ValueMetadataAdapter.java @@ -145,10 +145,17 @@ public void setParent(Itemable parent) { delegate.setParent(parent); } + // TODO is this correct? public Optional valueMetadata() { return Optional.of(this); } + // TODO is this correct? + @Override + public ValueMetadata getValueMetadata() { + return this; + } + public @NotNull ItemPath getPath() { return delegate.getPath(); } diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index b8f80e0e25a..4131d77bb62 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -9763,7 +9763,11 @@ - + + + + + diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestValueMetadata.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestValueMetadata.java index 978e888ec38..900c71207e0 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestValueMetadata.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestValueMetadata.java @@ -13,8 +13,9 @@ import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.*; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; @@ -31,25 +32,38 @@ import javax.xml.datatype.XMLGregorianCalendar; /** - * Tests the value metadata handling. Currently the only "handling" is creation of metadata mock-up. + * Tests the value metadata handling. */ @ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) -public class TestValueMetadata extends AbstractInitializedModelIntegrationTest { +public class TestValueMetadata extends AbstractEmptyModelIntegrationTest { public static final File TEST_DIR = new File("src/test/resources/metadata"); + private static final String NS_EXT_METADATA = "http://midpoint.evolveum.com/xml/ns/samples/metadata"; + private static final ItemName LOA_NAME = new ItemName(NS_EXT_METADATA, "loa"); + private static final ItemPath LOA_PATH = ItemPath.create(ObjectType.F_EXTENSION, LOA_NAME); + + private static final File SYSTEM_CONFIGURATION_FILE = new File(TEST_DIR, "system-configuration.xml"); + private static final TestResource TEMPLATE_REGULAR_USER = new TestResource<>(TEST_DIR, "template-regular-user.xml", "b1005d3d-6ef4-4347-b235-313666824ed8"); private static final TestResource USER_ALICE = new TestResource<>(TEST_DIR, "user-alice.xml", "9fc389be-5b47-4e9d-90b5-33fffd87b3ca"); + private static final TestResource USER_BOB = new TestResource<>(TEST_DIR, "user-bob.xml", "cab2344d-06c0-4881-98ee-7075bf5d1309"); @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); + addObject(TEMPLATE_REGULAR_USER, initTask, initResult); addObject(USER_ALICE, initTask, initResult); } + @Override + protected File getSystemConfigurationFile() { + return SYSTEM_CONFIGURATION_FILE; + } + @Test - public void test010TestLiveMetadata() throws SchemaException { + public void test010KeepingLiveMetadata() throws SchemaException { given(); UserType mark = new UserType(prismContext) .name("mark"); @@ -77,7 +91,7 @@ public void test010TestLiveMetadata() throws SchemaException { } @Test - public void test100CheckValueMetadata() throws Exception { + public void test020GettingMockUpMetadata() throws Exception { given(); when(); @@ -143,6 +157,33 @@ public void test100CheckValueMetadata() throws Exception { displayDumpable("assignment[111] admin status metadata", assignmentAdminStatusMetadata.get()); } + @Test + public void test100SimpleMetadataMapping() throws Exception { + given(); + Task task = getTestTask(); + OperationResult result = task.getResult(); + + when(); + addObject(USER_BOB, task, result); + + then(); + assertUserAfter(USER_BOB.oid) + .display() + .valueMetadata(UserType.F_GIVEN_NAME) + .display() + .assertPropertyValuesEqual(LOA_PATH, "low") + .end() + .valueMetadata(UserType.F_FAMILY_NAME) + .display() + .assertPropertyValuesEqual(LOA_PATH, "high") + .end() + .assertFullName("Bob Green") + .valueMetadata(UserType.F_FULL_NAME) + .display() +// .assertPropertyValuesEqual(LOA_PATH, "low") + .end(); + } + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") private ValueMetadataType cast(Optional metadata) { //noinspection OptionalGetWithoutIsPresent diff --git a/model/model-intest/src/test/resources/metadata/system-configuration.xml b/model/model-intest/src/test/resources/metadata/system-configuration.xml new file mode 100644 index 00000000000..b03377a39fb --- /dev/null +++ b/model/model-intest/src/test/resources/metadata/system-configuration.xml @@ -0,0 +1,17 @@ + + + + + SystemConfiguration + + UserType + regular + + + diff --git a/model/model-intest/src/test/resources/metadata/template-regular-user.xml b/model/model-intest/src/test/resources/metadata/template-regular-user.xml new file mode 100644 index 00000000000..d7e68ffb134 --- /dev/null +++ b/model/model-intest/src/test/resources/metadata/template-regular-user.xml @@ -0,0 +1,46 @@ + + + + Template for regular users + + + strong + + givenName + + + familyName + + + + + + fullName + + + + + extension/loa + + + + + + extension/loa + + + + + diff --git a/model/model-intest/src/test/resources/metadata/user-bob.xml b/model/model-intest/src/test/resources/metadata/user-bob.xml new file mode 100644 index 00000000000..9a9b18ff2b6 --- /dev/null +++ b/model/model-intest/src/test/resources/metadata/user-bob.xml @@ -0,0 +1,35 @@ + + + + bob + + + givenName + + + low + + + + + familyName + + + high + + + + + regular + Bob + Green + diff --git a/model/model-intest/src/test/resources/schema/metadata.xsd b/model/model-intest/src/test/resources/schema/metadata.xsd index e768c9c3771..c606a46e3f2 100644 --- a/model/model-intest/src/test/resources/schema/metadata.xsd +++ b/model/model-intest/src/test/resources/schema/metadata.xsd @@ -86,5 +86,6 @@ + diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/ExtensionAsserter.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/ExtensionAsserter.java index fa93ae2f3be..6ad5bd8c2b3 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/ExtensionAsserter.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/ExtensionAsserter.java @@ -7,6 +7,7 @@ package com.evolveum.midpoint.test.asserter; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.test.asserter.prism.PrismContainerValueAsserter; import com.evolveum.midpoint.test.asserter.prism.PrismObjectAsserter; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExtensionType; @@ -56,14 +57,14 @@ public ExtensionAsserter assertAny() { } @Override - public ExtensionAsserter assertPropertyValuesEqual(QName propName, T... expectedValues) { - super.assertPropertyValuesEqual(propName, expectedValues); + public ExtensionAsserter assertPropertyValuesEqual(ItemPath path, T... expectedValues) { + super.assertPropertyValuesEqual(path, expectedValues); return this; } @Override - public ExtensionAsserter assertPropertyValuesEqualRaw(QName attrName, T... expectedValues) { - super.assertPropertyValuesEqualRaw(attrName, expectedValues); + public ExtensionAsserter assertPropertyValuesEqualRaw(ItemPath path, T... expectedValues) { + super.assertPropertyValuesEqualRaw(path, expectedValues); return this; } @@ -74,8 +75,8 @@ public ExtensionAsserter assertNoItem(QName itemName) { } @Override - public ExtensionAsserter assertTimestampBetween(QName propertyName, XMLGregorianCalendar startTs, XMLGregorianCalendar endTs) { - super.assertTimestampBetween(propertyName, startTs, endTs); + public ExtensionAsserter assertTimestampBetween(ItemPath path, XMLGregorianCalendar startTs, XMLGregorianCalendar endTs) { + super.assertTimestampBetween(path, startTs, endTs); return this; } diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/UserAsserter.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/UserAsserter.java index 562985c7301..8204ae5f341 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/UserAsserter.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/UserAsserter.java @@ -16,17 +16,13 @@ import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.crypto.EncryptionException; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.asserter.prism.PolyStringAsserter; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsStorageTypeType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PasswordType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; /** * @author semancik @@ -367,6 +363,13 @@ public UserAsserter assertRoleMemberhipRefs(int expected) { return asserter; } + @Override + public ValueMetadataAsserter, RA> valueMetadata( + ItemPath path) throws SchemaException { + //noinspection unchecked + return (ValueMetadataAsserter, RA>) super.valueMetadata(path); + } + @Override public TriggersAsserter, RA> triggers() { TriggersAsserter, RA> asserter = new TriggersAsserter<>(this, getDetails()); diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/ValueMetadataAsserter.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/ValueMetadataAsserter.java new file mode 100644 index 00000000000..dc11e9b2d89 --- /dev/null +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/ValueMetadataAsserter.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2019 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.test.asserter; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.test.asserter.prism.PrismContainerValueAsserter; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ValueMetadataType; + +public class ValueMetadataAsserter, RA> extends PrismContainerValueAsserter { + + private final PA parentAsserter; + + public ValueMetadataAsserter(PA parentAsserter, PrismContainerValue valueMetadata) { + super(valueMetadata); + this.parentAsserter = parentAsserter; + } + + public ValueMetadataAsserter(PA parentAsserter, PrismContainerValue valueMetadata, String details) { + super(valueMetadata, details); + this.parentAsserter = parentAsserter; + } + + @Override + public ValueMetadataAsserter assertSize(int expected) { + return (ValueMetadataAsserter) super.assertSize(expected); + } + + @Override + public ValueMetadataAsserter assertItems(QName... expectedItems) { + return (ValueMetadataAsserter) super.assertItems(expectedItems); + } + + @Override + public ValueMetadataAsserter assertAny() { + return (ValueMetadataAsserter) super.assertAny(); + } + + @Override + public ValueMetadataAsserter assertPropertyValuesEqual(ItemPath path, T... expectedValues) { + return (ValueMetadataAsserter) super.assertPropertyValuesEqual(path, expectedValues); + } + + @Override + public ValueMetadataAsserter assertPropertyValuesEqualRaw(ItemPath path, T... expectedValues) { + return (ValueMetadataAsserter) super.assertPropertyValuesEqualRaw(path, expectedValues); + } + + @Override + public ValueMetadataAsserter assertNoItem(QName itemName) { + return (ValueMetadataAsserter) super.assertNoItem(itemName); + } + + @Override + public PrismContainerValueAsserter> containerSingle(QName subcontainerQName) { + return (PrismContainerValueAsserter>) super.containerSingle(subcontainerQName); + } + + + protected String desc() { + // TODO handling of details + return "metadata of " + getDetails() + " of " + parentAsserter.desc(); + } + + @Override + public PA end() { + return parentAsserter; + } + + @Override + public ValueMetadataAsserter display() { + return (ValueMetadataAsserter) super.display(); + } +} diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismContainerValueAsserter.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismContainerValueAsserter.java index 1323354570f..c12190fc8dd 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismContainerValueAsserter.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismContainerValueAsserter.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.path.ItemName; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.test.asserter.predicates.AssertionPredicate; import com.evolveum.midpoint.test.asserter.predicates.AssertionPredicateEvaluation; @@ -91,8 +92,8 @@ private String presentItemNames() { return sb.toString(); } - private PrismProperty findProperty(QName attrName) { - return getPrismValue().findProperty(ItemName.fromQName(attrName)); + private PrismProperty findProperty(ItemPath path) { + return getPrismValue().findProperty(path); } private PrismContainer findContainer(QName attrName) { @@ -103,47 +104,47 @@ private Item findItem(QName itemName) { return getPrismValue().findItem(ItemName.fromQName(itemName)); } - public PrismContainerValueAsserter assertPropertyEquals(QName propName, T expected) { - PrismProperty prop = findProperty(propName); + public PrismContainerValueAsserter assertPropertyEquals(ItemPath path, T expected) { + PrismProperty prop = findProperty(path); if (prop == null && expected == null) { return this; } - assertNotNull("No property "+propName.getLocalPart()+" in "+desc(), prop); + assertNotNull("No property "+path+" in "+desc(), prop); T realValue = prop.getRealValue(); - assertNotNull("No value in "+propName.getLocalPart()+" in "+desc(), realValue); - assertEquals("Wrong "+propName.getLocalPart()+" in "+desc(), expected, realValue); + assertNotNull("No value in "+path+" in "+desc(), realValue); + assertEquals("Wrong "+path+" in "+desc(), expected, realValue); return this; } - public PrismContainerValueAsserter assertPropertyValueSatisfies(QName propName, AssertionPredicate predicate) { - PrismProperty prop = findProperty(propName); + public PrismContainerValueAsserter assertPropertyValueSatisfies(ItemPath path, AssertionPredicate predicate) { + PrismProperty prop = findProperty(path); T value = prop != null ? prop.getRealValue() : null; AssertionPredicateEvaluation evaluation = predicate.evaluate(value); if (evaluation.hasFailed()) { - fail("Property " + propName + " value of '" + value + "' does not satisfy predicate: " + evaluation.getFailureDescription()); + fail("Property " + path + " value of '" + value + "' does not satisfy predicate: " + evaluation.getFailureDescription()); } return this; } - public PrismContainerValueAsserter assertPropertyValuesEqual(QName propName, T... expectedValues) { - PrismProperty property = findProperty(propName); - assertNotNull("No property "+propName+" in "+desc(), property); + public PrismContainerValueAsserter assertPropertyValuesEqual(ItemPath path, T... expectedValues) { + PrismProperty property = findProperty(path); + assertNotNull("No property "+ path +" in "+desc(), property); PrismAsserts.assertPropertyValueDesc(property, desc(), expectedValues); return this; } - public PrismContainerValueAsserter assertPropertyValuesEqualRaw(QName attrName, T... expectedValues) { - PrismProperty property = findProperty(attrName); - assertNotNull("No attribute "+attrName+" in "+desc(), property); - RawType[] expectedRaw = rawize(attrName, getPrismContext(), expectedValues); + public PrismContainerValueAsserter assertPropertyValuesEqualRaw(ItemPath path, T... expectedValues) { + PrismProperty property = findProperty(path); + assertNotNull("No attribute "+ path +" in "+desc(), property); + RawType[] expectedRaw = rawize(path, getPrismContext(), expectedValues); PrismAsserts.assertPropertyValueDesc(property, desc(), (T[])expectedRaw); return this; } - private RawType[] rawize(QName attrName, PrismContext prismContext, T[] expectedValues) { + private RawType[] rawize(ItemPath path, PrismContext prismContext, T[] expectedValues) { RawType[] raws = new RawType[expectedValues.length]; for(int i = 0; i < expectedValues.length; i++) { - raws[i] = new RawType(prismContext.itemFactory().createPropertyValue(expectedValues[i]), attrName, prismContext); + raws[i] = new RawType(prismContext.itemFactory().createPropertyValue(expectedValues[i]), path.lastName(), prismContext); } return raws; } @@ -173,12 +174,12 @@ public PrismContainerValueAsserter assertNoItem(QName itemName) { return this; } - public PrismContainerValueAsserter assertTimestampBetween(QName propertyName, XMLGregorianCalendar startTs, XMLGregorianCalendar endTs) { - PrismProperty property = findProperty(propertyName); - assertNotNull("No property "+propertyName+" in "+desc(), property); + public PrismContainerValueAsserter assertTimestampBetween(ItemPath path, XMLGregorianCalendar startTs, XMLGregorianCalendar endTs) { + PrismProperty property = findProperty(path); + assertNotNull("No property "+path+" in "+desc(), property); XMLGregorianCalendar timestamp = property.getRealValue(); - assertNotNull("No value of property "+propertyName+" in "+desc(), timestamp); - TestUtil.assertBetween("Wrong value of property "+propertyName+" in "+desc(), startTs, endTs, timestamp); + assertNotNull("No value of property "+path+" in "+desc(), timestamp); + TestUtil.assertBetween("Wrong value of property "+path+" in "+desc(), startTs, endTs, timestamp); return this; } @@ -199,10 +200,10 @@ public PrismContainerAsserter PrismPropertyAsserter> property(QName propertyName) { - PrismProperty property = findProperty(propertyName); - assertNotNull("No property "+propertyName+" in "+desc(), property); - PrismPropertyAsserter> asserter = new PrismPropertyAsserter<>(property, this, propertyName.getLocalPart() + " in " + desc()); + public PrismPropertyAsserter> property(ItemPath path) { + PrismProperty property = findProperty(path); + assertNotNull("No property "+ path +" in "+desc(), property); + PrismPropertyAsserter> asserter = new PrismPropertyAsserter<>(property, this, path + " in " + desc()); copySetupTo(asserter); return asserter; } diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismObjectAsserter.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismObjectAsserter.java index 189dc70a9fe..988c4f51199 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismObjectAsserter.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismObjectAsserter.java @@ -347,6 +347,28 @@ public PrismObject getCachedObject(Class type, S return asserter; } + public ValueMetadataAsserter, RA> valueMetadata(ItemPath path) throws SchemaException { + PrismContainerValue valueMetadata = getValueMetadata(path); + ValueMetadataAsserter, RA> asserter = + new ValueMetadataAsserter<>(this, valueMetadata, String.valueOf(path)); // TODO details + copySetupTo(asserter); + return asserter; + } + + private PrismContainerValue getValueMetadata(ItemPath path) throws SchemaException { + Item item = getObject().findItem(path); + if (item == null) { + throw new AssertionError("Item '" + path + "' not found in " + getObject()); + } + if (item.size() == 1) { + //noinspection unchecked + return (PrismContainerValue) (PrismContainerValue) item.getValue().getValueMetadata(); + } else { + throw new AssertionError("Item '" + path + "' has not a single value in " + getObject() + + ": " + item.size() + " values: " + item); + } + } + public TriggersAsserter, RA> triggers() { TriggersAsserter, RA> asserter = new TriggersAsserter<>(this, getDetails()); copySetupTo(asserter); diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismValueAsserter.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismValueAsserter.java index 8820dec82b0..3126233f45b 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismValueAsserter.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/asserter/prism/PrismValueAsserter.java @@ -7,14 +7,16 @@ package com.evolveum.midpoint.test.asserter.prism; import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.asserter.AbstractAsserter; +import com.evolveum.midpoint.util.DebugUtil; /** * @author semancik */ public abstract class PrismValueAsserter extends AbstractAsserter { - private V prismValue; + private final V prismValue; public PrismValueAsserter(V prismValue) { super(); @@ -41,4 +43,8 @@ protected String desc() { return getDetails(); } + public PrismValueAsserter display() { + IntegrationTestTools.display(desc(), DebugUtil.debugDump(prismValue)); + return this; + } }