package gitlab import ( "bufio" "os" "strings" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/xlgmokha/x/pkg/x" "gitlab.com/mokhax/stanuki/pkg/gitlab" ) func TestIssue(t *testing.T) { t.Run("FromIssues", func(t *testing.T) { t.Run("parses the array of issues from IO", func(t *testing.T) { body := strings.NewReader(`[{"ID":1,"title":"Issue Title"}]`) results, err := gitlab.FromIssues(body) require.NoError(t, err) require.Equal(t, 1, len(results)) assert.Equal(t, 1, results[0].ID) assert.Equal(t, "Issue Title", results[0].Title) }) }) t.Run("From", func(t *testing.T) { t.Run("parses each field", func(t *testing.T) { file, err := os.Open("../../test/data/issues.json") require.NoError(t, err) reader := bufio.NewReader(file) results, err := gitlab.FromIssues(reader) require.NoError(t, err) assert.Len(t, results, 20) result := results[0] assert.Equal(t, 146760799, result.ID) assert.Equal(t, 6375, result.IID) assert.Equal(t, 40549124, result.ProjectID) assert.Contains(t, result.Title, "`gitlab-org/gitlab` broken `master` with rspec unit") assert.Contains(t, result.Description, "## How to close this incident\n\n- Follow the steps in the") assert.Equal(t, gitlab.IssueClosed, result.State) assert.Equal(t, x.Must(time.Parse(time.RFC3339Nano, "2024-05-18T17:39:14.548Z")), result.CreatedAt) assert.Equal(t, x.Must(time.Parse(time.RFC3339Nano, "2024-05-18T18:14:37.830Z")), result.UpdatedAt) assert.Equal(t, x.Must(time.Parse(time.RFC3339Nano, "2024-05-18T17:39:16.837Z")), result.ClosedAt) t.Run("closed_by", func(t *testing.T) { user := result.ClosedBy assert.Equal(t, 1786152, user.ID) assert.Equal(t, "gitlab-bot", user.Username) assert.Equal(t, gitlab.UserActive, user.State) assert.Equal(t, false, user.Locked) assert.Equal(t, "https://gitlab.com/uploads/-/system/user/avatar/1786152/avatar.png", user.AvatarUrl) assert.Equal(t, "https://gitlab.com/gitlab-bot", user.WebUrl) }) assert.ElementsMatch(t, []string{ "Engineering Productivity", "master-broken::job-timeout", "master:broken", }, result.Labels) assert.Nil(t, result.Milestone) assert.Empty(t, result.Assignees) assert.Equal(t, 1786152, result.Author.ID) assert.Equal(t, gitlab.IssueTypeIncident, result.Type) assert.Nil(t, result.Assignee) assert.Equal(t, 4, result.UserNotesCount) assert.Equal(t, 0, result.MergeRequestsCount) assert.Equal(t, 0, result.Upvotes) assert.Equal(t, 0, result.Downvotes) assert.Nil(t, result.DueDate) assert.False(t, result.Confidential) assert.Nil(t, result.DiscussionLocked) assert.Equal(t, "https://gitlab.com/gitlab-org/quality/engineering-productivity/master-broken-incidents/-/issues/6375", result.WebUrl) // t.Run("time_stats", func(t *testing.T) { // stats := result.TimeStatistics // assert.Equal(t, 0, stats.TimeEstimate) // assert.Equal(t, 0, stats.TotalTimeSpent) // assert.Nil(t, stats.HumanTimeEstimate) // assert.Nil(t, stats.HumanTimeSpent) // }) // t.Run("task_completion_status", func(t *testing.T) { // status := result.TaskCompletionStatus // assert.Equal(t, 0, status.Count) // assert.Equal(t, 0, status.CompletedCount) // }) assert.Equal(t, 0, result.BlockingIssuesCount) assert.True(t, result.HasTasks) assert.Equal(t, "0 of 0 checklist items completed", result.TaskStatus) }) }) }