diff_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package kubecost
  2. import (
  3. "sort"
  4. "testing"
  5. "time"
  6. "github.com/google/go-cmp/cmp"
  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. trans := cmp.Transformer("Sort", func(in []Diff[Asset]) []Diff[Asset] {
  85. out := append([]Diff[Asset](nil), in...) // Copy input to avoid mutating it
  86. sort.Slice(out, func(i, j int) bool {
  87. return out[i].Entity.Properties().Name < out[i].Entity.Properties().Name
  88. })
  89. return out
  90. })
  91. diff := cmp.Diff(tc.expected, result, trans)
  92. if diff != "" {
  93. t.Fatalf(diff)
  94. }
  95. })
  96. }
  97. }