3131public class ValidateEntryTest extends TestHandler {
3232
3333 private ValidateEntry validateEntry ;
34+
3435 private IQ publishRequest ;
3536 private Element publishEntry ;
3637 private IQ replyRequest ;
3738 private Element replyEntry ;
39+ private IQ targetRequest ;
40+ private Element targetEntry ;
41+
3842 private ChannelManager channelManager ;
3943
4044 JID jid = new JID ("juliet@shakespeare.lit/balcony" );
@@ -49,7 +53,10 @@ public void setUp() throws Exception {
4953 replyRequest = readStanzaAsIq ("/iq/pubsub/publish/reply.stanza" );
5054 replyEntry = replyRequest .getChildElement ().element ("publish" )
5155 .element ("item" ).element ("entry" );
52-
56+ targetRequest = readStanzaAsIq ("/iq/pubsub/publish/target.stanza" );
57+ targetEntry = targetRequest .getChildElement ().element ("publish" )
58+ .element ("item" ).element ("entry" );
59+
5360 channelManager = Mockito .mock (ChannelManager .class );
5461
5562 NodeItem item = new NodeItemImpl (node , "1" , new Date (), "<entry/>" );
@@ -214,7 +221,7 @@ public void geolocationEntryIsAdded() throws Exception {
214221 public void globalInReplyToIdIsMadeALocalId () throws Exception {
215222
216223 Assert .assertEquals (
217- "null@ channels.shakespeare.lit,/users/romeo@shakespeare.lit/posts,fc362eb42085f017ed9ccd9c4004b095" ,
224+ "tag: channels.shakespeare.lit,/users/romeo@shakespeare.lit/posts,fc362eb42085f017ed9ccd9c4004b095" ,
218225 replyEntry .element ("in-reply-to" ).attributeValue ("ref" ));
219226
220227 Element entry = (Element ) this .replyEntry .clone ();
@@ -320,4 +327,146 @@ public void canNotReplyToAReply() throws Exception {
320327 Assert .assertEquals (ValidateEntry .MAX_THREAD_DEPTH_EXCEEDED ,
321328 validateEntry .getErrorMessage ());
322329 }
330+
331+ @ Test
332+ public void targetElementWithoutInReplyToReturnsError () throws Exception {
333+
334+ NodeItem item = new NodeItemImpl (node , "2" , new Date (), "<entry/>" , "1" );
335+ Mockito .when (
336+ channelManager .getNodeItem (Mockito .eq (node ),
337+ Mockito .eq ("1" ))).thenReturn (item );
338+ Mockito .when (
339+ channelManager .getNodeItem (Mockito .eq (node ),
340+ Mockito .eq ("2" ))).thenReturn (null );
341+
342+ Element entry = (Element ) this .targetEntry .clone ();
343+
344+ entry .element ("in-reply-to" ).detach ();
345+ validateEntry = getEntryObject (entry );
346+
347+ Assert .assertFalse (validateEntry .isValid ());
348+ Assert .assertEquals (ValidateEntry .IN_REPLY_TO_MISSING ,
349+ validateEntry .getErrorMessage ());
350+ }
351+
352+ @ Test
353+ public void missingTargetIdElementReturnsError () throws Exception {
354+
355+ NodeItem item = new NodeItemImpl (node , "2" , new Date (), "<entry/>" );
356+ Mockito .when (
357+ channelManager .getNodeItem (Mockito .eq (node ),
358+ Mockito .eq ("1" ))).thenReturn (item );
359+ Mockito .when (
360+ channelManager .getNodeItem (Mockito .eq (node ),
361+ Mockito .eq ("2" ))).thenReturn (null );
362+
363+ Element entry = (Element ) this .targetEntry .clone ();
364+
365+ entry .element ("target" ).element ("id" ).detach ();
366+ validateEntry = getEntryObject (entry );
367+
368+ Assert .assertFalse (validateEntry .isValid ());
369+ Assert .assertEquals (ValidateEntry .MISSING_TARGET_ID ,
370+ validateEntry .getErrorMessage ());
371+ }
372+
373+ @ Test
374+ public void emptyTargetIdElementReturnsError () throws Exception {
375+
376+ NodeItem item = new NodeItemImpl (node , "2" , new Date (), "<entry/>" );
377+ Mockito .when (
378+ channelManager .getNodeItem (Mockito .eq (node ),
379+ Mockito .eq ("1" ))).thenReturn (item );
380+ Mockito .when (
381+ channelManager .getNodeItem (Mockito .eq (node ),
382+ Mockito .eq ("2" ))).thenReturn (null );
383+
384+ Element entry = (Element ) this .targetEntry .clone ();
385+
386+ entry .element ("target" ).element ("id" ).detach ();
387+ entry .element ("target" ).addElement ("id" );
388+ validateEntry = getEntryObject (entry );
389+
390+ Assert .assertFalse (validateEntry .isValid ());
391+ Assert .assertEquals (ValidateEntry .MISSING_TARGET_ID ,
392+ validateEntry .getErrorMessage ());
393+ }
394+
395+ @ Test
396+ public void ifTargetedPostDoesntExistErrorIsReturned () throws Exception {
397+
398+ NodeItem item = new NodeItemImpl (node , "1" , new Date (), "<entry/>" );
399+ Mockito .when (
400+ channelManager .getNodeItem (Mockito .eq (node ),
401+ Mockito .eq ("1" ))).thenReturn (item );
402+ Mockito .when (
403+ channelManager .getNodeItem (Mockito .eq (node ),
404+ Mockito .eq ("2" ))).thenReturn (null );
405+
406+ Element entry = (Element ) this .targetEntry .clone ();
407+ validateEntry = getEntryObject (entry );
408+
409+ Assert .assertFalse (validateEntry .isValid ());
410+ Assert .assertEquals (ValidateEntry .TARGETED_ITEM_NOT_FOUND ,
411+ validateEntry .getErrorMessage ());
412+ }
413+
414+ @ Test
415+ public void ifTargetedPostIsntInSameThreadErrorIsReturnedParentCheck () throws Exception {
416+ NodeItem item = new NodeItemImpl (node , "1" , new Date (), "<entry/>" );
417+ Mockito .when (
418+ channelManager .getNodeItem (Mockito .eq (node ),
419+ Mockito .eq ("1" ))).thenReturn (item );
420+ Mockito .when (
421+ channelManager .getNodeItem (Mockito .eq (node ),
422+ Mockito .eq ("2" ))).thenReturn (item );
423+
424+ Element entry = (Element ) this .targetEntry .clone ();
425+ validateEntry = getEntryObject (entry );
426+
427+ Assert .assertFalse (validateEntry .isValid ());
428+ Assert .assertEquals (ValidateEntry .TARGET_MUST_BE_IN_SAME_THREAD ,
429+ validateEntry .getErrorMessage ());
430+ }
431+
432+ @ Test
433+ public void ifTargetedPostIsntInSameThreadErrorIsReturnedThreadCheck () throws Exception {
434+
435+ NodeItem item1 = new NodeItemImpl (node , "1" , new Date (), "<entry/>" );
436+ NodeItem item2 = new NodeItemImpl (node , "B" , new Date (), "<entry/>" , "A" );
437+ Mockito .when (
438+ channelManager .getNodeItem (Mockito .eq (node ),
439+ Mockito .eq ("1" ))).thenReturn (item1 );
440+ Mockito .when (
441+ channelManager .getNodeItem (Mockito .eq (node ),
442+ Mockito .eq ("2" ))).thenReturn (item2 );
443+
444+ Element entry = (Element ) this .targetEntry .clone ();
445+ entry .element ("target" ).element ("id" ).setText ("B" );
446+ validateEntry = getEntryObject (entry );
447+
448+ Assert .assertFalse (validateEntry .isValid ());
449+ Assert .assertEquals (ValidateEntry .TARGET_MUST_BE_IN_SAME_THREAD ,
450+ validateEntry .getErrorMessage ());
451+ }
452+
453+
454+ @ Test
455+ public void ifTargetedIdIsSameAsReplyToIdOnlyOneDatabaseLookupPerformed () throws Exception {
456+ NodeItem item = new NodeItemImpl (node , "1" , new Date (), "<entry/>" );
457+ Mockito .when (
458+ channelManager .getNodeItem (Mockito .eq (node ),
459+ Mockito .eq ("1" ))).thenReturn (item );
460+
461+ Element entry = (Element ) this .targetEntry .clone ();
462+ entry .element ("target" ).element ("id" ).setText ("1" );
463+
464+ validateEntry = getEntryObject (entry );
465+
466+ validateEntry .isValid ();
467+
468+ Mockito .verify (channelManager , Mockito .times (1 )).getNodeItem (Mockito .eq (node ),
469+ Mockito .eq ("1" ));
470+ }
471+
323472}
0 commit comments