package cli_test import ( "context" "net/http" "net/http/httptest" "sync/atomic" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/coder/coder/cli/clitest" "github.com/coder/coder/cli/cliui" "github.com/coder/coder/coderd/httpapi" "github.com/coder/coder/codersdk" "github.com/coder/coder/codersdk/agentsdk" "github.com/coder/coder/pty/ptytest" ) func TestGitAskpass(t *testing.T) { t.Parallel() t.Run("UsernameAndPassword", func(t *testing.T) { t.Parallel() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { httpapi.Write(context.Background(), w, http.StatusOK, agentsdk.GitAuthResponse{ Username: "something", Password: "bananas", }) })) t.Cleanup(srv.Close) url := srv.URL inv, _ := clitest.New(t, "--agent-url", url, "Username for 'https://github.com':") inv.Environ.Set("GIT_PREFIX", "/") pty := ptytest.New(t) inv.Stdout = pty.Output() clitest.Start(t, inv) pty.ExpectMatch("something") inv, _ = clitest.New(t, "--agent-url", url, "Password for 'https://potato@github.com':") inv.Environ.Set("GIT_PREFIX", "/") pty = ptytest.New(t) inv.Stdout = pty.Output() clitest.Start(t, inv) pty.ExpectMatch("bananas") }) t.Run("NoHost", func(t *testing.T) { t.Parallel() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { httpapi.Write(context.Background(), w, http.StatusNotFound, codersdk.Response{ Message: "Nope!", }) })) t.Cleanup(srv.Close) url := srv.URL inv, _ := clitest.New(t, "--agent-url", url, "--no-open", "Username for 'https://github.com':") inv.Environ.Set("GIT_PREFIX", "/") pty := ptytest.New(t) inv.Stderr = pty.Output() err := inv.Run() require.ErrorIs(t, err, cliui.Canceled) pty.ExpectMatch("Nope!") }) t.Run("Poll", func(t *testing.T) { t.Parallel() resp := atomic.Pointer[agentsdk.GitAuthResponse]{} resp.Store(&agentsdk.GitAuthResponse{ URL: "https://something.org", }) poll := make(chan struct{}, 10) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { val := resp.Load() if r.URL.Query().Has("listen") { poll <- struct{}{} if val.URL != "" { httpapi.Write(context.Background(), w, http.StatusInternalServerError, val) return } } httpapi.Write(context.Background(), w, http.StatusOK, val) })) t.Cleanup(srv.Close) url := srv.URL inv, _ := clitest.New(t, "--agent-url", url, "--no-open", "Username for 'https://github.com':") inv.Environ.Set("GIT_PREFIX", "/") pty := ptytest.New(t) inv.Stdout = pty.Output() go func() { err := inv.Run() assert.NoError(t, err) }() <-poll resp.Store(&agentsdk.GitAuthResponse{ Username: "username", Password: "password", }) pty.ExpectMatch("username") }) }