1// Copyright 2013 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 6package github 7 8import ( 9 "bytes" 10 "context" 11 "fmt" 12 "io/ioutil" 13 "net/http" 14 "reflect" 15 "testing" 16) 17 18func TestGitService_GetTree(t *testing.T) { 19 client, mux, _, teardown := setup() 20 defer teardown() 21 22 mux.HandleFunc("/repos/o/r/git/trees/s", func(w http.ResponseWriter, r *http.Request) { 23 testMethod(t, r, "GET") 24 fmt.Fprint(w, `{ 25 "sha": "s", 26 "tree": [ { "type": "blob" } ], 27 "truncated": true 28 }`) 29 }) 30 31 tree, _, err := client.Git.GetTree(context.Background(), "o", "r", "s", true) 32 if err != nil { 33 t.Errorf("Git.GetTree returned error: %v", err) 34 } 35 36 want := Tree{ 37 SHA: String("s"), 38 Entries: []*TreeEntry{ 39 { 40 Type: String("blob"), 41 }, 42 }, 43 Truncated: Bool(true), 44 } 45 if !reflect.DeepEqual(*tree, want) { 46 t.Errorf("Tree.Get returned %+v, want %+v", *tree, want) 47 } 48} 49 50func TestGitService_GetTree_invalidOwner(t *testing.T) { 51 client, _, _, teardown := setup() 52 defer teardown() 53 54 _, _, err := client.Git.GetTree(context.Background(), "%", "%", "%", false) 55 testURLParseError(t, err) 56} 57 58func TestGitService_CreateTree(t *testing.T) { 59 client, mux, _, teardown := setup() 60 defer teardown() 61 62 input := []*TreeEntry{ 63 { 64 Path: String("file.rb"), 65 Mode: String("100644"), 66 Type: String("blob"), 67 SHA: String("7c258a9869f33c1e1e1f74fbb32f07c86cb5a75b"), 68 }, 69 } 70 71 mux.HandleFunc("/repos/o/r/git/trees", func(w http.ResponseWriter, r *http.Request) { 72 got, err := ioutil.ReadAll(r.Body) 73 if err != nil { 74 t.Fatalf("unable to read body: %v", err) 75 } 76 77 testMethod(t, r, "POST") 78 79 want := []byte(`{"base_tree":"b","tree":[{"sha":"7c258a9869f33c1e1e1f74fbb32f07c86cb5a75b","path":"file.rb","mode":"100644","type":"blob"}]}` + "\n") 80 if !bytes.Equal(got, want) { 81 t.Errorf("Git.CreateTree request body: %s, want %s", got, want) 82 } 83 84 fmt.Fprint(w, `{ 85 "sha": "cd8274d15fa3ae2ab983129fb037999f264ba9a7", 86 "tree": [ 87 { 88 "path": "file.rb", 89 "mode": "100644", 90 "type": "blob", 91 "size": 132, 92 "sha": "7c258a9869f33c1e1e1f74fbb32f07c86cb5a75b" 93 } 94 ] 95 }`) 96 }) 97 98 tree, _, err := client.Git.CreateTree(context.Background(), "o", "r", "b", input) 99 if err != nil { 100 t.Errorf("Git.CreateTree returned error: %v", err) 101 } 102 103 want := Tree{ 104 String("cd8274d15fa3ae2ab983129fb037999f264ba9a7"), 105 []*TreeEntry{ 106 { 107 Path: String("file.rb"), 108 Mode: String("100644"), 109 Type: String("blob"), 110 Size: Int(132), 111 SHA: String("7c258a9869f33c1e1e1f74fbb32f07c86cb5a75b"), 112 }, 113 }, 114 nil, 115 } 116 117 if !reflect.DeepEqual(*tree, want) { 118 t.Errorf("Git.CreateTree returned %+v, want %+v", *tree, want) 119 } 120} 121 122func TestGitService_CreateTree_Content(t *testing.T) { 123 client, mux, _, teardown := setup() 124 defer teardown() 125 126 input := []*TreeEntry{ 127 { 128 Path: String("content.md"), 129 Mode: String("100644"), 130 Content: String("file content"), 131 }, 132 } 133 134 mux.HandleFunc("/repos/o/r/git/trees", func(w http.ResponseWriter, r *http.Request) { 135 got, err := ioutil.ReadAll(r.Body) 136 if err != nil { 137 t.Fatalf("unable to read body: %v", err) 138 } 139 140 testMethod(t, r, "POST") 141 142 want := []byte(`{"base_tree":"b","tree":[{"path":"content.md","mode":"100644","content":"file content"}]}` + "\n") 143 if !bytes.Equal(got, want) { 144 t.Errorf("Git.CreateTree request body: %s, want %s", got, want) 145 } 146 147 fmt.Fprint(w, `{ 148 "sha": "5c6780ad2c68743383b740fd1dab6f6a33202b11", 149 "url": "https://api.github.com/repos/o/r/git/trees/5c6780ad2c68743383b740fd1dab6f6a33202b11", 150 "tree": [ 151 { 152 "mode": "100644", 153 "type": "blob", 154 "sha": "aad8feacf6f8063150476a7b2bd9770f2794c08b", 155 "path": "content.md", 156 "size": 12, 157 "url": "https://api.github.com/repos/o/r/git/blobs/aad8feacf6f8063150476a7b2bd9770f2794c08b" 158 } 159 ] 160 }`) 161 }) 162 163 tree, _, err := client.Git.CreateTree(context.Background(), "o", "r", "b", input) 164 if err != nil { 165 t.Errorf("Git.CreateTree returned error: %v", err) 166 } 167 168 want := Tree{ 169 String("5c6780ad2c68743383b740fd1dab6f6a33202b11"), 170 []*TreeEntry{ 171 { 172 Path: String("content.md"), 173 Mode: String("100644"), 174 Type: String("blob"), 175 Size: Int(12), 176 SHA: String("aad8feacf6f8063150476a7b2bd9770f2794c08b"), 177 URL: String("https://api.github.com/repos/o/r/git/blobs/aad8feacf6f8063150476a7b2bd9770f2794c08b"), 178 }, 179 }, 180 nil, 181 } 182 183 if !reflect.DeepEqual(*tree, want) { 184 t.Errorf("Git.CreateTree returned %+v, want %+v", *tree, want) 185 } 186} 187 188func TestGitService_CreateTree_Delete(t *testing.T) { 189 client, mux, _, teardown := setup() 190 defer teardown() 191 192 input := []*TreeEntry{ 193 { 194 Path: String("content.md"), 195 Mode: String("100644"), 196 }, 197 } 198 199 mux.HandleFunc("/repos/o/r/git/trees", func(w http.ResponseWriter, r *http.Request) { 200 got, err := ioutil.ReadAll(r.Body) 201 if err != nil { 202 t.Fatalf("unable to read body: %v", err) 203 } 204 205 testMethod(t, r, "POST") 206 207 want := []byte(`{"base_tree":"b","tree":[{"sha":null,"path":"content.md","mode":"100644"}]}` + "\n") 208 if !bytes.Equal(got, want) { 209 t.Errorf("Git.CreateTree request body: %s, want %s", got, want) 210 } 211 212 fmt.Fprint(w, `{ 213 "sha": "5c6780ad2c68743383b740fd1dab6f6a33202b11", 214 "url": "https://api.github.com/repos/o/r/git/trees/5c6780ad2c68743383b740fd1dab6f6a33202b11", 215 "tree": [ 216 { 217 "mode": "100644", 218 "type": "blob", 219 "sha": null, 220 "path": "content.md", 221 "size": 12, 222 "url": "https://api.github.com/repos/o/r/git/blobs/aad8feacf6f8063150476a7b2bd9770f2794c08b" 223 } 224 ] 225 }`) 226 }) 227 228 tree, _, err := client.Git.CreateTree(context.Background(), "o", "r", "b", input) 229 if err != nil { 230 t.Errorf("Git.CreateTree returned error: %v", err) 231 } 232 233 want := Tree{ 234 String("5c6780ad2c68743383b740fd1dab6f6a33202b11"), 235 []*TreeEntry{ 236 { 237 Path: String("content.md"), 238 Mode: String("100644"), 239 Type: String("blob"), 240 Size: Int(12), 241 SHA: nil, 242 URL: String("https://api.github.com/repos/o/r/git/blobs/aad8feacf6f8063150476a7b2bd9770f2794c08b"), 243 }, 244 }, 245 nil, 246 } 247 248 if !reflect.DeepEqual(*tree, want) { 249 t.Errorf("Git.CreateTree returned %+v, want %+v", *tree, want) 250 } 251} 252 253func TestGitService_CreateTree_invalidOwner(t *testing.T) { 254 client, _, _, teardown := setup() 255 defer teardown() 256 257 _, _, err := client.Git.CreateTree(context.Background(), "%", "%", "", nil) 258 testURLParseError(t, err) 259} 260