@@ -14,6 +14,7 @@ import (
14
14
15
15
cache "github.com/go-pkgz/lcw"
16
16
R "github.com/go-pkgz/rest"
17
+ "github.com/google/uuid"
17
18
"github.com/stretchr/testify/assert"
18
19
"github.com/stretchr/testify/require"
19
20
@@ -598,7 +599,7 @@ func TestPublic_FindCommentsCtrl_ConsistentCount(t *testing.T) {
598
599
setScore (commentLocator , ids [4 ], - 3 )
599
600
time .Sleep (time .Millisecond * 5 )
600
601
601
- c6 := store.Comment {Text : "third-level comment 2" , ParentID : ids [4 ], Locator : commentLocator }
602
+ c6 := store.Comment {Text : "deleted third-level comment 2" , ParentID : ids [4 ], Locator : commentLocator }
602
603
ids [5 ], timestamps [5 ] = addCommentGetCreatedTime (t , c6 , ts )
603
604
// deleted later so not visible in site-wide requests
604
605
setScore (commentLocator , ids [5 ], 10 )
@@ -612,7 +613,7 @@ func TestPublic_FindCommentsCtrl_ConsistentCount(t *testing.T) {
612
613
setScore (commentLocator , ids [6 ], 1 )
613
614
time .Sleep (time .Millisecond * 5 )
614
615
615
- c8 := store.Comment {Text : "second-level comment 3" , ParentID : ids [6 ], Locator : commentLocator }
616
+ c8 := store.Comment {Text : "deleted second-level comment 3" , ParentID : ids [6 ], Locator : commentLocator }
616
617
ids [7 ], timestamps [7 ] = addCommentGetCreatedTime (t , c8 , ts )
617
618
// deleted later so not visible in site-wide requests
618
619
setScore (commentLocator , ids [7 ], - 20 )
@@ -636,24 +637,24 @@ func TestPublic_FindCommentsCtrl_ConsistentCount(t *testing.T) {
636
637
sinceTS [i ] = strconv .FormatInt (created .UnixNano ()/ 1000000 , 10 )
637
638
formattedTS [i ] = created .Format (time .RFC3339Nano )
638
639
}
639
- t .Logf ("last timestamp: %v" , timestamps [7 ])
640
640
641
641
testCases := []struct {
642
642
params string
643
643
expectedBody string
644
644
}{
645
- {"" , fmt .Sprintf (`"info":{"count":7,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
646
- {"url=test-url" , fmt .Sprintf (`"info":{"url":"test-url","count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
647
- {"format=plain" , fmt .Sprintf (`"info":{"count":7,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
648
- {"format=plain&url=test-url" , fmt .Sprintf (`"info":{"url":"test-url","count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
649
- {"since=" + sinceTenSecondsAgo , fmt .Sprintf (`"info":{"count":7,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
650
- {"url=test-url&since=" + sinceTenSecondsAgo , fmt .Sprintf (`"info":{"url":"test-url","count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
651
- {"since=" + sinceTS [0 ], fmt .Sprintf (`"info":{"count":7,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
652
- {"url=test-url&since=" + sinceTS [0 ], fmt .Sprintf (`"info":{"url":"test-url","count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
653
- {"since=" + sinceTS [1 ], fmt .Sprintf (`"info":{"count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
654
- {"url=test-url&since=" + sinceTS [1 ], fmt .Sprintf (`"info":{"url":"test-url","count":5,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
655
- {"since=" + sinceTS [4 ], fmt .Sprintf (`"info":{"count":3,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
656
- {"url=test-url&since=" + sinceTS [4 ], fmt .Sprintf (`"info":{"url":"test-url","count":2,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
645
+ // test parameters url, format, since, sort
646
+ {"" , fmt .Sprintf (`"info":{"count":7,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
647
+ {"url=test-url" , fmt .Sprintf (`"info":{"url":"test-url","count":6,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
648
+ {"format=plain" , fmt .Sprintf (`"info":{"count":7,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
649
+ {"format=plain&url=test-url" , fmt .Sprintf (`"info":{"url":"test-url","count":6,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
650
+ {"since=" + sinceTenSecondsAgo , fmt .Sprintf (`"info":{"count":7,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
651
+ {"url=test-url&since=" + sinceTenSecondsAgo , fmt .Sprintf (`"info":{"url":"test-url","count":6,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
652
+ {"since=" + sinceTS [0 ], fmt .Sprintf (`"info":{"count":7,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
653
+ {"url=test-url&since=" + sinceTS [0 ], fmt .Sprintf (`"info":{"url":"test-url","count":6,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
654
+ {"since=" + sinceTS [1 ], fmt .Sprintf (`"info":{"count":6,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
655
+ {"url=test-url&since=" + sinceTS [1 ], fmt .Sprintf (`"info":{"url":"test-url","count":5,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
656
+ {"since=" + sinceTS [4 ], fmt .Sprintf (`"info":{"count":3,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
657
+ {"url=test-url&since=" + sinceTS [4 ], fmt .Sprintf (`"info":{"url":"test-url","count":2,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
657
658
{"format=tree" , `"info":{"count":7` },
658
659
{"format=tree&url=test-url" , `"info":{"url":"test-url","count":6` },
659
660
{"format=tree&sort=+time" , `"info":{"count":7` },
@@ -672,17 +673,101 @@ func TestPublic_FindCommentsCtrl_ConsistentCount(t *testing.T) {
672
673
{"sort=+controversy&url=test-url&since=" + sinceTS [5 ], fmt .Sprintf (`"score":-2,"vote":0,"controversy":1.5874010519681994,"time":%q}],"info":{"url":"test-url","count":1` , formattedTS [6 ])},
673
674
// three comments of which last one deleted and doesn't have controversy so returned last
674
675
{"sort=-controversy&url=test-url&since=" + sinceTS [5 ], fmt .Sprintf (`"score":0,"vote":0,"time":%q,"delete":true}],"info":{"url":"test-url","count":1` , formattedTS [7 ])},
676
+
677
+ // test parameters limit, offset_id for format=plain
678
+ {"limit=bad" , `{"code":1,"details":"bad limit value","error":"strconv.Atoi: parsing \"bad\": invalid syntax"}` },
679
+ {"offset_id=bad" , `{"code":1,"details":"bad offset_id value","error":"invalid UUID length: 3"}` },
680
+ {"limit=2" , `"info":{"count":7,"count_left":5,"last_comment":"` + ids [1 ]},
681
+ {"limit=6" , `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
682
+ {"limit=7" , `"info":{"count":7,"count_left":0,"last_comment":"` + ids [8 ]},
683
+ {"limit=2&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":6,"last_comment":"` + ids [1 ]},
684
+ {"limit=6&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":2,"last_comment":"` + ids [5 ]},
685
+ {"limit=7&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":1,"last_comment":"` + ids [6 ]},
686
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [2 ]), `"info":{"count":7,"count_left":2,"last_comment":"` + ids [4 ]},
687
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [3 ]), `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
688
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [4 ]), `"info":{"count":7,"count_left":0` },
689
+ {fmt .Sprintf ("limit=1&offset_id=%s" , ids [6 ]), `"info":{"count":7,"count_left":0` },
690
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [8 ]), `"info":{"count":7,"count_left":0` },
691
+ {fmt .Sprintf ("limit=2&url=test-url&offset_id=%s" , ids [2 ]), `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [4 ]},
692
+ {fmt .Sprintf ("limit=2&url=test-url&offset_id=%s" , ids [3 ]), `"info":{"url":"test-url","count":6,"count_left":2,"last_comment":"` + ids [5 ]},
693
+ {fmt .Sprintf ("limit=2&url=test-url&offset_id=%s" , ids [4 ]), `"info":{"url":"test-url","count":6,"count_left":1,"last_comment":"` + ids [6 ]},
694
+ {fmt .Sprintf ("limit=1&url=test-url&offset_id=%s" , ids [6 ]), `"info":{"url":"test-url","count":6,"count_left":0,"last_comment":"` + ids [7 ]},
695
+ {fmt .Sprintf ("limit=2&url=test-url&offset_id=%s" , ids [8 ]), `"info":{"url":"test-url","count":6,"count_left":6,` },
696
+ // deleted comment, offset is ignored in site-wide request but not for particular URL
697
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [5 ]), `"info":{"count":7,"count_left":5,"last_comment":"` + ids [1 ]},
698
+ {fmt .Sprintf ("limit=2&url=test-url&offset_id=%s" , ids [5 ]), `"info":{"url":"test-url","count":6,"count_left":0,"last_comment":"` + ids [7 ]},
699
+ // non-existing comment, offset is ignored, deleted comments included into request with "url"
700
+ {fmt .Sprintf ("limit=1&offset_id=%s" , uuid .New ().String ()), `"info":{"count":7,"count_left":6,"last_comment":"` + ids [0 ]},
701
+ {fmt .Sprintf ("limit=1&url=test-url&offset_id=%s" , uuid .New ().String ()), `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [0 ]},
702
+ // since is ignored for tree format, so we test it only for plain
703
+ {"limit=6&since=" + sinceTenSecondsAgo , `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
704
+ {"limit=1&since=" + sinceTS [4 ], `"info":{"count":3,"count_left":2,"last_comment":"` + ids [4 ]},
705
+ {"limit=6&url=test-url&since=" + sinceTenSecondsAgo , `"info":{"url":"test-url","count":6,"count_left":2,"last_comment":"` + ids [5 ]},
706
+ {"limit=1&url=test-url&since=" + sinceTS [4 ], `"info":{"url":"test-url","count":2,"count_left":3,"last_comment":"` + ids [4 ]},
707
+ // start with deleted comment timestamp
708
+ {"limit=1&since=" + sinceTS [5 ], `"info":{"count":2,"count_left":1,"last_comment":"` + ids [6 ]},
709
+ {"limit=1&since=" + sinceTS [6 ], `"info":{"count":2,"count_left":1,"last_comment":"` + ids [6 ]},
710
+ {"limit=1&url=test-url&since=" + sinceTS [5 ], `"info":{"url":"test-url","count":1,"count_left":2,"last_comment":"` + ids [5 ]},
711
+ {"limit=1&url=test-url&since=" + sinceTS [6 ], `"info":{"url":"test-url","count":1,"count_left":1,"last_comment":"` + ids [6 ]},
712
+ // test sort
713
+ {"limit=1&sort=+time&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [0 ]},
714
+ {"limit=1&sort=-time&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [7 ]},
715
+ {"limit=1&sort=+score&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [6 ]},
716
+ {"limit=1&sort=-score&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [2 ]},
717
+ {"limit=1&sort=+controversy&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [0 ]},
718
+ {"limit=1&sort=-controversy&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [3 ]},
719
+
720
+ // test parameters limit, offset_id for format=tree
721
+ {"format=tree&limit=bad" , `{"code":1,"details":"bad limit value","error":"strconv.Atoi: parsing \"bad\": invalid syntax"}` },
722
+ {"format=tree&offset_id=bad" , `{"code":1,"details":"bad offset_id value","error":"invalid UUID length: 3"}` },
723
+ {"format=tree&limit=2" , `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
724
+ {"format=tree&limit=6" , `"info":{"count":7,"count_left":2,"last_comment":"` + ids [1 ]},
725
+ {"format=tree&limit=7" , `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
726
+ {"format=tree&url=test-url&limit=2" , `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
727
+ {"format=tree&url=test-url&limit=6" , `"info":{"url":"test-url","count":6,"count_left":1,"last_comment":"` + ids [1 ]},
728
+ {"format=tree&url=test-url&limit=7" , `"info":{"url":"test-url","count":6,"count_left":0,"last_comment":"` + ids [6 ]},
729
+ // start after first top-level comment
730
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [0 ]), `"info":{"count":7,"count_left":2,"last_comment":"` + ids [1 ]},
731
+ {fmt .Sprintf ("format=tree&url=test-url&limit=2&offset_id=%s" , ids [0 ]), `"info":{"url":"test-url","count":6,"count_left":1,"last_comment":"` + ids [1 ]},
732
+ // start after second top-level comment
733
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [1 ]), `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
734
+ {fmt .Sprintf ("format=tree&url=test-url&limit=2&offset_id=%s" , ids [1 ]), `"info":{"url":"test-url","count":6,"count_left":0,"last_comment":"` + ids [6 ]},
735
+ // start after third top-level comment, so expect comment to post 2, or no comments on post 1 if "url" is set
736
+ {fmt .Sprintf ("format=tree&limit=1&offset_id=%s" , ids [6 ]), `"info":{"count":7,"count_left":0,"last_comment":"` + ids [8 ]},
737
+ {fmt .Sprintf ("format=tree&url=test-url&limit=1&offset_id=%s" , ids [6 ]), `"info":{"url":"test-url","count":6,"count_left":0` },
738
+ // non-root comment IDs or non-existing IDs are ignored
739
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [2 ]), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
740
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [3 ]), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
741
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [4 ]), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
742
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [7 ]), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
743
+ {fmt .Sprintf ("format=tree&limit=1&offset_id=%s" , uuid .New ().String ()), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
744
+ {fmt .Sprintf ("format=tree&url=test-url&limit=2&offset_id=%s" , ids [2 ]), `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
745
+ {fmt .Sprintf ("format=tree&url=test-url&limit=2&offset_id=%s" , ids [3 ]), `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
746
+ {fmt .Sprintf ("format=tree&url=test-url&limit=2&offset_id=%s" , ids [4 ]), `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
747
+ {fmt .Sprintf ("format=tree&url=test-url&limit=2&offset_id=%s" , ids [7 ]), `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
748
+ {fmt .Sprintf ("format=tree&url=test-url&limit=1&offset_id=%s" , uuid .New ().String ()), `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
749
+ // test sort
750
+ {"format=tree&limit=1&sort=+time&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
751
+ {"format=tree&limit=1&sort=-time&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":5,"last_comment":"` + ids [6 ]},
752
+ {"format=tree&limit=1&sort=+score&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":5,"last_comment":"` + ids [6 ]},
753
+ {"format=tree&limit=1&sort=-score&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":4,"last_comment":"` + ids [1 ]},
754
+ {"format=tree&limit=1&sort=+controversy&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
755
+ {"format=tree&limit=1&sort=-controversy&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":5,"last_comment":"` + ids [6 ]},
675
756
}
676
757
677
758
for _ , tc := range testCases {
678
759
t .Run (tc .params , func (t * testing.T ) {
679
760
url := fmt .Sprintf (ts .URL + "/api/v1/find?site=remark42&%s" , tc .params )
680
761
body , code := get (t , url )
681
- assert .Equal (t , http .StatusOK , code )
762
+ expectedStatus := http .StatusOK
763
+ if strings .Contains (tc .params , "=bad" ) {
764
+ expectedStatus = http .StatusBadRequest
765
+ }
766
+ assert .Equal (t , expectedStatus , code )
682
767
assert .Contains (t , body , tc .expectedBody )
683
768
t .Log (body )
684
769
// prevent hit limiter from engaging
685
- time .Sleep (50 * time .Millisecond )
770
+ time .Sleep (80 * time .Millisecond )
686
771
})
687
772
}
688
773
}
0 commit comments