Skip to content

Commit c412937

Browse files
authored
Merge pull request #1218 from atlanhq/APP-4639
Fixes latest integration tests
2 parents 92d3461 + 17e45be commit c412937

21 files changed

+1962
-70
lines changed

integration-tests/src/test/java/com/atlan/java/sdk/CustomAssetTest.java

+135-49
Original file line numberDiff line numberDiff line change
@@ -27,66 +27,135 @@ public class CustomAssetTest extends AtlanLiveTest {
2727

2828
public static final AtlanConnectorType CONNECTOR_TYPE = AtlanConnectorType.CUSTOM;
2929
public static final String CONNECTION_NAME = PREFIX;
30-
private static final String ENTITY_NAME = PREFIX + "-entity";
30+
private static final String PARENT_NAME = PREFIX + "-parent";
31+
private static final String CHILD_NAME1 = PREFIX + "-child1";
32+
private static final String CHILD_NAME2 = PREFIX + "-child2";
3133

3234
private static Connection connection = null;
33-
private static CustomEntity entity = null;
35+
private static CustomEntity parent = null;
36+
private static CustomEntity child1 = null;
37+
private static CustomEntity child2 = null;
3438

3539
@Test(groups = {"custom.create.connection"})
3640
void createConnection() throws AtlanException, InterruptedException {
3741
connection = ConnectionTest.createConnection(client, CONNECTION_NAME, CONNECTOR_TYPE);
3842
}
3943

4044
@Test(
41-
groups = {"custom.create.entity"},
45+
groups = {"custom.create.parent"},
4246
dependsOnGroups = {"custom.create.connection"})
43-
void createEntity() throws AtlanException {
44-
CustomEntity toCreate =
45-
CustomEntity.creator(ENTITY_NAME, connection.getQualifiedName()).build();
47+
void createParent() throws AtlanException {
48+
CustomEntity toCreate = CustomEntity.creator(PARENT_NAME, connection.getQualifiedName())
49+
.iconUrl("http://assets.atlan.com/assets/ph-bowl-food-light.svg")
50+
.subType("Fruit Salad")
51+
.build();
4652
AssetMutationResponse response = toCreate.save(client);
4753
Asset one = validateSingleCreate(response);
4854
assertTrue(one instanceof CustomEntity);
49-
entity = (CustomEntity) one;
50-
assertNotNull(entity.getGuid());
51-
assertNotNull(entity.getQualifiedName());
52-
assertEquals(entity.getName(), ENTITY_NAME);
53-
assertEquals(entity.getConnectorType(), CONNECTOR_TYPE);
54-
assertEquals(entity.getConnectionQualifiedName(), connection.getQualifiedName());
55+
parent = (CustomEntity) one;
56+
assertNotNull(parent.getGuid());
57+
assertNotNull(parent.getQualifiedName());
58+
assertEquals(parent.getName(), PARENT_NAME);
59+
assertEquals(parent.getConnectorType(), CONNECTOR_TYPE);
60+
assertEquals(parent.getConnectionQualifiedName(), connection.getQualifiedName());
5561
}
5662

5763
@Test(
58-
groups = {"custom.update.entity"},
59-
dependsOnGroups = {"custom.create.entity"})
60-
void updateEntity() throws AtlanException {
64+
groups = {"custom.create.children"},
65+
dependsOnGroups = {"custom.create.parent"})
66+
void createChildren() throws AtlanException {
67+
CustomEntity one = CustomEntity.creator(CHILD_NAME1, connection.getQualifiedName())
68+
.iconUrl("http://assets.atlan.com/assets/ph-apple-logo-light.svg")
69+
.subType("Apple")
70+
.customParentEntity(CustomEntity.refByGuid(parent.getGuid()))
71+
.build();
72+
CustomEntity two = CustomEntity.creator(CHILD_NAME2, connection.getQualifiedName())
73+
.iconUrl("http://assets.atlan.com/assets/ph-orange-slice-light.svg")
74+
.subType("Orange")
75+
.customParentEntity(CustomEntity.refByQualifiedName(parent.getQualifiedName()))
76+
.customRelatedToEntity(CustomEntity.refByGuid(one.getGuid()))
77+
.build();
78+
AssetMutationResponse response = client.assets.save(List.of(one, two), false);
79+
assertNotNull(response);
80+
assertNotNull(response.getUpdatedAssets());
81+
assertEquals(response.getUpdatedAssets().size(), 1);
82+
assertEquals(response.getUpdatedAssets().get(0).getGuid(), parent.getGuid());
83+
assertNotNull(response.getCreatedAssets());
84+
assertEquals(response.getCreatedAssets().size(), 2);
85+
for (Asset asset : response.getCreatedAssets()) {
86+
assertTrue(asset instanceof CustomEntity);
87+
assertNotNull(asset.getGuid());
88+
assertNotNull(asset.getQualifiedName());
89+
assertEquals(asset.getConnectorType(), CONNECTOR_TYPE);
90+
assertEquals(asset.getConnectionQualifiedName(), connection.getQualifiedName());
91+
if (asset.getName().equals(CHILD_NAME1)) {
92+
child1 = (CustomEntity) asset;
93+
} else if (asset.getName().equals(CHILD_NAME2)) {
94+
child2 = (CustomEntity) asset;
95+
} else {
96+
throw new IllegalStateException("Created entity did not match either we attempted to create.");
97+
}
98+
}
99+
}
100+
101+
@Test(
102+
groups = {"custom.update.parent"},
103+
dependsOnGroups = {"custom.create.*"})
104+
void updateParent() throws AtlanException {
61105
CustomEntity updated = CustomEntity.updateCertificate(
62-
client, entity.getQualifiedName(), CERTIFICATE_STATUS, CERTIFICATE_MESSAGE);
106+
client, parent.getQualifiedName(), CERTIFICATE_STATUS, CERTIFICATE_MESSAGE);
63107
assertNotNull(updated);
64108
assertEquals(updated.getCertificateStatus(), CERTIFICATE_STATUS);
65109
assertEquals(updated.getCertificateStatusMessage(), CERTIFICATE_MESSAGE);
66110
updated = CustomEntity.updateAnnouncement(
67-
client, entity.getQualifiedName(), ANNOUNCEMENT_TYPE, ANNOUNCEMENT_TITLE, ANNOUNCEMENT_MESSAGE);
111+
client, parent.getQualifiedName(), ANNOUNCEMENT_TYPE, ANNOUNCEMENT_TITLE, ANNOUNCEMENT_MESSAGE);
68112
assertNotNull(updated);
69113
assertEquals(updated.getAnnouncementType(), ANNOUNCEMENT_TYPE);
70114
assertEquals(updated.getAnnouncementTitle(), ANNOUNCEMENT_TITLE);
71115
assertEquals(updated.getAnnouncementMessage(), ANNOUNCEMENT_MESSAGE);
72116
}
73117

