github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/http/data_source_test.go (about) 1 package http 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/http/httptest" 7 "regexp" 8 "testing" 9 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 type TestHttpMock struct { 15 server *httptest.Server 16 } 17 18 const testDataSourceConfig_basic = ` 19 data "http" "http_test" { 20 url = "%s/meta_%d.txt" 21 } 22 23 output "body" { 24 value = "${data.http.http_test.body}" 25 } 26 ` 27 28 func TestDataSource_http200(t *testing.T) { 29 testHttpMock := setUpMockHttpServer() 30 31 defer testHttpMock.server.Close() 32 33 resource.UnitTest(t, resource.TestCase{ 34 Providers: testProviders, 35 Steps: []resource.TestStep{ 36 resource.TestStep{ 37 Config: fmt.Sprintf(testDataSourceConfig_basic, testHttpMock.server.URL, 200), 38 Check: func(s *terraform.State) error { 39 _, ok := s.RootModule().Resources["data.http.http_test"] 40 if !ok { 41 return fmt.Errorf("missing data resource") 42 } 43 44 outputs := s.RootModule().Outputs 45 46 if outputs["body"].Value != "1.0.0" { 47 return fmt.Errorf( 48 `'body' output is %s; want '1.0.0'`, 49 outputs["body"].Value, 50 ) 51 } 52 53 return nil 54 }, 55 }, 56 }, 57 }) 58 } 59 60 func TestDataSource_http404(t *testing.T) { 61 testHttpMock := setUpMockHttpServer() 62 63 defer testHttpMock.server.Close() 64 65 resource.UnitTest(t, resource.TestCase{ 66 Providers: testProviders, 67 Steps: []resource.TestStep{ 68 resource.TestStep{ 69 Config: fmt.Sprintf(testDataSourceConfig_basic, testHttpMock.server.URL, 404), 70 ExpectError: regexp.MustCompile("HTTP request error. Response code: 404"), 71 }, 72 }, 73 }) 74 } 75 76 const testDataSourceConfig_withHeaders = ` 77 data "http" "http_test" { 78 url = "%s/restricted/meta_%d.txt" 79 80 request_headers = { 81 "Authorization" = "Zm9vOmJhcg==" 82 } 83 } 84 85 output "body" { 86 value = "${data.http.http_test.body}" 87 } 88 ` 89 90 func TestDataSource_withHeaders200(t *testing.T) { 91 testHttpMock := setUpMockHttpServer() 92 93 defer testHttpMock.server.Close() 94 95 resource.UnitTest(t, resource.TestCase{ 96 Providers: testProviders, 97 Steps: []resource.TestStep{ 98 resource.TestStep{ 99 Config: fmt.Sprintf(testDataSourceConfig_withHeaders, testHttpMock.server.URL, 200), 100 Check: func(s *terraform.State) error { 101 _, ok := s.RootModule().Resources["data.http.http_test"] 102 if !ok { 103 return fmt.Errorf("missing data resource") 104 } 105 106 outputs := s.RootModule().Outputs 107 108 if outputs["body"].Value != "1.0.0" { 109 return fmt.Errorf( 110 `'body' output is %s; want '1.0.0'`, 111 outputs["body"].Value, 112 ) 113 } 114 115 return nil 116 }, 117 }, 118 }, 119 }) 120 } 121 122 const testDataSourceConfig_error = ` 123 data "http" "http_test" { 124 125 } 126 ` 127 128 func TestDataSource_compileError(t *testing.T) { 129 resource.UnitTest(t, resource.TestCase{ 130 Providers: testProviders, 131 Steps: []resource.TestStep{ 132 resource.TestStep{ 133 Config: testDataSourceConfig_error, 134 ExpectError: regexp.MustCompile("required field is not set"), 135 }, 136 }, 137 }) 138 } 139 140 func setUpMockHttpServer() *TestHttpMock { 141 Server := httptest.NewServer( 142 http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 143 if r.URL.Path == "/meta_200.txt" { 144 w.WriteHeader(http.StatusOK) 145 w.Write([]byte("1.0.0")) 146 } else if r.URL.Path == "/restricted/meta_200.txt" { 147 if r.Header.Get("Authorization") == "Zm9vOmJhcg==" { 148 w.WriteHeader(http.StatusOK) 149 w.Write([]byte("1.0.0")) 150 } else { 151 w.WriteHeader(http.StatusForbidden) 152 } 153 } else if r.URL.Path == "/meta_404.txt" { 154 w.WriteHeader(http.StatusNotFound) 155 } else { 156 w.WriteHeader(http.StatusNotFound) 157 } 158 159 w.Header().Add("Content-Type", "text/plain") 160 }), 161 ) 162 163 return &TestHttpMock{ 164 server: Server, 165 } 166 }