github.com/opentofu/opentofu@v1.7.1/internal/backend/remote-state/http/backend_test.go (about)

     1  // Copyright (c) The OpenTofu Authors
     2  // SPDX-License-Identifier: MPL-2.0
     3  // Copyright (c) 2023 HashiCorp, Inc.
     4  // SPDX-License-Identifier: MPL-2.0
     5  
     6  package http
     7  
     8  import (
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/opentofu/opentofu/internal/configs"
    13  	"github.com/opentofu/opentofu/internal/encryption"
    14  	"github.com/zclconf/go-cty/cty"
    15  
    16  	"github.com/opentofu/opentofu/internal/backend"
    17  )
    18  
    19  func TestBackend_impl(t *testing.T) {
    20  	var _ backend.Backend = new(Backend)
    21  }
    22  
    23  func TestHTTPClientFactory(t *testing.T) {
    24  	// defaults
    25  
    26  	conf := map[string]cty.Value{
    27  		"address": cty.StringVal("http://127.0.0.1:8888/foo"),
    28  	}
    29  	b := backend.TestBackendConfig(t, New(encryption.StateEncryptionDisabled()), configs.SynthBody("synth", conf)).(*Backend)
    30  	client := b.client
    31  
    32  	if client == nil {
    33  		t.Fatal("Unexpected failure, address")
    34  	}
    35  	if client.URL.String() != "http://127.0.0.1:8888/foo" {
    36  		t.Fatalf("Expected address \"%s\", got \"%s\"", conf["address"], client.URL.String())
    37  	}
    38  	if client.UpdateMethod != "POST" {
    39  		t.Fatalf("Expected update_method \"%s\", got \"%s\"", "POST", client.UpdateMethod)
    40  	}
    41  	if client.LockURL != nil || client.LockMethod != "LOCK" {
    42  		t.Fatal("Unexpected lock_address or lock_method")
    43  	}
    44  	if client.UnlockURL != nil || client.UnlockMethod != "UNLOCK" {
    45  		t.Fatal("Unexpected unlock_address or unlock_method")
    46  	}
    47  	if client.Username != "" || client.Password != "" {
    48  		t.Fatal("Unexpected username or password")
    49  	}
    50  
    51  	if client.Headers != nil {
    52  		t.Fatal("Unexpected headers")
    53  	}
    54  
    55  	// custom
    56  	conf = map[string]cty.Value{
    57  		"address":        cty.StringVal("http://127.0.0.1:8888/foo"),
    58  		"update_method":  cty.StringVal("BLAH"),
    59  		"lock_address":   cty.StringVal("http://127.0.0.1:8888/bar"),
    60  		"lock_method":    cty.StringVal("BLIP"),
    61  		"unlock_address": cty.StringVal("http://127.0.0.1:8888/baz"),
    62  		"unlock_method":  cty.StringVal("BLOOP"),
    63  		"username":       cty.StringVal("user"),
    64  		"password":       cty.StringVal("pass"),
    65  		"retry_max":      cty.StringVal("999"),
    66  		"retry_wait_min": cty.StringVal("15"),
    67  		"retry_wait_max": cty.StringVal("150"),
    68  		"headers": cty.MapVal(map[string]cty.Value{
    69  			"user-defined": cty.StringVal("test"),
    70  		}),
    71  	}
    72  
    73  	b = backend.TestBackendConfig(t, New(encryption.StateEncryptionDisabled()), configs.SynthBody("synth", conf)).(*Backend)
    74  	client = b.client
    75  
    76  	if client == nil {
    77  		t.Fatal("Unexpected failure, update_method")
    78  	}
    79  	if client.UpdateMethod != "BLAH" {
    80  		t.Fatalf("Expected update_method \"%s\", got \"%s\"", "BLAH", client.UpdateMethod)
    81  	}
    82  	if client.LockURL.String() != conf["lock_address"].AsString() || client.LockMethod != "BLIP" {
    83  		t.Fatalf("Unexpected lock_address \"%s\" vs \"%s\" or lock_method \"%s\" vs \"%s\"", client.LockURL.String(),
    84  			conf["lock_address"].AsString(), client.LockMethod, conf["lock_method"])
    85  	}
    86  	if client.UnlockURL.String() != conf["unlock_address"].AsString() || client.UnlockMethod != "BLOOP" {
    87  		t.Fatalf("Unexpected unlock_address \"%s\" vs \"%s\" or unlock_method \"%s\" vs \"%s\"", client.UnlockURL.String(),
    88  			conf["unlock_address"].AsString(), client.UnlockMethod, conf["unlock_method"])
    89  	}
    90  	if client.Username != "user" || client.Password != "pass" {
    91  		t.Fatalf("Unexpected username \"%s\" vs \"%s\" or password \"%s\" vs \"%s\"", client.Username, conf["username"],
    92  			client.Password, conf["password"])
    93  	}
    94  	if client.Client.RetryMax != 999 {
    95  		t.Fatalf("Expected retry_max \"%d\", got \"%d\"", 999, client.Client.RetryMax)
    96  	}
    97  	if client.Client.RetryWaitMin != 15*time.Second {
    98  		t.Fatalf("Expected retry_wait_min \"%s\", got \"%s\"", 15*time.Second, client.Client.RetryWaitMin)
    99  	}
   100  	if client.Client.RetryWaitMax != 150*time.Second {
   101  		t.Fatalf("Expected retry_wait_max \"%s\", got \"%s\"", 150*time.Second, client.Client.RetryWaitMax)
   102  	}
   103  
   104  	if len(client.Headers) != 1 || client.Headers["user-defined"] != "test" {
   105  		t.Fatalf("Expected headers \"user-defined\" to be \"test\", got \"%s\"", client.Headers)
   106  	}
   107  }
   108  
   109  func TestHTTPClientFactoryWithEnv(t *testing.T) {
   110  	// env
   111  	conf := map[string]string{
   112  		"address":        "http://127.0.0.1:8888/foo",
   113  		"update_method":  "BLAH",
   114  		"lock_address":   "http://127.0.0.1:8888/bar",
   115  		"lock_method":    "BLIP",
   116  		"unlock_address": "http://127.0.0.1:8888/baz",
   117  		"unlock_method":  "BLOOP",
   118  		"username":       "user",
   119  		"password":       "pass",
   120  		"retry_max":      "999",
   121  		"retry_wait_min": "15",
   122  		"retry_wait_max": "150",
   123  	}
   124  
   125  	t.Setenv("TF_HTTP_ADDRESS", conf["address"])
   126  	t.Setenv("TF_HTTP_UPDATE_METHOD", conf["update_method"])
   127  	t.Setenv("TF_HTTP_LOCK_ADDRESS", conf["lock_address"])
   128  	t.Setenv("TF_HTTP_UNLOCK_ADDRESS", conf["unlock_address"])
   129  	t.Setenv("TF_HTTP_LOCK_METHOD", conf["lock_method"])
   130  	t.Setenv("TF_HTTP_UNLOCK_METHOD", conf["unlock_method"])
   131  	t.Setenv("TF_HTTP_USERNAME", conf["username"])
   132  	t.Setenv("TF_HTTP_PASSWORD", conf["password"])
   133  	t.Setenv("TF_HTTP_RETRY_MAX", conf["retry_max"])
   134  	t.Setenv("TF_HTTP_RETRY_WAIT_MIN", conf["retry_wait_min"])
   135  	t.Setenv("TF_HTTP_RETRY_WAIT_MAX", conf["retry_wait_max"])
   136  
   137  	b := backend.TestBackendConfig(t, New(encryption.StateEncryptionDisabled()), nil).(*Backend)
   138  	client := b.client
   139  
   140  	if client == nil {
   141  		t.Fatal("Unexpected failure, EnvDefaultFunc")
   142  	}
   143  	if client.UpdateMethod != "BLAH" {
   144  		t.Fatalf("Expected update_method \"%s\", got \"%s\"", "BLAH", client.UpdateMethod)
   145  	}
   146  	if client.LockURL.String() != conf["lock_address"] || client.LockMethod != "BLIP" {
   147  		t.Fatalf("Unexpected lock_address \"%s\" vs \"%s\" or lock_method \"%s\" vs \"%s\"", client.LockURL.String(),
   148  			conf["lock_address"], client.LockMethod, conf["lock_method"])
   149  	}
   150  	if client.UnlockURL.String() != conf["unlock_address"] || client.UnlockMethod != "BLOOP" {
   151  		t.Fatalf("Unexpected unlock_address \"%s\" vs \"%s\" or unlock_method \"%s\" vs \"%s\"", client.UnlockURL.String(),
   152  			conf["unlock_address"], client.UnlockMethod, conf["unlock_method"])
   153  	}
   154  	if client.Username != "user" || client.Password != "pass" {
   155  		t.Fatalf("Unexpected username \"%s\" vs \"%s\" or password \"%s\" vs \"%s\"", client.Username, conf["username"],
   156  			client.Password, conf["password"])
   157  	}
   158  	if client.Client.RetryMax != 999 {
   159  		t.Fatalf("Expected retry_max \"%d\", got \"%d\"", 999, client.Client.RetryMax)
   160  	}
   161  	if client.Client.RetryWaitMin != 15*time.Second {
   162  		t.Fatalf("Expected retry_wait_min \"%s\", got \"%s\"", 15*time.Second, client.Client.RetryWaitMin)
   163  	}
   164  	if client.Client.RetryWaitMax != 150*time.Second {
   165  		t.Fatalf("Expected retry_wait_max \"%s\", got \"%s\"", 150*time.Second, client.Client.RetryWaitMax)
   166  	}
   167  }