74118
@Test(
75-
groups = {"custom.read.entity"},
76-
dependsOnGroups = {"custom.create.*", "custom.update.entity"})
77-
void retrieveEntity() throws AtlanException {
78-
CustomEntity c = CustomEntity.get(client, entity.getGuid(), true);
119+
groups = {"custom.read.parent"},
120+
dependsOnGroups = {"custom.create.*", "custom.update.parent"})
121+
void retrieveParent() throws AtlanException {
122+
CustomEntity c = CustomEntity.get(client, parent.getGuid(), true);
79123
assertNotNull(c);
80124
assertTrue(c.isComplete());
81-
assertEquals(c.getGuid(), entity.getGuid());
82-
assertEquals(c.getQualifiedName(), entity.getQualifiedName());
83-
assertEquals(c.getName(), ENTITY_NAME);
125+
assertEquals(c.getGuid(), parent.getGuid());
126+
assertEquals(c.getQualifiedName(), parent.getQualifiedName());
127+
assertEquals(c.getName(), PARENT_NAME);
84128
assertEquals(c.getCertificateStatus(), CERTIFICATE_STATUS);
129+
assertEquals(c.getCustomChildEntities().size(), 2);
130+
assertEquals(c.getSubType(), "Fruit Salad");
131+
assertEquals(c.getIconUrl(), "http://assets.atlan.com/assets/ph-bowl-food-light.svg");
132+
}
133+
134+
@Test(
135+
groups = {"custom.read.child1"},
136+
dependsOnGroups = {"custom.create.*", "custom.update.parent"})
137+
void retrieveChild1() throws AtlanException {
138+
CustomEntity c = CustomEntity.get(client, child1.getGuid(), true);
139+
assertNotNull(c);
140+
assertTrue(c.isComplete());
141+
assertEquals(c.getGuid(), child1.getGuid());
142+
assertEquals(c.getQualifiedName(), child1.getQualifiedName());
143+
assertEquals(c.getName(), CHILD_NAME1);
144+
assertTrue(
145+
c.getCustomChildEntities() == null || c.getCustomChildEntities().isEmpty());
146+
assertNotNull(c.getCustomParentEntity());
147+
assertEquals(c.getCustomParentEntity().getGuid(), parent.getGuid());
148+
assertFalse(c.getCustomRelatedFromEntities() == null
149+
|| c.getCustomRelatedFromEntities().isEmpty());
150+
assertEquals(c.getCustomRelatedFromEntities().size(), 1);
151+
assertEquals(c.getCustomRelatedFromEntities().first().getGuid(), child2.getGuid());
152+
assertEquals(c.getSubType(), "Apple");
153+
assertEquals(c.getIconUrl(), "http://assets.atlan.com/assets/ph-apple-logo-light.svg");
85154
}
86155

