This is an automated email from the ASF dual-hosted git repository.

klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new 37220be9f fix(jira): include fields=*all in Jira Server issue search 
query (#9149)
37220be9f is described below

commit 37220be9fe88c04e5e711dafa1c5d5025339d450
Author: Keerthan Poojary <[email protected]>
AuthorDate: Tue Sep 22 09:22:20 2026 +0530

    fix(jira): include fields=*all in Jira Server issue search query (#9149)
---
 backend/plugins/jira/tasks/issue_collector.go      |  1 +
 backend/plugins/jira/tasks/issue_extractor_test.go | 83 ++++++++++++++++++++++
 2 files changed, 84 insertions(+)

diff --git a/backend/plugins/jira/tasks/issue_collector.go 
b/backend/plugins/jira/tasks/issue_collector.go
index ff5dd8fd8..20d4e38dd 100644
--- a/backend/plugins/jira/tasks/issue_collector.go
+++ b/backend/plugins/jira/tasks/issue_collector.go
@@ -233,6 +233,7 @@ func setupIssueV2Collector(apiCollector 
*api.StatefulApiCollector, data *JiraTas
                        query.Set("startAt", fmt.Sprintf("%v", 
reqData.Pager.Skip))
                        query.Set("maxResults", fmt.Sprintf("%v", 
reqData.Pager.Size))
                        query.Set("expand", "changelog")
+                       query.Set("fields", "*all")
                        return query, nil
                },
                GetTotalPages: GetTotalPagesFromResponse,
diff --git a/backend/plugins/jira/tasks/issue_extractor_test.go 
b/backend/plugins/jira/tasks/issue_extractor_test.go
index 97489fd8a..72628a696 100644
--- a/backend/plugins/jira/tasks/issue_extractor_test.go
+++ b/backend/plugins/jira/tasks/issue_extractor_test.go
@@ -124,3 +124,86 @@ func jiraIssueFromResults(results []interface{}) 
*models.JiraIssue {
        }
        return nil
 }
+
+func TestExtractIssuesWorklog(t *testing.T) {
+       mappings := &typeMappings{
+               TypeIdMappings:         map[string]string{},
+               StdTypeMappings:        map[string]string{},
+               StandardStatusMappings: map[string]models.StatusMappings{},
+       }
+       data := &JiraTaskData{
+               Options: &JiraOptions{
+                       ConnectionId: 1,
+                       BoardId:      1,
+               },
+       }
+
+       t.Run("extracts embedded worklog when fields contain worklog", func(t 
*testing.T) {
+               worklogJSON := `"worklog": {
+                       "startAt": 0,
+                       "maxResults": 20,
+                       "total": 1,
+                       "worklogs": [{
+                               "id": "1001",
+                               "issueId": "10001",
+                               "timeSpent": "1h",
+                               "timeSpentSeconds": 3600,
+                               "created": "2024-01-01T00:00:00.000+0000",
+                               "updated": "2024-01-01T00:00:00.000+0000",
+                               "started": "2024-01-01T00:00:00.000+0000"
+                       }]
+               }`
+               raw := minimalIssueJSON(worklogJSON)
+               var apiIssue apiv2models.Issue
+               if err := json.Unmarshal(raw, &apiIssue); err != nil {
+                       t.Fatalf("unmarshal issue: %v", err)
+               }
+               results, err := extractIssues(data, mappings, &apiIssue, 
&api.RawData{Data: raw}, nil)
+               if err != nil {
+                       t.Fatalf("extractIssues() error = %v", err)
+               }
+               issue := jiraIssueFromResults(results)
+               if issue == nil {
+                       t.Fatal("extractIssues() did not return a JiraIssue")
+               }
+               if issue.WorklogTotal != 1 {
+                       t.Errorf("WorklogTotal = %d, want 1", 
issue.WorklogTotal)
+               }
+               var extractedWorklogs []*models.JiraWorklog
+               for _, r := range results {
+                       if w, ok := r.(*models.JiraWorklog); ok {
+                               extractedWorklogs = append(extractedWorklogs, w)
+                       }
+               }
+               if len(extractedWorklogs) != 1 {
+                       t.Fatalf("len(extractedWorklogs) = %d, want 1", 
len(extractedWorklogs))
+               }
+               if extractedWorklogs[0].WorklogId != "1001" {
+                       t.Errorf("WorklogId = %s, want 1001", 
extractedWorklogs[0].WorklogId)
+               }
+       })
+
+       t.Run("no worklog extracted when worklog field is absent", func(t 
*testing.T) {
+               raw := minimalIssueJSON("")
+               var apiIssue apiv2models.Issue
+               if err := json.Unmarshal(raw, &apiIssue); err != nil {
+                       t.Fatalf("unmarshal issue: %v", err)
+               }
+               results, err := extractIssues(data, mappings, &apiIssue, 
&api.RawData{Data: raw}, nil)
+               if err != nil {
+                       t.Fatalf("extractIssues() error = %v", err)
+               }
+               issue := jiraIssueFromResults(results)
+               if issue == nil {
+                       t.Fatal("extractIssues() did not return a JiraIssue")
+               }
+               if issue.WorklogTotal != 0 {
+                       t.Errorf("WorklogTotal = %d, want 0", 
issue.WorklogTotal)
+               }
+               for _, r := range results {
+                       if _, ok := r.(*models.JiraWorklog); ok {
+                               t.Errorf("unexpected JiraWorklog extracted when 
worklog field is absent")
+                       }
+               }
+       })
+}

Reply via email to