github.com/rvichery/terraform@v0.11.10/backend/remote/testing.go (about) 1 package remote 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "net/http" 8 "net/http/httptest" 9 "testing" 10 11 tfe "github.com/hashicorp/go-tfe" 12 "github.com/hashicorp/terraform/backend" 13 "github.com/hashicorp/terraform/state/remote" 14 "github.com/hashicorp/terraform/svchost" 15 "github.com/hashicorp/terraform/svchost/auth" 16 "github.com/hashicorp/terraform/svchost/disco" 17 "github.com/mitchellh/cli" 18 ) 19 20 const ( 21 testCred = "test-auth-token" 22 ) 23 24 var ( 25 tfeHost = svchost.Hostname(defaultHostname) 26 credsSrc = auth.StaticCredentialsSource(map[svchost.Hostname]map[string]interface{}{ 27 tfeHost: {"token": testCred}, 28 }) 29 ) 30 31 func testInput(t *testing.T, answers map[string]string) *mockInput { 32 return &mockInput{answers: answers} 33 } 34 35 func testBackendDefault(t *testing.T) *Remote { 36 c := map[string]interface{}{ 37 "organization": "hashicorp", 38 "workspaces": []interface{}{ 39 map[string]interface{}{ 40 "name": "prod", 41 }, 42 }, 43 } 44 return testBackend(t, c) 45 } 46 47 func testBackendNoDefault(t *testing.T) *Remote { 48 c := map[string]interface{}{ 49 "organization": "hashicorp", 50 "workspaces": []interface{}{ 51 map[string]interface{}{ 52 "prefix": "my-app-", 53 }, 54 }, 55 } 56 return testBackend(t, c) 57 } 58 59 func testRemoteClient(t *testing.T) remote.Client { 60 b := testBackendDefault(t) 61 raw, err := b.State(backend.DefaultStateName) 62 if err != nil { 63 t.Fatalf("error: %v", err) 64 } 65 s := raw.(*remote.State) 66 return s.Client 67 } 68 69 func testBackend(t *testing.T, c map[string]interface{}) *Remote { 70 s := testServer(t) 71 b := New(testDisco(s)) 72 73 // Configure the backend so the client is created. 74 backend.TestBackendConfig(t, b, c) 75 76 // Get a new mock client. 77 mc := newMockClient() 78 79 // Replace the services we use with our mock services. 80 b.CLI = cli.NewMockUi() 81 b.client.Applies = mc.Applies 82 b.client.ConfigurationVersions = mc.ConfigurationVersions 83 b.client.Organizations = mc.Organizations 84 b.client.Plans = mc.Plans 85 b.client.PolicyChecks = mc.PolicyChecks 86 b.client.Runs = mc.Runs 87 b.client.StateVersions = mc.StateVersions 88 b.client.Workspaces = mc.Workspaces 89 90 ctx := context.Background() 91 92 // Create the organization. 93 _, err := b.client.Organizations.Create(ctx, tfe.OrganizationCreateOptions{ 94 Name: tfe.String(b.organization), 95 }) 96 if err != nil { 97 t.Fatalf("error: %v", err) 98 } 99 100 // Create the default workspace if required. 101 if b.workspace != "" { 102 _, err = b.client.Workspaces.Create(ctx, b.organization, tfe.WorkspaceCreateOptions{ 103 Name: tfe.String(b.workspace), 104 }) 105 if err != nil { 106 t.Fatalf("error: %v", err) 107 } 108 } 109 110 return b 111 } 112 113 // testServer returns a *httptest.Server used for local testing. 114 func testServer(t *testing.T) *httptest.Server { 115 mux := http.NewServeMux() 116 117 // Respond to service discovery calls. 118 mux.HandleFunc("/well-known/terraform.json", func(w http.ResponseWriter, r *http.Request) { 119 w.Header().Set("Content-Type", "application/json") 120 io.WriteString(w, `{"tfe.v2":"/api/v2/"}`) 121 }) 122 123 return httptest.NewServer(mux) 124 } 125 126 // testDisco returns a *disco.Disco mapping app.terraform.io and 127 // localhost to a local test server. 128 func testDisco(s *httptest.Server) *disco.Disco { 129 services := map[string]interface{}{ 130 "tfe.v2": fmt.Sprintf("%s/api/v2/", s.URL), 131 } 132 d := disco.NewWithCredentialsSource(credsSrc) 133 134 d.ForceHostServices(svchost.Hostname(defaultHostname), services) 135 d.ForceHostServices(svchost.Hostname("localhost"), services) 136 return d 137 }