auth_current_user_test.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. //go:build unit
  2. package handler
  3. import (
  4. "encoding/json"
  5. "net/http"
  6. "net/http/httptest"
  7. "testing"
  8. "time"
  9. middleware2 "github.com/Wei-Shaw/sub2api/internal/server/middleware"
  10. "github.com/Wei-Shaw/sub2api/internal/service"
  11. "github.com/gin-gonic/gin"
  12. "github.com/stretchr/testify/require"
  13. )
  14. func TestAuthHandlerGetCurrentUserReturnsProfileCompatibilityFields(t *testing.T) {
  15. gin.SetMode(gin.TestMode)
  16. verifiedAt := time.Date(2026, 4, 20, 8, 30, 0, 0, time.UTC)
  17. repo := &userHandlerRepoStub{
  18. user: &service.User{
  19. ID: 31,
  20. Email: "me@example.com",
  21. Username: "linuxdo-handle",
  22. Role: service.RoleUser,
  23. Status: service.StatusActive,
  24. AvatarURL: "https://cdn.example.com/linuxdo.png",
  25. AvatarSource: "remote_url",
  26. },
  27. identities: []service.UserAuthIdentityRecord{
  28. {
  29. ProviderType: "linuxdo",
  30. ProviderKey: "linuxdo",
  31. ProviderSubject: "linuxdo-subject-31",
  32. VerifiedAt: &verifiedAt,
  33. Metadata: map[string]any{
  34. "username": "linuxdo-handle",
  35. "avatar_url": "https://cdn.example.com/linuxdo.png",
  36. },
  37. },
  38. },
  39. }
  40. handler := &AuthHandler{
  41. userService: service.NewUserService(repo, nil, nil, nil),
  42. }
  43. recorder := httptest.NewRecorder()
  44. c, _ := gin.CreateTestContext(recorder)
  45. c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/auth/me", nil)
  46. c.Set(string(middleware2.ContextKeyUser), middleware2.AuthSubject{UserID: 31})
  47. handler.GetCurrentUser(c)
  48. require.Equal(t, http.StatusOK, recorder.Code)
  49. var resp struct {
  50. Code int `json:"code"`
  51. Data map[string]any `json:"data"`
  52. }
  53. require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp))
  54. require.Equal(t, 0, resp.Code)
  55. require.Equal(t, true, resp.Data["email_bound"])
  56. require.Equal(t, true, resp.Data["linuxdo_bound"])
  57. require.Equal(t, "https://cdn.example.com/linuxdo.png", resp.Data["avatar_url"])
  58. authBindings, ok := resp.Data["auth_bindings"].(map[string]any)
  59. require.True(t, ok)
  60. linuxdoBinding, ok := authBindings["linuxdo"].(map[string]any)
  61. require.True(t, ok)
  62. require.Equal(t, true, linuxdoBinding["bound"])
  63. avatarSource, ok := resp.Data["avatar_source"].(map[string]any)
  64. require.True(t, ok)
  65. require.Equal(t, "linuxdo", avatarSource["provider"])
  66. require.Equal(t, "linuxdo", avatarSource["source"])
  67. profileSources, ok := resp.Data["profile_sources"].(map[string]any)
  68. require.True(t, ok)
  69. usernameSource, ok := profileSources["username"].(map[string]any)
  70. require.True(t, ok)
  71. require.Equal(t, "linuxdo", usernameSource["provider"])
  72. require.Equal(t, "linuxdo", usernameSource["source"])
  73. }