Skip to content

Commit cf80e19

Browse files
ethantkoeniglunny
authored andcommitted
Optimize and unit test Issue_ReplaceLabels (#1080)
1 parent a201977 commit cf80e19

File tree

3 files changed

+57
-30
lines changed

3 files changed

+57
-30
lines changed

models/issue.go

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -476,43 +476,34 @@ func (issue *Issue) ReplaceLabels(labels []*Label, doer *User) (err error) {
476476
sort.Sort(labelSorter(issue.Labels))
477477

478478
var toAdd, toRemove []*Label
479-
for _, l := range labels {
480-
var exist bool
481-
for _, oriLabel := range issue.Labels {
482-
if oriLabel.ID == l.ID {
483-
exist = true
484-
break
485-
}
486-
}
487-
if !exist {
488-
toAdd = append(toAdd, l)
489-
}
490-
}
491479

492-
for _, oriLabel := range issue.Labels {
493-
var exist bool
494-
for _, l := range labels {
495-
if oriLabel.ID == l.ID {
496-
exist = true
497-
break
498-
}
499-
}
500-
if !exist {
501-
toRemove = append(toRemove, oriLabel)
480+
addIndex, removeIndex := 0, 0
481+
for addIndex < len(labels) && removeIndex < len(issue.Labels) {
482+
addLabel := labels[addIndex]
483+
removeLabel := issue.Labels[removeIndex]
484+
if addLabel.ID == removeLabel.ID {
485+
addIndex++
486+
removeIndex++
487+
} else if addLabel.ID < removeLabel.ID {
488+
toAdd = append(toAdd, addLabel)
489+
addIndex++
490+
} else {
491+
toRemove = append(toRemove, removeLabel)
492+
removeIndex++
502493
}
503494
}
495+
toAdd = append(toAdd, labels[addIndex:]...)
496+
toRemove = append(toRemove, issue.Labels[removeIndex:]...)
504497

505498
if len(toAdd) > 0 {
506499
if err = issue.addLabels(sess, toAdd, doer); err != nil {
507500
return fmt.Errorf("addLabels: %v", err)
508501
}
509502
}
510503

511-
if len(toRemove) > 0 {
512-
for _, l := range toRemove {
513-
if err = issue.removeLabel(sess, doer, l); err != nil {
514-
return fmt.Errorf("removeLabel: %v", err)
515-
}
504+
for _, l := range toRemove {
505+
if err = issue.removeLabel(sess, doer, l); err != nil {
506+
return fmt.Errorf("removeLabel: %v", err)
516507
}
517508
}
518509

models/issue_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright 2017 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package models
6+
7+
import (
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestIssue_ReplaceLabels(t *testing.T) {
14+
assert.NoError(t, PrepareTestDatabase())
15+
16+
testSuccess := func(issueID int64, labelIDs []int64) {
17+
issue := AssertExistsAndLoadBean(t, &Issue{ID: issueID}).(*Issue)
18+
repo := AssertExistsAndLoadBean(t, &Repository{ID: issue.RepoID}).(*Repository)
19+
doer := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User)
20+
21+
labels := make([]*Label, len(labelIDs))
22+
for i, labelID := range labelIDs {
23+
labels[i] = AssertExistsAndLoadBean(t, &Label{ID: labelID, RepoID: repo.ID}).(*Label)
24+
}
25+
assert.NoError(t, issue.ReplaceLabels(labels, doer))
26+
AssertCount(t, &IssueLabel{IssueID: issueID}, len(labelIDs))
27+
for _, labelID := range labelIDs {
28+
AssertExistsAndLoadBean(t, &IssueLabel{IssueID: issueID, LabelID: labelID})
29+
}
30+
}
31+
32+
testSuccess(1, []int64{2})
33+
testSuccess(1, []int64{1, 2})
34+
testSuccess(1, []int64{})
35+
}

models/setup_for_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ func AssertSuccessfulInsert(t *testing.T, beans ...interface{}) {
107107
assert.NoError(t, err)
108108
}
109109

110-
// AssertSuccessfulUpdate assert that bean is successfully updated
111-
func AssertSuccessfulUpdate(t *testing.T, bean interface{}, conditions ...interface{}) {
112-
_, err := x.Update(bean, conditions...)
110+
// AssertCount assert the count of a bean
111+
func AssertCount(t *testing.T, bean interface{}, expected interface{}) {
112+
actual, err := x.Count(bean)
113113
assert.NoError(t, err)
114+
assert.EqualValues(t, expected, actual)
114115
}

0 commit comments

Comments
 (0)