use of com.evolveum.midpoint.repo.sqale.qmodel.focus.QUser in project midpoint by Evolveum.
the class SqaleRepoAddDeleteObjectTest method test205AddObjectWithMultivalueRefs.
@Test
public void test205AddObjectWithMultivalueRefs() throws ObjectAlreadyExistsException, SchemaException {
OperationResult result = createOperationResult();
given("user with ref");
String userName = "user" + getTestNumber();
String targetRef1 = UUID.randomUUID().toString();
String targetRef2 = UUID.randomUUID().toString();
UserType user = new UserType(prismContext).name(userName).linkRef(targetRef1, RoleType.COMPLEX_TYPE).linkRef(targetRef2, RoleType.COMPLEX_TYPE);
when("adding it to the repository");
repositoryService.addObject(user.asPrismObject(), null, result);
then("object and its reference rows are created");
assertThatOperationResult(result).isSuccess();
QUser u = aliasFor(QUser.class);
List<MUser> users = select(u, u.nameOrig.eq(userName));
assertThat(users).hasSize(1);
MUser userRow = users.get(0);
assertThat(userRow.oid).isNotNull();
// cid sequence is in initial state
assertThat(userRow.containerIdSeq).isEqualTo(1);
UUID userOid = UUID.fromString(user.getOid());
QObjectReference<?> or = QObjectReferenceMapping.getForProjection().defaultAlias();
List<MReference> projectionRefs = select(or, or.ownerOid.eq(userOid));
assertThat(projectionRefs).hasSize(2).allMatch(rRow -> rRow.referenceType == MReferenceType.PROJECTION).allMatch(rRow -> rRow.ownerOid.equals(userOid)).extracting(rRow -> rRow.targetOid.toString()).containsExactlyInAnyOrder(targetRef1, targetRef2);
// this is the same set of refs queried from the super-table
QReference<MReference, ?> r = aliasFor(QReference.CLASS);
List<MReference> refs = select(r, r.ownerOid.eq(userOid));
assertThat(refs).hasSize(2).allMatch(rRow -> rRow.referenceType == MReferenceType.PROJECTION);
}
use of com.evolveum.midpoint.repo.sqale.qmodel.focus.QUser in project midpoint by Evolveum.
the class SqaleRepoAddDeleteObjectTest method test200AddObjectWithMultivalueContainers.
@Test
public void test200AddObjectWithMultivalueContainers() throws ObjectAlreadyExistsException, SchemaException {
OperationResult result = createOperationResult();
given("user with assignment and ref");
String userName = "user" + getTestNumber();
String targetRef1 = UUID.randomUUID().toString();
String targetRef2 = UUID.randomUUID().toString();
UserType user = new UserType(prismContext).name(userName).assignment(new AssignmentType(prismContext).targetRef(targetRef1, RoleType.COMPLEX_TYPE)).assignment(new AssignmentType(prismContext).targetRef(targetRef2, RoleType.COMPLEX_TYPE));
when("adding it to the repository");
repositoryService.addObject(user.asPrismObject(), null, result);
then("object and its container rows are created and container IDs are assigned");
assertThatOperationResult(result).isSuccess();
QUser u = aliasFor(QUser.class);
List<MUser> users = select(u, u.nameOrig.eq(userName));
assertThat(users).hasSize(1);
MUser userRow = users.get(0);
assertThat(userRow.oid).isNotNull();
// next free container number
assertThat(userRow.containerIdSeq).isEqualTo(3);
QContainer<MContainer, ?> c = aliasFor(QContainer.CLASS);
List<MContainer> containers = select(c, c.ownerOid.eq(userRow.oid));
assertThat(containers).hasSize(2).allMatch(cRow -> cRow.ownerOid.equals(userRow.oid) && cRow.containerType == MContainerType.ASSIGNMENT).extracting(cRow -> cRow.cid).containsExactlyInAnyOrder(1L, 2L);
}
use of com.evolveum.midpoint.repo.sqale.qmodel.focus.QUser in project midpoint by Evolveum.
the class SqaleRepoAddDeleteObjectTest method test100AddNamedUserWithoutOidWorksOk.
// region basic object/container and various item types tests
@Test
public void test100AddNamedUserWithoutOidWorksOk() throws ObjectAlreadyExistsException, SchemaException {
OperationResult result = createOperationResult();
given("user with a name");
String userName = "user" + getTestNumber();
UserType userType = new UserType(prismContext).name(userName).version(// version will be ignored and set to 1
"5");
when("adding it to the repository");
String returnedOid = repositoryService.addObject(userType.asPrismObject(), null, result);
then("operation is successful and user row for it is created");
assertThatOperationResult(result).isSuccess();
assertThat(returnedOid).isEqualTo(userType.getOid());
QUser u = aliasFor(QUser.class);
MUser row = selectOne(u, u.nameOrig.eq(userName));
assertThat(row.oid).isEqualTo(UUID.fromString(returnedOid));
// normalized name is stored
assertThat(row.nameNorm).isNotNull();
// initial version is set, ignoring provided version
assertThat(row.version).isEqualTo(SqaleRepositoryService.INITIAL_VERSION_NUMBER);
// read-only column with value generated/stored in the database
assertThat(row.objectType).isEqualTo(MObjectType.USER);
// we don't store empty lists as empty arrays
assertThat(row.subtypes).isNull();
}
use of com.evolveum.midpoint.repo.sqale.qmodel.focus.QUser in project midpoint by Evolveum.
the class SqaleRepoAddDeleteObjectTest method test201AddObjectWithOidAndMultivalueContainers.
@Test
public void test201AddObjectWithOidAndMultivalueContainers() throws ObjectAlreadyExistsException, SchemaException {
OperationResult result = createOperationResult();
given("user with assignment and ref");
UUID providedOid = UUID.randomUUID();
String userName = "user" + getTestNumber();
String targetRef1 = UUID.randomUUID().toString();
String targetRef2 = UUID.randomUUID().toString();
UserType user = new UserType(prismContext).oid(providedOid.toString()).name(userName).assignment(new AssignmentType(prismContext).targetRef(targetRef1, RoleType.COMPLEX_TYPE)).assignment(new AssignmentType(prismContext).targetRef(targetRef2, RoleType.COMPLEX_TYPE));
when("adding it to the repository");
repositoryService.addObject(user.asPrismObject(), null, result);
then("object and its container rows are created and container IDs are assigned");
assertThatOperationResult(result).isSuccess();
QUser u = aliasFor(QUser.class);
List<MUser> users = select(u, u.nameOrig.eq(userName));
assertThat(users).hasSize(1);
MUser userRow = users.get(0);
assertThat(userRow.oid).isNotNull();
// next free container number
assertThat(userRow.containerIdSeq).isEqualTo(3);
QContainer<MContainer, ?> c = aliasFor(QContainer.CLASS);
List<MContainer> containers = select(c, c.ownerOid.eq(userRow.oid));
assertThat(containers).hasSize(2).allMatch(cRow -> cRow.ownerOid.equals(userRow.oid) && cRow.containerType == MContainerType.ASSIGNMENT).extracting(cRow -> cRow.cid).containsExactlyInAnyOrder(1L, 2L);
}
use of com.evolveum.midpoint.repo.sqale.qmodel.focus.QUser 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