source_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package external
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/stretchr/testify/require"
  7. )
  8. // --- test doubles ---
  9. // stubLabelSource is a LabelSource whose behaviour is controlled by the test.
  10. type stubLabelSource struct {
  11. labels map[string]string
  12. err error
  13. }
  14. func (s *stubLabelSource) ExtractNodeLabels(_ map[string]string) (map[string]string, error) {
  15. return s.labels, s.err
  16. }
  17. // stubLabelProvider records the last Update call.
  18. type stubLabelProvider struct {
  19. name string
  20. labels map[string]string
  21. err error
  22. }
  23. func (p *stubLabelProvider) Update(name string, data map[string]string) error {
  24. p.name = name
  25. p.labels = data
  26. return p.err
  27. }
  28. func (p *stubLabelProvider) Labels() (map[string]string, error) {
  29. return p.labels, nil
  30. }
  31. // --- WatchFunc tests ---
  32. func TestWatchFunc_NilSource_ReturnsError(t *testing.T) {
  33. provider := &stubLabelProvider{}
  34. fn := WatchFunc(nil, provider)
  35. err := fn("cm", map[string]string{"k": "v"})
  36. require.Error(t, err)
  37. assert.Contains(t, err.Error(), "nil LabelSource")
  38. }
  39. func TestWatchFunc_NilProvider_ReturnsError(t *testing.T) {
  40. src := &stubLabelSource{labels: map[string]string{"k": "v"}}
  41. fn := WatchFunc(src, nil)
  42. err := fn("cm", map[string]string{"k": "v"})
  43. require.Error(t, err)
  44. assert.Contains(t, err.Error(), "nil LabelProvider")
  45. }
  46. func TestWatchFunc_HappyPath_LabelsForwardedToProvider(t *testing.T) {
  47. src := &stubLabelSource{labels: map[string]string{"cluster": "prod", "region": "us-east-1"}}
  48. provider := &stubLabelProvider{}
  49. fn := WatchFunc(src, provider)
  50. err := fn("my-cm", map[string]string{"raw": "data"})
  51. require.NoError(t, err)
  52. assert.Equal(t, "my-cm", provider.name)
  53. assert.Equal(t, map[string]string{"cluster": "prod", "region": "us-east-1"}, provider.labels)
  54. }
  55. func TestWatchFunc_SourceExtractError_PropagatesError(t *testing.T) {
  56. src := &stubLabelSource{err: fmt.Errorf("extract failed")}
  57. provider := &stubLabelProvider{}
  58. fn := WatchFunc(src, provider)
  59. err := fn("cm", map[string]string{})
  60. require.Error(t, err)
  61. assert.EqualError(t, err, "extract failed")
  62. // provider.Update must not have been called
  63. assert.Nil(t, provider.labels)
  64. }
  65. func TestWatchFunc_ProviderUpdateError_PropagatesError(t *testing.T) {
  66. src := &stubLabelSource{labels: map[string]string{"env": "dev"}}
  67. provider := &stubLabelProvider{err: fmt.Errorf("update failed")}
  68. fn := WatchFunc(src, provider)
  69. err := fn("cm", map[string]string{})
  70. require.Error(t, err)
  71. assert.EqualError(t, err, "update failed")
  72. }
  73. func TestWatchFunc_EmptyLabels_ForwardedToProvider(t *testing.T) {
  74. src := &stubLabelSource{labels: map[string]string{}}
  75. provider := &stubLabelProvider{}
  76. fn := WatchFunc(src, provider)
  77. err := fn("cm", map[string]string{})
  78. require.NoError(t, err)
  79. assert.Empty(t, provider.labels)
  80. }
  81. func TestWatchFunc_ReturnedFuncCalledMultipleTimes_ProviderUpdatedEachTime(t *testing.T) {
  82. src := &stubLabelSource{}
  83. provider := &stubLabelProvider{}
  84. fn := WatchFunc(src, provider)
  85. src.labels = map[string]string{"a": "1"}
  86. require.NoError(t, fn("cm", map[string]string{}))
  87. assert.Equal(t, map[string]string{"a": "1"}, provider.labels)
  88. src.labels = map[string]string{"b": "2"}
  89. require.NoError(t, fn("cm", map[string]string{}))
  90. assert.Equal(t, map[string]string{"b": "2"}, provider.labels)
  91. }