package app import ( "context" "testing" "git.5iot.com/iotlcm-public/iotlcm-app/internal/consts" "git.5iot.com/iotlcm-public/iotlcm-app/internal/model" "git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" ) func TestPhoneRegisterParamAllowsEmptySmsCode(t *testing.T) { err := g.Validator().Data(&model.AppPhoneRegisterParam{ TenantId: "000000", Phone: "13800008000", Password: "123456", NickName: "测试用户", }).Run(context.Background()) if err != nil { t.Fatalf("AppPhoneRegisterParam should allow empty smsCode, got: %v", err) } } func TestVerifyOptionalAppSmsCodeSkipsEmptyCode(t *testing.T) { if err := verifyOptionalAppSmsCode(context.Background(), "000000", "13800008000", "register", ""); err != nil { t.Fatalf("empty smsCode should skip sms verification, got: %v", err) } if err := verifyOptionalAppSmsCode(context.Background(), "000000", "13800008000", "register", " "); err != nil { t.Fatalf("blank smsCode should skip sms verification, got: %v", err) } } func TestDeletedRegisterUserNameFitsSysUserUniqueColumn(t *testing.T) { name := deletedRegisterUserName(88, "18800004698") if name != "del88_004698" { t.Fatalf("unexpected deleted register username: %s", name) } if len(name) > 30 { t.Fatalf("deleted register username length = %d, want <= 30", len(name)) } } func TestIsSysUserNameUniqueKeyError(t *testing.T) { if !isSysUserNameUniqueKeyError(gerror.New("Error 1062: Duplicate entry '000000-18800004698' for key 'sys_user.uk_user_name'")) { t.Fatal("expected sys_user.uk_user_name duplicate error to be recognized") } if isSysUserNameUniqueKeyError(gerror.New("Error 1062: Duplicate entry 'x' for key 'other_key'")) { t.Fatal("unexpected duplicate key match for other indexes") } } func TestAppWechatMiniSecretMissing(t *testing.T) { if !appWechatMiniSecretMissing("") { t.Fatal("empty mini app secret should be treated as missing") } if !appWechatMiniSecretMissing(appWechatMiniAppSecretPlaceholder) { t.Fatal("placeholder mini app secret should be treated as missing") } if appWechatMiniSecretMissing("real-secret") { t.Fatal("non-placeholder mini app secret should not be treated as missing") } } func TestAppEnsureWechatBindPhoneVerifiedSkipsVerifiedPhone(t *testing.T) { err := appEnsureWechatBindPhoneVerified( context.Background(), &model.AppWechatBindPhoneParam{}, &appWechatBindTicketCache{VerifiedPhone: "13800008000"}, "13800008000", ) if err != nil { t.Fatalf("verified phone should skip captcha verification, got: %v", err) } err = appEnsureWechatBindPhoneVerified( context.Background(), &model.AppWechatBindPhoneParam{}, &appWechatBindTicketCache{VerifiedPhone: "13800008001"}, "13800008000", ) if err == nil { t.Fatal("different phone should require captcha verification") } } func TestAvailableAppLoginUsersByPasswordFiltersCandidates(t *testing.T) { svc := &sAppAuth{} users := []*entity.SysUser{ appAuthTestUser(1, "phone-a", "right-password"), appAuthTestUser(2, "phone-b", "other-password"), } matched, err := svc.availableAppLoginUsersByPassword(users, "wrong-password") if err != nil { t.Fatalf("availableAppLoginUsersByPassword returned error: %v", err) } if len(matched) != 0 { t.Fatalf("wrong password matched %d users, want 0", len(matched)) } matched, err = svc.availableAppLoginUsersByPassword(users, "right-password") if err != nil { t.Fatalf("availableAppLoginUsersByPassword returned error: %v", err) } if len(matched) != 1 || matched[0].UserId != 1 { t.Fatalf("right password matched %#v, want only user 1", matched) } } func appAuthTestUser(userId int64, username string, password string) *entity.SysUser { salt := "abcde" return &entity.SysUser{ UserId: userId, UserName: username, Salt: salt, Password: appPasswordEncryptForStore(password, salt), Status: consts.SysUserStatusNormal, } }