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 }