// 功能描述:验证资料更新保留头像、拒绝跨账户图片及空昵称。 // 版本:1.0.0。 package user import ( "git.apinb.com/bsm-sdk/core/types" "github.com/DATA-DOG/go-sqlmock" "github.com/gin-gonic/gin" "net/http/httptest" "strings" "testing" ) // TestProfileUpdateBoundaries 对数据库读写使用 SQL Mock,不连接远程数据。 func TestProfileUpdateBoundaries(t *testing.T) { for _, tc := range []struct { name, body string valid bool }{ {"昵称修改保留头像", `{"name":"新昵称"}`, true}, {"允许保留旧头像", `{"name":"新昵称","avatar":"/uploads/avatars/old.png"}`, true}, {"空昵称拒绝", `{"name":" "}`, false}, {"他人头像拒绝", `{"name":"新昵称","avatar":"/uploads/avatars/other.png"}`, false}, } { t.Run(tc.name, func(t *testing.T) { mock := primaryTestDB(t) mock.ExpectQuery(`SELECT .* FROM "user_account"`).WillReturnRows(sqlmock.NewRows([]string{"id", "identity", "name", "avatar"}).AddRow(1, "alice", "旧昵称", "/uploads/avatars/old.png")) if tc.valid { if strings.Contains(tc.body, "avatar") { mock.ExpectExec(`UPDATE "user_account" SET "avatar"=.*"name"=`).WillReturnResult(sqlmock.NewResult(0, 1)) } else { mock.ExpectExec(`UPDATE "user_account" SET "name"=`).WillReturnResult(sqlmock.NewResult(0, 1)) } } response := httptest.NewRecorder() ctx, _ := gin.CreateTestContext(response) ctx.Set("Auth", &types.JwtClaims{Client: "user_app", Identity: "alice"}) ctx.Request = httptest.NewRequest("PUT", "/auth/profile", strings.NewReader(tc.body)) ctx.Request.Header.Set("Content-Type", "application/json") UpdateProfile(ctx) if err := mock.ExpectationsWereMet(); err != nil { t.Fatal(err) } success := strings.Contains(response.Body.String(), `"code":0`) if success != tc.valid { t.Fatalf("更新状态错误: %s", response.Body.String()) } }) } }