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  }