diff --git a/pkg/conf/conf.go b/pkg/conf/conf.go index fbc0875..2a8d929 100644 --- a/pkg/conf/conf.go +++ b/pkg/conf/conf.go @@ -35,7 +35,7 @@ type captcha struct { IsShowNoiseText bool IsShowSlimeLine bool IsShowSineLine bool - CaptchaLen int `validate:"gte=0"` + CaptchaLen int `validate:"gt=0"` } // DatabaseConfig 数据库配置 @@ -72,7 +72,7 @@ func Init(path string) { //TODO 配置合法性验证 cfg, err = ini.Load(path) if err != nil { - util.Log().Panic("无法解析配置文件 '%s': ", path, err) + util.Log().Panic("无法解析配置文件 '%s': %s", path, err) } sections := map[string]interface{}{ @@ -83,7 +83,7 @@ func Init(path string) { for sectionName, sectionStruct := range sections { err = mapSection(sectionName, sectionStruct) if err != nil { - util.Log().Warning("配置文件 %s 分区解析失败: ", sectionName, err) + util.Log().Warning("配置文件 %s 分区解析失败: %s", sectionName, err) } } diff --git a/routers/controllers/general.go b/routers/controllers/general.go index 28c6f95..7444e8f 100644 --- a/routers/controllers/general.go +++ b/routers/controllers/general.go @@ -32,6 +32,7 @@ func Captcha(c *gin.Context) { util.SetSession(c, map[string]interface{}{ "captchaID": idKeyD, }) + // 将验证码图像编码为Base64 base64stringD := base64Captcha.CaptchaWriteToBase64Encoding(capD) diff --git a/routers/router.go b/routers/router.go index 13c6259..d16dfb6 100644 --- a/routers/router.go +++ b/routers/router.go @@ -7,9 +7,18 @@ import ( "github.com/gin-gonic/gin" ) +var r *gin.Engine + +// SetupTestEngine 设置测试用gin.Engine +func SetupTestEngine(engine *gin.Engine) { + r = engine +} + // InitRouter 初始化路由 func InitRouter() *gin.Engine { - r := gin.Default() + if r == nil { + r = gin.Default() + } /* 中间件 diff --git a/routers/router_test.go b/routers/router_test.go index f895eeb..9d21abc 100644 --- a/routers/router_test.go +++ b/routers/router_test.go @@ -11,6 +11,7 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" + "github.com/mojocn/base64Captcha" "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" @@ -47,11 +48,41 @@ func TestPing(t *testing.T) { asserts.Contains(w.Body.String(), "Pong") } +func TestCaptcha(t *testing.T) { + asserts := assert.New(t) + router := InitRouter() + w := httptest.NewRecorder() + + req, _ := http.NewRequest( + "GET", + "/Api/V3/Captcha", + nil, + ) + + router.ServeHTTP(w, req) + + asserts.Equal(200, w.Code) + asserts.Contains(w.Body.String(), "base64") +} + func TestUserSession(t *testing.T) { asserts := assert.New(t) router := InitRouter() w := httptest.NewRecorder() + // 创建测试用验证码 + var configD = base64Captcha.ConfigDigit{ + Height: 80, + Width: 240, + MaxSkew: 0.7, + DotCount: 80, + CaptchaLen: 1, + } + idKeyD, _ := base64Captcha.GenerateCaptcha("", configD) + middleware.ContextMock = map[string]interface{}{ + "captchaID": idKeyD, + } + testCases := []struct { settingRows *sqlmock.Rows userRows *sqlmock.Rows @@ -70,6 +101,15 @@ func TestUserSession(t *testing.T) { Nick: "admin", }), }, + // 登录信息正确,需要验证码,验证码错误 + { + settingRows: sqlmock.NewRows([]string{"name", "value", "type"}). + AddRow("login_captcha", "1", "login"), + userRows: sqlmock.NewRows([]string{"email", "nick", "password", "options"}). + AddRow("admin@cloudreve.org", "admin", "CKLmDKa1C9SD64vU:76adadd4fd4bad86959155f6f7bc8993c94e7adf", "{}"), + reqBody: `{"userName":"admin@cloudreve.org","captchaCode":"captchaCode","Password":"admin"}`, + expected: serializer.ParamErr("验证码错误", nil), + }, // 邮箱正确密码错误 { settingRows: sqlmock.NewRows([]string{"name", "value", "type"}). @@ -104,7 +144,7 @@ func TestUserSession(t *testing.T) { }, } - for _, testCase := range testCases { + for k, testCase := range testCases { if testCase.settingRows != nil { mock.ExpectQuery("^SELECT (.+)").WillReturnRows(testCase.settingRows) } @@ -120,7 +160,7 @@ func TestUserSession(t *testing.T) { asserts.Equal(200, w.Code) expectedJSON, _ := json.Marshal(testCase.expected) - asserts.JSONEq(string(expectedJSON), w.Body.String()) + asserts.JSONEq(string(expectedJSON), w.Body.String(), "测试用例:%d", k) w.Body.Reset() asserts.NoError(mock.ExpectationsWereMet()) diff --git a/service/user/login.go b/service/user/login.go index 5727c13..0a238f7 100644 --- a/service/user/login.go +++ b/service/user/login.go @@ -26,7 +26,6 @@ func (service *UserLoginService) Login(c *gin.Context) serializer.Response { // TODO 验证码校验 captchaID := util.GetSession(c, "captchaID") if captchaID == nil || !base64Captcha.VerifyCaptcha(captchaID.(string), service.CaptchaCode) { - util.DeleteSession(c, "captchaID") return serializer.ParamErr("验证码错误", nil) } }