feat: 新增日志、配置文件和环境变量
This commit is contained in:
166
logger/logger_test.go
Normal file
166
logger/logger_test.go
Normal file
@@ -0,0 +1,166 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"git.hujye.com/infrastructure/go-web-gin/web"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
// LoggerTestSuite is the test suite for Logger
|
||||
type LoggerTestSuite struct {
|
||||
suite.Suite
|
||||
logger *Logger
|
||||
}
|
||||
|
||||
// SetupSuite runs once before all tests
|
||||
func (s *LoggerTestSuite) SetupSuite() {
|
||||
s.logger = GetLogger()
|
||||
}
|
||||
|
||||
// TearDownSuite runs once after all tests
|
||||
func (s *LoggerTestSuite) TearDownSuite() {
|
||||
s.logger.Sync()
|
||||
}
|
||||
|
||||
// SetupTest runs before each test
|
||||
func (s *LoggerTestSuite) SetupTest() {
|
||||
// Reset logger instance if needed
|
||||
}
|
||||
|
||||
// TearDownTest runs after each test
|
||||
func (s *LoggerTestSuite) TearDownTest() {
|
||||
// Cleanup after each test if needed
|
||||
}
|
||||
|
||||
// TestGetLogger tests the GetLogger function
|
||||
func (s *LoggerTestSuite) TestGetLogger() {
|
||||
logger := GetLogger()
|
||||
s.NotNil(logger, "GetLogger should return a non-nil logger")
|
||||
s.NotNil(logger.logger, "logger field should be initialized")
|
||||
}
|
||||
|
||||
// TestGetLoggerSingleton tests that GetLogger returns the same instance
|
||||
func (s *LoggerTestSuite) TestGetLoggerSingleton() {
|
||||
logger1 := GetLogger()
|
||||
logger2 := GetLogger()
|
||||
s.Equal(logger1, logger2, "GetLogger should return the same instance")
|
||||
}
|
||||
|
||||
// TestInfoWithNilContext tests Info method with nil context
|
||||
func (s *LoggerTestSuite) TestInfoWithNilContext() {
|
||||
s.NotPanics(func() {
|
||||
s.logger.Info(nil, "Test info message")
|
||||
}, "Info should not panic with nil context")
|
||||
}
|
||||
|
||||
// TestErrorWithNilContext tests Error method with nil context
|
||||
func (s *LoggerTestSuite) TestErrorWithNilContext() {
|
||||
s.NotPanics(func() {
|
||||
s.logger.Error(nil, "Test error message")
|
||||
}, "Error should not panic with nil context")
|
||||
}
|
||||
|
||||
// TestDebugWithNilContext tests Debug method with nil context
|
||||
func (s *LoggerTestSuite) TestDebugWithNilContext() {
|
||||
s.NotPanics(func() {
|
||||
s.logger.Debug(nil, "Test debug message")
|
||||
}, "Debug should not panic with nil context")
|
||||
}
|
||||
|
||||
// TestWarnWithNilContext tests Warn method with nil context
|
||||
func (s *LoggerTestSuite) TestWarnWithNilContext() {
|
||||
s.NotPanics(func() {
|
||||
s.logger.Warn(nil, "Test warn message")
|
||||
}, "Warn should not panic with nil context")
|
||||
}
|
||||
|
||||
// TestInfoWithContext tests Info method with context containing user info
|
||||
func (s *LoggerTestSuite) TestInfoWithContext() {
|
||||
ctx := context.Background()
|
||||
ctx = web.SetUserID(ctx, "test-user-123")
|
||||
ctx = web.SetUserName(ctx, "testuser")
|
||||
ctx = web.SetTrace(ctx, "trace-test-456")
|
||||
ctx = web.SetFromIP(ctx, "192.168.1.1")
|
||||
|
||||
s.NotPanics(func() {
|
||||
s.logger.Info(ctx, "Test info with context")
|
||||
}, "Info should not panic with valid context")
|
||||
}
|
||||
|
||||
// TestErrorWithContext tests Error method with context containing user info
|
||||
func (s *LoggerTestSuite) TestErrorWithContext() {
|
||||
ctx := context.Background()
|
||||
ctx = web.SetUserID(ctx, "error-user-789")
|
||||
|
||||
s.NotPanics(func() {
|
||||
s.logger.Error(ctx, "Test error with context")
|
||||
}, "Error should not panic with valid context")
|
||||
}
|
||||
|
||||
// TestInfoWithFormattedMessage tests Info method with formatted message
|
||||
func (s *LoggerTestSuite) TestInfoWithFormattedMessage() {
|
||||
ctx := context.Background()
|
||||
ctx = web.SetUserID(ctx, "format-user-001")
|
||||
|
||||
s.NotPanics(func() {
|
||||
s.logger.Info(ctx, "User %s logged in from %s", "admin", "10.0.0.1")
|
||||
}, "Info should handle formatted messages correctly")
|
||||
}
|
||||
|
||||
// TestErrorWithFormattedMessage tests Error method with formatted message
|
||||
func (s *LoggerTestSuite) TestErrorWithFormattedMessage() {
|
||||
s.NotPanics(func() {
|
||||
s.logger.Error(nil, "Error code: %d, message: %s", 500, "Internal Server Error")
|
||||
}, "Error should handle formatted messages correctly")
|
||||
}
|
||||
|
||||
// TestAllLogLevels tests all log level methods
|
||||
func (s *LoggerTestSuite) TestAllLogLevels() {
|
||||
ctx := context.Background()
|
||||
ctx = web.SetUserID(ctx, "level-test-user")
|
||||
ctx = web.SetUserName(ctx, "leveltest")
|
||||
ctx = web.SetTrace(ctx, "trace-level-test")
|
||||
ctx = web.SetFromIP(ctx, "10.20.30.40")
|
||||
|
||||
s.NotPanics(func() {
|
||||
s.logger.Debug(ctx, "Debug message")
|
||||
s.logger.Info(ctx, "Info message")
|
||||
s.logger.Warn(ctx, "Warn message")
|
||||
s.logger.Error(ctx, "Error message")
|
||||
// Skip Fatal as it will exit the program
|
||||
}, "All log levels should work correctly")
|
||||
}
|
||||
|
||||
// TestEmptyContext tests with empty context (no user info)
|
||||
func (s *LoggerTestSuite) TestEmptyContext() {
|
||||
ctx := context.Background()
|
||||
|
||||
s.NotPanics(func() {
|
||||
s.logger.Info(ctx, "Message with empty context")
|
||||
}, "Should handle empty context without user info")
|
||||
}
|
||||
|
||||
// TestPartialUserInfo tests with partial user information
|
||||
func (s *LoggerTestSuite) TestPartialUserInfo() {
|
||||
ctx := context.Background()
|
||||
// Only set user ID, not other fields
|
||||
ctx = web.SetUserID(ctx, "partial-user")
|
||||
|
||||
s.NotPanics(func() {
|
||||
s.logger.Info(ctx, "Message with partial user info")
|
||||
}, "Should handle partial user information")
|
||||
}
|
||||
|
||||
// TestLoggerSync tests the Sync method
|
||||
func (s *LoggerTestSuite) TestLoggerSync() {
|
||||
err := s.logger.Sync()
|
||||
// Sync may return an error for stderr in test environment, which is acceptable
|
||||
s.T().Logf("Sync returned error (may be expected for stderr): %v", err)
|
||||
}
|
||||
|
||||
// TestLoggerRunSuite runs the test suite
|
||||
func TestLoggerRunSuite(t *testing.T) {
|
||||
suite.Run(t, new(LoggerTestSuite))
|
||||
}
|
||||
Reference in New Issue
Block a user