github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/configs/experiments_test.go (about)

     1  package configs
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/google/go-cmp/cmp"
     7  	"github.com/hashicorp/hcl/v2"
     8  
     9  	"github.com/hashicorp/terraform/internal/experiments"
    10  )
    11  
    12  func TestExperimentsConfig(t *testing.T) {
    13  	// The experiment registrations are global, so we need to do some special
    14  	// patching in order to get a predictable set for our tests.
    15  	current := experiments.Experiment("current")
    16  	concluded := experiments.Experiment("concluded")
    17  	currentExperiments := experiments.NewSet(current)
    18  	concludedExperiments := map[experiments.Experiment]string{
    19  		concluded: "Reticulate your splines.",
    20  	}
    21  	defer experiments.OverrideForTesting(t, currentExperiments, concludedExperiments)()
    22  
    23  	t.Run("current", func(t *testing.T) {
    24  		parser := NewParser(nil)
    25  		parser.AllowLanguageExperiments(true)
    26  		mod, diags := parser.LoadConfigDir("testdata/experiments/current")
    27  		if got, want := len(diags), 1; got != want {
    28  			t.Fatalf("wrong number of diagnostics %d; want %d", got, want)
    29  		}
    30  		got := diags[0]
    31  		want := &hcl.Diagnostic{
    32  			Severity: hcl.DiagWarning,
    33  			Summary:  `Experimental feature "current" is active`,
    34  			Detail:   "Experimental features are available only in alpha releases of Terraform and are subject to breaking changes or total removal in later versions, based on feedback. We recommend against using experimental features in production.\n\nIf you have feedback on the design of this feature, please open a GitHub issue to discuss it.",
    35  			Subject: &hcl.Range{
    36  				Filename: "testdata/experiments/current/current_experiment.tf",
    37  				Start:    hcl.Pos{Line: 2, Column: 18, Byte: 29},
    38  				End:      hcl.Pos{Line: 2, Column: 25, Byte: 36},
    39  			},
    40  		}
    41  		if diff := cmp.Diff(want, got); diff != "" {
    42  			t.Errorf("wrong warning\n%s", diff)
    43  		}
    44  		if got, want := len(mod.ActiveExperiments), 1; got != want {
    45  			t.Errorf("wrong number of experiments %d; want %d", got, want)
    46  		}
    47  		if !mod.ActiveExperiments.Has(current) {
    48  			t.Errorf("module does not indicate current experiment as active")
    49  		}
    50  	})
    51  	t.Run("concluded", func(t *testing.T) {
    52  		parser := NewParser(nil)
    53  		parser.AllowLanguageExperiments(true)
    54  		_, diags := parser.LoadConfigDir("testdata/experiments/concluded")
    55  		if got, want := len(diags), 1; got != want {
    56  			t.Fatalf("wrong number of diagnostics %d; want %d", got, want)
    57  		}
    58  		got := diags[0]
    59  		want := &hcl.Diagnostic{
    60  			Severity: hcl.DiagError,
    61  			Summary:  `Experiment has concluded`,
    62  			Detail:   `Experiment "concluded" is no longer available. Reticulate your splines.`,
    63  			Subject: &hcl.Range{
    64  				Filename: "testdata/experiments/concluded/concluded_experiment.tf",
    65  				Start:    hcl.Pos{Line: 2, Column: 18, Byte: 29},
    66  				End:      hcl.Pos{Line: 2, Column: 27, Byte: 38},
    67  			},
    68  		}
    69  		if diff := cmp.Diff(want, got); diff != "" {
    70  			t.Errorf("wrong error\n%s", diff)
    71  		}
    72  	})
    73  	t.Run("concluded", func(t *testing.T) {
    74  		parser := NewParser(nil)
    75  		parser.AllowLanguageExperiments(true)
    76  		_, diags := parser.LoadConfigDir("testdata/experiments/unknown")
    77  		if got, want := len(diags), 1; got != want {
    78  			t.Fatalf("wrong number of diagnostics %d; want %d", got, want)
    79  		}
    80  		got := diags[0]
    81  		want := &hcl.Diagnostic{
    82  			Severity: hcl.DiagError,
    83  			Summary:  `Unknown experiment keyword`,
    84  			Detail:   `There is no current experiment with the keyword "unknown".`,
    85  			Subject: &hcl.Range{
    86  				Filename: "testdata/experiments/unknown/unknown_experiment.tf",
    87  				Start:    hcl.Pos{Line: 2, Column: 18, Byte: 29},
    88  				End:      hcl.Pos{Line: 2, Column: 25, Byte: 36},
    89  			},
    90  		}
    91  		if diff := cmp.Diff(want, got); diff != "" {
    92  			t.Errorf("wrong error\n%s", diff)
    93  		}
    94  	})
    95  	t.Run("invalid", func(t *testing.T) {
    96  		parser := NewParser(nil)
    97  		parser.AllowLanguageExperiments(true)
    98  		_, diags := parser.LoadConfigDir("testdata/experiments/invalid")
    99  		if got, want := len(diags), 1; got != want {
   100  			t.Fatalf("wrong number of diagnostics %d; want %d", got, want)
   101  		}
   102  		got := diags[0]
   103  		want := &hcl.Diagnostic{
   104  			Severity: hcl.DiagError,
   105  			Summary:  `Invalid expression`,
   106  			Detail:   `A static list expression is required.`,
   107  			Subject: &hcl.Range{
   108  				Filename: "testdata/experiments/invalid/invalid_experiments.tf",
   109  				Start:    hcl.Pos{Line: 2, Column: 17, Byte: 28},
   110  				End:      hcl.Pos{Line: 2, Column: 24, Byte: 35},
   111  			},
   112  		}
   113  		if diff := cmp.Diff(want, got); diff != "" {
   114  			t.Errorf("wrong error\n%s", diff)
   115  		}
   116  	})
   117  	t.Run("disallowed", func(t *testing.T) {
   118  		parser := NewParser(nil)
   119  		parser.AllowLanguageExperiments(false) // The default situation for release builds
   120  		_, diags := parser.LoadConfigDir("testdata/experiments/current")
   121  		if got, want := len(diags), 1; got != want {
   122  			t.Fatalf("wrong number of diagnostics %d; want %d", got, want)
   123  		}
   124  		got := diags[0]
   125  		want := &hcl.Diagnostic{
   126  			Severity: hcl.DiagError,
   127  			Summary:  `Module uses experimental features`,
   128  			Detail:   `Experimental features are intended only for gathering early feedback on new language designs, and so are available only in alpha releases of Terraform.`,
   129  			Subject: &hcl.Range{
   130  				Filename: "testdata/experiments/current/current_experiment.tf",
   131  				Start:    hcl.Pos{Line: 2, Column: 3, Byte: 14},
   132  				End:      hcl.Pos{Line: 2, Column: 14, Byte: 25},
   133  			},
   134  		}
   135  		if diff := cmp.Diff(want, got); diff != "" {
   136  			t.Errorf("wrong error\n%s", diff)
   137  		}
   138  	})
   139  }