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  }