From ffd04d01d89bf6f8a39d0692e9328f537d33ca6f Mon Sep 17 00:00:00 2001 From: TheFox0x7 Date: Tue, 20 May 2025 19:30:25 +0200 Subject: [PATCH] add tests for smtp command --- cmd/admin.go | 4 +- cmd/admin_auth_smtp_test.go | 286 ++++++++++++++++++++++++++++++++++++ cmd/admin_auth_stmp.go | 45 +++--- 3 files changed, 313 insertions(+), 22 deletions(-) create mode 100644 cmd/admin_auth_smtp_test.go diff --git a/cmd/admin.go b/cmd/admin.go index 241579618d..1cca0b8603 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -57,8 +57,8 @@ var ( newMicrocmdAuthUpdateLdapBindDn(), newMicrocmdAuthAddLdapSimpleAuth(), newMicrocmdAuthUpdateLdapSimpleAuth(), - microcmdAuthAddSMTP, - microcmdAuthUpdateSMTP, + microcmdAuthAddSMTP(), + microcmdAuthUpdateSMTP(), microcmdAuthList, microcmdAuthDelete, }, diff --git a/cmd/admin_auth_smtp_test.go b/cmd/admin_auth_smtp_test.go new file mode 100644 index 0000000000..febff2bd92 --- /dev/null +++ b/cmd/admin_auth_smtp_test.go @@ -0,0 +1,286 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package cmd + +import ( + "context" + "testing" + + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/services/auth/source/smtp" + + "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v3" +) + +func TestAddSMTP(t *testing.T) { + testCases := []struct { + name string + args []string + source *auth_model.Source + errMsg string + }{ + { + name: "missing name", + args: []string{ + "--host", "localhost", + "--port", "25", + }, + errMsg: "name must be set", + }, + { + name: "missing host", + args: []string{ + "--name", "test", + "--port", "25", + }, + errMsg: "host must be set", + }, + { + name: "missing port", + args: []string{ + "--name", "test", + "--host", "localhost", + }, + errMsg: "port must be set", + }, + { + name: "valid config", + args: []string{ + "--name", "test", + "--host", "localhost", + "--port", "25", + }, + source: &auth_model.Source{ + Type: auth_model.SMTP, + Name: "test", + IsActive: true, + Cfg: &smtp.Source{ + Auth: "PLAIN", + Host: "localhost", + Port: 25, + // ForceSMTPS: true, + // SkipVerify: true, + }, + TwoFactorPolicy: "skip", + }, + }, + { + name: "valid config with options", + args: []string{ + "--name", "test", + "--host", "localhost", + "--port", "25", + "--auth-type", "LOGIN", + "--force-smtps=false", + "--skip-verify=false", + "--helo-hostname", "example.com", + "--disable-helo=false", + "--allowed-domains", "example.com,example.org", + "--skip-local-2fa=false", + "--active=false", + }, + source: &auth_model.Source{ + Type: auth_model.SMTP, + Name: "test", + IsActive: false, + Cfg: &smtp.Source{ + Auth: "LOGIN", + Host: "localhost", + Port: 25, + ForceSMTPS: false, + SkipVerify: false, + HeloHostname: "example.com", + DisableHelo: false, + AllowedDomains: "example.com,example.org", + }, + TwoFactorPolicy: "", + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + a := &authService{ + initDB: func(ctx context.Context) error { + return nil + }, + createAuthSource: func(ctx context.Context, source *auth_model.Source) error { + assert.Equal(t, tc.source, source) + return nil + }, + } + + cmd := &cli.Command{ + Flags: microcmdAuthAddSMTP().Flags, + Action: a.runAddSMTP, + } + + args := []string{"smtp-test"} + args = append(args, tc.args...) + + t.Log(args) + err := cmd.Run(t.Context(), args) + + if tc.errMsg != "" { + assert.EqualError(t, err, tc.errMsg) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestUpdateSMTP(t *testing.T) { + testCases := []struct { + name string + args []string + existingAuthSource *auth_model.Source + authSource *auth_model.Source + errMsg string + }{ + { + name: "missing id", + args: []string{ + "--name", "test", + "--host", "localhost", + "--port", "25", + }, + errMsg: "--id flag is missing", + }, + { + name: "valid config", + existingAuthSource: &auth_model.Source{ + ID: 1, + Type: auth_model.SMTP, + Name: "old name", + IsActive: true, + Cfg: &smtp.Source{ + Auth: "PLAIN", + Host: "old host", + Port: 26, + ForceSMTPS: true, + SkipVerify: true, + }, + TwoFactorPolicy: "", + }, + args: []string{ + "--id", "1", + "--name", "test", + "--host", "localhost", + "--port", "25", + }, + authSource: &auth_model.Source{ + ID: 1, + Type: auth_model.SMTP, + Name: "test", + IsActive: true, + Cfg: &smtp.Source{ + Auth: "PLAIN", + Host: "localhost", + Port: 25, + ForceSMTPS: true, + SkipVerify: true, + }, + TwoFactorPolicy: "skip", + }, + }, + { + name: "valid config with options", + existingAuthSource: &auth_model.Source{ + ID: 1, + Type: auth_model.SMTP, + Name: "old name", + IsActive: true, + Cfg: &smtp.Source{ + Auth: "PLAIN", + Host: "old host", + Port: 26, + ForceSMTPS: true, + SkipVerify: true, + HeloHostname: "old.example.com", + DisableHelo: false, + AllowedDomains: "old.example.com", + }, + TwoFactorPolicy: "", + }, + args: []string{ + "--id", "1", + "--name", "test", + "--host", "localhost", + "--port", "25", + "--auth-type", "LOGIN", + "--force-smtps=false", + "--skip-verify=false", + "--helo-hostname", "example.com", + "--disable-helo=true", + "--allowed-domains", "example.com,example.org", + "--skip-local-2fa=true", + "--active=false", + }, + authSource: &auth_model.Source{ + ID: 1, + Type: auth_model.SMTP, + Name: "test", + IsActive: false, + Cfg: &smtp.Source{ + Auth: "LOGIN", + Host: "localhost", + Port: 25, + ForceSMTPS: false, + SkipVerify: false, + HeloHostname: "example.com", + DisableHelo: true, + AllowedDomains: "example.com,example.org", + }, + TwoFactorPolicy: "skip", + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + a := &authService{ + initDB: func(ctx context.Context) error { + return nil + }, + getAuthSourceByID: func(ctx context.Context, id int64) (*auth_model.Source, error) { + return &auth_model.Source{ + ID: 1, + Type: auth_model.SMTP, + Name: "test", + IsActive: true, + Cfg: &smtp.Source{ + Auth: "PLAIN", + SkipVerify: true, + ForceSMTPS: true, + }, + TwoFactorPolicy: "skip", + }, nil + + }, + + updateAuthSource: func(ctx context.Context, source *auth_model.Source) error { + assert.Equal(t, tc.authSource, source) + return nil + }, + } + + app := &cli.Command{ + Flags: microcmdAuthUpdateSMTP().Flags, + Action: a.runUpdateSMTP, + } + args := []string{"smtp-tests"} + args = append(args, tc.args...) + + err := app.Run(t.Context(), args) + + if tc.errMsg != "" { + assert.EqualError(t, err, tc.errMsg) + } else { + assert.NoError(t, err) + } + }) + } +} diff --git a/cmd/admin_auth_stmp.go b/cmd/admin_auth_stmp.go index 016cb5639a..31d59fa7f1 100644 --- a/cmd/admin_auth_stmp.go +++ b/cmd/admin_auth_stmp.go @@ -6,6 +6,7 @@ package cmd import ( "context" "errors" + "fmt" "strings" auth_model "code.gitea.io/gitea/models/auth" @@ -15,8 +16,8 @@ import ( "github.com/urfave/cli/v3" ) -var ( - smtpCLIFlags = []cli.Flag{ +func smtpCLIFlags() []cli.Flag { + return []cli.Flag{ &cli.StringFlag{ Name: "name", Value: "", @@ -72,21 +73,24 @@ var ( Value: true, }, } +} - microcmdAuthAddSMTP = &cli.Command{ - Name: "add-smtp", - Usage: "Add new SMTP authentication source", - Action: runAddSMTP, - Flags: smtpCLIFlags, - } - - microcmdAuthUpdateSMTP = &cli.Command{ +func microcmdAuthUpdateSMTP() *cli.Command { + return &cli.Command{ Name: "update-smtp", Usage: "Update existing SMTP authentication source", - Action: runUpdateSMTP, - Flags: append(smtpCLIFlags[:1], append([]cli.Flag{idFlag}, smtpCLIFlags[1:]...)...), + Action: newAuthService().runUpdateSMTP, + Flags: append(smtpCLIFlags()[:1], append([]cli.Flag{idFlag}, smtpCLIFlags()[1:]...)...), } -) +} +func microcmdAuthAddSMTP() *cli.Command { + return &cli.Command{ + Name: "add-smtp", + Usage: "Add new SMTP authentication source", + Action: newAuthService().runAddSMTP, + Flags: smtpCLIFlags(), + } +} func parseSMTPConfig(c *cli.Command, conf *smtp.Source) error { if c.IsSet("auth-type") { @@ -121,11 +125,11 @@ func parseSMTPConfig(c *cli.Command, conf *smtp.Source) error { return nil } -func runAddSMTP(_ context.Context, c *cli.Command) error { +func (a *authService) runAddSMTP(_ context.Context, c *cli.Command) error { ctx, cancel := installSignals() defer cancel() - if err := initDB(ctx); err != nil { + if err := a.initDB(ctx); err != nil { return err } @@ -140,6 +144,7 @@ func runAddSMTP(_ context.Context, c *cli.Command) error { } active := true if c.IsSet("active") { + fmt.Println("Active is set!", c.Bool("active")) active = c.Bool("active") } @@ -153,7 +158,7 @@ func runAddSMTP(_ context.Context, c *cli.Command) error { smtpConfig.Auth = "PLAIN" } - return auth_model.CreateSource(ctx, &auth_model.Source{ + return a.createAuthSource(ctx, &auth_model.Source{ Type: auth_model.SMTP, Name: c.String("name"), IsActive: active, @@ -162,7 +167,7 @@ func runAddSMTP(_ context.Context, c *cli.Command) error { }) } -func runUpdateSMTP(_ context.Context, c *cli.Command) error { +func (a *authService) runUpdateSMTP(_ context.Context, c *cli.Command) error { if !c.IsSet("id") { return errors.New("--id flag is missing") } @@ -170,11 +175,11 @@ func runUpdateSMTP(_ context.Context, c *cli.Command) error { ctx, cancel := installSignals() defer cancel() - if err := initDB(ctx); err != nil { + if err := a.initDB(ctx); err != nil { return err } - source, err := auth_model.GetSourceByID(ctx, c.Int64("id")) + source, err := a.getAuthSourceByID(ctx, c.Int64("id")) if err != nil { return err } @@ -195,5 +200,5 @@ func runUpdateSMTP(_ context.Context, c *cli.Command) error { source.Cfg = smtpConfig source.TwoFactorPolicy = util.Iif(c.Bool("skip-local-2fa"), "skip", "") - return auth_model.UpdateSource(ctx, source) + return a.updateAuthSource(ctx, source) }