1package autorest
2
3// Copyright 2017 Microsoft Corporation
4//
5//  Licensed under the Apache License, Version 2.0 (the "License");
6//  you may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at
8//
9//      http://www.apache.org/licenses/LICENSE-2.0
10//
11//  Unless required by applicable law or agreed to in writing, software
12//  distributed under the License is distributed on an "AS IS" BASIS,
13//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14//  See the License for the specific language governing permissions and
15//  limitations under the License.
16
17import (
18	"net/http"
19	"testing"
20
21	"github.com/Azure/go-autorest/autorest/mocks"
22)
23
24func TestResponseHasStatusCode(t *testing.T) {
25	codes := []int{http.StatusOK, http.StatusAccepted}
26	resp := &http.Response{StatusCode: http.StatusAccepted}
27	if !ResponseHasStatusCode(resp, codes...) {
28		t.Fatalf("autorest: ResponseHasStatusCode failed to find %v in %v", resp.StatusCode, codes)
29	}
30}
31
32func TestResponseHasStatusCodeNotPresent(t *testing.T) {
33	codes := []int{http.StatusOK, http.StatusAccepted}
34	resp := &http.Response{StatusCode: http.StatusInternalServerError}
35	if ResponseHasStatusCode(resp, codes...) {
36		t.Fatalf("autorest: ResponseHasStatusCode unexpectedly found %v in %v", resp.StatusCode, codes)
37	}
38}
39
40func TestNewPollingRequestDoesNotReturnARequestWhenLocationHeaderIsMissing(t *testing.T) {
41	resp := mocks.NewResponseWithStatus("500 InternalServerError", http.StatusInternalServerError)
42
43	req, _ := NewPollingRequest(resp, nil)
44	if req != nil {
45		t.Fatal("autorest: NewPollingRequest returned an http.Request when the Location header was missing")
46	}
47}
48
49func TestNewPollingRequestReturnsAnErrorWhenPrepareFails(t *testing.T) {
50	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
51	mocks.SetAcceptedHeaders(resp)
52	resp.Header.Set(http.CanonicalHeaderKey(HeaderLocation), mocks.TestBadURL)
53
54	_, err := NewPollingRequest(resp, nil)
55	if err == nil {
56		t.Fatal("autorest: NewPollingRequest failed to return an error when Prepare fails")
57	}
58}
59
60func TestNewPollingRequestDoesNotReturnARequestWhenPrepareFails(t *testing.T) {
61	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
62	mocks.SetAcceptedHeaders(resp)
63	resp.Header.Set(http.CanonicalHeaderKey(HeaderLocation), mocks.TestBadURL)
64
65	req, _ := NewPollingRequest(resp, nil)
66	if req != nil {
67		t.Fatal("autorest: NewPollingRequest returned an http.Request when Prepare failed")
68	}
69}
70
71func TestNewPollingRequestReturnsAGetRequest(t *testing.T) {
72	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
73	mocks.SetAcceptedHeaders(resp)
74
75	req, _ := NewPollingRequest(resp, nil)
76	if req.Method != "GET" {
77		t.Fatalf("autorest: NewPollingRequest did not create an HTTP GET request -- actual method %v", req.Method)
78	}
79}
80
81func TestNewPollingRequestProvidesTheURL(t *testing.T) {
82	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
83	mocks.SetAcceptedHeaders(resp)
84
85	req, _ := NewPollingRequest(resp, nil)
86	if req.URL.String() != mocks.TestURL {
87		t.Fatalf("autorest: NewPollingRequest did not create an HTTP with the expected URL -- received %v, expected %v", req.URL, mocks.TestURL)
88	}
89}
90
91func TestGetLocation(t *testing.T) {
92	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
93	mocks.SetAcceptedHeaders(resp)
94
95	l := GetLocation(resp)
96	if len(l) == 0 {
97		t.Fatalf("autorest: GetLocation failed to return Location header -- expected %v, received %v", mocks.TestURL, l)
98	}
99}
100
101func TestGetLocationReturnsEmptyStringForMissingLocation(t *testing.T) {
102	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
103
104	l := GetLocation(resp)
105	if len(l) != 0 {
106		t.Fatalf("autorest: GetLocation return a value without a Location header -- received %v", l)
107	}
108}
109
110func TestGetRetryAfter(t *testing.T) {
111	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
112	mocks.SetAcceptedHeaders(resp)
113
114	d := GetRetryAfter(resp, DefaultPollingDelay)
115	if d != mocks.TestDelay {
116		t.Fatalf("autorest: GetRetryAfter failed to returned the expected delay -- expected %v, received %v", mocks.TestDelay, d)
117	}
118}
119
120func TestGetRetryAfterReturnsDefaultDelayIfRetryHeaderIsMissing(t *testing.T) {
121	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
122
123	d := GetRetryAfter(resp, DefaultPollingDelay)
124	if d != DefaultPollingDelay {
125		t.Fatalf("autorest: GetRetryAfter failed to returned the default delay for a missing Retry-After header -- expected %v, received %v",
126			DefaultPollingDelay, d)
127	}
128}
129
130func TestGetRetryAfterReturnsDefaultDelayIfRetryHeaderIsMalformed(t *testing.T) {
131	resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted)
132	mocks.SetAcceptedHeaders(resp)
133	resp.Header.Set(http.CanonicalHeaderKey(HeaderRetryAfter), "a very bad non-integer value")
134
135	d := GetRetryAfter(resp, DefaultPollingDelay)
136	if d != DefaultPollingDelay {
137		t.Fatalf("autorest: GetRetryAfter failed to returned the default delay for a malformed Retry-After header -- expected %v, received %v",
138			DefaultPollingDelay, d)
139	}
140}
141