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