1// Copyright 2014 The go-github AUTHORS. All rights reserved. 2// 3// Use of this source code is governed by a BSD-style 4// license that can be found in the LICENSE file. 5 6// +build integration 7 8package integration 9 10import ( 11 "context" 12 "io" 13 "io/ioutil" 14 "net/http" 15 "reflect" 16 "testing" 17 18 "github.com/google/go-github/v35/github" 19) 20 21func TestRepositories_CRUD(t *testing.T) { 22 if !checkAuth("TestRepositories_CRUD") { 23 return 24 } 25 26 // get authenticated user 27 me, _, err := client.Users.Get(context.Background(), "") 28 if err != nil { 29 t.Fatalf("Users.Get('') returned error: %v", err) 30 } 31 32 repo, err := createRandomTestRepository(*me.Login, false) 33 if err != nil { 34 t.Fatalf("createRandomTestRepository returned error: %v", err) 35 } 36 37 // update the repository description 38 repo.Description = github.String("description") 39 repo.DefaultBranch = nil // FIXME: this shouldn't be necessary 40 _, _, err = client.Repositories.Edit(context.Background(), *repo.Owner.Login, *repo.Name, repo) 41 if err != nil { 42 t.Fatalf("Repositories.Edit() returned error: %v", err) 43 } 44 45 // delete the repository 46 _, err = client.Repositories.Delete(context.Background(), *repo.Owner.Login, *repo.Name) 47 if err != nil { 48 t.Fatalf("Repositories.Delete() returned error: %v", err) 49 } 50 51 // verify that the repository was deleted 52 _, resp, err := client.Repositories.Get(context.Background(), *repo.Owner.Login, *repo.Name) 53 if err == nil { 54 t.Fatalf("Test repository still exists after deleting it.") 55 } 56 if err != nil && resp.StatusCode != http.StatusNotFound { 57 t.Fatalf("Repositories.Get() returned error: %v", err) 58 } 59} 60 61func TestRepositories_BranchesTags(t *testing.T) { 62 // branches 63 branches, _, err := client.Repositories.ListBranches(context.Background(), "git", "git", nil) 64 if err != nil { 65 t.Fatalf("Repositories.ListBranches() returned error: %v", err) 66 } 67 68 if len(branches) == 0 { 69 t.Fatalf("Repositories.ListBranches('git', 'git') returned no branches") 70 } 71 72 _, _, err = client.Repositories.GetBranch(context.Background(), "git", "git", *branches[0].Name) 73 if err != nil { 74 t.Fatalf("Repositories.GetBranch() returned error: %v", err) 75 } 76 77 // tags 78 tags, _, err := client.Repositories.ListTags(context.Background(), "git", "git", nil) 79 if err != nil { 80 t.Fatalf("Repositories.ListTags() returned error: %v", err) 81 } 82 83 if len(tags) == 0 { 84 t.Fatalf("Repositories.ListTags('git', 'git') returned no tags") 85 } 86} 87 88func TestRepositories_EditBranches(t *testing.T) { 89 if !checkAuth("TestRepositories_EditBranches") { 90 return 91 } 92 93 // get authenticated user 94 me, _, err := client.Users.Get(context.Background(), "") 95 if err != nil { 96 t.Fatalf("Users.Get('') returned error: %v", err) 97 } 98 99 repo, err := createRandomTestRepository(*me.Login, true) 100 if err != nil { 101 t.Fatalf("createRandomTestRepository returned error: %v", err) 102 } 103 104 branch, _, err := client.Repositories.GetBranch(context.Background(), *repo.Owner.Login, *repo.Name, "master") 105 if err != nil { 106 t.Fatalf("Repositories.GetBranch() returned error: %v", err) 107 } 108 109 if *branch.Protected { 110 t.Fatalf("Branch %v of repo %v is already protected", "master", *repo.Name) 111 } 112 113 protectionRequest := &github.ProtectionRequest{ 114 RequiredStatusChecks: &github.RequiredStatusChecks{ 115 Strict: true, 116 Contexts: []string{"continuous-integration"}, 117 }, 118 RequiredPullRequestReviews: &github.PullRequestReviewsEnforcementRequest{ 119 DismissStaleReviews: true, 120 }, 121 EnforceAdmins: true, 122 // TODO: Only organization repositories can have users and team restrictions. 123 // In order to be able to test these Restrictions, need to add support 124 // for creating temporary organization repositories. 125 Restrictions: nil, 126 } 127 128 protection, _, err := client.Repositories.UpdateBranchProtection(context.Background(), *repo.Owner.Login, *repo.Name, "master", protectionRequest) 129 if err != nil { 130 t.Fatalf("Repositories.UpdateBranchProtection() returned error: %v", err) 131 } 132 133 want := &github.Protection{ 134 RequiredStatusChecks: &github.RequiredStatusChecks{ 135 Strict: true, 136 Contexts: []string{"continuous-integration"}, 137 }, 138 RequiredPullRequestReviews: &github.PullRequestReviewsEnforcement{ 139 DismissStaleReviews: true, 140 RequiredApprovingReviewCount: 0, 141 }, 142 EnforceAdmins: &github.AdminEnforcement{ 143 URL: github.String("https://api.github.com/repos/" + *repo.Owner.Login + "/" + *repo.Name + "/branches/master/protection/enforce_admins"), 144 Enabled: true, 145 }, 146 Restrictions: nil, 147 } 148 if !reflect.DeepEqual(protection, want) { 149 t.Errorf("Repositories.UpdateBranchProtection() returned %+v, want %+v", protection, want) 150 } 151 152 _, err = client.Repositories.Delete(context.Background(), *repo.Owner.Login, *repo.Name) 153 if err != nil { 154 t.Fatalf("Repositories.Delete() returned error: %v", err) 155 } 156} 157 158func TestRepositories_List(t *testing.T) { 159 if !checkAuth("TestRepositories_List") { 160 return 161 } 162 163 _, _, err := client.Repositories.List(context.Background(), "", nil) 164 if err != nil { 165 t.Fatalf("Repositories.List('') returned error: %v", err) 166 } 167 168 _, _, err = client.Repositories.List(context.Background(), "google", nil) 169 if err != nil { 170 t.Fatalf("Repositories.List('google') returned error: %v", err) 171 } 172 173 opt := github.RepositoryListOptions{Sort: "created"} 174 repos, _, err := client.Repositories.List(context.Background(), "google", &opt) 175 if err != nil { 176 t.Fatalf("Repositories.List('google') with Sort opt returned error: %v", err) 177 } 178 for i, repo := range repos { 179 if i > 0 && (*repos[i-1].CreatedAt).Time.Before((*repo.CreatedAt).Time) { 180 t.Fatalf("Repositories.List('google') with default descending Sort returned incorrect order") 181 } 182 } 183} 184 185func TestRepositories_DownloadReleaseAsset(t *testing.T) { 186 if !checkAuth("TestRepositories_DownloadReleaseAsset") { 187 return 188 } 189 190 rc, _, err := client.Repositories.DownloadReleaseAsset(context.Background(), "andersjanmyr", "goose", 484892, http.DefaultClient) 191 if err != nil { 192 t.Fatalf("Repositories.DownloadReleaseAsset(andersjanmyr, goose, 484892, true) returned error: %v", err) 193 } 194 defer func() { _ = rc.Close() }() 195 _, err = io.Copy(ioutil.Discard, rc) 196 if err != nil { 197 t.Fatalf("Repositories.DownloadReleaseAsset(andersjanmyr, goose, 484892, true) returned error: %v", err) 198 } 199} 200