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  }