DATAJDBC-291 - Add failing test for setting ids in nested entities.

Original pull request: #158, #173.
This commit is contained in:
mhyeon-lee
2019-06-30 00:05:32 +09:00
committed by Mark Paluch
parent 4434a0f552
commit 2a0729d7fe

View File

@@ -41,12 +41,15 @@ public class AggregateChangeUnitTests {
DummyEntity entity = new DummyEntity();
Content content = new Content();
Tag tag = new Tag();
RelationalMappingContext context = new RelationalMappingContext();
RelationalConverter converter = new BasicRelationalConverter(context);
PersistentPropertyAccessor<DummyEntity> propertyAccessor = context.getRequiredPersistentEntity(DummyEntity.class)
.getPropertyAccessor(entity);
PersistentPropertyAccessor<Content> contentPropertyAccessor = context.getRequiredPersistentEntity(Content.class)
.getPropertyAccessor(content);
Object id = 23;
DbAction.WithEntity<?> rootInsert = new DbAction.InsertRoot<>(entity);
@@ -60,6 +63,12 @@ public class AggregateChangeUnitTests {
return insert;
}
DbAction.Insert<?> createDeepInsert(String propertyName, Object value, Object key, DbAction.Insert<?> parentInsert) {
DbAction.Insert<Object> insert = new DbAction.Insert<>(value, toPath(entity, value), parentInsert);
insert.getQualifiers().put(toPath(parentInsert.getPropertyPath().toDotPath() + "." + propertyName, DummyEntity.class), key);
return insert;
}
@Test // DATAJDBC-241
public void setIdForSimpleReference() {
@@ -115,6 +124,99 @@ public class AggregateChangeUnitTests {
.containsExactlyInAnyOrder(tuple("one", 23));
}
@Test // DATAJDBC-291
public void setIdForDeepReference() {
content.single = tag;
entity.single = content;
DbAction.Insert<?> parentInsert = createInsert("single", content, null);
DbAction.Insert<?> insert = createDeepInsert("single", tag, null, parentInsert);
AggregateChange.setIdOfNonRootEntity(context, converter, propertyAccessor, insert, id);
Content result = contentPropertyAccessor.getBean();
assertThat(result.single.id).isEqualTo(id);
}
@Test // DATAJDBC-291
public void setIdForDeepReferenceElementList() {
content.tagList.add(tag);
entity.single = content;
DbAction.Insert<?> parentInsert = createInsert("single", content, null);
DbAction.Insert<?> insert = createDeepInsert("tagList", tag, 0, parentInsert);
AggregateChange.setIdOfNonRootEntity(context, converter, propertyAccessor, insert, id);
Content result = contentPropertyAccessor.getBean();
assertThat(result.tagList).extracting(c -> c.id).containsExactlyInAnyOrder(23);
}
@Test // DATAJDBC-291
public void setIdForDeepElementSetElementSet() {
content.tagSet.add(tag);
entity.contentSet.add(content);
DbAction.Insert<?> parentInsert = createInsert("contentSet", content, null);
DbAction.Insert<?> insert = createDeepInsert("tagSet", tag, null, parentInsert);
AggregateChange.setIdOfNonRootEntity(context, converter, propertyAccessor, insert, id);
Content result = contentPropertyAccessor.getBean();
assertThat(result.tagSet).isNotNull();
assertThat(result.tagSet).extracting(c -> c == null ? "null" : c.id).containsExactlyInAnyOrder(23);
}
@Test // DATAJDBC-291
public void setIdForDeepElementListSingleReference() {
content.single = tag;
entity.contentList.add(content);
DbAction.Insert<?> parentInsert = createInsert("contentList", content, 0);
DbAction.Insert<?> insert = createDeepInsert("single", tag, null, parentInsert);
AggregateChange.setIdOfNonRootEntity(context, converter, propertyAccessor, insert, id);
Content result = contentPropertyAccessor.getBean();
assertThat(result.single.id).isEqualTo(id);
}
@Test // DATAJDBC-291
public void setIdForDeepElementListElementList() {
content.tagList.add(tag);
entity.contentList.add(content);
DbAction.Insert<?> parentInsert = createInsert("contentList", content, 0);
DbAction.Insert<?> insert = createDeepInsert("tagList", tag, 0, parentInsert);
AggregateChange.setIdOfNonRootEntity(context, converter, propertyAccessor, insert, id);
Content result = contentPropertyAccessor.getBean();
assertThat(result.tagList).extracting(c -> c.id).containsExactlyInAnyOrder(23);
}
@Test // DATAJDBC-291
public void setIdForDeepElementMapElementMap() {
content.tagMap.put("one", tag);
entity.contentMap.put("one", content);
DbAction.Insert<?> parentInsert = createInsert("contentMap", content, "one");
DbAction.Insert<?> insert = createDeepInsert("tagMap", tag, "one", parentInsert);
AggregateChange.setIdOfNonRootEntity(context, converter, propertyAccessor, insert, id);
Content result = contentPropertyAccessor.getBean();
assertThat(result.tagMap.entrySet()).extracting(e -> e.getKey(), e -> e.getValue().id)
.containsExactlyInAnyOrder(tuple("one", 23));
}
PersistentPropertyPath<RelationalPersistentProperty> toPath(String path, Class source) {
PersistentPropertyPaths<?, RelationalPersistentProperty> persistentPropertyPaths = context
@@ -123,6 +225,15 @@ public class AggregateChangeUnitTests {
return persistentPropertyPaths.filter(p -> p.toDotPath().equals(path)).stream().findFirst().orElse(null);
}
PersistentPropertyPath<RelationalPersistentProperty> toPath(DummyEntity root, Object pathValue) {
// DefaultPersistentPropertyPath is package-public
return new WritingContext(context, entity, new AggregateChange<>(AggregateChange.Kind.SAVE, DummyEntity.class, root))
.insert().stream().filter(a -> a instanceof DbAction.Insert).map(DbAction.Insert.class::cast)
.filter(a -> a.getEntity() == pathValue)
.map(DbAction.Insert::getPropertyPath)
.findFirst().orElse(null);
}
private static class DummyEntity {
@Id Integer rootId;
@@ -139,5 +250,17 @@ public class AggregateChangeUnitTests {
private static class Content {
@Id Integer id;
Tag single;
Set<Tag> tagSet = new HashSet<>();
List<Tag> tagList = new ArrayList<>();
Map<String, Tag> tagMap = new HashMap<>();
}
private static class Tag {
@Id Integer id;
}
}