github.com/recobe182/terraform@v0.8.5-0.20170117231232-49ab22a935b7/builtin/providers/fastly/resource_fastly_service_v1_headers_test.go (about)

     1  package fastly
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"sort"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/terraform/helper/acctest"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  	gofastly "github.com/sethvargo/go-fastly"
    13  )
    14  
    15  func TestFastlyServiceV1_BuildHeaders(t *testing.T) {
    16  	cases := []struct {
    17  		remote *gofastly.CreateHeaderInput
    18  		local  map[string]interface{}
    19  	}{
    20  		{
    21  			remote: &gofastly.CreateHeaderInput{
    22  				Name:        "someheadder",
    23  				Action:      gofastly.HeaderActionDelete,
    24  				IgnoreIfSet: gofastly.CBool(true),
    25  				Type:        gofastly.HeaderTypeCache,
    26  				Destination: "http.aws-id",
    27  				Priority:    uint(100),
    28  			},
    29  			local: map[string]interface{}{
    30  				"name":               "someheadder",
    31  				"action":             "delete",
    32  				"ignore_if_set":      true,
    33  				"destination":        "http.aws-id",
    34  				"priority":           100,
    35  				"source":             "",
    36  				"regex":              "",
    37  				"substitution":       "",
    38  				"request_condition":  "",
    39  				"cache_condition":    "",
    40  				"response_condition": "",
    41  				"type":               "cache",
    42  			},
    43  		},
    44  		{
    45  			remote: &gofastly.CreateHeaderInput{
    46  				Name:        "someheadder",
    47  				Action:      gofastly.HeaderActionSet,
    48  				IgnoreIfSet: gofastly.CBool(false),
    49  				Type:        gofastly.HeaderTypeCache,
    50  				Destination: "http.aws-id",
    51  				Priority:    uint(100),
    52  				Source:      "http.server-name",
    53  			},
    54  			local: map[string]interface{}{
    55  				"name":               "someheadder",
    56  				"action":             "set",
    57  				"ignore_if_set":      false,
    58  				"destination":        "http.aws-id",
    59  				"priority":           100,
    60  				"source":             "http.server-name",
    61  				"regex":              "",
    62  				"substitution":       "",
    63  				"request_condition":  "",
    64  				"cache_condition":    "",
    65  				"response_condition": "",
    66  				"type":               "cache",
    67  			},
    68  		},
    69  	}
    70  
    71  	for _, c := range cases {
    72  		out, _ := buildHeader(c.local)
    73  		if !reflect.DeepEqual(out, c.remote) {
    74  			t.Fatalf("Error matching:\nexpected: %#v\ngot: %#v", c.remote, out)
    75  		}
    76  	}
    77  }
    78  
    79  func TestAccFastlyServiceV1_headers_basic(t *testing.T) {
    80  	var service gofastly.ServiceDetail
    81  	name := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    82  	domainName1 := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10))
    83  
    84  	resource.Test(t, resource.TestCase{
    85  		PreCheck:     func() { testAccPreCheck(t) },
    86  		Providers:    testAccProviders,
    87  		CheckDestroy: testAccCheckServiceV1Destroy,
    88  		Steps: []resource.TestStep{
    89  			resource.TestStep{
    90  				Config: testAccServiceV1HeadersConfig(name, domainName1),
    91  				Check: resource.ComposeTestCheckFunc(
    92  					testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
    93  					testAccCheckFastlyServiceV1HeaderAttributes(&service, name, []string{"http.x-amz-request-id", "http.Server"}, nil),
    94  					resource.TestCheckResourceAttr(
    95  						"fastly_service_v1.foo", "name", name),
    96  					resource.TestCheckResourceAttr(
    97  						"fastly_service_v1.foo", "header.#", "2"),
    98  				),
    99  			},
   100  
   101  			resource.TestStep{
   102  				Config: testAccServiceV1HeadersConfig_update(name, domainName1),
   103  				Check: resource.ComposeTestCheckFunc(
   104  					testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
   105  					testAccCheckFastlyServiceV1HeaderAttributes(&service, name, []string{"http.x-amz-request-id", "http.Server"}, []string{"http.server-name"}),
   106  					resource.TestCheckResourceAttr(
   107  						"fastly_service_v1.foo", "name", name),
   108  					resource.TestCheckResourceAttr(
   109  						"fastly_service_v1.foo", "header.#", "3"),
   110  					resource.TestCheckResourceAttr(
   111  						"fastly_service_v1.foo", "header.1147514417.source", "server.identity"),
   112  				),
   113  			},
   114  		},
   115  	})
   116  }
   117  
   118  func testAccCheckFastlyServiceV1HeaderAttributes(service *gofastly.ServiceDetail, name string, headersDeleted, headersAdded []string) resource.TestCheckFunc {
   119  	return func(s *terraform.State) error {
   120  
   121  		if service.Name != name {
   122  			return fmt.Errorf("Bad name, expected (%s), got (%s)", name, service.Name)
   123  		}
   124  
   125  		conn := testAccProvider.Meta().(*FastlyClient).conn
   126  		headersList, err := conn.ListHeaders(&gofastly.ListHeadersInput{
   127  			Service: service.ID,
   128  			Version: service.ActiveVersion.Number,
   129  		})
   130  
   131  		if err != nil {
   132  			return fmt.Errorf("[ERR] Error looking up Headers for (%s), version (%s): %s", service.Name, service.ActiveVersion.Number, err)
   133  		}
   134  
   135  		var deleted []string
   136  		var added []string
   137  		for _, h := range headersList {
   138  			if h.Action == gofastly.HeaderActionDelete {
   139  				deleted = append(deleted, h.Destination)
   140  			}
   141  			if h.Action == gofastly.HeaderActionSet {
   142  				added = append(added, h.Destination)
   143  			}
   144  		}
   145  
   146  		sort.Strings(headersAdded)
   147  		sort.Strings(headersDeleted)
   148  		sort.Strings(deleted)
   149  		sort.Strings(added)
   150  
   151  		if !reflect.DeepEqual(headersDeleted, deleted) {
   152  			return fmt.Errorf("Deleted Headers did not match.\n\tExpected: (%#v)\n\tGot: (%#v)", headersDeleted, deleted)
   153  		}
   154  		if !reflect.DeepEqual(headersAdded, added) {
   155  			return fmt.Errorf("Added Headers did not match.\n\tExpected: (%#v)\n\tGot: (%#v)", headersAdded, added)
   156  		}
   157  
   158  		return nil
   159  	}
   160  }
   161  
   162  func testAccServiceV1HeadersConfig(name, domain string) string {
   163  	return fmt.Sprintf(`
   164  resource "fastly_service_v1" "foo" {
   165    name = "%s"
   166  
   167    domain {
   168      name    = "%s"
   169      comment = "tf-testing-domain"
   170    }
   171  
   172    backend {
   173      address = "aws.amazon.com"
   174      name    = "amazon docs"
   175    }
   176  
   177    header {
   178      destination = "http.x-amz-request-id"
   179      type        = "cache"
   180      action      = "delete"
   181      name        = "remove x-amz-request-id"
   182    }
   183  
   184    header {
   185      destination   = "http.Server"
   186      type          = "cache"
   187      action        = "delete"
   188      name          = "remove s3 server"
   189      ignore_if_set = "true"
   190    }
   191  
   192    force_destroy = true
   193  }`, name, domain)
   194  }
   195  
   196  func testAccServiceV1HeadersConfig_update(name, domain string) string {
   197  	return fmt.Sprintf(`
   198  resource "fastly_service_v1" "foo" {
   199    name = "%s"
   200  
   201    domain {
   202      name    = "%s"
   203      comment = "tf-testing-domain"
   204    }
   205  
   206    backend {
   207      address = "aws.amazon.com"
   208      name    = "amazon docs"
   209    }
   210  
   211    header {
   212      destination = "http.x-amz-request-id"
   213      type        = "cache"
   214      action      = "delete"
   215      name        = "remove x-amz-request-id"
   216    }
   217  
   218    header {
   219      destination = "http.Server"
   220      type        = "cache"
   221      action      = "delete"
   222      name        = "DESTROY S3"
   223    }
   224  
   225    header {
   226      destination = "http.server-name"
   227      type        = "request"
   228      action      = "set"
   229      source      = "server.identity"
   230      name        = "Add server name"
   231    }
   232  
   233    force_destroy = true
   234  }`, name, domain)
   235  }