use of com.evolveum.midpoint.repo.sqale.qmodel.focus.MUser in project midpoint by Evolveum.
the class SqaleRepoModifyObjectTest method test180ReplacingSubtypeValuesSetsArrayColumn.
// endregion
// region array/jsonb stored multi-values
@Test
public void test180ReplacingSubtypeValuesSetsArrayColumn() throws Exception {
OperationResult result = createOperationResult();
MUser originalRow = selectObjectByOid(QUser.class, user1Oid);
given("delta to replace subtypes with a couple of values");
ObjectDelta<UserType> delta = prismContext.deltaFor(UserType.class).item(UserType.F_SUBTYPE).replace("subtype-1", "subtype-2").asObjectDelta(user1Oid);
when("modifyObject is called");
repositoryService.modifyObject(UserType.class, user1Oid, delta.getModifications(), result);
then("operation is successful");
assertThatOperationResult(result).isSuccess();
and("serialized form (fullObject) is updated and has provided subtypes");
UserType userObject = repositoryService.getObject(UserType.class, user1Oid, null, result).asObjectable();
assertThat(userObject.getVersion()).isEqualTo(String.valueOf(originalRow.version + 1));
assertThat(userObject.getSubtype()).containsExactlyInAnyOrder("subtype-1", "subtype-2");
and("column with subtypes is updated");
MUser row = selectObjectByOid(QUser.class, user1Oid);
assertThat(row.version).isEqualTo(originalRow.version + 1);
assertThat(row.subtypes).containsExactlyInAnyOrder("subtype-1", "subtype-2");
}
use of com.evolveum.midpoint.repo.sqale.qmodel.focus.MUser in project midpoint by Evolveum.
the class SqaleRepoModifyObjectTest method test501AddingAnotherExtensionItem.
@Test
public void test501AddingAnotherExtensionItem() throws Exception {
OperationResult result = createOperationResult();
MUser originalRow = selectObjectByOid(QUser.class, user1Oid);
given("delta adding int extension item");
ObjectDelta<UserType> delta = prismContext.deltaFor(UserType.class).item(FocusType.F_EXTENSION, new QName("int")).replace(555).asObjectDelta(user1Oid);
when("modifyObject is called");
repositoryService.modifyObject(UserType.class, user1Oid, delta.getModifications(), result);
then("operation is successful");
assertThatOperationResult(result).isSuccess();
and("serialized form (fullObject) is updated");
UserType user = repositoryService.getObject(UserType.class, user1Oid, null, result).asObjectable();
assertThat(user.getVersion()).isEqualTo(String.valueOf(originalRow.version + 1));
// no check of ext container, we believe in prism here
and("externalized column is updated");
ExtensionType extensionContainer = user.getExtension();
MUser row = selectObjectByOid(QUser.class, user1Oid);
assertThat(row.version).isEqualTo(originalRow.version + 1);
assertThat(row.ext).isNotNull();
assertThat(Jsonb.toMap(row.ext)).containsEntry(extensionKey(extensionContainer, "string"), "string-value500").containsEntry(extensionKey(extensionContainer, "int"), 555);
}
use of com.evolveum.midpoint.repo.sqale.qmodel.focus.MUser in project midpoint by Evolveum.
the class SqaleRepoModifyObjectTest method test135ObjectNameCanBeChanged.
@Test
public void test135ObjectNameCanBeChanged() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException {
OperationResult result = createOperationResult();
MUser originalRow = selectObjectByOid(QUser.class, user1Oid);
given("delta with object name change for user 1");
ObjectDelta<UserType> delta = prismContext.deltaFor(UserType.class).item(ObjectType.F_NAME).add(new PolyString("user-1-changed")).asObjectDelta(user1Oid);
when("modifyObject is called");
repositoryService.modifyObject(UserType.class, user1Oid, delta.getModifications(), result);
then("operation is successful");
assertThatOperationResult(result).isSuccess();
and("serialized form (fullObject) is updated");
UserType userObject = repositoryService.getObject(UserType.class, user1Oid, null, result).asObjectable();
assertThat(userObject.getVersion()).isEqualTo(String.valueOf(originalRow.version + 1));
PolyStringType name = userObject.getName();
assertThat(name.getOrig()).isEqualTo("user-1-changed");
assertThat(name.getNorm()).isEqualTo("user1changed");
and("externalized column is updated");
MUser row = selectObjectByOid(QUser.class, user1Oid);
assertThat(row.version).isEqualTo(originalRow.version + 1);
assertThat(row.nameOrig).isEqualTo("user-1-changed");
assertThat(row.nameNorm).isEqualTo("user1changed");
}
use of com.evolveum.midpoint.repo.sqale.qmodel.focus.MUser in project midpoint by Evolveum.
the class SqaleRepoModifyObjectTest method test310AddingAssignmentWithNewPrefilledCid.
@Test
public void test310AddingAssignmentWithNewPrefilledCid() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException {
OperationResult result = createOperationResult();
MUser originalRow = selectObjectByOid(QUser.class, user1Oid);
QAssignment<?> a = QAssignmentMapping.getAssignmentMapping().defaultAlias();
int origAssignmentCount = (int) count(a, a.ownerOid.eq(UUID.fromString(user1Oid)));
given("delta adding assignments with free CID for user 1");
ObjectDelta<UserType> delta = prismContext.deltaFor(UserType.class).item(UserType.F_ASSIGNMENT).add(new AssignmentType(prismContext).id(originalRow.containerIdSeq).order(1)).asObjectDelta(user1Oid);
when("modifyObject is called");
repositoryService.modifyObject(UserType.class, user1Oid, delta.getModifications(), result);
then("operation is successful");
assertThatOperationResult(result).isSuccess();
and("serialized form (fullObject) is updated and provided CID is used");
UserType userObject = repositoryService.getObject(UserType.class, user1Oid, null, result).asObjectable();
assertThat(userObject.getVersion()).isEqualTo(String.valueOf(originalRow.version + 1));
List<AssignmentType> assignments = userObject.getAssignment();
assertThat(assignments).hasSize(origAssignmentCount + 1).anyMatch(ass -> ass.getId().equals(originalRow.containerIdSeq));
and("new assignment row is created");
MUser row = selectObjectByOid(QUser.class, user1Oid);
assertThat(row.version).isEqualTo(originalRow.version + 1);
assertThat(row.containerIdSeq).isEqualTo(originalRow.containerIdSeq + 1);
List<MAssignment> aRows = select(a, a.ownerOid.eq(UUID.fromString(user1Oid)));
assertThat(aRows).hasSize(assignments.size()).anyMatch(aRow -> aRow.cid.equals(originalRow.containerIdSeq) && aRow.orderValue == 1);
}
use of com.evolveum.midpoint.repo.sqale.qmodel.focus.MUser in project midpoint by Evolveum.
the class SqaleRepoModifyObjectTest method test952ReindexFixingColumnsOutOfSync.
@Test
public void test952ReindexFixingColumnsOutOfSync() throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException {
OperationResult result = createOperationResult();
given("user existing in the repository");
String name = "user" + getTestNumber();
UserType user = new UserType(prismContext).name(name).emailAddress(name + "@goodmail.com").subtype("subtype-1").subtype("subtype-2").assignment(new AssignmentType(prismContext).order(1));
String oid = repositoryService.addObject(user.asPrismObject(), null, result);
and("object aggregate is modified in the DB (simulating out-of-sync data)");
QAssignment<MObject> a = QAssignmentMapping.getAssignmentMapping().defaultAlias();
UUID oidUuid = UUID.fromString(oid);
try (JdbcSession jdbcSession = startTransaction()) {
jdbcSession.newInsert(a).set(a.ownerOid, oidUuid).set(a.cid, -1L).set(a.containerType, MContainerType.ASSIGNMENT).set(a.ownerType, MObjectType.USER).set(a.orderValue, // test number, hopefully unique
952).execute();
QUser u = QUserMapping.getUserMapping().defaultAlias();
jdbcSession.newUpdate(u).set(u.emailAddress, "bad@badmail.com").set(u.subtypes, new String[] { "subtype-952" }).set(u.costCenter, "invasive value").where(u.oid.eq(oidUuid)).execute();
jdbcSession.commit();
}
and("search provides obviously bad results");
assertThat(repositorySearchObjects(UserType.class, prismContext.queryFor(UserType.class).item(UserType.F_EMAIL_ADDRESS).eq(name + "@goodmail.com").build(), result)).isEmpty();
assertThat(repositorySearchObjects(UserType.class, prismContext.queryFor(UserType.class).item(UserType.F_COST_CENTER).eq("invasive value").build(), result)).hasSize(// can find by bad value, that's wrong
1);
assertThat(repositorySearchObjects(UserType.class, prismContext.queryFor(UserType.class).item(UserType.F_ASSIGNMENT, AssignmentType.F_ORDER).eq(952).build(), result)).hasSize(// can find by wrong assignment
1);
assertThat(repositorySearchObjects(UserType.class, prismContext.queryFor(UserType.class).item(UserType.F_SUBTYPE).eq("subtype-952").build(), result)).hasSize(// can find by wrong subtype
1);
when("reindex is called to fix it");
repositoryService.modifyObject(UserType.class, oid, Collections.emptyList(), RepoModifyOptions.createForceReindex(), result);
then("the searches work as expected");
assertThat(repositorySearchObjects(UserType.class, prismContext.queryFor(UserType.class).item(UserType.F_EMAIL_ADDRESS).eq(name + "@goodmail.com").build(), result)).hasSize(1).extracting(o -> o.getOid()).containsExactlyInAnyOrder(// can find by the original mail, that's good!
oid);
assertThat(repositorySearchObjects(UserType.class, prismContext.queryFor(UserType.class).item(UserType.F_COST_CENTER).eq("invasive value").build(), result)).isEmpty();
assertThat(repositorySearchObjects(UserType.class, prismContext.queryFor(UserType.class).item(UserType.F_ASSIGNMENT, AssignmentType.F_ORDER).eq(952).build(), result)).isEmpty();
assertThat(repositorySearchObjects(UserType.class, prismContext.queryFor(UserType.class).item(UserType.F_ASSIGNMENT, AssignmentType.F_ORDER).eq(1).build(), result)).extracting(o -> o.getOid()).contains(// good, can have more results, but our user is there too
oid);
and("database values are as good as new");
MUser userRow = selectObjectByOid(QUser.class, oid);
// tested by search above as well
assertThat(userRow.emailAddress).isEqualTo(name + "@goodmail.com");
assertThat(userRow.costCenter).isNull();
assertThat(userRow.subtypes).containsExactlyInAnyOrder("subtype-1", "subtype-2");
List<MAssignment> assRows = select(a, a.ownerOid.eq(oidUuid));
// single row with proper order is returned, wrong row is gone
assertThat(assRows).hasSize(1);
assertThat(assRows.get(0).orderValue).isEqualTo(1);
}
Aggregations