Fixes 19073 : Resolve NullPointerException in MS Teams DQ template handling (#19062)

* fix: Resolve NullPointerException in MS Teams DQ template handling

* fix: Update DQ template logic to handle test case changes and results

Details:
Ensures a general template is created for any changes in the test case.
Generates a DQ template when the test case result is updated.

* refactor: Make testCaseResult as constant named TEST_CASE_RESULT
This commit is contained in:
Siddhant 2024-12-16 16:07:56 +05:30 committed by Siddhanttimeline
parent c75d453154
commit db2770fbb4

View File

@ -29,6 +29,7 @@ import org.openmetadata.common.utils.CommonUtil;
import org.openmetadata.schema.tests.TestCaseParameterValue;
import org.openmetadata.schema.type.ChangeEvent;
import org.openmetadata.schema.type.EntityReference;
import org.openmetadata.schema.type.FieldChange;
import org.openmetadata.schema.type.TagLabel;
import org.openmetadata.service.Entity;
import org.openmetadata.service.apps.bundles.changeEvent.msteams.TeamsMessage;
@ -41,6 +42,7 @@ import org.openmetadata.service.apps.bundles.changeEvent.msteams.TeamsMessage.Te
import org.openmetadata.service.exception.UnhandledServerException;
public class MSTeamsMessageDecorator implements MessageDecorator<TeamsMessage> {
private static final String TEST_CASE_RESULT = "testCaseResult";
@Override
public String getBold() {
@ -115,11 +117,25 @@ public class MSTeamsMessageDecorator implements MessageDecorator<TeamsMessage> {
String entityType = event.getEntityType();
return switch (entityType) {
case Entity.TEST_CASE -> createDQMessage(publisherName, event, outgoingMessage);
case Entity.TEST_CASE -> createTestCaseMessage(publisherName, event, outgoingMessage);
default -> createGeneralChangeEventMessage(publisherName, event, outgoingMessage);
};
}
private TeamsMessage createTestCaseMessage(
String publisherName, ChangeEvent event, OutgoingMessage outgoingMessage) {
List<FieldChange> fieldsAdded = event.getChangeDescription().getFieldsAdded();
List<FieldChange> fieldsUpdated = event.getChangeDescription().getFieldsUpdated();
boolean hasRelevantChange =
fieldsAdded.stream().anyMatch(field -> TEST_CASE_RESULT.equals(field.getName()))
|| fieldsUpdated.stream().anyMatch(field -> TEST_CASE_RESULT.equals(field.getName()));
return hasRelevantChange
? createDQMessage(event, outgoingMessage)
: createGeneralChangeEventMessage(publisherName, event, outgoingMessage);
}
private TeamsMessage createGeneralChangeEventMessage(
String publisherName, ChangeEvent event, OutgoingMessage outgoingMessage) {
@ -173,11 +189,9 @@ public class MSTeamsMessageDecorator implements MessageDecorator<TeamsMessage> {
return TeamsMessage.builder().type("message").attachments(List.of(attachment)).build();
}
private TeamsMessage createDQMessage(
String publisherName, ChangeEvent event, OutgoingMessage outgoingMessage) {
private TeamsMessage createDQMessage(ChangeEvent event, OutgoingMessage outgoingMessage) {
Map<DQ_Template_Section, Map<Enum<?>, Object>> dqTemplateData =
buildDQTemplateData(publisherName, event, outgoingMessage);
MessageDecorator.buildDQTemplateData(event, outgoingMessage);
TextBlock changeEventDetailsTextBlock = createHeader();
@ -569,33 +583,6 @@ public class MSTeamsMessageDecorator implements MessageDecorator<TeamsMessage> {
return builder.build();
}
// todo - complete buildDQTemplateData fn
private Map<DQ_Template_Section, Map<Enum<?>, Object>> buildDQTemplateData(
String publisherName, ChangeEvent event, OutgoingMessage outgoingMessage) {
TemplateDataBuilder<DQ_Template_Section> builder = new TemplateDataBuilder<>();
// Use DQ_Template_Section directly
builder
.add(
DQ_Template_Section.EVENT_DETAILS,
EventDetailsKeys.EVENT_TYPE,
event.getEventType().value())
.add(DQ_Template_Section.EVENT_DETAILS, EventDetailsKeys.UPDATED_BY, event.getUserName())
.add(DQ_Template_Section.EVENT_DETAILS, EventDetailsKeys.ENTITY_TYPE, event.getEntityType())
.add(
DQ_Template_Section.EVENT_DETAILS,
EventDetailsKeys.ENTITY_FQN,
MessageDecorator.getFQNForChangeEventEntity(event))
.add(
DQ_Template_Section.EVENT_DETAILS,
EventDetailsKeys.TIME,
new Date(event.getTimestamp()).toString())
.add(DQ_Template_Section.EVENT_DETAILS, EventDetailsKeys.OUTGOING_MESSAGE, outgoingMessage);
return builder.build();
}
private TextBlock createHeader() {
return TextBlock.builder()
.type("TextBlock")