From a76141a99dd5d78babbc68b2b7d43c90862396d5 Mon Sep 17 00:00:00 2001 From: Stavros Date: Sat, 9 May 2026 13:32:08 +0300 Subject: [PATCH] tests: fix middleware tests --- .../middleware/context_middleware_test.go | 61 +++------- internal/middleware/middleware_test.go | 108 ++++++++++++++++++ 2 files changed, 122 insertions(+), 47 deletions(-) create mode 100644 internal/middleware/middleware_test.go diff --git a/internal/middleware/context_middleware_test.go b/internal/middleware/context_middleware_test.go index 5dfde3b4..167c200e 100644 --- a/internal/middleware/context_middleware_test.go +++ b/internal/middleware/context_middleware_test.go @@ -5,7 +5,7 @@ import ( "encoding/base64" "net/http" "net/http/httptest" - "path" + "sync" "testing" "time" @@ -17,36 +17,14 @@ import ( "github.com/tinyauthapp/tinyauth/internal/model" "github.com/tinyauthapp/tinyauth/internal/repository" "github.com/tinyauthapp/tinyauth/internal/service" - "github.com/tinyauthapp/tinyauth/internal/utils/tlog" + "github.com/tinyauthapp/tinyauth/internal/utils/logger" ) func TestContextMiddleware(t *testing.T) { - tlog.NewTestLogger().Init() - tempDir := t.TempDir() + log := logger.NewLogger().WithTestConfig() + log.Init() - authServiceCfg := service.AuthServiceConfig{ - LocalUsers: &[]model.LocalUser{ - { - Username: "testuser", - Password: "$2a$10$ZwVYQH07JX2zq7Fjkt3gU.BjwvvwPeli4OqOno04RQIv0P7usBrXa", // password - }, - { - Username: "totpuser", - Password: "$2a$10$ZwVYQH07JX2zq7Fjkt3gU.BjwvvwPeli4OqOno04RQIv0P7usBrXa", // password - TOTPSecret: "JPIEBDKJH6UGWJMX66RR3S55UFP2SGKK", - }, - }, - SessionExpiry: 10, // 10 seconds, useful for testing - CookieDomain: "example.com", - LoginTimeout: 10, // 10 seconds, useful for testing - LoginMaxRetries: 3, - SessionCookieName: "tinyauth-session", - } - - middlewareCfg := middleware.ContextMiddlewareConfig{ - CookieDomain: "example.com", - SessionCookieName: "tinyauth-session", - } + cfg, runtime := createTestConfigs(t) basicAuthHeader := func(username, password string) string { return "Basic " + base64.StdEncoding.EncodeToString([]byte(username+":"+password)) @@ -270,30 +248,20 @@ func TestContextMiddleware(t *testing.T) { }, } - oauthBrokerCfgs := make(map[string]model.OAuthServiceConfig) + ctx := context.TODO() + wg := &sync.WaitGroup{} - app := bootstrap.NewBootstrapApp(model.Config{}) + app := bootstrap.NewBootstrapApp(cfg) - db, err := app.SetupDatabase(path.Join(tempDir, "tinyauth.db")) + err := app.SetupDatabase() require.NoError(t, err) - queries := repository.New(db) + queries := repository.New(app.GetDB()) - ldap := service.NewLdapService(service.LdapServiceConfig{}) - err = ldap.Init() - require.NoError(t, err) + broker := service.NewOAuthBrokerService(log, map[string]model.OAuthServiceConfig{}, ctx) + authService := service.NewAuthService(log, cfg, runtime, ctx, wg, nil, queries, broker) - broker := service.NewOAuthBrokerService(oauthBrokerCfgs) - err = broker.Init() - require.NoError(t, err) - - authService := service.NewAuthService(authServiceCfg, ldap, queries, broker) - err = authService.Init() - require.NoError(t, err) - - contextMiddleware := middleware.NewContextMiddleware(middlewareCfg, authService, broker) - err = contextMiddleware.Init() - require.NoError(t, err) + contextMiddleware := middleware.NewContextMiddleware(log, runtime, authService, broker) for _, test := range tests { authService.ClearRateLimitsTestingOnly() @@ -322,7 +290,6 @@ func TestContextMiddleware(t *testing.T) { } t.Cleanup(func() { - err = db.Close() - require.NoError(t, err) + app.GetDB().Close() }) } diff --git a/internal/middleware/middleware_test.go b/internal/middleware/middleware_test.go new file mode 100644 index 00000000..c00bf4e0 --- /dev/null +++ b/internal/middleware/middleware_test.go @@ -0,0 +1,108 @@ +package middleware_test + +import ( + "path" + "testing" + + "github.com/stretchr/testify/require" + "github.com/tinyauthapp/tinyauth/internal/model" + "golang.org/x/crypto/bcrypt" +) + +// Note: This code is duplicated from controller_test.go + +var testingTOTPSecret = "JPIEBDKJH6UGWJMX66RR3S55UFP2SGKK" + +func createTestConfigs(t *testing.T) (model.Config, model.RuntimeConfig) { + tempDir := t.TempDir() + + config := model.Config{ + UI: model.UIConfig{ + Title: "Tinyauth Test", + ForgotPasswordMessage: "foo", + BackgroundImage: "/background.jpg", + WarningsEnabled: true, + }, + OAuth: model.OAuthConfig{ + AutoRedirect: "none", + }, + OIDC: model.OIDCConfig{ + Clients: map[string]model.OIDCClientConfig{ + "test": { + ClientID: "some-client-id", + ClientSecret: "some-client-secret", + TrustedRedirectURIs: []string{"https://test.example.com/callback"}, + Name: "Test Client", + }, + }, + PrivateKeyPath: path.Join(tempDir, "key.pem"), + PublicKeyPath: path.Join(tempDir, "key.pub"), + }, + Auth: model.AuthConfig{ + SessionExpiry: 10, + LoginTimeout: 10, + LoginMaxRetries: 3, + }, + Database: model.DatabaseConfig{ + Path: path.Join(tempDir, "test.db"), + }, + Resources: model.ResourcesConfig{ + Enabled: true, + Path: path.Join(tempDir, "resources"), + }, + } + + passwd, err := bcrypt.GenerateFromPassword([]byte("password"), bcrypt.DefaultCost) + require.NoError(t, err) + + runtime := model.RuntimeConfig{ + ConfiguredProviders: []model.Provider{ + { + Name: "Local", + ID: "local", + OAuth: false, + }, + }, + LocalUsers: []model.LocalUser{ + { + Username: "testuser", + Password: string(passwd), + }, + { + Username: "totpuser", + Password: string(passwd), + TOTPSecret: testingTOTPSecret, + }, + { + Username: "attruser", + Password: string(passwd), + Attributes: model.UserAttributes{ + Name: "Alice Smith", + Email: "alice@example.com", + }, + }, + { + Username: "attrtotpuser", + Password: string(passwd), + TOTPSecret: testingTOTPSecret, + Attributes: model.UserAttributes{ + Name: "Bob Jones", + Email: "bob@example.com", + }, + }, + }, + CookieDomain: "example.com", + AppURL: "https://tinyauth.example.com", + SessionCookieName: "tinyauth-session", + OIDCClients: func() []model.OIDCClientConfig { + var clients []model.OIDCClientConfig + for id, client := range config.OIDC.Clients { + client.ID = id + clients = append(clients, client) + } + return clients + }(), + } + + return config, runtime +}