diff --git a/backend/plugins/jira/tasks/issue_collector.go b/backend/plugins/jira/tasks/issue_collector.go index ff5dd8fd855..20d4e38dda5 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 97489fd8a36..72628a6962e 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") + } + } + }) +}