package store import ( "context" "testing" ) // 微信首次登录建号:合成占位邮箱(按 openid 唯一,避免多个微信用户空邮箱撞唯一约束)、按 openid 可查回。 func TestCreateAndGetWechatUser(t *testing.T) { p := newTestStore(t) ctx := context.Background() // 不存在时返回 (nil, nil),不报错 if u, err := p.GetUserByWechatOpenID(ctx, "openid-x"); err != nil || u != nil { t.Fatalf("未建号应返回 nil,nil,得 %v,%v", u, err) } u, err := p.CreateWechatUser(ctx, "openid-x", "微信用户") if err != nil { t.Fatalf("建号失败: %v", err) } if u.Email != "wx-openid-x@wx.local" { t.Fatalf("微信用户应有按 openid 合成的占位邮箱,得 %q", u.Email) } // 第二个微信用户不能撞唯一约束(此前空邮箱会冲突——邀请功能会批量建微信用户)。 if _, err := p.CreateWechatUser(ctx, "openid-y", "微信用户2"); err != nil { t.Fatalf("第二个微信用户建号不该冲突: %v", err) } got, err := p.GetUserByWechatOpenID(ctx, "openid-x") if err != nil || got == nil || got.ID != u.ID { t.Fatalf("按 openid 查不回: %v,%v", got, err) } // 空 openid 查询不匹配任何人(避免存量邮箱用户的空串被 openid 查询命中) if got, _ := p.GetUserByWechatOpenID(ctx, ""); got != nil { t.Fatalf("空 openid 不该命中任何用户,得 %+v", got) } }