autocompletequeryservice_test.go 3.0 KB

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