1package testing
2
3import (
4	"fmt"
5	"net/http"
6	"testing"
7
8	"github.com/gophercloud/gophercloud/openstack/service/vN/resources"
9	th "github.com/gophercloud/gophercloud/testhelper"
10	"github.com/gophercloud/gophercloud/testhelper/client"
11)
12
13// ListResult provides a single page of RESOURCE results.
14const ListResult = `
15{
16}
17`
18
19// GetResult provides a Get result.
20const GetResult = `
21{
22}
23`
24
25// CreateRequest provides the input to a Create request.
26const CreateRequest = `
27{
28}
29`
30
31// UpdateRequest provides the input to as Update request.
32const UpdateRequest = `
33{
34}
35`
36
37// UpdateResult provides an update result.
38const UpdateResult = `
39{
40}
41`
42
43// FirstResource is the first resource in the List request.
44var FirstResource = resources.Resource{}
45
46// SecondResource is the second resource in the List request.
47var SecondResource = resources.Resource{}
48
49// SecondResourceUpdated is how SecondResource should look after an Update.
50var SecondResourceUpdated = resources.Resource{}
51
52// ExpectedResourcesSlice is the slice of resources expected to be returned from ListResult.
53var ExpectedResourcesSlice = []resources.Resource{FirstResource, SecondResource}
54
55// HandleListResourceSuccessfully creates an HTTP handler at `/resources` on the
56// test handler mux that responds with a list of two resources.
57func HandleListResourceSuccessfully(t *testing.T) {
58	th.Mux.HandleFunc("/resources", func(w http.ResponseWriter, r *http.Request) {
59		th.TestMethod(t, r, "GET")
60		th.TestHeader(t, r, "Accept", "application/json")
61		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
62
63		w.Header().Set("Content-Type", "application/json")
64		w.WriteHeader(http.StatusOK)
65		fmt.Fprintf(w, ListResult)
66	})
67}
68
69// HandleGetResourceSuccessfully creates an HTTP handler at `/resources` on the
70// test handler mux that responds with a single resource.
71func HandleGetResourceSuccessfully(t *testing.T) {
72	th.Mux.HandleFunc("/resources/9fe1d3", func(w http.ResponseWriter, r *http.Request) {
73		th.TestMethod(t, r, "GET")
74		th.TestHeader(t, r, "Accept", "application/json")
75		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
76
77		w.Header().Set("Content-Type", "application/json")
78		w.WriteHeader(http.StatusOK)
79		fmt.Fprintf(w, GetResult)
80	})
81}
82
83// HandleCreateResourceSuccessfully creates an HTTP handler at `/resources` on the
84// test handler mux that tests resource creation.
85func HandleCreateResourceSuccessfully(t *testing.T) {
86	th.Mux.HandleFunc("/resources", func(w http.ResponseWriter, r *http.Request) {
87		th.TestMethod(t, r, "POST")
88		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
89		th.TestJSONRequest(t, r, CreateRequest)
90
91		w.WriteHeader(http.StatusCreated)
92		fmt.Fprintf(w, GetResult)
93	})
94}
95
96// HandleDeleteResourceSuccessfully creates an HTTP handler at `/resources` on the
97// test handler mux that tests resource deletion.
98func HandleDeleteResourceSuccessfully(t *testing.T) {
99	th.Mux.HandleFunc("/resources/9fe1d3", func(w http.ResponseWriter, r *http.Request) {
100		th.TestMethod(t, r, "DELETE")
101		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
102
103		w.WriteHeader(http.StatusNoContent)
104	})
105}
106
107// HandleUpdateResourceSuccessfully creates an HTTP handler at `/resources` on the
108// test handler mux that tests resource update.
109func HandleUpdateResourceSuccessfully(t *testing.T) {
110	th.Mux.HandleFunc("/resources/9fe1d3", func(w http.ResponseWriter, r *http.Request) {
111		th.TestMethod(t, r, "PATCH")
112		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
113		th.TestJSONRequest(t, r, UpdateRequest)
114
115		w.WriteHeader(http.StatusOK)
116		fmt.Fprintf(w, UpdateResult)
117	})
118}
119