@@ -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,115 @@ 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 , _ string ) * JiraTaskData {
147+ return & JiraTaskData {
148+ Options : & JiraOptions {BoardId : boardId },
149+ Board : & models.JiraBoard {BoardId : boardId , Name : boardName },
150+ }
151+ }
152+
153+ tests := []struct {
154+ name string
155+ tmpl string
156+ data * JiraTaskData
157+ want string
158+ wantErr bool
159+ }{
160+ {
161+ name : "static JQL passes through unchanged" ,
162+ tmpl : `project = "MyProject"` ,
163+ data : makeData (1 , "My Board" , "" ),
164+ want : `project = "MyProject"` ,
165+ },
166+ {
167+ name : "BoardName substitution" ,
168+ tmpl : `project = "{{.BoardName}}"` ,
169+ data : makeData (42 , "Team Alpha" , "" ),
170+ want : `project = "Team Alpha"` ,
171+ },
172+ {
173+ name : "BoardId substitution" ,
174+ tmpl : `cf[10001] = {{.BoardId}}` ,
175+ data : makeData (99 , "Some Board" , "" ),
176+ want : `cf[10001] = 99` ,
177+ },
178+ {
179+ name : "nil Board falls back to empty BoardName" ,
180+ tmpl : `project = "{{.BoardName}}"` ,
181+ data : & JiraTaskData {Options : & JiraOptions {BoardId : 1 }, Board : nil },
182+ want : `project = ""` ,
183+ },
184+ {
185+ name : "invalid template returns error" ,
186+ tmpl : `project = "{{.Unclosed"` ,
187+ data : makeData (1 , "My Board" , "" ),
188+ wantErr : true ,
189+ },
190+ {
191+ name : "unknown field returns error (missingkey=error)" ,
192+ tmpl : `component = "{{.Typo}}"` ,
193+ data : makeData (1 , "My Board" , "" ),
194+ wantErr : true ,
195+ },
196+ }
197+
198+ for _ , tt := range tests {
199+ t .Run (tt .name , func (t * testing.T ) {
200+ got , err := renderExtraJQL (tt .tmpl , tt .data )
201+ if (err != nil ) != tt .wantErr {
202+ t .Errorf ("renderExtraJQL() error = %v, wantErr %v" , err , tt .wantErr )
203+ return
204+ }
205+ if ! tt .wantErr && got != tt .want {
206+ t .Errorf ("renderExtraJQL() = %v, want %v" , got , tt .want )
207+ }
208+ })
209+ }
210+ }
0 commit comments