registry_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package hercules
  2. import (
  3. "reflect"
  4. "testing"
  5. "github.com/spf13/cobra"
  6. "github.com/stretchr/testify/assert"
  7. "gopkg.in/src-d/go-git.v4"
  8. )
  9. func getRegistry() *PipelineItemRegistry {
  10. return &PipelineItemRegistry{
  11. provided: map[string][]reflect.Type{},
  12. registered: map[string]reflect.Type{},
  13. flags: map[string]reflect.Type{},
  14. }
  15. }
  16. type dummyPipelineItem struct{}
  17. func (item *dummyPipelineItem) Name() string {
  18. return "dummy"
  19. }
  20. func (item *dummyPipelineItem) Provides() []string {
  21. arr := [...]string{"dummy"}
  22. return arr[:]
  23. }
  24. func (item *dummyPipelineItem) Requires() []string {
  25. return []string{}
  26. }
  27. func (item *dummyPipelineItem) Features() []string {
  28. arr := [...]string{"power"}
  29. return arr[:]
  30. }
  31. func (item *dummyPipelineItem) Configure(facts map[string]interface{}) {
  32. }
  33. func (item *dummyPipelineItem) ListConfigurationOptions() []ConfigurationOption {
  34. options := [...]ConfigurationOption{{
  35. Name: "DummyOption",
  36. Description: "The option description.",
  37. Flag: "dummy-option",
  38. Type: BoolConfigurationOption,
  39. Default: false,
  40. }}
  41. return options[:]
  42. }
  43. func (item *dummyPipelineItem) Initialize(repository *git.Repository) {}
  44. func (item *dummyPipelineItem) Consume(deps map[string]interface{}) (map[string]interface{}, error) {
  45. return map[string]interface{}{"dummy": nil}, nil
  46. }
  47. type dummyPipelineItem2 struct{}
  48. func (item *dummyPipelineItem2) Name() string {
  49. return "dummy2"
  50. }
  51. func (item *dummyPipelineItem2) Provides() []string {
  52. arr := [...]string{"dummy2"}
  53. return arr[:]
  54. }
  55. func (item *dummyPipelineItem2) Requires() []string {
  56. return []string{}
  57. }
  58. func (item *dummyPipelineItem2) Features() []string {
  59. arr := [...]string{"other"}
  60. return arr[:]
  61. }
  62. func (item *dummyPipelineItem2) Configure(facts map[string]interface{}) {
  63. }
  64. func (item *dummyPipelineItem2) ListConfigurationOptions() []ConfigurationOption {
  65. return []ConfigurationOption{}
  66. }
  67. func (item *dummyPipelineItem2) Initialize(repository *git.Repository) {}
  68. func (item *dummyPipelineItem2) Consume(deps map[string]interface{}) (map[string]interface{}, error) {
  69. return map[string]interface{}{"dummy2": nil}, nil
  70. }
  71. func TestRegistrySummon(t *testing.T) {
  72. reg := getRegistry()
  73. reg.Register(&testPipelineItem{})
  74. summoned := reg.Summon((&testPipelineItem{}).Provides()[0])
  75. assert.Len(t, summoned, 1)
  76. assert.Equal(t, summoned[0].Name(), (&testPipelineItem{}).Name())
  77. summoned = reg.Summon((&testPipelineItem{}).Name())
  78. assert.Len(t, summoned, 1)
  79. assert.Equal(t, summoned[0].Name(), (&testPipelineItem{}).Name())
  80. }
  81. func TestRegistryAddFlags(t *testing.T) {
  82. reg := getRegistry()
  83. reg.Register(&testPipelineItem{})
  84. reg.Register(&dummyPipelineItem{})
  85. testCmd := &cobra.Command{
  86. Use: "test",
  87. Short: "Temporary command to test the stuff.",
  88. Long: ``,
  89. Args: cobra.MaximumNArgs(0),
  90. Run: func(cmd *cobra.Command, args []string) {},
  91. }
  92. facts, deployed := reg.AddFlags(testCmd.Flags())
  93. assert.Len(t, facts, 4)
  94. assert.IsType(t, 0, facts[(&testPipelineItem{}).ListConfigurationOptions()[0].Name])
  95. assert.IsType(t, true, facts[(&dummyPipelineItem{}).ListConfigurationOptions()[0].Name])
  96. assert.Contains(t, facts, ConfigPipelineDryRun)
  97. assert.Contains(t, facts, ConfigPipelineDumpPath)
  98. assert.Len(t, deployed, 1)
  99. assert.Contains(t, deployed, (&testPipelineItem{}).Name())
  100. assert.NotNil(t, testCmd.Flags().Lookup((&testPipelineItem{}).Flag()))
  101. assert.NotNil(t, testCmd.Flags().Lookup("feature"))
  102. assert.NotNil(t, testCmd.Flags().Lookup("dump-dag"))
  103. assert.NotNil(t, testCmd.Flags().Lookup("dry-run"))
  104. assert.NotNil(t, testCmd.Flags().Lookup(
  105. (&testPipelineItem{}).ListConfigurationOptions()[0].Flag))
  106. assert.NotNil(t, testCmd.Flags().Lookup(
  107. (&dummyPipelineItem{}).ListConfigurationOptions()[0].Flag))
  108. testCmd.UsageString() // to test that nothing is broken
  109. }
  110. func TestRegistryFeatures(t *testing.T) {
  111. reg := getRegistry()
  112. reg.Register(&dummyPipelineItem{})
  113. reg.Register(&dummyPipelineItem2{})
  114. testCmd := &cobra.Command{
  115. Use: "test",
  116. Short: "Temporary command to test the stuff.",
  117. Long: ``,
  118. Args: cobra.MaximumNArgs(0),
  119. Run: func(cmd *cobra.Command, args []string) {},
  120. }
  121. reg.AddFlags(testCmd.Flags())
  122. args := [...]string{"--feature", "other", "--feature", "power"}
  123. testCmd.ParseFlags(args[:])
  124. pipeline := NewPipeline(testRepository)
  125. val, _ := pipeline.GetFeature("power")
  126. assert.False(t, val)
  127. val, _ = pipeline.GetFeature("other")
  128. assert.False(t, val)
  129. pipeline.SetFeaturesFromFlags()
  130. val, _ = pipeline.GetFeature("power")
  131. assert.True(t, val)
  132. val, _ = pipeline.GetFeature("other")
  133. assert.True(t, val)
  134. }
  135. func TestRegistryLeaves(t *testing.T) {
  136. reg := getRegistry()
  137. reg.Register(&testPipelineItem{})
  138. reg.Register(&dependingTestPipelineItem{})
  139. reg.Register(&dummyPipelineItem{})
  140. leaves := reg.GetLeaves()
  141. assert.Len(t, leaves, 2)
  142. assert.Equal(t, leaves[0].Name(), (&dependingTestPipelineItem{}).Name())
  143. assert.Equal(t, leaves[1].Name(), (&testPipelineItem{}).Name())
  144. }
  145. func TestRegistryPlumbingItems(t *testing.T) {
  146. reg := getRegistry()
  147. reg.Register(&testPipelineItem{})
  148. reg.Register(&dependingTestPipelineItem{})
  149. reg.Register(&dummyPipelineItem{})
  150. plumbing := reg.GetPlumbingItems()
  151. assert.Len(t, plumbing, 1)
  152. assert.Equal(t, plumbing[0].Name(), (&dummyPipelineItem{}).Name())
  153. }
  154. func TestRegistryFeaturedItems(t *testing.T) {
  155. reg := getRegistry()
  156. reg.Register(&testPipelineItem{})
  157. reg.Register(&dependingTestPipelineItem{})
  158. reg.Register(&dummyPipelineItem{})
  159. featured := reg.GetFeaturedItems()
  160. assert.Len(t, featured, 1)
  161. assert.Len(t, featured["power"], 2)
  162. assert.Equal(t, featured["power"][0].Name(), (&testPipelineItem{}).Name())
  163. assert.Equal(t, featured["power"][1].Name(), (&dummyPipelineItem{}).Name())
  164. }