package authentication import ( "context" "testing" "time" "github.com/golang/mock/gomock" "github.com/google/go-cmp/cmp" "github.com/int128/kubelogin/pkg/adaptors/env/mock_env" "github.com/int128/kubelogin/pkg/adaptors/logger/mock_logger" "github.com/int128/kubelogin/pkg/adaptors/oidcclient" "github.com/int128/kubelogin/pkg/adaptors/oidcclient/mock_oidcclient" "github.com/int128/kubelogin/pkg/domain/oidc" ) func TestAuthCode_Do(t *testing.T) { dummyTokenClaims := oidc.Claims{ Subject: "YOUR_SUBJECT", Expiry: time.Date(2019, 1, 2, 3, 4, 5, 0, time.UTC), Pretty: map[string]string{"sub": "YOUR_SUBJECT"}, } timeout := 5 * time.Second t.Run("Success", func(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() ctx, cancel := context.WithTimeout(context.TODO(), timeout) defer cancel() o := &AuthCodeOption{ BindAddress: []string{"127.0.0.1:8000"}, SkipOpenBrowser: true, } mockOIDCClient := mock_oidcclient.NewMockInterface(ctrl) mockOIDCClient.EXPECT(). GetTokenByAuthCode(gomock.Any(), gomock.Any(), gomock.Any()). Do(func(_ context.Context, _ oidcclient.GetTokenByAuthCodeInput, readyChan chan<- string) { readyChan <- "LOCAL_SERVER_URL" }). Return(&oidcclient.TokenSet{ IDToken: "YOUR_ID_TOKEN", RefreshToken: "YOUR_REFRESH_TOKEN", IDTokenClaims: dummyTokenClaims, }, nil) u := AuthCode{ Logger: mock_logger.New(t), } got, err := u.Do(ctx, o, mockOIDCClient) if err != nil { t.Errorf("Do returned error: %+v", err) } want := &Output{ IDToken: "YOUR_ID_TOKEN", RefreshToken: "YOUR_REFRESH_TOKEN", IDTokenClaims: dummyTokenClaims, } if diff := cmp.Diff(want, got); diff != "" { t.Errorf("mismatch (-want +got):\n%s", diff) } }) t.Run("OpenBrowser", func(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() ctx, cancel := context.WithTimeout(context.TODO(), timeout) defer cancel() o := &AuthCodeOption{ BindAddress: []string{"127.0.0.1:8000"}, } mockOIDCClient := mock_oidcclient.NewMockInterface(ctrl) mockOIDCClient.EXPECT(). GetTokenByAuthCode(gomock.Any(), gomock.Any(), gomock.Any()). Do(func(_ context.Context, _ oidcclient.GetTokenByAuthCodeInput, readyChan chan<- string) { readyChan <- "LOCAL_SERVER_URL" }). Return(&oidcclient.TokenSet{ IDToken: "YOUR_ID_TOKEN", RefreshToken: "YOUR_REFRESH_TOKEN", IDTokenClaims: dummyTokenClaims, }, nil) mockEnv := mock_env.NewMockInterface(ctrl) mockEnv.EXPECT(). OpenBrowser("LOCAL_SERVER_URL") u := AuthCode{ Logger: mock_logger.New(t), Env: mockEnv, } got, err := u.Do(ctx, o, mockOIDCClient) if err != nil { t.Errorf("Do returned error: %+v", err) } want := &Output{ IDToken: "YOUR_ID_TOKEN", RefreshToken: "YOUR_REFRESH_TOKEN", IDTokenClaims: dummyTokenClaims, } if diff := cmp.Diff(want, got); diff != "" { t.Errorf("mismatch (-want +got):\n%s", diff) } }) }