2
0

autocompletequeryservice_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package allocation
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/opencost/opencost/core/pkg/autocomplete"
  6. "github.com/opencost/opencost/core/pkg/filter/ast"
  7. "github.com/opencost/opencost/core/pkg/opencost"
  8. )
  9. func TestQueryAllocationAutocompleteFromSetRange(t *testing.T) {
  10. start := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
  11. as := opencost.NewAllocationSet(start, start.Add(24*time.Hour))
  12. as.Set(opencost.NewMockUnitAllocation("a1", start, 24*time.Hour, &opencost.AllocationProperties{
  13. Cluster: "cluster-a",
  14. Namespace: "ns-a",
  15. Pod: "pod-a",
  16. Container: "container-a",
  17. ControllerKind: "deployment",
  18. Controller: "deploy-a",
  19. Node: "node-a",
  20. Labels: map[string]string{"Team": "platform", "app": "api"},
  21. NamespaceLabels: map[string]string{"owner": "sre"},
  22. }))
  23. as.Set(opencost.NewMockUnitAllocation("a2", start, 24*time.Hour, &opencost.AllocationProperties{
  24. Cluster: "cluster-b",
  25. Namespace: "ns-b",
  26. Pod: "pod-b",
  27. Container: "container-b",
  28. ControllerKind: "statefulset",
  29. Controller: "db-a",
  30. Node: "node-b",
  31. Labels: map[string]string{"Team": "data", "app": "db"},
  32. NamespaceLabels: map[string]string{"owner": "db"},
  33. }))
  34. asr := opencost.NewAllocationSetRange(as)
  35. window := opencost.NewClosedWindow(start, start.Add(24*time.Hour))
  36. resp, err := QueryAllocationAutocompleteFromSetRange(asr, autocomplete.Request{
  37. Field: "label",
  38. Limit: 10,
  39. Window: window,
  40. Filter: &ast.VoidOp{},
  41. })
  42. if err != nil {
  43. t.Fatalf("unexpected error: %v", err)
  44. }
  45. if len(resp.Data) != 2 || resp.Data[0] != "Team" || resp.Data[1] != "app" {
  46. t.Fatalf("unexpected label autocomplete response: %+v", resp.Data)
  47. }
  48. valueResp, err := QueryAllocationAutocompleteFromSetRange(asr, autocomplete.Request{
  49. Field: "label:team",
  50. Search: "plat",
  51. Window: window,
  52. })
  53. if err != nil {
  54. t.Fatalf("unexpected error: %v", err)
  55. }
  56. if len(valueResp.Data) != 1 || valueResp.Data[0] != "platform" {
  57. t.Fatalf("unexpected label value autocomplete response: %+v", valueResp.Data)
  58. }
  59. mixedCaseResp, err := QueryAllocationAutocompleteFromSetRange(asr, autocomplete.Request{
  60. Field: "label:Team",
  61. Window: window,
  62. })
  63. if err != nil {
  64. t.Fatalf("unexpected error: %v", err)
  65. }
  66. if len(mixedCaseResp.Data) != 2 || mixedCaseResp.Data[0] != "data" || mixedCaseResp.Data[1] != "platform" {
  67. t.Fatalf("expected label:team to match Team label values, got %+v", mixedCaseResp.Data)
  68. }
  69. accountResp, err := QueryAllocationAutocompleteFromSetRange(asr, autocomplete.Request{
  70. Field: "account",
  71. Window: window,
  72. })
  73. if err != nil {
  74. t.Fatalf("unexpected error for account field: %v", err)
  75. }
  76. if len(accountResp.Data) != 0 {
  77. t.Fatalf("expected empty account autocomplete response, got %+v", accountResp.Data)
  78. }
  79. _, err = QueryAllocationAutocompleteFromSetRange(asr, autocomplete.Request{
  80. Field: "namespace",
  81. Limit: autocomplete.MaxResultLimit + 1,
  82. Window: window,
  83. })
  84. if err == nil {
  85. t.Fatal("expected error for excessive limit")
  86. }
  87. if !autocomplete.IsBadRequest(err) {
  88. t.Fatalf("expected bad request error, got: %v", err)
  89. }
  90. }