github.com/munnerz/test-infra@v0.0.0-20190108210205-ce3d181dc989/velodrome/fetcher/issues_test.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package main 18 19 import ( 20 "reflect" 21 "testing" 22 "time" 23 24 "k8s.io/test-infra/velodrome/sql" 25 sqltest "k8s.io/test-infra/velodrome/sql/testing" 26 27 "github.com/google/go-github/github" 28 ) 29 30 func TestFindLatestIssueUpdate(t *testing.T) { 31 config := sqltest.SQLiteConfig{File: ":memory:"} 32 tests := []struct { 33 issues []sql.Issue 34 expectedLatest time.Time 35 repository string 36 }{ 37 // If we don't have any issue, return 1900/1/1 0:0:0 UTC 38 { 39 []sql.Issue{}, 40 time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC), 41 "ONE", 42 }, 43 // We have issues, but not for this repo, return 1900/1/1 0:0:0 UTC 44 { 45 []sql.Issue{ 46 {IssueUpdatedAt: time.Date(1999, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "ONE"}, 47 {IssueUpdatedAt: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "ONE"}, 48 {IssueUpdatedAt: time.Date(1998, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "ONE"}, 49 }, 50 time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC), 51 "TWO", 52 }, 53 { 54 []sql.Issue{ 55 {IssueUpdatedAt: time.Date(1999, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "ONE"}, 56 {IssueUpdatedAt: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "ONE"}, 57 {IssueUpdatedAt: time.Date(1998, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "TWO"}, 58 }, 59 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 60 "ONE", 61 }, 62 { 63 []sql.Issue{ 64 {IssueUpdatedAt: time.Date(1999, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "ONE"}, 65 {IssueUpdatedAt: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "ONE"}, 66 {IssueUpdatedAt: time.Date(1998, 1, 1, 0, 0, 0, 0, time.UTC), Repository: "TWO"}, 67 }, 68 time.Date(1998, 1, 1, 0, 0, 0, 0, time.UTC), 69 "TWO", 70 }, 71 } 72 73 for _, test := range tests { 74 db, err := config.CreateDatabase() 75 if err != nil { 76 t.Fatal("Failed to create database:", err) 77 } 78 79 tx := db.Begin() 80 for _, issue := range test.issues { 81 tx.Create(&issue) 82 } 83 tx.Commit() 84 85 actualLatest, err := findLatestIssueUpdate(db, test.repository) 86 if err != nil { 87 t.Error("findLatestIssueUpdate failed:", err) 88 } 89 if actualLatest != test.expectedLatest { 90 t.Error("Actual:", actualLatest, 91 "doesn't match expected:", test.expectedLatest) 92 } 93 } 94 } 95 96 func TestUpdateIssues(t *testing.T) { 97 config := sqltest.SQLiteConfig{File: ":memory:"} 98 99 tests := []struct { 100 before []sql.Issue 101 new []*github.Issue 102 after []sql.Issue 103 repository string 104 }{ 105 // No new issues 106 { 107 before: []sql.Issue{ 108 *makeIssue(1, "Title", "", "State", "User", "", "full/repo", 109 0, false, 110 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 111 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 112 time.Time{}), 113 }, 114 new: []*github.Issue{}, 115 after: []sql.Issue{ 116 *makeIssue(1, "Title", "", "State", "User", "", "full/repo", 117 0, false, 118 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 119 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 120 time.Time{}), 121 }, 122 repository: "FULL/REPO", 123 }, 124 // New issues 125 { 126 before: []sql.Issue{ 127 *makeIssue(1, "Title", "", "State", "User", "", "full/repo", 128 0, false, 129 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 130 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 131 time.Time{}), 132 }, 133 new: []*github.Issue{ 134 makeGithubIssue(2, "Super Title", "Body", "NoState", "Login", "", 0, false, 135 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 136 time.Date(2002, 1, 1, 0, 0, 0, 0, time.UTC), 137 time.Time{}), 138 }, 139 after: []sql.Issue{ 140 *makeIssue(1, "Title", "", "State", "User", "", "full/repo", 141 0, false, 142 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 143 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 144 time.Time{}), 145 *makeIssue(2, "Super Title", "Body", "NoState", "Login", "", 146 "full/repo", 0, false, 147 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 148 time.Date(2002, 1, 1, 0, 0, 0, 0, time.UTC), 149 time.Time{}), 150 }, 151 repository: "FULL/REPO", 152 }, 153 // New issues + already existing 154 { 155 before: []sql.Issue{ 156 *makeIssue(1, "Title", "", "State", "User", "", "full/repo", 157 0, false, 158 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 159 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 160 time.Time{}), 161 *makeIssue(2, "Title", "", "State", "User", "", "full/repo", 162 0, false, 163 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 164 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 165 time.Time{}), 166 }, 167 new: []*github.Issue{ 168 makeGithubIssue(2, "Super Title", "Body", "NoState", "Login", "", 169 0, false, 170 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 171 time.Date(2002, 1, 1, 0, 0, 0, 0, time.UTC), 172 time.Time{}), 173 makeGithubIssue(3, "Title", "Body", "State", "John", "", 174 0, false, 175 time.Date(2002, 1, 1, 0, 0, 0, 0, time.UTC), 176 time.Date(2003, 1, 1, 0, 0, 0, 0, time.UTC), 177 time.Time{}), 178 }, 179 after: []sql.Issue{ 180 *makeIssue(1, "Title", "", "State", "User", "", "full/repo", 0, false, 181 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 182 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 183 time.Time{}), 184 *makeIssue(2, "Super Title", "Body", "NoState", "Login", "", 185 "full/repo", 0, false, 186 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 187 time.Date(2002, 1, 1, 0, 0, 0, 0, time.UTC), 188 time.Time{}), 189 *makeIssue(3, "Title", "Body", "State", "John", "", "full/repo", 190 0, false, 191 time.Date(2002, 1, 1, 0, 0, 0, 0, time.UTC), 192 time.Date(2003, 1, 1, 0, 0, 0, 0, time.UTC), 193 time.Time{}), 194 }, 195 repository: "FULL/REPO", 196 }, 197 // Fetch new repository 198 { 199 before: []sql.Issue{ 200 *makeIssue(1, "Title", "", "State", "User", "", "full/one", 201 0, false, 202 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 203 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 204 time.Time{}), 205 }, 206 new: []*github.Issue{ 207 makeGithubIssue(1, "Super Title", "Body", "NoState", "Login", "", 208 0, false, 209 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 210 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 211 time.Time{}), 212 }, 213 after: []sql.Issue{ 214 *makeIssue(1, "Title", "", "State", "User", "", "full/one", 215 0, false, 216 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 217 time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC), 218 time.Time{}), 219 *makeIssue(1, "Super Title", "Body", "NoState", "Login", "", 220 "full/other", 0, false, 221 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 222 time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), 223 time.Time{}), 224 }, 225 repository: "FULL/OTHER", 226 }, 227 } 228 229 for _, test := range tests { 230 db, err := config.CreateDatabase() 231 if err != nil { 232 t.Fatal("Failed to create database:", err) 233 } 234 235 for _, issue := range test.before { 236 db.Create(&issue) 237 } 238 239 UpdateIssues(db, FakeClient{Issues: test.new, Repository: test.repository}) 240 var issues []sql.Issue 241 if err := db.Order("ID").Find(&issues).Error; err != nil { 242 t.Fatal(err) 243 } 244 if !reflect.DeepEqual(issues, test.after) { 245 t.Error("Actual:", issues, 246 "doesn't match expected:", test.after) 247 } 248 } 249 }