mirror of
				https://github.com/steveiliop56/tinyauth.git
				synced 2025-10-28 04:35:40 +00:00 
			
		
		
		
	tests: add proxy controller tests
This commit is contained in:
		| @@ -55,6 +55,15 @@ func (controller *ProxyController) proxyHandler(c *gin.Context) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if req.Proxy != "nginx" && req.Proxy != "traefik" && req.Proxy != "caddy" { | ||||||
|  | 		log.Warn().Str("proxy", req.Proxy).Msg("Invalid proxy") | ||||||
|  | 		c.JSON(400, gin.H{ | ||||||
|  | 			"status":  400, | ||||||
|  | 			"message": "Bad Request", | ||||||
|  | 		}) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	isBrowser := strings.Contains(c.Request.Header.Get("Accept"), "text/html") | 	isBrowser := strings.Contains(c.Request.Header.Get("Accept"), "text/html") | ||||||
|  |  | ||||||
| 	if isBrowser { | 	if isBrowser { | ||||||
|   | |||||||
							
								
								
									
										164
									
								
								internal/controller/proxy_controller_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								internal/controller/proxy_controller_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | |||||||
|  | package controller_test | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"net/http/httptest" | ||||||
|  | 	"testing" | ||||||
|  | 	"tinyauth/internal/config" | ||||||
|  | 	"tinyauth/internal/controller" | ||||||
|  | 	"tinyauth/internal/service" | ||||||
|  |  | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"gotest.tools/v3/assert" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func setupProxyController(t *testing.T, middlewares *[]gin.HandlerFunc) (*gin.Engine, *httptest.ResponseRecorder, *service.AuthService) { | ||||||
|  | 	// Setup | ||||||
|  | 	gin.SetMode(gin.TestMode) | ||||||
|  | 	router := gin.Default() | ||||||
|  |  | ||||||
|  | 	if middlewares != nil { | ||||||
|  | 		for _, m := range *middlewares { | ||||||
|  | 			router.Use(m) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	group := router.Group("/api") | ||||||
|  | 	recorder := httptest.NewRecorder() | ||||||
|  |  | ||||||
|  | 	// Database | ||||||
|  | 	databaseService := service.NewDatabaseService(service.DatabaseServiceConfig{ | ||||||
|  | 		DatabasePath: "/tmp/tinyauth_test.db", | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	assert.NilError(t, databaseService.Init()) | ||||||
|  |  | ||||||
|  | 	database := databaseService.GetDatabase() | ||||||
|  |  | ||||||
|  | 	// Docker | ||||||
|  | 	dockerService := service.NewDockerService() | ||||||
|  |  | ||||||
|  | 	assert.NilError(t, dockerService.Init()) | ||||||
|  |  | ||||||
|  | 	// Auth service | ||||||
|  | 	authService := service.NewAuthService(service.AuthServiceConfig{ | ||||||
|  | 		Users: []config.User{ | ||||||
|  | 			{ | ||||||
|  | 				Username: "testuser", | ||||||
|  | 				Password: "$2a$10$ne6z693sTgzT3ePoQ05PgOecUHnBjM7sSNj6M.l5CLUP.f6NyCnt.", // test | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		OauthWhitelist:    "", | ||||||
|  | 		SessionExpiry:     3600, | ||||||
|  | 		SecureCookie:      false, | ||||||
|  | 		RootDomain:        "localhost", | ||||||
|  | 		LoginTimeout:      300, | ||||||
|  | 		LoginMaxRetries:   3, | ||||||
|  | 		SessionCookieName: "tinyauth-session", | ||||||
|  | 	}, dockerService, nil, database) | ||||||
|  |  | ||||||
|  | 	// Controller | ||||||
|  | 	ctrl := controller.NewProxyController(controller.ProxyControllerConfig{ | ||||||
|  | 		AppURL: "http://localhost:8080", | ||||||
|  | 	}, group, dockerService, authService) | ||||||
|  | 	ctrl.SetupRoutes() | ||||||
|  |  | ||||||
|  | 	return router, recorder, authService | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestProxyHandler(t *testing.T) { | ||||||
|  | 	// Setup | ||||||
|  | 	router, recorder, authService := setupProxyController(t, nil) | ||||||
|  |  | ||||||
|  | 	// Test invalid proxy | ||||||
|  | 	req := httptest.NewRequest("GET", "/api/auth/invalidproxy", nil) | ||||||
|  | 	router.ServeHTTP(recorder, req) | ||||||
|  |  | ||||||
|  | 	assert.Equal(t, 400, recorder.Code) | ||||||
|  |  | ||||||
|  | 	// Test logged out user (traefik/caddy) | ||||||
|  | 	recorder = httptest.NewRecorder() | ||||||
|  | 	req = httptest.NewRequest("GET", "/api/auth/traefik", nil) | ||||||
|  | 	req.Header.Set("X-Forwarded-Proto", "https") | ||||||
|  | 	req.Header.Set("X-Forwarded-Host", "example.com") | ||||||
|  | 	req.Header.Set("X-Forwarded-Uri", "/somepath") | ||||||
|  | 	req.Header.Set("Accept", "text/html") | ||||||
|  | 	router.ServeHTTP(recorder, req) | ||||||
|  |  | ||||||
|  | 	assert.Equal(t, 307, recorder.Code) | ||||||
|  | 	assert.Equal(t, "http://localhost:8080/login?redirect_uri=https%3A%2F%2Fexample.com%2Fsomepath", recorder.Header().Get("Location")) | ||||||
|  |  | ||||||
|  | 	// Test logged out user (nginx) | ||||||
|  | 	recorder = httptest.NewRecorder() | ||||||
|  | 	req = httptest.NewRequest("GET", "/api/auth/nginx", nil) | ||||||
|  | 	router.ServeHTTP(recorder, req) | ||||||
|  |  | ||||||
|  | 	assert.Equal(t, 401, recorder.Code) | ||||||
|  |  | ||||||
|  | 	// Test logged in user | ||||||
|  | 	c := gin.CreateTestContextOnly(recorder, router) | ||||||
|  |  | ||||||
|  | 	err := authService.CreateSessionCookie(c, &config.SessionCookie{ | ||||||
|  | 		Username:    "testuser", | ||||||
|  | 		Name:        "testuser", | ||||||
|  | 		Email:       "testuser@example.com", | ||||||
|  | 		Provider:    "username", | ||||||
|  | 		TotpPending: false, | ||||||
|  | 		OAuthGroups: "", | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	assert.NilError(t, err) | ||||||
|  |  | ||||||
|  | 	cookie := c.Writer.Header().Get("Set-Cookie") | ||||||
|  |  | ||||||
|  | 	router, recorder, _ = setupProxyController(t, &[]gin.HandlerFunc{ | ||||||
|  | 		func(c *gin.Context) { | ||||||
|  | 			c.Set("context", &config.UserContext{ | ||||||
|  | 				Username:    "testuser", | ||||||
|  | 				Name:        "testuser", | ||||||
|  | 				Email:       "testuser@example.com", | ||||||
|  | 				IsLoggedIn:  true, | ||||||
|  | 				OAuth:       false, | ||||||
|  | 				Provider:    "username", | ||||||
|  | 				TotpPending: false, | ||||||
|  | 				OAuthGroups: "", | ||||||
|  | 				TotpEnabled: false, | ||||||
|  | 			}) | ||||||
|  | 			c.Next() | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	req = httptest.NewRequest("GET", "/api/auth/traefik", nil) | ||||||
|  | 	req.Header.Set("Cookie", cookie) | ||||||
|  | 	req.Header.Set("Accept", "text/html") | ||||||
|  | 	router.ServeHTTP(recorder, req) | ||||||
|  |  | ||||||
|  | 	assert.Equal(t, 200, recorder.Code) | ||||||
|  |  | ||||||
|  | 	assert.Equal(t, "testuser", recorder.Header().Get("Remote-User")) | ||||||
|  | 	assert.Equal(t, "testuser", recorder.Header().Get("Remote-Name")) | ||||||
|  | 	assert.Equal(t, "testuser@example.com", recorder.Header().Get("Remote-Email")) | ||||||
|  |  | ||||||
|  | 	// Ensure basic auth is disabled for TOTP enabled users | ||||||
|  | 	router, recorder, _ = setupProxyController(t, &[]gin.HandlerFunc{ | ||||||
|  | 		func(c *gin.Context) { | ||||||
|  | 			c.Set("context", &config.UserContext{ | ||||||
|  | 				Username:    "testuser", | ||||||
|  | 				Name:        "testuser", | ||||||
|  | 				Email:       "testuser@example.com", | ||||||
|  | 				IsLoggedIn:  true, | ||||||
|  | 				OAuth:       false, | ||||||
|  | 				Provider:    "basic", | ||||||
|  | 				TotpPending: false, | ||||||
|  | 				OAuthGroups: "", | ||||||
|  | 				TotpEnabled: true, | ||||||
|  | 			}) | ||||||
|  | 			c.Next() | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	req = httptest.NewRequest("GET", "/api/auth/traefik", nil) | ||||||
|  | 	req.SetBasicAuth("testuser", "test") | ||||||
|  | 	router.ServeHTTP(recorder, req) | ||||||
|  |  | ||||||
|  | 	assert.Equal(t, 401, recorder.Code) | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Stavros
					Stavros