mirror of
https://github.com/int128/kubelogin.git
synced 2026-08-23 04:46:17 +00:00
* refactor: use t.Setenv() * refactor: use t.TempDir() * refactor: use t.Cleanup()
204 lines
6.1 KiB
Go
204 lines
6.1 KiB
Go
package loader
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/int128/kubelogin/pkg/kubeconfig"
|
|
"k8s.io/client-go/tools/clientcmd/api"
|
|
)
|
|
|
|
func Test_loadByDefaultRules(t *testing.T) {
|
|
t.Run("google.yaml>keycloak.yaml", func(t *testing.T) {
|
|
t.Setenv("KUBECONFIG", "testdata/kubeconfig.google.yaml"+string(os.PathListSeparator)+"testdata/kubeconfig.keycloak.yaml")
|
|
|
|
config, err := loadByDefaultRules("")
|
|
if err != nil {
|
|
t.Fatalf("Could not load the configs: %s", err)
|
|
}
|
|
if w := "google@hello.k8s.local"; w != config.CurrentContext {
|
|
t.Errorf("CurrentContext wants %s but %s", w, config.CurrentContext)
|
|
}
|
|
if _, ok := config.Contexts["google@hello.k8s.local"]; !ok {
|
|
t.Errorf("Contexts[google@hello.k8s.local] is missing")
|
|
}
|
|
if _, ok := config.Contexts["keycloak@hello.k8s.local"]; !ok {
|
|
t.Errorf("Contexts[keycloak@hello.k8s.local] is missing")
|
|
}
|
|
if _, ok := config.AuthInfos["google"]; !ok {
|
|
t.Errorf("AuthInfos[google] is missing")
|
|
}
|
|
if _, ok := config.AuthInfos["keycloak"]; !ok {
|
|
t.Errorf("AuthInfos[keycloak] is missing")
|
|
}
|
|
})
|
|
|
|
t.Run("keycloak.yaml>google.yaml", func(t *testing.T) {
|
|
t.Setenv("KUBECONFIG", "testdata/kubeconfig.keycloak.yaml"+string(os.PathListSeparator)+"testdata/kubeconfig.google.yaml")
|
|
|
|
config, err := loadByDefaultRules("")
|
|
if err != nil {
|
|
t.Fatalf("Could not load the configs: %s", err)
|
|
}
|
|
if w := "keycloak@hello.k8s.local"; w != config.CurrentContext {
|
|
t.Errorf("CurrentContext wants %s but %s", w, config.CurrentContext)
|
|
}
|
|
if _, ok := config.Contexts["google@hello.k8s.local"]; !ok {
|
|
t.Errorf("Contexts[google@hello.k8s.local] is missing")
|
|
}
|
|
if _, ok := config.Contexts["keycloak@hello.k8s.local"]; !ok {
|
|
t.Errorf("Contexts[keycloak@hello.k8s.local] is missing")
|
|
}
|
|
if _, ok := config.AuthInfos["google"]; !ok {
|
|
t.Errorf("AuthInfos[google] is missing")
|
|
}
|
|
if _, ok := config.AuthInfos["keycloak"]; !ok {
|
|
t.Errorf("AuthInfos[keycloak] is missing")
|
|
}
|
|
})
|
|
}
|
|
|
|
func Test_findCurrentAuthProvider(t *testing.T) {
|
|
t.Run("CurrentContext", func(t *testing.T) {
|
|
got, err := findCurrentAuthProvider(&api.Config{
|
|
CurrentContext: "theContext",
|
|
Contexts: map[string]*api.Context{
|
|
"theContext": {
|
|
AuthInfo: "theUser",
|
|
},
|
|
},
|
|
AuthInfos: map[string]*api.AuthInfo{
|
|
"theUser": {
|
|
LocationOfOrigin: "/path/to/kubeconfig",
|
|
AuthProvider: &api.AuthProviderConfig{
|
|
Name: "oidc",
|
|
Config: map[string]string{
|
|
"idp-issuer-url": "https://accounts.google.com",
|
|
"client-id": "GOOGLE_CLIENT_ID",
|
|
"client-secret": "GOOGLE_CLIENT_SECRET",
|
|
"idp-certificate-authority": "/path/to/cert",
|
|
"idp-certificate-authority-data": "BASE64",
|
|
"extra-scopes": "email,profile",
|
|
"id-token": "YOUR_ID_TOKEN",
|
|
"refresh-token": "YOUR_REFRESH_TOKEN",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, "", "")
|
|
if err != nil {
|
|
t.Fatalf("Could not find the current auth: %s", err)
|
|
}
|
|
want := &kubeconfig.AuthProvider{
|
|
LocationOfOrigin: "/path/to/kubeconfig",
|
|
UserName: "theUser",
|
|
ContextName: "theContext",
|
|
IDPIssuerURL: "https://accounts.google.com",
|
|
ClientID: "GOOGLE_CLIENT_ID",
|
|
ClientSecret: "GOOGLE_CLIENT_SECRET",
|
|
IDPCertificateAuthority: "/path/to/cert",
|
|
IDPCertificateAuthorityData: "BASE64",
|
|
ExtraScopes: []string{"email", "profile"},
|
|
IDToken: "YOUR_ID_TOKEN",
|
|
RefreshToken: "YOUR_REFRESH_TOKEN",
|
|
}
|
|
if diff := cmp.Diff(want, got); diff != "" {
|
|
t.Errorf("mismatch (-want +got):\n%s", diff)
|
|
}
|
|
})
|
|
|
|
t.Run("ByContextName", func(t *testing.T) {
|
|
got, err := findCurrentAuthProvider(&api.Config{
|
|
Contexts: map[string]*api.Context{
|
|
"theContext": {
|
|
AuthInfo: "theUser",
|
|
},
|
|
},
|
|
AuthInfos: map[string]*api.AuthInfo{
|
|
"theUser": {
|
|
LocationOfOrigin: "/path/to/kubeconfig",
|
|
AuthProvider: &api.AuthProviderConfig{
|
|
Name: "oidc",
|
|
Config: map[string]string{
|
|
"idp-issuer-url": "https://accounts.google.com",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, "theContext", "")
|
|
if err != nil {
|
|
t.Fatalf("Could not find the current auth: %s", err)
|
|
}
|
|
want := &kubeconfig.AuthProvider{
|
|
LocationOfOrigin: "/path/to/kubeconfig",
|
|
UserName: "theUser",
|
|
ContextName: "theContext",
|
|
IDPIssuerURL: "https://accounts.google.com",
|
|
}
|
|
if diff := cmp.Diff(want, got); diff != "" {
|
|
t.Errorf("mismatch (-want +got):\n%s", diff)
|
|
}
|
|
})
|
|
|
|
t.Run("ByUserName", func(t *testing.T) {
|
|
got, err := findCurrentAuthProvider(&api.Config{
|
|
AuthInfos: map[string]*api.AuthInfo{
|
|
"theUser": {
|
|
LocationOfOrigin: "/path/to/kubeconfig",
|
|
AuthProvider: &api.AuthProviderConfig{
|
|
Name: "oidc",
|
|
Config: map[string]string{
|
|
"idp-issuer-url": "https://accounts.google.com",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, "", "theUser")
|
|
if err != nil {
|
|
t.Fatalf("Could not find the current auth: %s", err)
|
|
}
|
|
want := &kubeconfig.AuthProvider{
|
|
LocationOfOrigin: "/path/to/kubeconfig",
|
|
UserName: "theUser",
|
|
IDPIssuerURL: "https://accounts.google.com",
|
|
}
|
|
if diff := cmp.Diff(want, got); diff != "" {
|
|
t.Errorf("mismatch (-want +got):\n%s", diff)
|
|
}
|
|
})
|
|
|
|
t.Run("NoConfig", func(t *testing.T) {
|
|
_, err := findCurrentAuthProvider(&api.Config{
|
|
AuthInfos: map[string]*api.AuthInfo{
|
|
"theUser": {
|
|
LocationOfOrigin: "/path/to/kubeconfig",
|
|
AuthProvider: &api.AuthProviderConfig{
|
|
Name: "oidc",
|
|
},
|
|
},
|
|
},
|
|
}, "", "theUser")
|
|
if err == nil {
|
|
t.Fatalf("wants error but nil")
|
|
}
|
|
})
|
|
|
|
t.Run("NotOIDC", func(t *testing.T) {
|
|
_, err := findCurrentAuthProvider(&api.Config{
|
|
AuthInfos: map[string]*api.AuthInfo{
|
|
"theUser": {
|
|
LocationOfOrigin: "/path/to/kubeconfig",
|
|
AuthProvider: &api.AuthProviderConfig{
|
|
Name: "some",
|
|
Config: map[string]string{"foo": "bar"},
|
|
},
|
|
},
|
|
},
|
|
}, "", "theUser")
|
|
if err == nil {
|
|
t.Fatalf("wants error but nil")
|
|
}
|
|
})
|
|
}
|