usage_log_session_id_integration_test.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //go:build integration
  2. package repository
  3. import (
  4. "context"
  5. "testing"
  6. "time"
  7. "github.com/google/uuid"
  8. "github.com/Wei-Shaw/sub2api/internal/service"
  9. "github.com/stretchr/testify/require"
  10. )
  11. // TestUsageLog_SessionIDPersistence proves session_id round-trips from insert to
  12. // read and is omitted (NULL) when absent.
  13. func TestUsageLog_SessionIDPersistence(t *testing.T) {
  14. ctx := context.Background()
  15. client := testEntClient(t)
  16. repo := newUsageLogRepositoryWithSQL(client, integrationDB)
  17. user := mustCreateUser(t, client, &service.User{Email: "session-id-" + uuid.NewString() + "@example.com"})
  18. apiKey := mustCreateApiKey(t, client, &service.APIKey{UserID: user.ID, Key: "sk-session-" + uuid.NewString(), Name: "k"})
  19. account := mustCreateAccount(t, client, &service.Account{Name: "acc-session-" + uuid.NewString()})
  20. sessionID := "sess-" + uuid.NewString()
  21. withSession := &service.UsageLog{
  22. UserID: user.ID,
  23. APIKeyID: apiKey.ID,
  24. AccountID: account.ID,
  25. RequestID: uuid.NewString(),
  26. Model: "claude-3",
  27. InputTokens: 10,
  28. OutputTokens: 5,
  29. TotalCost: 1.0,
  30. ActualCost: 1.0,
  31. SessionID: &sessionID,
  32. CreatedAt: time.Now().UTC(),
  33. }
  34. _, err := repo.Create(ctx, withSession)
  35. require.NoError(t, err)
  36. require.NotZero(t, withSession.ID)
  37. withoutSession := &service.UsageLog{
  38. UserID: user.ID,
  39. APIKeyID: apiKey.ID,
  40. AccountID: account.ID,
  41. RequestID: uuid.NewString(),
  42. Model: "claude-3",
  43. InputTokens: 7,
  44. OutputTokens: 3,
  45. TotalCost: 0.5,
  46. ActualCost: 0.5,
  47. CreatedAt: time.Now().UTC(),
  48. }
  49. _, err = repo.Create(ctx, withoutSession)
  50. require.NoError(t, err)
  51. // Round-trip: session id survives insert → read.
  52. got, err := repo.GetByID(ctx, withSession.ID)
  53. require.NoError(t, err)
  54. require.NotNil(t, got.SessionID)
  55. require.Equal(t, sessionID, *got.SessionID)
  56. // Omission: absent session id reads back as nil (NULL), not empty string.
  57. gotNone, err := repo.GetByID(ctx, withoutSession.ID)
  58. require.NoError(t, err)
  59. require.Nil(t, gotNone.SessionID)
  60. }