From b939188e6ddc240d29420e95f14c1e109cf91479 Mon Sep 17 00:00:00 2001 From: Kynan Ware <47394200+BagToad@users.noreply.github.com> Date: Wed, 27 Aug 2025 17:20:45 -0600 Subject: [PATCH] Refactor agent task tests into table-driven format Consolidates multiple individual test functions into a single table-driven test, improving maintainability and readability. This change makes it easier to add new test cases and ensures consistent test structure for agent task command authentication scenarios. --- pkg/cmd/agent-task/agent_task_test.go | 211 ++++++++++++-------------- 1 file changed, 94 insertions(+), 117 deletions(-) diff --git a/pkg/cmd/agent-task/agent_task_test.go b/pkg/cmd/agent-task/agent_task_test.go index d5e89c55f..dd4fe21b0 100644 --- a/pkg/cmd/agent-task/agent_task_test.go +++ b/pkg/cmd/agent-task/agent_task_test.go @@ -32,132 +32,109 @@ func setupMockOAuthConfig(t *testing.T, tokenSource string) gh.Config { return c } -func TestOAuthTokenAccepted(t *testing.T) { - f := &cmdutil.Factory{} - ios, _, stdout, _ := iostreams.Test() - f.IOStreams = ios - f.Config = func() (gh.Config, error) { return setupMockOAuthConfig(t, "oauth_token"), nil } - - cmd := NewCmdAgentTask(f) - err := cmd.Execute() - require.NoError(t, err) - require.Empty(t, stdout.String()) -} - -func TestKeyringOAuthTokenAccepted(t *testing.T) { - f := &cmdutil.Factory{} - ios, _, stdout, _ := iostreams.Test() - f.IOStreams = ios - f.Config = func() (gh.Config, error) { return setupMockOAuthConfig(t, "keyring"), nil } - - cmd := NewCmdAgentTask(f) - err := cmd.Execute() - require.NoError(t, err) - require.Equal(t, "", stdout.String()) -} - -func TestEnvVarTokenRejected(t *testing.T) { - f := &cmdutil.Factory{} - ios, _, _, _ := iostreams.Test() - f.IOStreams = ios - f.Config = func() (gh.Config, error) { return setupMockOAuthConfig(t, "GH_TOKEN"), nil } - cmd := NewCmdAgentTask(f) - err := cmd.Execute() - require.Error(t, err) - require.Contains(t, err.Error(), "requires an OAuth token") -} - -func TestEnterpriseTokenIgnored(t *testing.T) { - // This test ignores the test helper because we want to test a specific config state - t.Run("enterprise token alone is ignored and rejected", func(t *testing.T) { - f := &cmdutil.Factory{} - ios, _, _, _ := iostreams.Test() - f.IOStreams = ios - f.Config = func() (gh.Config, error) { - return func() gh.Config { - c := config.NewBlankConfig() - c.Set("something.ghes.com", "oauth_token", "ghe_ENTERPRISE123") - return c - }(), nil - } - - cmd := NewCmdAgentTask(f) - err := cmd.Execute() - require.Error(t, err) - }) - - t.Run("github.com oauth is accepted and enterprise token ignored", func(t *testing.T) { - f := &cmdutil.Factory{} - ios, _, _, _ := iostreams.Test() - f.IOStreams = ios - f.Config = func() (gh.Config, error) { - return func() gh.Config { +func TestNewCmdAgentTask(t *testing.T) { + tests := []struct { + name string + tokenSource string + customConfig func() (gh.Config, error) + wantErr bool + wantErrContains string + wantStdout string + }{ + { + name: "oauth token is accepted", + tokenSource: "oauth_token", + wantErr: false, + wantStdout: "", + }, + { + name: "keyring oauth token is accepted", + tokenSource: "keyring", + wantErr: false, + wantStdout: "", + }, + { + name: "env var token is rejected", + tokenSource: "GH_TOKEN", + wantErr: true, + wantErrContains: "requires an OAuth token", + }, + { + name: "enterprise token alone is ignored and rejected", + tokenSource: "GH_ENTERPRISE_TOKEN", + wantErr: true, + }, + { + name: "github.com oauth is accepted and enterprise token ignored", + customConfig: func() (gh.Config, error) { c := config.NewBlankConfig() c.Set("something.ghes.com", "oauth_token", "ghe_ENTERPRISE123") c.Set("github.com", "oauth_token", "gho_OAUTH123") - return c - }(), nil - } - - cmd := NewCmdAgentTask(f) - err := cmd.Execute() - require.NoError(t, err) - }) - -} - -func TestEnterpriseHostRejected(t *testing.T) { - f := &cmdutil.Factory{} - ios, _, _, _ := iostreams.Test() - f.IOStreams = ios - - f.Config = func() (gh.Config, error) { - return &ghmock.ConfigMock{ - AuthenticationFunc: func() gh.AuthConfig { - c := &config.AuthConfig{} - c.SetDefaultHost("something.ghes.com", "GH_HOST") - return c + return c, nil }, - }, nil + wantErr: false, + wantStdout: "", + }, + { + name: "enterprise host is rejected", + customConfig: func() (gh.Config, error) { + return &ghmock.ConfigMock{ + AuthenticationFunc: func() gh.AuthConfig { + c := &config.AuthConfig{} + c.SetDefaultHost("something.ghes.com", "GH_HOST") + return c + }, + }, nil + }, + wantErr: true, + wantErrContains: "not supported on this host", + }, + { + name: "empty host is rejected", + customConfig: func() (gh.Config, error) { + return &ghmock.ConfigMock{ + AuthenticationFunc: func() gh.AuthConfig { + c := &config.AuthConfig{} + c.SetDefaultHost("", "GH_HOST") + return c + }, + }, nil + }, + wantErr: true, + wantErrContains: "no default host configured", + }, + { + name: "no auth is rejected", + tokenSource: "", + wantErr: true, + }, } - cmd := NewCmdAgentTask(f) - err := cmd.Execute() - require.Error(t, err) - require.Contains(t, err.Error(), "not supported on this host") -} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + f := &cmdutil.Factory{} + ios, _, stdout, _ := iostreams.Test() + f.IOStreams = ios + if tt.customConfig != nil { + f.Config = tt.customConfig + } else { + f.Config = func() (gh.Config, error) { return setupMockOAuthConfig(t, tt.tokenSource), nil } + } -func TestEmptyHostRejected(t *testing.T) { - f := &cmdutil.Factory{} - ios, _, _, _ := iostreams.Test() - f.IOStreams = ios + cmd := NewCmdAgentTask(f) + err := cmd.Execute() - f.Config = func() (gh.Config, error) { - return &ghmock.ConfigMock{ - AuthenticationFunc: func() gh.AuthConfig { - c := &config.AuthConfig{} - c.SetDefaultHost("", "GH_HOST") - return c - }, - }, nil + if tt.wantErr { + require.Error(t, err) + if tt.wantErrContains != "" { + require.Contains(t, err.Error(), tt.wantErrContains) + } + } else { + require.NoError(t, err) + require.Equal(t, tt.wantStdout, stdout.String()) + } + }) } - - cmd := NewCmdAgentTask(f) - err := cmd.Execute() - require.Error(t, err) - require.Contains(t, err.Error(), "no default host configured") -} - -func TestNoAuthRejected(t *testing.T) { - f := &cmdutil.Factory{} - ios, _, _, _ := iostreams.Test() - f.IOStreams = ios - // No token configured - f.Config = func() (gh.Config, error) { return setupMockOAuthConfig(t, ""), nil } - - cmd := NewCmdAgentTask(f) - err := cmd.Execute() - require.Error(t, err) } func TestAliasAreSet(t *testing.T) {