@@ -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
@@ -580,7 +581,7 @@ func TestPublic_FindCommentsCtrl_ConsistentCount(t *testing.T) {
580
581
setScore (commentLocator , ids [4 ], - 3 )
581
582
time .Sleep (time .Millisecond * 5 )
582
583
583
- c6 := store.Comment {Text : "third-level comment 2" , ParentID : ids [4 ], Locator : commentLocator }
584
+ c6 := store.Comment {Text : "deleted third-level comment 2" , ParentID : ids [4 ], Locator : commentLocator }
584
585
ids [5 ], timestamps [5 ] = addCommentGetCreatedTime (t , c6 , ts )
585
586
// deleted later so not visible in site-wide requests
586
587
setScore (commentLocator , ids [5 ], 10 )
@@ -594,7 +595,7 @@ func TestPublic_FindCommentsCtrl_ConsistentCount(t *testing.T) {
594
595
setScore (commentLocator , ids [6 ], 1 )
595
596
time .Sleep (time .Millisecond * 5 )
596
597
597
- c8 := store.Comment {Text : "second-level comment 3" , ParentID : ids [6 ], Locator : commentLocator }
598
+ c8 := store.Comment {Text : "deleted second-level comment 3" , ParentID : ids [6 ], Locator : commentLocator }
598
599
ids [7 ], timestamps [7 ] = addCommentGetCreatedTime (t , c8 , ts )
599
600
// deleted later so not visible in site-wide requests
600
601
setScore (commentLocator , ids [7 ], - 20 )
@@ -618,24 +619,24 @@ func TestPublic_FindCommentsCtrl_ConsistentCount(t *testing.T) {
618
619
sinceTS [i ] = strconv .FormatInt (created .UnixNano ()/ 1000000 , 10 )
619
620
formattedTS [i ] = created .Format (time .RFC3339Nano )
620
621
}
621
- t .Logf ("last timestamp: %v" , timestamps [7 ])
622
622
623
623
testCases := []struct {
624
624
params string
625
625
expectedBody string
626
626
}{
627
- {"" , fmt .Sprintf (`"info":{"count":7,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
628
- {"url=test-url" , fmt .Sprintf (`"info":{"url":"test-url","count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
629
- {"format=plain" , fmt .Sprintf (`"info":{"count":7,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
630
- {"format=plain&url=test-url" , fmt .Sprintf (`"info":{"url":"test-url","count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
631
- {"since=" + sinceTenSecondsAgo , fmt .Sprintf (`"info":{"count":7,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
632
- {"url=test-url&since=" + sinceTenSecondsAgo , fmt .Sprintf (`"info":{"url":"test-url","count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
633
- {"since=" + sinceTS [0 ], fmt .Sprintf (`"info":{"count":7,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
634
- {"url=test-url&since=" + sinceTS [0 ], fmt .Sprintf (`"info":{"url":"test-url","count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
635
- {"since=" + sinceTS [1 ], fmt .Sprintf (`"info":{"count":6,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
636
- {"url=test-url&since=" + sinceTS [1 ], fmt .Sprintf (`"info":{"url":"test-url","count":5,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
637
- {"since=" + sinceTS [4 ], fmt .Sprintf (`"info":{"count":3,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
638
- {"url=test-url&since=" + sinceTS [4 ], fmt .Sprintf (`"info":{"url":"test-url","count":2,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
627
+ // test parameters url, format, since, sort
628
+ {"" , fmt .Sprintf (`"info":{"count":7,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
629
+ {"url=test-url" , fmt .Sprintf (`"info":{"url":"test-url","count":6,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [7 ])},
630
+ {"format=plain" , fmt .Sprintf (`"info":{"count":7,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
631
+ {"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 ])},
632
+ {"since=" + sinceTenSecondsAgo , fmt .Sprintf (`"info":{"count":7,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
633
+ {"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 ])},
634
+ {"since=" + sinceTS [0 ], fmt .Sprintf (`"info":{"count":7,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
635
+ {"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 ])},
636
+ {"since=" + sinceTS [1 ], fmt .Sprintf (`"info":{"count":6,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
637
+ {"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 ])},
638
+ {"since=" + sinceTS [4 ], fmt .Sprintf (`"info":{"count":3,"count_left":0,"first_time":%q,"last_time":%q}` , formattedTS [0 ], formattedTS [8 ])},
639
+ {"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 ])},
639
640
{"format=tree" , `"info":{"count":7` },
640
641
{"format=tree&url=test-url" , `"info":{"url":"test-url","count":6` },
641
642
{"format=tree&sort=+time" , `"info":{"count":7` },
@@ -654,17 +655,101 @@ func TestPublic_FindCommentsCtrl_ConsistentCount(t *testing.T) {
654
655
{"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 ])},
655
656
// three comments of which last one deleted and doesn't have controversy so returned last
656
657
{"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 ])},
658
+
659
+ // test parameters limit, offset_id for format=plain
660
+ {"limit=bad" , `{"code":1,"details":"bad limit value","error":"strconv.Atoi: parsing \"bad\": invalid syntax"}` },
661
+ {"offset_id=bad" , `{"code":1,"details":"bad offset_id value","error":"invalid UUID length: 3"}` },
662
+ {"limit=2" , `"info":{"count":7,"count_left":5,"last_comment":"` + ids [1 ]},
663
+ {"limit=6" , `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
664
+ {"limit=7" , `"info":{"count":7,"count_left":0,"last_comment":"` + ids [8 ]},
665
+ {"limit=2&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":6,"last_comment":"` + ids [1 ]},
666
+ {"limit=6&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":2,"last_comment":"` + ids [5 ]},
667
+ {"limit=7&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":1,"last_comment":"` + ids [6 ]},
668
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [2 ]), `"info":{"count":7,"count_left":2,"last_comment":"` + ids [4 ]},
669
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [3 ]), `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
670
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [4 ]), `"info":{"count":7,"count_left":0` },
671
+ {fmt .Sprintf ("limit=1&offset_id=%s" , ids [6 ]), `"info":{"count":7,"count_left":0` },
672
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [8 ]), `"info":{"count":7,"count_left":0` },
673
+ {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 ]},
674
+ {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 ]},
675
+ {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 ]},
676
+ {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 ]},
677
+ {fmt .Sprintf ("limit=2&url=test-url&offset_id=%s" , ids [8 ]), `"info":{"url":"test-url","count":6,"count_left":6,` },
678
+ // deleted comment, offset is ignored in site-wide request but not for particular URL
679
+ {fmt .Sprintf ("limit=2&offset_id=%s" , ids [5 ]), `"info":{"count":7,"count_left":5,"last_comment":"` + ids [1 ]},
680
+ {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 ]},
681
+ // non-existing comment, offset is ignored, deleted comments included into request with "url"
682
+ {fmt .Sprintf ("limit=1&offset_id=%s" , uuid .New ().String ()), `"info":{"count":7,"count_left":6,"last_comment":"` + ids [0 ]},
683
+ {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 ]},
684
+ // since is ignored for tree format, so we test it only for plain
685
+ {"limit=6&since=" + sinceTenSecondsAgo , `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
686
+ {"limit=1&since=" + sinceTS [4 ], `"info":{"count":3,"count_left":2,"last_comment":"` + ids [4 ]},
687
+ {"limit=6&url=test-url&since=" + sinceTenSecondsAgo , `"info":{"url":"test-url","count":6,"count_left":2,"last_comment":"` + ids [5 ]},
688
+ {"limit=1&url=test-url&since=" + sinceTS [4 ], `"info":{"url":"test-url","count":2,"count_left":3,"last_comment":"` + ids [4 ]},
689
+ // start with deleted comment timestamp
690
+ {"limit=1&since=" + sinceTS [5 ], `"info":{"count":2,"count_left":1,"last_comment":"` + ids [6 ]},
691
+ {"limit=1&since=" + sinceTS [6 ], `"info":{"count":2,"count_left":1,"last_comment":"` + ids [6 ]},
692
+ {"limit=1&url=test-url&since=" + sinceTS [5 ], `"info":{"url":"test-url","count":1,"count_left":2,"last_comment":"` + ids [5 ]},
693
+ {"limit=1&url=test-url&since=" + sinceTS [6 ], `"info":{"url":"test-url","count":1,"count_left":1,"last_comment":"` + ids [6 ]},
694
+ // test sort
695
+ {"limit=1&sort=+time&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [0 ]},
696
+ {"limit=1&sort=-time&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [7 ]},
697
+ {"limit=1&sort=+score&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [6 ]},
698
+ {"limit=1&sort=-score&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [2 ]},
699
+ {"limit=1&sort=+controversy&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [0 ]},
700
+ {"limit=1&sort=-controversy&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":7,"last_comment":"` + ids [3 ]},
701
+
702
+ // test parameters limit, offset_id for format=tree
703
+ {"format=tree&limit=bad" , `{"code":1,"details":"bad limit value","error":"strconv.Atoi: parsing \"bad\": invalid syntax"}` },
704
+ {"format=tree&offset_id=bad" , `{"code":1,"details":"bad offset_id value","error":"invalid UUID length: 3"}` },
705
+ {"format=tree&limit=2" , `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
706
+ {"format=tree&limit=6" , `"info":{"count":7,"count_left":2,"last_comment":"` + ids [1 ]},
707
+ {"format=tree&limit=7" , `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
708
+ {"format=tree&url=test-url&limit=2" , `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
709
+ {"format=tree&url=test-url&limit=6" , `"info":{"url":"test-url","count":6,"count_left":1,"last_comment":"` + ids [1 ]},
710
+ {"format=tree&url=test-url&limit=7" , `"info":{"url":"test-url","count":6,"count_left":0,"last_comment":"` + ids [6 ]},
711
+ // start after first top-level comment
712
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [0 ]), `"info":{"count":7,"count_left":2,"last_comment":"` + ids [1 ]},
713
+ {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 ]},
714
+ // start after second top-level comment
715
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [1 ]), `"info":{"count":7,"count_left":1,"last_comment":"` + ids [6 ]},
716
+ {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 ]},
717
+ // start after third top-level comment, so expect comment to post 2, or no comments on post 1 if "url" is set
718
+ {fmt .Sprintf ("format=tree&limit=1&offset_id=%s" , ids [6 ]), `"info":{"count":7,"count_left":0,"last_comment":"` + ids [8 ]},
719
+ {fmt .Sprintf ("format=tree&url=test-url&limit=1&offset_id=%s" , ids [6 ]), `"info":{"url":"test-url","count":6,"count_left":0` },
720
+ // non-root comment IDs or non-existing IDs are ignored
721
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [2 ]), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
722
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [3 ]), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
723
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [4 ]), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
724
+ {fmt .Sprintf ("format=tree&limit=2&offset_id=%s" , ids [7 ]), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
725
+ {fmt .Sprintf ("format=tree&limit=1&offset_id=%s" , uuid .New ().String ()), `"info":{"count":7,"count_left":4,"last_comment":"` + ids [0 ]},
726
+ {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 ]},
727
+ {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 ]},
728
+ {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 ]},
729
+ {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 ]},
730
+ {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 ]},
731
+ // test sort
732
+ {"format=tree&limit=1&sort=+time&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
733
+ {"format=tree&limit=1&sort=-time&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":5,"last_comment":"` + ids [6 ]},
734
+ {"format=tree&limit=1&sort=+score&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":5,"last_comment":"` + ids [6 ]},
735
+ {"format=tree&limit=1&sort=-score&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":4,"last_comment":"` + ids [1 ]},
736
+ {"format=tree&limit=1&sort=+controversy&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":3,"last_comment":"` + ids [0 ]},
737
+ {"format=tree&limit=1&sort=-controversy&url=test-url" , `"info":{"url":"test-url","count":6,"count_left":5,"last_comment":"` + ids [6 ]},
657
738
}
658
739
659
740
for _ , tc := range testCases {
660
741
t .Run (tc .params , func (t * testing.T ) {
661
742
url := fmt .Sprintf (ts .URL + "/api/v1/find?site=remark42&%s" , tc .params )
662
743
body , code := get (t , url )
663
- assert .Equal (t , http .StatusOK , code )
744
+ expectedStatus := http .StatusOK
745
+ if strings .Contains (tc .params , "=bad" ) {
746
+ expectedStatus = http .StatusBadRequest
747
+ }
748
+ assert .Equal (t , expectedStatus , code )
664
749
assert .Contains (t , body , tc .expectedBody )
665
750
t .Log (body )
666
751
// prevent hit limiter from engaging
667
- time .Sleep (50 * time .Millisecond )
752
+ time .Sleep (80 * time .Millisecond )
668
753
})
669
754
}
670
755
}
0 commit comments