account_repo_model_availability_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package repository
  2. import (
  3. "context"
  4. "strings"
  5. "testing"
  6. "github.com/DATA-DOG/go-sqlmock"
  7. dbent "github.com/Wei-Shaw/sub2api/ent"
  8. _ "github.com/Wei-Shaw/sub2api/ent/runtime"
  9. "github.com/Wei-Shaw/sub2api/internal/service"
  10. "github.com/stretchr/testify/require"
  11. "entgo.io/ent/dialect"
  12. entsql "entgo.io/ent/dialect/sql"
  13. )
  14. func TestListModelAvailabilityCandidates_GroupQueryIgnoresTransientState(t *testing.T) {
  15. var capturedSQL string
  16. db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(captureEntQueryMatcher{actual: &capturedSQL}))
  17. require.NoError(t, err)
  18. t.Cleanup(func() { _ = db.Close() })
  19. driver := entsql.OpenDB(dialect.Postgres, db)
  20. client := dbent.NewClient(dbent.Driver(driver))
  21. t.Cleanup(func() { _ = client.Close() })
  22. repo := newAccountRepositoryWithSQL(client, db, nil)
  23. mock.ExpectQuery("model availability candidates").
  24. WillReturnRows(sqlmock.NewRows([]string{"id"}))
  25. groupID := int64(42)
  26. accounts, err := repo.ListModelAvailabilityCandidates(
  27. context.Background(),
  28. &groupID,
  29. []string{service.PlatformAnthropic},
  30. false,
  31. )
  32. require.NoError(t, err)
  33. require.Empty(t, accounts)
  34. require.NoError(t, mock.ExpectationsWereMet())
  35. normalized := normalizeSQLWhitespace(capturedSQL)
  36. _, whereClause, found := strings.Cut(normalized, " WHERE ")
  37. require.True(t, found, "expected WHERE clause in query: %s", normalized)
  38. whereClause, _, _ = strings.Cut(whereClause, " ORDER BY ")
  39. for _, configuredPredicate := range []string{"group_id", "status", "schedulable", "platform"} {
  40. require.Contains(t, whereClause, configuredPredicate)
  41. }
  42. for _, transientPredicate := range []string{
  43. "rate_limit_reset_at",
  44. "overload_until",
  45. "temp_unschedulable_until",
  46. "expires_at",
  47. "auto_pause_on_expired",
  48. } {
  49. require.NotContains(t, whereClause, transientPredicate, "configured-state diagnosis must not filter transient predicate %q", transientPredicate)
  50. }
  51. }