mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-10-31 16:49:03 +08:00 
			
		
		
		
	Test: captcha
This commit is contained in:
		| @ -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) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| @ -32,6 +32,7 @@ func Captcha(c *gin.Context) { | ||||
| 	util.SetSession(c, map[string]interface{}{ | ||||
| 		"captchaID": idKeyD, | ||||
| 	}) | ||||
|  | ||||
| 	// 将验证码图像编码为Base64 | ||||
| 	base64stringD := base64Captcha.CaptchaWriteToBase64Encoding(capD) | ||||
|  | ||||
|  | ||||
| @ -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() | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 		中间件 | ||||
|  | ||||
| @ -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()) | ||||
|  | ||||
| @ -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) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 HFO4
					HFO4