diff_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package kubecost
  2. import (
  3. "reflect"
  4. "testing"
  5. "time"
  6. "golang.org/x/exp/slices"
  7. )
  8. func TestDiff(t *testing.T) {
  9. start := time.Now().AddDate(0, 0, -1)
  10. end := time.Now()
  11. window1 := NewWindow(&start, &end)
  12. node1 := NewNode("node1", "cluster1", "123abc", start, end, window1)
  13. node2 := NewNode("node2", "cluster1", "123abc", start, end, window1)
  14. node3 := NewNode("node3", "cluster1", "123abc", start, end, window1)
  15. node4 := NewNode("node4", "cluster1", "123abc", start, end, window1)
  16. disk1 := NewDisk("disk1", "cluster1", "123abc", start, end, window1)
  17. disk2 := NewDisk("disk2", "cluster1", "123abc", start, end, window1)
  18. cases := map[string]struct {
  19. inputAssetsBefore []Asset
  20. inputAssetsAfter []Asset
  21. expected []Diff[Asset]
  22. }{
  23. "added node": {
  24. inputAssetsBefore: []Asset{node1, node2},
  25. inputAssetsAfter: []Asset{node1, node2, node3},
  26. expected: []Diff[Asset]{{node3, DiffAdded}},
  27. },
  28. "multiple adds": {
  29. inputAssetsBefore: []Asset{node1, node2},
  30. inputAssetsAfter: []Asset{node1, node2, node3, node4},
  31. expected: []Diff[Asset]{{node3, DiffAdded}, {node4, DiffAdded}},
  32. },
  33. "removed node": {
  34. inputAssetsBefore: []Asset{node1, node2},
  35. inputAssetsAfter: []Asset{node2},
  36. expected: []Diff[Asset]{{node1, DiffRemoved}},
  37. },
  38. "multiple removes": {
  39. inputAssetsBefore: []Asset{node1, node2, node3},
  40. inputAssetsAfter: []Asset{node2},
  41. expected: []Diff[Asset]{{node1, DiffRemoved}, {node3, DiffRemoved}},
  42. },
  43. "remove all": {
  44. inputAssetsBefore: []Asset{node1, node2},
  45. inputAssetsAfter: []Asset{},
  46. expected: []Diff[Asset]{{node1, DiffRemoved}, {node2, DiffRemoved}},
  47. },
  48. "add and remove": {
  49. inputAssetsBefore: []Asset{node1, node2},
  50. inputAssetsAfter: []Asset{node2, node3},
  51. expected: []Diff[Asset]{{node1, DiffRemoved}, {node3, DiffAdded}},
  52. },
  53. "no change": {
  54. inputAssetsBefore: []Asset{node1, node2},
  55. inputAssetsAfter: []Asset{node1, node2},
  56. expected: []Diff[Asset]{},
  57. },
  58. "order switch": {
  59. inputAssetsBefore: []Asset{node2, node1},
  60. inputAssetsAfter: []Asset{node1, node2},
  61. expected: []Diff[Asset]{},
  62. },
  63. "disk add": {
  64. inputAssetsBefore: []Asset{disk1, node1},
  65. inputAssetsAfter: []Asset{disk1, node1, disk2},
  66. expected: []Diff[Asset]{{disk2, DiffAdded}},
  67. },
  68. "disk and node add": {
  69. inputAssetsBefore: []Asset{disk1, node1},
  70. inputAssetsAfter: []Asset{disk1, node1, disk2, node2},
  71. expected: []Diff[Asset]{{disk2, DiffAdded}, {node2, DiffAdded}},
  72. },
  73. "disk and node removed": {
  74. inputAssetsBefore: []Asset{disk1, node1, disk2, node2},
  75. inputAssetsAfter: []Asset{disk2, node2},
  76. expected: []Diff[Asset]{{disk1, DiffRemoved}, {node1, DiffRemoved}},
  77. },
  78. }
  79. for name, tc := range cases {
  80. t.Run(name, func(t *testing.T) {
  81. as1 := NewAssetSet(start, end, tc.inputAssetsBefore...)
  82. as2 := NewAssetSet(start, end, tc.inputAssetsAfter...)
  83. result := DiffAsset(as1.Clone(), as2.Clone())
  84. slices.SortFunc(result, func(a, b Diff[Asset]) bool {
  85. return a.Entity.Properties().Name < b.Entity.Properties().Name
  86. })
  87. slices.SortFunc(tc.expected, func(a, b Diff[Asset]) bool {
  88. return a.Entity.Properties().Name < b.Entity.Properties().Name
  89. })
  90. if !reflect.DeepEqual(result, tc.expected) {
  91. t.Fatalf("expected %+v; got %+v", tc.expected, result)
  92. }
  93. })
  94. }
  95. }