asset_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package asset
  2. import (
  3. "errors"
  4. "testing"
  5. "time"
  6. "github.com/opencost/opencost/core/pkg/autocomplete"
  7. "github.com/opencost/opencost/core/pkg/opencost"
  8. "github.com/opencost/opencost/core/pkg/util/httputil"
  9. )
  10. func TestValidateField(t *testing.T) {
  11. tests := []struct {
  12. in string
  13. want string
  14. err bool
  15. }{
  16. {"assettype", "type", false},
  17. {"cluster", "cluster", false},
  18. {"account", "account", false},
  19. {"category", "category", false},
  20. {"label", "label", false},
  21. {"label:App", "label:App", false},
  22. {"bad", "", true},
  23. }
  24. for _, tt := range tests {
  25. got, err := ValidateField(tt.in)
  26. if tt.err {
  27. if err == nil {
  28. t.Fatalf("ValidateField(%q) expected error", tt.in)
  29. }
  30. continue
  31. }
  32. if err != nil || got != tt.want {
  33. t.Fatalf("ValidateField(%q) = %q, %v", tt.in, got, err)
  34. }
  35. }
  36. }
  37. func TestValidateWindow(t *testing.T) {
  38. start := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
  39. if err := ValidateWindow(opencost.NewClosedWindow(start, start.Add(time.Hour))); err != nil {
  40. t.Fatalf("unexpected error: %v", err)
  41. }
  42. if err := ValidateWindow(opencost.NewWindow(&start, nil)); err == nil {
  43. t.Fatal("expected open window error")
  44. }
  45. end := start.Add(time.Hour)
  46. if err := ValidateWindow(opencost.NewWindow(nil, &end)); err == nil {
  47. t.Fatal("expected open window error for nil start")
  48. }
  49. if err := ValidateWindow(opencost.NewWindow(nil, nil)); err == nil {
  50. t.Fatal("expected missing start/end error")
  51. }
  52. }
  53. func TestNormalizeRequest(t *testing.T) {
  54. start := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
  55. req := &autocomplete.Request{
  56. TenantID: "t1",
  57. Field: "assettype",
  58. Search: " x ",
  59. Limit: 0,
  60. Window: opencost.NewClosedWindow(start, start.Add(24*time.Hour)),
  61. }
  62. opts := autocomplete.NormalizeOptions{RequireTenantID: true, WindowValidator: ValidateWindow}
  63. field, err := autocomplete.NormalizeRequest(req, ValidateField, opts)
  64. if err != nil {
  65. t.Fatalf("unexpected error: %v", err)
  66. }
  67. if field != "type" || req.Search != "x" {
  68. t.Fatalf("unexpected normalized request: %+v", req)
  69. }
  70. _, err = autocomplete.NormalizeRequest(&autocomplete.Request{Field: "cluster", Window: req.Window}, ValidateField, opts)
  71. if err == nil || !errors.Is(err, autocomplete.ErrBadRequest) {
  72. t.Fatalf("expected tenant ID error, got %v", err)
  73. }
  74. }
  75. func TestParseRequest(t *testing.T) {
  76. qp := httputil.NewQueryParams(map[string][]string{"field": {"cluster"}})
  77. _, err := ParseRequest(qp, autocomplete.ParseOptions{})
  78. if err == nil {
  79. t.Fatal("expected missing window error")
  80. }
  81. got, err := ParseRequest(qp, autocomplete.ParseOptions{DefaultWindow: "30d", DefaultTenantID: "t1"})
  82. if err != nil {
  83. t.Fatalf("ParseRequest() error = %v", err)
  84. }
  85. if got.Field != "cluster" || got.TenantID != "t1" {
  86. t.Fatalf("unexpected request: %+v", got)
  87. }
  88. }
  89. func TestRouteField(t *testing.T) {
  90. tests := []struct {
  91. field string
  92. route Route
  93. key string
  94. }{
  95. {"type", RouteStaticType, ""},
  96. {"category", RouteStaticCategory, ""},
  97. {"label", RouteLabelKeys, ""},
  98. {"label:App", RouteLabelValue, "App"},
  99. {"cluster", RouteDefault, ""},
  100. }
  101. for _, tt := range tests {
  102. route, key, err := RouteField(tt.field)
  103. if err != nil || route != tt.route || key != tt.key {
  104. t.Fatalf("RouteField(%q) = %v, %q, %v; want %v, %q", tt.field, route, key, err, tt.route, tt.key)
  105. }
  106. }
  107. }
  108. func TestStaticValues(t *testing.T) {
  109. types := StaticTypes()
  110. if len(types) == 0 {
  111. t.Fatal("expected static types")
  112. }
  113. categories := StaticCategories()
  114. if len(categories) == 0 {
  115. t.Fatal("expected static categories")
  116. }
  117. got := FilterStaticValues(StaticTypes(), "node")
  118. if len(got) != 1 || got[0] != "node" {
  119. t.Fatalf("FilterStaticValues() = %v", got)
  120. }
  121. }