-
Notifications
You must be signed in to change notification settings - Fork 279
Expand file tree
/
Copy pathexternal_prompt_test.go
More file actions
160 lines (135 loc) · 5.04 KB
/
external_prompt_test.go
File metadata and controls
160 lines (135 loc) · 5.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package cmd
import (
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"testing"
"github.com/azure/azure-dev/cli/azd/internal"
"github.com/azure/azure-dev/cli/azd/pkg/input"
"github.com/azure/azure-dev/cli/azd/pkg/output"
"github.com/spf13/cobra"
"github.com/stretchr/testify/require"
)
// TestExternalPromptFromEnvironmentVariables verifies that the console reads
// AZD_UI_PROMPT_ENDPOINT and AZD_UI_PROMPT_KEY environment variables and
// configures external prompting accordingly.
func TestExternalPromptFromEnvironmentVariables(t *testing.T) {
// Create a test HTTP server that simulates the external prompt endpoint
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Return a success response
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]any{
"status": "success",
"value": "test-response",
})
}))
defer server.Close()
testKey := "test-secret-key-12345"
// Set environment variables
t.Setenv("AZD_UI_PROMPT_ENDPOINT", server.URL)
t.Setenv("AZD_UI_PROMPT_KEY", testKey)
// Create a mock cobra command
cmd := &cobra.Command{}
cmd.SetIn(os.Stdin)
cmd.SetOut(os.Stdout)
cmd.SetErr(os.Stderr)
// Create root options
rootOptions := &internal.GlobalCommandOptions{
NoPrompt: false,
}
// Create formatter
var formatter output.Formatter = nil
// This simulates what happens in container.go when registering the console
writer := cmd.OutOrStdout()
isTerminal := false // Force non-terminal for test
// Check for external prompt configuration from environment variables
// (This is the code we added to container.go)
var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
}
}
}
// Verify the config was created
require.NotNil(t, externalPromptCfg, "External prompt config should be created from env vars")
require.Equal(t, server.URL, externalPromptCfg.Endpoint)
require.Equal(t, testKey, externalPromptCfg.Key)
require.NotNil(t, externalPromptCfg.Transporter)
// Create the console with external prompting configured
console := input.NewConsole(
rootOptions.NoPrompt,
isTerminal,
input.Writers{Output: writer},
input.ConsoleHandles{
Stdin: cmd.InOrStdin(),
Stdout: cmd.OutOrStdout(),
Stderr: cmd.ErrOrStderr(),
},
formatter,
externalPromptCfg,
)
require.NotNil(t, console)
// Note: Actually testing that the console uses external prompting would require
// calling Prompt/Select/Confirm methods, which is tested in console_test.go
// This test verifies the environment variable reading logic works correctly.
}
// TestExternalPromptNotConfiguredWithoutEnvVars verifies that when the
// environment variables are not set, no external prompt config is created.
func TestExternalPromptNotConfiguredWithoutEnvVars(t *testing.T) {
// Ensure env vars are not set
os.Unsetenv("AZD_UI_PROMPT_ENDPOINT")
os.Unsetenv("AZD_UI_PROMPT_KEY")
// Check for external prompt configuration from environment variables
var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
}
}
}
require.Nil(t, externalPromptCfg, "External prompt config should be nil when env vars not set")
}
// TestExternalPromptRequiresBothEnvVars verifies that both environment
// variables must be set for external prompting to be configured.
func TestExternalPromptRequiresBothEnvVars(t *testing.T) {
t.Run("only endpoint set", func(t *testing.T) {
t.Setenv("AZD_UI_PROMPT_ENDPOINT", "http://localhost:8080")
os.Unsetenv("AZD_UI_PROMPT_KEY")
var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
}
}
}
require.Nil(t, externalPromptCfg, "Config should be nil when only endpoint is set")
})
t.Run("only key set", func(t *testing.T) {
os.Unsetenv("AZD_UI_PROMPT_ENDPOINT")
t.Setenv("AZD_UI_PROMPT_KEY", "secret-key")
var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
}
}
}
require.Nil(t, externalPromptCfg, "Config should be nil when only key is set")
})
}