| |
|
|
| package handler |
|
|
| import ( |
| "encoding/json" |
| "net/http" |
| "net/http/httptest" |
| "testing" |
| "time" |
|
|
| middleware2 "github.com/Wei-Shaw/sub2api/internal/server/middleware" |
| "github.com/Wei-Shaw/sub2api/internal/service" |
| "github.com/gin-gonic/gin" |
| "github.com/stretchr/testify/require" |
| ) |
|
|
| func TestAuthHandlerGetCurrentUserReturnsProfileCompatibilityFields(t *testing.T) { |
| gin.SetMode(gin.TestMode) |
|
|
| verifiedAt := time.Date(2026, 4, 20, 8, 30, 0, 0, time.UTC) |
| repo := &userHandlerRepoStub{ |
| user: &service.User{ |
| ID: 31, |
| Email: "me@example.com", |
| Username: "linuxdo-handle", |
| Role: service.RoleUser, |
| Status: service.StatusActive, |
| AvatarURL: "https://cdn.example.com/linuxdo.png", |
| AvatarSource: "remote_url", |
| }, |
| identities: []service.UserAuthIdentityRecord{ |
| { |
| ProviderType: "linuxdo", |
| ProviderKey: "linuxdo", |
| ProviderSubject: "linuxdo-subject-31", |
| VerifiedAt: &verifiedAt, |
| Metadata: map[string]any{ |
| "username": "linuxdo-handle", |
| "avatar_url": "https://cdn.example.com/linuxdo.png", |
| }, |
| }, |
| }, |
| } |
|
|
| handler := &AuthHandler{ |
| userService: service.NewUserService(repo, nil, nil, nil), |
| } |
|
|
| recorder := httptest.NewRecorder() |
| c, _ := gin.CreateTestContext(recorder) |
| c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/auth/me", nil) |
| c.Set(string(middleware2.ContextKeyUser), middleware2.AuthSubject{UserID: 31}) |
|
|
| handler.GetCurrentUser(c) |
|
|
| require.Equal(t, http.StatusOK, recorder.Code) |
|
|
| var resp struct { |
| Code int `json:"code"` |
| Data map[string]any `json:"data"` |
| } |
| require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp)) |
| require.Equal(t, 0, resp.Code) |
| require.Equal(t, true, resp.Data["email_bound"]) |
| require.Equal(t, true, resp.Data["linuxdo_bound"]) |
| require.Equal(t, "https://cdn.example.com/linuxdo.png", resp.Data["avatar_url"]) |
|
|
| authBindings, ok := resp.Data["auth_bindings"].(map[string]any) |
| require.True(t, ok) |
| linuxdoBinding, ok := authBindings["linuxdo"].(map[string]any) |
| require.True(t, ok) |
| require.Equal(t, true, linuxdoBinding["bound"]) |
|
|
| avatarSource, ok := resp.Data["avatar_source"].(map[string]any) |
| require.True(t, ok) |
| require.Equal(t, "linuxdo", avatarSource["provider"]) |
| require.Equal(t, "linuxdo", avatarSource["source"]) |
|
|
| profileSources, ok := resp.Data["profile_sources"].(map[string]any) |
| require.True(t, ok) |
| usernameSource, ok := profileSources["username"].(map[string]any) |
| require.True(t, ok) |
| require.Equal(t, "linuxdo", usernameSource["provider"]) |
| require.Equal(t, "linuxdo", usernameSource["source"]) |
| } |
|
|