1+ require_relative "../../spec_helper.rb"
2+
3+ describe Openjournals ::ReviewerChecklistsResponder do
4+
5+ subject do
6+ described_class
7+ end
8+
9+ before do
10+ settings = { env : { bot_github_user : "editorialbot" } }
11+ @responder = subject . new ( settings , { } )
12+ end
13+
14+ describe "listening" do
15+ it "should listen to new comments" do
16+ expect ( @responder . event_action ) . to eq ( "issue_comment.created" )
17+ end
18+
19+ it "should define regex" do
20+ expect ( @responder . event_regex ) . to match ( "@editorialbot generate my checklist" )
21+ expect ( @responder . event_regex ) . to match ( "@editorialbot generate my checklist." )
22+ expect ( @responder . event_regex ) . to match ( "@editorialbot generate my checklist \r \n " )
23+ expect ( @responder . event_regex ) . to match ( "@editorialbot generate my checklist \r \n more" )
24+ expect ( @responder . event_regex ) . to_not match ( "@editorialbot generate my checklist for @arfon." )
25+ expect ( @responder . event_regex ) . to_not match ( "@editorialbot generate my checkl" )
26+ end
27+ end
28+
29+ describe "#process_message" do
30+ before do
31+ @responder . context = OpenStruct . new ( issue_id : 5 ,
32+ issue_author : "opener" ,
33+ issue_title : "New paper" ,
34+ issue_labels : [ { "name" => "test" } ] ,
35+ repo : "openjournals/buffy" ,
36+ comment_id : 111222 ,
37+ issue_body : "Test Submission\n \n ... description ... \n \n " +
38+ "<!--author-handle-->@submitter<!--end-author-handle-->\n " +
39+ "<!--reviewers-list-->@reviewer1, @reviewer2<!--end-reviewers-list-->" )
40+ @msg = "@editorialbot generate my checklist"
41+ disable_github_calls_for ( @responder )
42+ end
43+
44+ context "generate checklist command" do
45+ it "should add user checklist for reviewer" do
46+ @responder . context [ :sender ] = "reviewer1"
47+
48+ expected_locals = { issue_id : 5 , issue_author : "opener" , bot_name : "editorialbot" , issue_title : "New paper" , repo : "openjournals/buffy" , sender : "reviewer1" }
49+ expected_checklist = "Checklist for @reviewer1 \n [] A"
50+
51+ expect ( @responder ) . to receive ( :render_external_template ) . with ( "reviewer_checklist.md" , expected_locals ) . and_return ( expected_checklist )
52+ expect ( @responder ) . to receive ( :update_comment ) . with ( 111222 , expected_checklist )
53+ expect ( @responder ) . to_not receive ( :respond )
54+ @responder . process_message ( @msg )
55+ end
56+
57+ it "should use pre-2026 checklist if issue is labeled" do
58+ @responder . context [ :sender ] = "reviewer1"
59+ @responder . context . issue_labels << { "name" => "pre-2026-submission" }
60+
61+ expected_locals = { issue_id : 5 , issue_author : "opener" , bot_name : "editorialbot" , issue_title : "New paper" , repo : "openjournals/buffy" , sender : "reviewer1" }
62+ expected_checklist = "Checklist for @reviewer1 \n [] A"
63+
64+ expect ( @responder ) . to receive ( :render_external_template ) . with ( "reviewer_checklist_pre2026.md" , expected_locals ) . and_return ( expected_checklist )
65+ expect ( @responder ) . to receive ( :update_comment ) . with ( 111222 , expected_checklist )
66+ expect ( @responder ) . to_not receive ( :respond )
67+ @responder . process_message ( @msg )
68+ end
69+
70+
71+ it "should be case insensitive for the reviewer's username" do
72+ @responder . context [ :sender ] = "ReVIEwer1"
73+
74+ expected_locals = { issue_id : 5 , issue_author : "opener" , issue_title : "New paper" , bot_name : "editorialbot" , repo : "openjournals/buffy" , sender : "ReVIEwer1" }
75+ expected_checklist = "Checklist for @ReVIEwer1 \n [] A"
76+
77+ expect ( @responder ) . to receive ( :render_external_template ) . with ( "reviewer_checklist.md" , expected_locals ) . and_return ( expected_checklist )
78+ expect ( @responder ) . to receive ( :update_comment ) . with ( 111222 , expected_checklist )
79+ expect ( @responder ) . to_not receive ( :respond )
80+ @responder . process_message ( @msg )
81+ end
82+
83+ it "should not add user checklist if sender is not a reviewer" do
84+ @responder . context [ :sender ] = "nonreviewer"
85+
86+ expect ( @responder ) . to receive ( :respond ) . with ( "@nonreviewer I can't do that because you are not a reviewer" )
87+ @responder . process_message ( @msg )
88+ end
89+ end
90+
91+ context "checklist links" do
92+ before do
93+ @responder . context [ :sender ] = "reviewer1"
94+
95+ expected_locals = { issue_id : 5 , issue_author : "opener" , issue_title : "New paper" , bot_name : "editorialbot" , repo : "openjournals/buffy" , sender : "reviewer1" }
96+ expected_checklist = "Checklist for @reviewer1 \n [] A"
97+
98+ expect ( @responder ) . to receive ( :render_external_template ) . with ( "reviewer_checklist.md" , expected_locals ) . and_return ( expected_checklist )
99+ expect ( @responder ) . to receive ( :update_comment ) . with ( 111222 , expected_checklist )
100+
101+
102+ @link1 = "<!--checklist-for-reviewer1-->\n 📝 [Checklist for @reviewer1](https://github.com/openjournals/buffy/issues/5#issuecomment-111222)\n <!--end-checklist-for-reviewer1-->"
103+ @link2 = "<!--checklist-for-reviewer2-->\n 📝 [Checklist for @reviewer2](https://github.com/openjournals/buffy/issues/5#issuecomment-222222)\n <!--end-checklist-for-reviewer2-->"
104+ end
105+
106+ it "should not add link to checklist if no checklist-comments mark" do
107+ expect ( @responder ) . to_not receive ( :update_value )
108+ @responder . process_message ( @msg )
109+ end
110+
111+ it "should add link to the issue's text" do
112+ @responder . context [ :issue_body ] += "<!--checklist-comments--><!--end-checklist-comments-->"
113+
114+ expect ( @responder ) . to receive ( :update_value ) . with ( "checklist-comments" , "\n #{ @link1 } \n " )
115+ @responder . process_message ( @msg )
116+ end
117+
118+ it "should add link to existing checklist" do
119+ @responder . context [ :issue_body ] += "<!--checklist-comments-->#{ @link2 } <!--end-checklist-comments-->"
120+
121+ expect ( @responder ) . to receive ( :update_value ) . with ( "checklist-comments" , "\n #{ @link2 } \n #{ @link1 } \n " )
122+ @responder . process_message ( @msg )
123+ end
124+
125+ it "should update links to checklist in the issue's text" do
126+ previous_link = "<!--checklist-for-reviewer1-->Whatever<!--end-checklist-for-reviewer1-->"
127+ @responder . context [ :issue_body ] += "<!--checklist-comments--><!--end-checklist-comments-->"
128+
129+ expect ( @responder ) . to receive ( :update_value ) . with ( "checklist-comments" , "\n #{ @link1 } \n " )
130+ @responder . process_message ( @msg )
131+ end
132+ end
133+ end
134+
135+ it "command is customizable" do
136+ responder = subject . new ( { env : { bot_github_user : "editorialbot" } } , { command : "create check-list" } )
137+
138+ expect ( responder . event_regex ) . to match ( "@editorialbot create check-list" )
139+ expect ( responder . event_regex ) . to_not match ( "@editorialbot generate my checklist" )
140+ end
141+
142+ end
0 commit comments