85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
package gitcredentials_test
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/MakeNowJust/heredoc"
|
|
"github.com/cli/cli/v2/git"
|
|
"github.com/cli/cli/v2/pkg/cmd/auth/shared/gitcredentials"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func configureStoreCredentialHelper(t *testing.T) {
|
|
t.Helper()
|
|
tmpCredentialsFile := filepath.Join(t.TempDir(), "credentials")
|
|
|
|
gc := &git.Client{}
|
|
// Use `--file` to store credentials in a temporary file that gets cleaned up when the test has finished running
|
|
cmd, err := gc.Command(context.Background(), "config", "--global", "--add", "credential.helper", fmt.Sprintf("store --file %s", tmpCredentialsFile))
|
|
require.NoError(t, err)
|
|
require.NoError(t, cmd.Run())
|
|
}
|
|
|
|
func fillCredentials(t *testing.T) string {
|
|
gc := &git.Client{}
|
|
fillCmd, err := gc.Command(context.Background(), "credential", "fill")
|
|
require.NoError(t, err)
|
|
|
|
fillCmd.Stdin = bytes.NewBufferString(heredoc.Docf(`
|
|
protocol=https
|
|
host=%s
|
|
`, "github.com"))
|
|
|
|
b, err := fillCmd.Output()
|
|
require.NoError(t, err)
|
|
|
|
return string(b)
|
|
}
|
|
|
|
func TestUpdateAddsNewCredentials(t *testing.T) {
|
|
// Given we have an isolated git config and we're using the built in store credential helper
|
|
// https://git-scm.com/docs/git-credential-store
|
|
withIsolatedGitConfig(t)
|
|
configureStoreCredentialHelper(t)
|
|
|
|
// When we add new credentials
|
|
u := &gitcredentials.Updater{
|
|
GitClient: &git.Client{},
|
|
}
|
|
require.NoError(t, u.Update("github.com", "monalisa", "password"))
|
|
|
|
// Then our credential description is successfully filled
|
|
require.Equal(t, heredoc.Doc(`
|
|
protocol=https
|
|
host=github.com
|
|
username=monalisa
|
|
password=password
|
|
`), fillCredentials(t))
|
|
}
|
|
|
|
func TestUpdateReplacesOldCredentials(t *testing.T) {
|
|
// Given we have an isolated git config and we're using the built in store credential helper
|
|
// https://git-scm.com/docs/git-credential-store
|
|
// and we have existing credentials
|
|
withIsolatedGitConfig(t)
|
|
configureStoreCredentialHelper(t)
|
|
|
|
// When we replace old credentials
|
|
u := &gitcredentials.Updater{
|
|
GitClient: &git.Client{},
|
|
}
|
|
require.NoError(t, u.Update("github.com", "monalisa", "old-password"))
|
|
require.NoError(t, u.Update("github.com", "monalisa", "new-password"))
|
|
|
|
// Then our credential description is successfully filled
|
|
require.Equal(t, heredoc.Doc(`
|
|
protocol=https
|
|
host=github.com
|
|
username=monalisa
|
|
password=new-password
|
|
`), fillCredentials(t))
|
|
}
|