87156
@Test(
88157
groups = {"custom.search.assets"},
89-
dependsOnGroups = {"custom.read.entity"})
158+
dependsOnGroups = {"custom.read.*"})
90159
void searchAssets() throws AtlanException, InterruptedException {
91160
IndexSearchRequest index = client.assets
92161
.select()
@@ -95,11 +164,12 @@ void searchAssets() throws AtlanException, InterruptedException {
95164
.pageSize(10)
96165
.aggregate("type", IReferenceable.TYPE_NAME.bucketBy())
97166
.sort(Asset.CREATE_TIME.order(SortOrder.Asc))
167+
.sort(Asset.NAME.order(SortOrder.Asc))
98168
.includeOnResults(Asset.NAME)
99169
.includeOnResults(Asset.CONNECTION_QUALIFIED_NAME)
100170
.toRequest();
101171

102-
IndexSearchResponse response = retrySearchUntil(index, 9L);
172+
IndexSearchResponse response = retrySearchUntil(index, 3L);
103173

104174
assertNotNull(response.getAggregations());
105175
assertEquals(response.getAggregations().size(), 1);
@@ -108,7 +178,7 @@ void searchAssets() throws AtlanException, InterruptedException {
108178
((AggregationBucketResult) response.getAggregations().get("type"))
109179
.getBuckets()
110180
.size(),
111-
3);
181+
1);
112182

113183
assertEquals(response.getApproximateCount().longValue(), 3L);
114184
List<Asset> entities = response.getAssets();
@@ -119,62 +189,78 @@ void searchAssets() throws AtlanException, InterruptedException {
119189
assertTrue(one instanceof CustomEntity);
120190
assertFalse(one.isComplete());
121191
CustomEntity d = (CustomEntity) one;
122-
assertEquals(d.getQualifiedName(), entity.getQualifiedName());
123-
assertEquals(d.getName(), entity.getName());
192+
assertEquals(d.getQualifiedName(), parent.getQualifiedName());
193+
assertEquals(d.getName(), parent.getName());
194+
assertEquals(d.getConnectionQualifiedName(), connection.getQualifiedName());
195+
196+
one = entities.get(1);
197+
assertTrue(one instanceof CustomEntity);
198+
assertFalse(one.isComplete());
199+
d = (CustomEntity) one;
200+
assertEquals(d.getQualifiedName(), child1.getQualifiedName());
201+
assertEquals(d.getName(), child1.getName());
202+
assertEquals(d.getConnectionQualifiedName(), connection.getQualifiedName());
203+
204+
one = entities.get(2);
205+
assertTrue(one instanceof CustomEntity);
206+
assertFalse(one.isComplete());
207+
d = (CustomEntity) one;
208+
assertEquals(d.getQualifiedName(), child2.getQualifiedName());
209+
assertEquals(d.getName(), child2.getName());
124210
assertEquals(d.getConnectionQualifiedName(), connection.getQualifiedName());
125211
}
126212

127213
@Test(
128-
groups = {"custom.delete.entity"},
214+
groups = {"custom.delete.child2"},
129215
dependsOnGroups = {"custom.update.*", "custom.search.*"})
130-
void deleteEntity() throws AtlanException {
131-
AssetMutationResponse response = Asset.delete(client, entity.getGuid()).block();
216+
void deleteChild2() throws AtlanException {
217+
AssetMutationResponse response = Asset.delete(client, child2.getGuid()).block();
132218
assertNotNull(response);
133219
assertTrue(response.getCreatedAssets().isEmpty());
134220
assertTrue(response.getUpdatedAssets().isEmpty());
135221
assertEquals(response.getDeletedAssets().size(), 1);
136222
Asset one = response.getDeletedAssets().get(0);
137223
assertTrue(one instanceof CustomEntity);
138224
CustomEntity s = (CustomEntity) one;
139-
assertEquals(s.getGuid(), entity.getGuid());
140-
assertEquals(s.getQualifiedName(), entity.getQualifiedName());
225+
assertEquals(s.getGuid(), child2.getGuid());
226+
assertEquals(s.getQualifiedName(), child2.getQualifiedName());
141227
assertEquals(s.getDeleteHandler(), "SOFT");
142228
assertEquals(s.getStatus(), AtlanStatus.DELETED);
143229
}
144230

145231
@Test(
146-
groups = {"custom.delete.entity.read"},
147-
dependsOnGroups = {"custom.delete.entity"})
232+
groups = {"custom.delete.child2.read"},
233+
dependsOnGroups = {"custom.delete.child2"})
148234
void readDeletedEntity() throws AtlanException {
149-
validateDeletedAsset(entity, log);
235+
validateDeletedAsset(child2, log);
150236
}
151237

152238
@Test(
153-
groups = {"custom.delete.entity.restore"},
154-
dependsOnGroups = {"custom.delete.entity.read"})
239+
groups = {"custom.delete.child2.restore"},
240+
dependsOnGroups = {"custom.delete.child2.read"})
155241
void restoreEntity() throws AtlanException {
156-
assertTrue(CustomEntity.restore(client, entity.getQualifiedName()));
157-
CustomEntity restored = CustomEntity.get(client, entity.getQualifiedName());
242+
assertTrue(CustomEntity.restore(client, child2.getQualifiedName()));
243+
CustomEntity restored = CustomEntity.get(client, child2.getQualifiedName());
158244
assertFalse(restored.isComplete());
159-
assertEquals(restored.getGuid(), entity.getGuid());
160-
assertEquals(restored.getQualifiedName(), entity.getQualifiedName());
245+
assertEquals(restored.getGuid(), child2.getGuid());
246+
assertEquals(restored.getQualifiedName(), child2.getQualifiedName());
161247
assertEquals(restored.getStatus(), AtlanStatus.ACTIVE);
162248
}
163249

