@@ -20,6 +20,8 @@ package tasks
2020import (
2121 "testing"
2222 "time"
23+
24+ "github.com/apache/incubator-devlake/plugins/jira/models"
2325)
2426
2527func Test_buildJQL (t * testing.T ) {
@@ -66,6 +68,7 @@ func Test_buildFilterJQL(t *testing.T) {
6668 tests := []struct {
6769 name string
6870 filterId string
71+ extraJql string
6972 incrementalJql string
7073 want string
7174 }{
@@ -93,13 +96,122 @@ func Test_buildFilterJQL(t *testing.T) {
9396 incrementalJql : "updated >= '2024/01/01 00:00' ORDER BY created ASC" ,
9497 want : "updated >= '2024/01/01 00:00' ORDER BY created ASC" ,
9598 },
99+ {
100+ name : "extra jql with filter full sync" ,
101+ filterId : "12345" ,
102+ extraJql : `project = "MyComponent"` ,
103+ incrementalJql : "ORDER BY created ASC" ,
104+ want : `filter = 12345 AND (project = "MyComponent") ORDER BY created ASC` ,
105+ },
106+ {
107+ name : "extra jql with filter incremental sync" ,
108+ filterId : "12345" ,
109+ extraJql : `project = "MyComponent"` ,
110+ incrementalJql : "updated >= '2024/01/01 00:00' ORDER BY created ASC" ,
111+ want : `filter = 12345 AND (project = "MyComponent") AND updated >= '2024/01/01 00:00' ORDER BY created ASC` ,
112+ },
113+ {
114+ name : "extra jql without filter" ,
115+ filterId : "" ,
116+ extraJql : `project = "MyComponent"` ,
117+ incrementalJql : "ORDER BY created ASC" ,
118+ want : `(project = "MyComponent") ORDER BY created ASC` ,
119+ },
120+ {
121+ name : "extra jql without filter, incremental sync" ,
122+ filterId : "" ,
123+ extraJql : `project = "MyComponent"` ,
124+ incrementalJql : "updated >= '2024/01/01 00:00' ORDER BY created ASC" ,
125+ want : `(project = "MyComponent") AND updated >= '2024/01/01 00:00' ORDER BY created ASC` ,
126+ },
127+ {
128+ name : "extra jql with OR operator is parenthesized" ,
129+ filterId : "12345" ,
130+ extraJql : `project = "A" OR project = "B"` ,
131+ incrementalJql : "ORDER BY created ASC" ,
132+ want : `filter = 12345 AND (project = "A" OR project = "B") ORDER BY created ASC` ,
133+ },
96134 }
97135
98136 for _ , tt := range tests {
99137 t .Run (tt .name , func (t * testing.T ) {
100- if got := buildFilterJQL (tt .filterId , tt .incrementalJql ); got != tt .want {
138+ if got := buildFilterJQL (tt .filterId , tt .extraJql , tt . incrementalJql ); got != tt .want {
101139 t .Errorf ("buildFilterJQL() = %v, want %v" , got , tt .want )
102140 }
103141 })
104142 }
105143}
144+
145+ func Test_renderExtraJQL (t * testing.T ) {
146+ makeData := func (boardId uint64 , boardName string , projectName string ) * JiraTaskData {
147+ return & JiraTaskData {
148+ Options : & JiraOptions {BoardId : boardId },
149+ Board : & models.JiraBoard {BoardId : boardId , Name : boardName },
150+ DevLakeProjectName : projectName ,
151+ }
152+ }
153+
154+ tests := []struct {
155+ name string
156+ tmpl string
157+ data * JiraTaskData
158+ want string
159+ wantErr bool
160+ }{
161+ {
162+ name : "static JQL passes through unchanged" ,
163+ tmpl : `project = "MyProject"` ,
164+ data : makeData (1 , "My Board" , "" ),
165+ want : `project = "MyProject"` ,
166+ },
167+ {
168+ name : "BoardName substitution" ,
169+ tmpl : `project = "{{.BoardName}}"` ,
170+ data : makeData (42 , "Team Alpha" , "" ),
171+ want : `project = "Team Alpha"` ,
172+ },
173+ {
174+ name : "BoardId substitution" ,
175+ tmpl : `cf[10001] = {{.BoardId}}` ,
176+ data : makeData (99 , "Some Board" , "" ),
177+ want : `cf[10001] = 99` ,
178+ },
179+ {
180+ name : "DevLakeProjectName substitution" ,
181+ tmpl : `component = "{{.DevLakeProjectName}}"` ,
182+ data : makeData (1 , "Big Shared Board" , "payments-service" ),
183+ want : `component = "payments-service"` ,
184+ },
185+ {
186+ name : "nil Board falls back to empty BoardName" ,
187+ tmpl : `project = "{{.BoardName}}"` ,
188+ data : & JiraTaskData {Options : & JiraOptions {BoardId : 1 }, Board : nil },
189+ want : `project = ""` ,
190+ },
191+ {
192+ name : "invalid template returns error" ,
193+ tmpl : `project = "{{.Unclosed"` ,
194+ data : makeData (1 , "My Board" , "" ),
195+ wantErr : true ,
196+ },
197+ {
198+ name : "unknown field returns error (missingkey=error)" ,
199+ tmpl : `component = "{{.Typo}}"` ,
200+ data : makeData (1 , "My Board" , "" ),
201+ wantErr : true ,
202+ },
203+ }
204+
205+ for _ , tt := range tests {
206+ t .Run (tt .name , func (t * testing.T ) {
207+ got , err := renderExtraJQL (tt .tmpl , tt .data )
208+ if (err != nil ) != tt .wantErr {
209+ t .Errorf ("renderExtraJQL() error = %v, wantErr %v" , err , tt .wantErr )
210+ return
211+ }
212+ if ! tt .wantErr && got != tt .want {
213+ t .Errorf ("renderExtraJQL() = %v, want %v" , got , tt .want )
214+ }
215+ })
216+ }
217+ }
0 commit comments