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
6package github
7
8import (
9	"bytes"
10	"context"
11	"encoding/json"
12	"fmt"
13	"io/ioutil"
14	"net/http"
15	"reflect"
16	"testing"
17)
18
19func TestRepositoriesService_EnablePages(t *testing.T) {
20	client, mux, _, teardown := setup()
21	defer teardown()
22
23	input := &Pages{
24		Source: &PagesSource{
25			Branch: String("master"),
26			Path:   String("/"),
27		},
28		CNAME: String("www.my-domain.com"), // not passed along.
29	}
30
31	mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) {
32		v := new(createPagesRequest)
33		json.NewDecoder(r.Body).Decode(v)
34
35		testMethod(t, r, "POST")
36		testHeader(t, r, "Accept", mediaTypeEnablePagesAPIPreview)
37		want := &createPagesRequest{Source: &PagesSource{Branch: String("master"), Path: String("/")}}
38		if !reflect.DeepEqual(v, want) {
39			t.Errorf("Request body = %+v, want %+v", v, want)
40		}
41
42		fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false,"html_url":"h", "source": {"branch":"master", "path":"/"}}`)
43	})
44
45	page, _, err := client.Repositories.EnablePages(context.Background(), "o", "r", input)
46	if err != nil {
47		t.Errorf("Repositories.EnablePages returned error: %v", err)
48	}
49
50	want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false), HTMLURL: String("h"), Source: &PagesSource{Branch: String("master"), Path: String("/")}}
51
52	if !reflect.DeepEqual(page, want) {
53		t.Errorf("Repositories.EnablePages returned %v, want %v", page, want)
54	}
55}
56
57func TestRepositoriesService_UpdatePages(t *testing.T) {
58	client, mux, _, teardown := setup()
59	defer teardown()
60
61	input := &PagesUpdate{
62		CNAME:  String("www.my-domain.com"),
63		Source: String("gh-pages"),
64	}
65
66	mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) {
67		v := new(PagesUpdate)
68		json.NewDecoder(r.Body).Decode(v)
69
70		testMethod(t, r, "PUT")
71		want := &PagesUpdate{CNAME: String("www.my-domain.com"), Source: String("gh-pages")}
72		if !reflect.DeepEqual(v, want) {
73			t.Errorf("Request body = %+v, want %+v", v, want)
74		}
75
76		fmt.Fprint(w, `{"cname":"www.my-domain.com","source":"gh-pages"}`)
77	})
78
79	_, err := client.Repositories.UpdatePages(context.Background(), "o", "r", input)
80	if err != nil {
81		t.Errorf("Repositories.UpdatePages returned error: %v", err)
82	}
83}
84
85func TestRepositoriesService_UpdatePages_NullCNAME(t *testing.T) {
86	client, mux, _, teardown := setup()
87	defer teardown()
88
89	input := &PagesUpdate{
90		Source: String("gh-pages"),
91	}
92
93	mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) {
94		got, err := ioutil.ReadAll(r.Body)
95		if err != nil {
96			t.Fatalf("unable to read body: %v", err)
97		}
98
99		want := []byte(`{"cname":null,"source":"gh-pages"}` + "\n")
100		if !bytes.Equal(got, want) {
101			t.Errorf("Request body = %+v, want %+v", got, want)
102		}
103
104		fmt.Fprint(w, `{"cname":null,"source":"gh-pages"}`)
105	})
106
107	_, err := client.Repositories.UpdatePages(context.Background(), "o", "r", input)
108	if err != nil {
109		t.Errorf("Repositories.UpdatePages returned error: %v", err)
110	}
111}
112
113func TestRepositoriesService_DisablePages(t *testing.T) {
114	client, mux, _, teardown := setup()
115	defer teardown()
116
117	mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) {
118		testMethod(t, r, "DELETE")
119		testHeader(t, r, "Accept", mediaTypeEnablePagesAPIPreview)
120	})
121
122	_, err := client.Repositories.DisablePages(context.Background(), "o", "r")
123	if err != nil {
124		t.Errorf("Repositories.DisablePages returned error: %v", err)
125	}
126}
127
128func TestRepositoriesService_GetPagesInfo(t *testing.T) {
129	client, mux, _, teardown := setup()
130	defer teardown()
131
132	mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) {
133		testMethod(t, r, "GET")
134		fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false,"html_url":"h"}`)
135	})
136
137	page, _, err := client.Repositories.GetPagesInfo(context.Background(), "o", "r")
138	if err != nil {
139		t.Errorf("Repositories.GetPagesInfo returned error: %v", err)
140	}
141
142	want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false), HTMLURL: String("h")}
143	if !reflect.DeepEqual(page, want) {
144		t.Errorf("Repositories.GetPagesInfo returned %+v, want %+v", page, want)
145	}
146}
147
148func TestRepositoriesService_ListPagesBuilds(t *testing.T) {
149	client, mux, _, teardown := setup()
150	defer teardown()
151
152	mux.HandleFunc("/repos/o/r/pages/builds", func(w http.ResponseWriter, r *http.Request) {
153		testMethod(t, r, "GET")
154		fmt.Fprint(w, `[{"url":"u","status":"s","commit":"c"}]`)
155	})
156
157	pages, _, err := client.Repositories.ListPagesBuilds(context.Background(), "o", "r", nil)
158	if err != nil {
159		t.Errorf("Repositories.ListPagesBuilds returned error: %v", err)
160	}
161
162	want := []*PagesBuild{{URL: String("u"), Status: String("s"), Commit: String("c")}}
163	if !reflect.DeepEqual(pages, want) {
164		t.Errorf("Repositories.ListPagesBuilds returned %+v, want %+v", pages, want)
165	}
166}
167
168func TestRepositoriesService_ListPagesBuilds_withOptions(t *testing.T) {
169	client, mux, _, teardown := setup()
170	defer teardown()
171
172	mux.HandleFunc("/repos/o/r/pages/builds", func(w http.ResponseWriter, r *http.Request) {
173		testMethod(t, r, "GET")
174		testFormValues(t, r, values{
175			"page": "2",
176		})
177		fmt.Fprint(w, `[]`)
178	})
179
180	_, _, err := client.Repositories.ListPagesBuilds(context.Background(), "o", "r", &ListOptions{Page: 2})
181	if err != nil {
182		t.Errorf("Repositories.ListPagesBuilds returned error: %v", err)
183	}
184}
185
186func TestRepositoriesService_GetLatestPagesBuild(t *testing.T) {
187	client, mux, _, teardown := setup()
188	defer teardown()
189
190	mux.HandleFunc("/repos/o/r/pages/builds/latest", func(w http.ResponseWriter, r *http.Request) {
191		testMethod(t, r, "GET")
192		fmt.Fprint(w, `{"url":"u","status":"s","commit":"c"}`)
193	})
194
195	build, _, err := client.Repositories.GetLatestPagesBuild(context.Background(), "o", "r")
196	if err != nil {
197		t.Errorf("Repositories.GetLatestPagesBuild returned error: %v", err)
198	}
199
200	want := &PagesBuild{URL: String("u"), Status: String("s"), Commit: String("c")}
201	if !reflect.DeepEqual(build, want) {
202		t.Errorf("Repositories.GetLatestPagesBuild returned %+v, want %+v", build, want)
203	}
204}
205
206func TestRepositoriesService_GetPageBuild(t *testing.T) {
207	client, mux, _, teardown := setup()
208	defer teardown()
209
210	mux.HandleFunc("/repos/o/r/pages/builds/1", func(w http.ResponseWriter, r *http.Request) {
211		testMethod(t, r, "GET")
212		fmt.Fprint(w, `{"url":"u","status":"s","commit":"c"}`)
213	})
214
215	build, _, err := client.Repositories.GetPageBuild(context.Background(), "o", "r", 1)
216	if err != nil {
217		t.Errorf("Repositories.GetPageBuild returned error: %v", err)
218	}
219
220	want := &PagesBuild{URL: String("u"), Status: String("s"), Commit: String("c")}
221	if !reflect.DeepEqual(build, want) {
222		t.Errorf("Repositories.GetPageBuild returned %+v, want %+v", build, want)
223	}
224}
225
226func TestRepositoriesService_RequestPageBuild(t *testing.T) {
227	client, mux, _, teardown := setup()
228	defer teardown()
229
230	mux.HandleFunc("/repos/o/r/pages/builds", func(w http.ResponseWriter, r *http.Request) {
231		testMethod(t, r, "POST")
232		fmt.Fprint(w, `{"url":"u","status":"s"}`)
233	})
234
235	build, _, err := client.Repositories.RequestPageBuild(context.Background(), "o", "r")
236	if err != nil {
237		t.Errorf("Repositories.RequestPageBuild returned error: %v", err)
238	}
239
240	want := &PagesBuild{URL: String("u"), Status: String("s")}
241	if !reflect.DeepEqual(build, want) {
242		t.Errorf("Repositories.RequestPageBuild returned %+v, want %+v", build, want)
243	}
244}
245