164250
@Test(
165-
groups = {"custom.purge.entity"},
166-
dependsOnGroups = {"custom.delete.entity.restore"})
251+
groups = {"custom.purge.child2"},
252+
dependsOnGroups = {"custom.delete.child2.restore"})
167253
void purgeEntity() throws AtlanException {
168-
AssetMutationResponse response = Asset.purge(client, entity.getGuid()).block();
254+
AssetMutationResponse response = Asset.purge(client, child2.getGuid()).block();
169255
assertNotNull(response);
170256
assertTrue(response.getCreatedAssets().isEmpty());
171257
assertTrue(response.getUpdatedAssets().isEmpty());
172258
assertEquals(response.getDeletedAssets().size(), 1);
173259
Asset one = response.getDeletedAssets().get(0);
174260
assertTrue(one instanceof CustomEntity);
175261
CustomEntity s = (CustomEntity) one;
176-
assertEquals(s.getGuid(), entity.getGuid());
177-
assertEquals(s.getQualifiedName(), entity.getQualifiedName());
262+
assertEquals(s.getGuid(), child2.getGuid());
263+
assertEquals(s.getQualifiedName(), child2.getQualifiedName());
178264
assertEquals(s.getDeleteHandler(), "PURGE");
179265
assertEquals(s.getStatus(), AtlanStatus.DELETED);
180266
}
@@ -186,7 +272,7 @@ void purgeEntity() throws AtlanException {
186272
"custom.read.*",
187273
"custom.search.*",
188274
"custom.update.*",
189-
"custom.purge.entity"
275+
"custom.purge.child2"
190276
},
191277
alwaysRun = true)
192278
void purgeConnection() throws AtlanException, InterruptedException {

integration-tests/src/test/java/com/atlan/java/sdk/DataverseAssetTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ void searchAssets() throws AtlanException, InterruptedException {
134134
.includeOnResults(Asset.CONNECTION_QUALIFIED_NAME)
135135
.toRequest();
136136

137-
IndexSearchResponse response = retrySearchUntil(index, 9L);
137+
IndexSearchResponse response = retrySearchUntil(index, 2L);
138138

139139
assertNotNull(response.getAggregations());
140140
assertEquals(response.getAggregations().size(), 1);
@@ -143,12 +143,12 @@ void searchAssets() throws AtlanException, InterruptedException {
143143
((AggregationBucketResult) response.getAggregations().get("type"))
144144
.getBuckets()
145145
.size(),
146-
9);
146+
2);
147147

148-
assertEquals(response.getApproximateCount().longValue(), 9L);
148+
assertEquals(response.getApproximateCount().longValue(), 2L);
149149
List<Asset> entities = response.getAssets();
150150
assertNotNull(entities);
151-
assertEquals(entities.size(), 9);
151+
assertEquals(entities.size(), 2);
152152

153153
Asset one = entities.get(0);
154154
assertTrue(one instanceof DataverseEntity);

sdk/src/main/java/com/atlan/model/assets/Asset.java

+3
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,9 @@ public abstract class Asset extends Reference implements IAsset, IReferenceable
798798
@Singular
799799
SortedSet<String> viewerUsers;
800800

801+
/** URL of an icon to use for this asset. (Only applies to CustomEntity and Fivetran Catalog assets, currently.) */
802+
transient String iconUrl;
803+
801804
/** Internal tracking of fields that should be serialized with null values. */
802805
@JsonIgnore
803806
@Singular

sdk/src/main/java/com/atlan/model/assets/DataverseAttribute.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -361,10 +361,10 @@ public static boolean restore(AtlanClient client, String qualifiedName) throws A
361361
/**
362362
* Builds the minimal object necessary to create a DataverseAttribute.
363363
*
364-
* @param name of the DataverseAttribute
365-
* @param entity in which DataverseAttribute should be created, which must have at least
364+
* @param name of the attribute
365+
* @param entity in which the attribute should be created, which must have at least
366366
* a qualifiedName
367-
* @return the minimal request necessary to create the DataverseAttribute, as a builder
367+
* @return the minimal request necessary to create the attribute, as a builder
368368
* @throws InvalidRequestException if the entity provided is without a qualifiedName
369369
*/
370370
public static DataverseAttribute.DataverseAttributeBuilder<?, ?> creator(String name, DataverseEntity entity)
@@ -381,7 +381,7 @@ public static boolean restore(AtlanClient client, String qualifiedName) throws A
381381
/**
382382
* Builds the minimal object necessary to create a DataverseAttribute.
383383
*
384-
* @param name of the DataverseAttribute
384+
* @param name of the attribute
385385
* @param entityQualifiedName unique name of the entity in which this attribute exists
386386
* @return the minimal request necessary to create the attribute, as a builder
387387
*/
@@ -394,7 +394,7 @@ public static boolean restore(AtlanClient client, String qualifiedName) throws A
394394
/**
395395
* Builds the minimal object necessary to create a DataverseAttribute.
396396
*
397-
* @param name of the DataverseAttribute
397+
* @param name of the attribute
398398
* @param connectionQualifiedName unique name of the connection in which to create the attribute
399399
* @param entityQualifiedName unique name of the entity in which to create the attribute
400400
* @return the minimal request necessary to create the attribute, as a builder

sdk/src/main/java/com/atlan/model/assets/DataverseEntity.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -348,11 +348,11 @@ public static boolean restore(AtlanClient client, String qualifiedName) throws A
348348
}
349349

350350
/**
351-
* Builds the minimal object necessary to create a DataverseEntity.
351+
* Builds the minimal object necessary to create a Dataverse entity.
352352
*
353-
* @param name of the DataverseEntity
354-
* @param connectionQualifiedName unique name of the connection through which the DataverseEntity is accessible
355-
* @return the minimal object necessary to create the DataverseEntity, as a builder
353+
* @param name of the Dataverse entity
354+
* @param connectionQualifiedName unique name of the connection through which the entity is accessible
355+
* @return the minimal object necessary to create the Dataverse entity, as a builder
356356
*/
357357
public static DataverseEntity.DataverseEntityBuilder<?, ?> creator(String name, String connectionQualifiedName) {
358358
return DataverseEntity._internal()

sdk/src/main/java/com/atlan/model/assets/ICatalog.java

+3
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,9 @@ public static ICatalog getLineageReference(String typeName, String qualifiedName
467467
case PowerBIDataflow.TYPE_NAME:
468468
ref = PowerBIDataflow.refByQualifiedName(qualifiedName);
469469
break;
470+
case PowerBIDataflowEntityColumn.TYPE_NAME:
471+
ref = PowerBIDataflowEntityColumn.refByQualifiedName(qualifiedName);
472+
break;
470473
case PowerBIDataset.TYPE_NAME:
471474
ref = PowerBIDataset.refByQualifiedName(qualifiedName);
472475
break;

0 commit comments

Comments
 (0)