Commit 2737992a54
Verified · cmc
Layout: unified · split
internal/store/dashboard.go +2
| @@ -76,6 +76,8 @@ const dashboardIssuesQuery = ` | ||
| 76 | 76 | LEFT JOIN orgs o ON r.owner_kind = 'org' AND o.id = r.owner_id |
| 77 | 77 | JOIN users au ON au.id = x.author_id |
| 78 | 78 | WHERE x.state = 'open' AND ` + involvedCond + ` |
| 79 | AND NOT EXISTS (SELECT 1 FROM issue_assignees ia | |
| 80 | WHERE ia.issue_id = x.id AND ia.user_id = ?1) | |
| 79 | 81 | ORDER BY x.updated_at DESC LIMIT 50` |
| 80 | 82 | |
| 81 | 83 | func (s *Store) DashboardIssues(userID int64) ([]DashboardItem, error) { |
internal/store/dashboard_test.go added +55
| @@ -0,0 +1,55 @@ | ||
| 1 | package store | |
| 2 | ||
| 3 | import "testing" | |
| 4 | ||
| 5 | // An issue assigned to the user is not repeated under DashboardIssues: | |
| 6 | // AssignedIssues already covers it, and a repository the user can | |
| 7 | // otherwise reach (here, one they own) is the common case where the two | |
| 8 | // queries used to overlap (#265). | |
| 9 | func TestDashboardIssuesExcludesAssignedIssues(t *testing.T) { | |
| 10 | s := open(t) | |
| 11 | if err := s.MigrateUp(); err != nil { | |
| 12 | t.Fatal(err) | |
| 13 | } | |
| 14 | uid, err := s.CreateUser("cmc", false) | |
| 15 | if err != nil { | |
| 16 | t.Fatal(err) | |
| 17 | } | |
| 18 | repoID, err := s.CreateRepo("user", uid, "gitbay", "public") | |
| 19 | if err != nil { | |
| 20 | t.Fatal(err) | |
| 21 | } | |
| 22 | repo, err := s.RepoByID(repoID) | |
| 23 | if err != nil { | |
| 24 | t.Fatal(err) | |
| 25 | } | |
| 26 | assignedNum, err := s.CreateIssue(repo.ID, uid, "assigned to me", "", "markdown") | |
| 27 | if err != nil { | |
| 28 | t.Fatal(err) | |
| 29 | } | |
| 30 | if _, err := s.CreateIssue(repo.ID, uid, "not assigned", "", "markdown"); err != nil { | |
| 31 | t.Fatal(err) | |
| 32 | } | |
| 33 | assigned, err := s.IssueByNumber(repo.ID, assignedNum) | |
| 34 | if err != nil { | |
| 35 | t.Fatal(err) | |
| 36 | } | |
| 37 | if err := s.SetIssueAssignee(assigned.ID, uid, true); err != nil { | |
| 38 | t.Fatal(err) | |
| 39 | } | |
| 40 | ||
| 41 | issues, err := s.DashboardIssues(uid) | |
| 42 | if err != nil { | |
| 43 | t.Fatal(err) | |
| 44 | } | |
| 45 | if len(issues) != 1 || issues[0].Title != "not assigned" { | |
| 46 | t.Fatalf("DashboardIssues = %+v, want only the unassigned issue", issues) | |
| 47 | } | |
| 48 | assignedList, err := s.AssignedIssues(uid) | |
| 49 | if err != nil { | |
| 50 | t.Fatal(err) | |
| 51 | } | |
| 52 | if len(assignedList) != 1 || assignedList[0].Title != "assigned to me" { | |
| 53 | t.Fatalf("AssignedIssues = %+v, want the assigned issue", assignedList) | |
| 54 | } | |
| 55 | } | |