Ctrl K
ComunidadGuías…

coderd/usersecrets_internal_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package coderd

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"github.com/coder/coder/v2/coderd/database"
	"github.com/coder/coder/v2/coderd/util/ptr"
	"github.com/coder/coder/v2/codersdk"
)

func TestUserSecretCreateValidationErrors(t *testing.T) {
	t.Parallel()

	req := func(envName, filePath string, enabled *bool) codersdk.CreateUserSecretRequest {
		return codersdk.CreateUserSecretRequest{
			Name: "n", Value: "v", EnvName: envName, FilePath: filePath, Enabled: enabled,
		}
	}
	const (
		envField  = codersdk.UserSecretEnvNameField
		pathField = codersdk.UserSecretFilePathField
	)

	tests := []struct {
		name       string
		blocked    bool
		req        codersdk.CreateUserSecretRequest
		wantField  string
		wantDetail string
	}{
		{name: "PolicyOffAllowsFilePath", blocked: false, req: req("X", "/tmp/x", nil)},
		{name: "PolicyOnAllowsEnvOnly", blocked: true, req: req("X", "", nil)},
		{name: "PolicyOnAllowsDisabledTargetless", blocked: true, req: req("", "", ptr.Ref(false))},
		{name: "PolicyOnRejectsFilePath", blocked: true, req: req("X", "/tmp/x", nil), wantField: pathField, wantDetail: userSecretFilePathDisabledDetail},
		{name: "PolicyOnRejectsFilePathOnDisabled", blocked: true, req: req("", "/tmp/x", ptr.Ref(false)), wantField: pathField, wantDetail: userSecretFilePathDisabledDetail},
		{name: "PolicyOnRequiresEnvTarget", blocked: true, req: req("", "", nil), wantField: envField, wantDetail: userSecretEnvTargetRequiredDetail},
		{name: "PolicyOffKeepsSharedMessage", blocked: false, req: req("", "", nil), wantField: envField, wantDetail: codersdk.UserSecretInjectionTargetRequiredDetail},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			got := userSecretCreateValidationErrors(tt.req, tt.blocked)
			if tt.wantField == "" {
				require.Empty(t, got)
				return
			}
			require.Len(t, got, 1)
			assert.Equal(t, tt.wantField, got[0].Field)
			assert.Equal(t, tt.wantDetail, got[0].Detail)
		})
	}
}

func TestPrefixUserSecretValidationErrors(t *testing.T) {
	t.Parallel()

	got := prefixUserSecretValidationErrors(2, []codersdk.ValidationError{
		{Field: codersdk.UserSecretFilePathField, Detail: "nope"},
		{Field: codersdk.UserSecretEnvNameField, Detail: "also nope"},
	})
	require.Len(t, got, 2)
	assert.Equal(t, "secrets[2].file_path", got[0].Field)
	assert.Equal(t, "nope", got[0].Detail)
	assert.Equal(t, "secrets[2].env_name", got[1].Field)
}

func TestPrefixUserSecretValidationErrorsNegativeIndex(t *testing.T) {
	t.Parallel()

	// The batch handler passes failedIndex=-1 when no entry can be blamed.
	in := []codersdk.ValidationError{{Field: codersdk.UserSecretEnvNameField, Detail: "nope"}}
	got := prefixUserSecretValidationErrors(-1, in)
	require.Len(t, got, 1)
	assert.Equal(t, codersdk.UserSecretEnvNameField, got[0].Field)
	assert.Equal(t, "nope", got[0].Detail)
}

func TestUserSecretFilePathPolicyError(t *testing.T) {
	t.Parallel()

	var (
		legacyFileOnly   = database.UserSecret{FilePath: "/tmp/legacy", Enabled: true}
		bothTargets      = database.UserSecret{EnvName: "ENV", FilePath: "/tmp/legacy", Enabled: true}
		disabledFileOnly = database.UserSecret{FilePath: "/tmp/legacy"}
		envOnly          = database.UserSecret{EnvName: "ENV", Enabled: true}
	)

	tests := []struct {
		name    string
		old     database.UserSecret
		req     codersdk.UpdateUserSecretRequest
		wantErr error
	}{
		{name: "UnrelatedEdit", old: legacyFileOnly, req: codersdk.UpdateUserSecretRequest{Description: ptr.Ref("new")}},
		{name: "ResubmitSamePath", old: legacyFileOnly, req: codersdk.UpdateUserSecretRequest{FilePath: ptr.Ref("/tmp/legacy")}},
		{name: "Disable", old: legacyFileOnly, req: codersdk.UpdateUserSecretRequest{Enabled: ptr.Ref(false)}},
		{name: "ClearOnlyPath", old: legacyFileOnly, req: codersdk.UpdateUserSecretRequest{FilePath: ptr.Ref("")}, wantErr: errUserSecretEnvTargetRequired},
		{name: "ClearPathAndDisable", old: legacyFileOnly, req: codersdk.UpdateUserSecretRequest{FilePath: ptr.Ref(""), Enabled: ptr.Ref(false)}},
		{name: "MigrateToEnv", old: legacyFileOnly, req: codersdk.UpdateUserSecretRequest{EnvName: ptr.Ref("ENV"), FilePath: ptr.Ref("")}},
		{name: "CleanupPathWithEnvTarget", old: bothTargets, req: codersdk.UpdateUserSecretRequest{FilePath: ptr.Ref("")}},
		{name: "AddPath", old: envOnly, req: codersdk.UpdateUserSecretRequest{FilePath: ptr.Ref("/tmp/new")}, wantErr: errUserSecretFilePathDisabled},
		{name: "ChangePath", old: legacyFileOnly, req: codersdk.UpdateUserSecretRequest{FilePath: ptr.Ref("/tmp/other")}, wantErr: errUserSecretFilePathDisabled},
		{name: "ClearEnvLeavesOnlyPath", old: bothTargets, req: codersdk.UpdateUserSecretRequest{EnvName: ptr.Ref("")}, wantErr: errUserSecretEnvTargetRequired},
		{name: "ReEnableFileOnly", old: disabledFileOnly, req: codersdk.UpdateUserSecretRequest{Enabled: ptr.Ref(true)}, wantErr: errUserSecretEnvTargetRequired},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			err := userSecretFilePathPolicyError(tt.old, tt.req)
			if tt.wantErr == nil {
				require.NoError(t, err)
				return
			}
			require.ErrorIs(t, err, tt.wantErr)
		})
	}
}