33import com .objectcomputing .checkins .configuration .CheckInsConfiguration ;
44import com .objectcomputing .checkins .notifications .email .MailJetFactory ;
55import com .objectcomputing .checkins .services .MailJetFactoryReplacement ;
6+ import com .objectcomputing .checkins .services .SlackPosterReplacement ;
67import com .objectcomputing .checkins .services .TestContainersSuite ;
78import com .objectcomputing .checkins .services .fixture .KudosFixture ;
89import com .objectcomputing .checkins .services .fixture .TeamFixture ;
910import com .objectcomputing .checkins .services .fixture .RoleFixture ;
1011import com .objectcomputing .checkins .services .kudos .kudos_recipient .KudosRecipient ;
1112import com .objectcomputing .checkins .services .kudos .kudos_recipient .KudosRecipientServicesImpl ;
13+ import com .objectcomputing .checkins .services .memberprofile .MemberProfileUtils ;
1214import com .objectcomputing .checkins .services .memberprofile .MemberProfile ;
1315import com .objectcomputing .checkins .services .team .Team ;
1416import io .micronaut .core .type .Argument ;
3032import org .junit .jupiter .params .provider .CsvSource ;
3133import org .junit .jupiter .api .condition .DisabledInNativeImage ;
3234
35+ import com .fasterxml .jackson .databind .ObjectMapper ;
36+ import com .fasterxml .jackson .databind .node .JsonNodeType ;
37+ import com .fasterxml .jackson .databind .JsonNode ;
38+ import com .fasterxml .jackson .databind .node .ObjectNode ;
39+ import com .fasterxml .jackson .core .JsonProcessingException ;
40+
3341import java .time .LocalDate ;
3442import java .util .Collections ;
3543import java .util .List ;
44+ import java .util .Map ;
3645import java .util .Optional ;
3746import java .util .UUID ;
3847
5160// when attempting to post public Kudos to Slack.
5261@ DisabledInNativeImage
5362@ Property (name = "replace.mailjet.factory" , value = StringUtils .TRUE )
63+ @ Property (name = "replace.slackposter" , value = StringUtils .TRUE )
5464class KudosControllerTest extends TestContainersSuite implements KudosFixture , TeamFixture , RoleFixture {
5565 @ Inject
5666 @ Named (MailJetFactory .HTML_FORMAT )
5767 private MailJetFactoryReplacement .MockEmailSender emailSender ;
5868
69+ @ Inject
70+ private SlackPosterReplacement slackPoster ;
71+
5972 @ Inject
6073 @ Client ("/services/kudos" )
6174 HttpClient httpClient ;
@@ -93,6 +106,7 @@ void setUp() {
93106
94107 message = "Kudos!" ;
95108 emailSender .reset ();
109+ slackPoster .reset ();
96110 }
97111
98112 @ ParameterizedTest
@@ -210,7 +224,7 @@ void testCreateKudosWithEmptyRecipientMembers() {
210224 }
211225
212226 @ Test
213- void testApproveKudos () {
227+ void testApproveKudos () throws JsonProcessingException {
214228 Kudos kudos = createPublicKudos (senderId );
215229 assertNull (kudos .getDateApproved ());
216230 KudosRecipient recipient = createKudosRecipient (kudos .getId (), recipientMembers .getFirst ().getId ());
@@ -231,6 +245,52 @@ void testApproveKudos() {
231245 ),
232246 emailSender .events .getFirst ()
233247 );
248+
249+ // Check the posted slack block
250+ assertEquals (1 , slackPoster .posted .size ());
251+ ObjectMapper mapper = new ObjectMapper ();
252+ JsonNode posted = mapper .readTree (slackPoster .posted .get (0 ));
253+
254+ assertEquals (JsonNodeType .OBJECT , posted .getNodeType ());
255+ JsonNode blocks = posted .get ("blocks" );
256+ assertEquals (JsonNodeType .ARRAY , blocks .getNodeType ());
257+
258+ var iter = blocks .elements ();
259+ assertTrue (iter .hasNext ());
260+ JsonNode block = iter .next ();
261+
262+ assertEquals (JsonNodeType .OBJECT , block .getNodeType ());
263+ JsonNode elements = block .get ("elements" );
264+ assertEquals (JsonNodeType .ARRAY , elements .getNodeType ());
265+
266+ iter = elements .elements ();
267+ assertTrue (iter .hasNext ());
268+ JsonNode element = iter .next ();
269+
270+ assertEquals (JsonNodeType .OBJECT , element .getNodeType ());
271+ JsonNode innerElements = element .get ("elements" );
272+ assertEquals (JsonNodeType .ARRAY , innerElements .getNodeType ());
273+
274+ iter = innerElements .elements ();
275+ assertTrue (iter .hasNext ());
276+
277+ // The real SlackPoster will look up user ids in Slack and use those in
278+ // the posted message. Failing the lookup, it will use @<full name>.
279+ String from = "@" + MemberProfileUtils .getFullName (sender );
280+ String to = "@" + MemberProfileUtils .getFullName (recipientMembers .get (0 ));
281+ boolean foundFrom = false ;
282+ boolean foundTo = false ;
283+ while (iter .hasNext ()) {
284+ element = iter .next ();
285+ assertEquals (JsonNodeType .OBJECT , element .getNodeType ());
286+ String value = element .get ("text" ).asText ();
287+ if (value .equals (from )) {
288+ foundFrom = true ;
289+ } else if (value .equals (to )) {
290+ foundTo = true ;
291+ }
292+ }
293+ assertTrue (foundFrom && foundTo );
234294 }
235295
236296 @ Test
0 commit comments