github.com/paultyng/terraform@v0.6.11-0.20180227224804-66ff8f8bed40/registry/client_test.go (about) 1 package registry 2 3 import ( 4 "os" 5 "strings" 6 "testing" 7 8 version "github.com/hashicorp/go-version" 9 "github.com/hashicorp/terraform/registry/regsrc" 10 "github.com/hashicorp/terraform/registry/test" 11 "github.com/hashicorp/terraform/svchost/disco" 12 ) 13 14 func TestLookupModuleVersions(t *testing.T) { 15 server := test.Registry() 16 defer server.Close() 17 18 client := NewClient(test.Disco(server), nil, nil) 19 20 // test with and without a hostname 21 for _, src := range []string{ 22 "example.com/test-versions/name/provider", 23 "test-versions/name/provider", 24 } { 25 modsrc, err := regsrc.ParseModuleSource(src) 26 if err != nil { 27 t.Fatal(err) 28 } 29 30 resp, err := client.Versions(modsrc) 31 if err != nil { 32 t.Fatal(err) 33 } 34 35 if len(resp.Modules) != 1 { 36 t.Fatal("expected 1 module, got", len(resp.Modules)) 37 } 38 39 mod := resp.Modules[0] 40 name := "test-versions/name/provider" 41 if mod.Source != name { 42 t.Fatalf("expected module name %q, got %q", name, mod.Source) 43 } 44 45 if len(mod.Versions) != 4 { 46 t.Fatal("expected 4 versions, got", len(mod.Versions)) 47 } 48 49 for _, v := range mod.Versions { 50 _, err := version.NewVersion(v.Version) 51 if err != nil { 52 t.Fatalf("invalid version %q: %s", v.Version, err) 53 } 54 } 55 } 56 } 57 58 func TestInvalidRegistry(t *testing.T) { 59 server := test.Registry() 60 defer server.Close() 61 62 client := NewClient(test.Disco(server), nil, nil) 63 64 src := "non-existent.localhost.localdomain/test-versions/name/provider" 65 modsrc, err := regsrc.ParseModuleSource(src) 66 if err != nil { 67 t.Fatal(err) 68 } 69 70 if _, err := client.Versions(modsrc); err == nil { 71 t.Fatal("expected error") 72 } 73 } 74 75 func TestRegistryAuth(t *testing.T) { 76 server := test.Registry() 77 defer server.Close() 78 79 client := NewClient(test.Disco(server), nil, nil) 80 81 src := "private/name/provider" 82 mod, err := regsrc.ParseModuleSource(src) 83 if err != nil { 84 t.Fatal(err) 85 } 86 87 // both should fail without auth 88 _, err = client.Versions(mod) 89 if err == nil { 90 t.Fatal("expected error") 91 } 92 _, err = client.Location(mod, "1.0.0") 93 if err == nil { 94 t.Fatal("expected error") 95 } 96 97 client = NewClient(test.Disco(server), test.Credentials, nil) 98 99 _, err = client.Versions(mod) 100 if err != nil { 101 t.Fatal(err) 102 } 103 _, err = client.Location(mod, "1.0.0") 104 if err != nil { 105 t.Fatal(err) 106 } 107 } 108 109 func TestLookupModuleLocationRelative(t *testing.T) { 110 server := test.Registry() 111 defer server.Close() 112 113 client := NewClient(test.Disco(server), nil, nil) 114 115 src := "relative/foo/bar" 116 mod, err := regsrc.ParseModuleSource(src) 117 if err != nil { 118 t.Fatal(err) 119 } 120 121 got, err := client.Location(mod, "0.2.0") 122 if err != nil { 123 t.Fatal(err) 124 } 125 126 want := server.URL + "/relative-path" 127 if got != want { 128 t.Errorf("wrong location %s; want %s", got, want) 129 } 130 } 131 132 func TestAccLookupModuleVersions(t *testing.T) { 133 if os.Getenv("TF_ACC") == "" { 134 t.Skip() 135 } 136 regDisco := disco.NewDisco() 137 138 // test with and without a hostname 139 for _, src := range []string{ 140 "terraform-aws-modules/vpc/aws", 141 regsrc.PublicRegistryHost.String() + "/terraform-aws-modules/vpc/aws", 142 } { 143 modsrc, err := regsrc.ParseModuleSource(src) 144 if err != nil { 145 t.Fatal(err) 146 } 147 148 s := NewClient(regDisco, nil, nil) 149 resp, err := s.Versions(modsrc) 150 if err != nil { 151 t.Fatal(err) 152 } 153 154 if len(resp.Modules) != 1 { 155 t.Fatal("expected 1 module, got", len(resp.Modules)) 156 } 157 158 mod := resp.Modules[0] 159 name := "terraform-aws-modules/vpc/aws" 160 if mod.Source != name { 161 t.Fatalf("expected module name %q, got %q", name, mod.Source) 162 } 163 164 if len(mod.Versions) == 0 { 165 t.Fatal("expected multiple versions, got 0") 166 } 167 168 for _, v := range mod.Versions { 169 _, err := version.NewVersion(v.Version) 170 if err != nil { 171 t.Fatalf("invalid version %q: %s", v.Version, err) 172 } 173 } 174 } 175 } 176 177 // the error should reference the config source exatly, not the discovered path. 178 func TestLookupLookupModuleError(t *testing.T) { 179 server := test.Registry() 180 defer server.Close() 181 182 client := NewClient(test.Disco(server), nil, nil) 183 184 // this should not be found in teh registry 185 src := "bad/local/path" 186 mod, err := regsrc.ParseModuleSource(src) 187 if err != nil { 188 t.Fatal(err) 189 } 190 191 _, err = client.Location(mod, "0.2.0") 192 if err == nil { 193 t.Fatal("expected error") 194 } 195 196 // check for the exact quoted string to ensure we didn't prepend a hostname. 197 if !strings.Contains(err.Error(), `"bad/local/path"`) { 198 t.Fatal("error should not include the hostname. got:", err) 199 } 200 }