/engine/api/pipeline/pipeline_test.go

https://github.com/ovh/cds · Go · 309 lines · 259 code · 47 blank · 3 comment · 15 complexity · 1d62b406c38de8051cd40c1da0f4a3df MD5 · raw file

  1. package pipeline_test
  2. import (
  3. "context"
  4. "fmt"
  5. "sort"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. "github.com/ovh/cds/engine/api/application"
  10. "github.com/ovh/cds/engine/api/bootstrap"
  11. "github.com/ovh/cds/engine/api/group"
  12. "github.com/ovh/cds/engine/api/pipeline"
  13. "github.com/ovh/cds/engine/api/project"
  14. "github.com/ovh/cds/engine/api/test"
  15. "github.com/ovh/cds/engine/api/test/assets"
  16. "github.com/ovh/cds/engine/api/workflow"
  17. "github.com/ovh/cds/sdk"
  18. )
  19. func TestInsertPipeline(t *testing.T) {
  20. db, _ := test.SetupPG(t)
  21. pk := sdk.RandomString(8)
  22. p := sdk.Project{
  23. Key: pk,
  24. Name: pk,
  25. }
  26. if err := project.Insert(db, &p); err != nil {
  27. t.Fatalf("Cannot insert project : %s", err)
  28. }
  29. tests := []struct {
  30. name string
  31. p *sdk.Pipeline
  32. wantErr bool
  33. }{
  34. {
  35. name: "InsertPipeline should fail with sdk.ErrInvalidName",
  36. p: &sdk.Pipeline{},
  37. wantErr: true,
  38. },
  39. {
  40. name: "InsertPipeline should fail with sdk.ErrInvalidType",
  41. p: &sdk.Pipeline{
  42. Name: "Name",
  43. },
  44. wantErr: true,
  45. },
  46. {
  47. name: "InsertPipeline should fail with sdk.ErrInvalidProject",
  48. p: &sdk.Pipeline{
  49. Name: "Name",
  50. },
  51. wantErr: true,
  52. },
  53. {
  54. name: "InsertPipeline should not fail",
  55. p: &sdk.Pipeline{
  56. Name: "Name",
  57. ProjectID: p.ID,
  58. },
  59. wantErr: false,
  60. },
  61. }
  62. for _, tt := range tests {
  63. if err := pipeline.InsertPipeline(db, tt.p); (err != nil) != tt.wantErr {
  64. t.Errorf("%q. InsertPipeline() error = %v, wantErr %v", tt.name, err, tt.wantErr)
  65. }
  66. }
  67. }
  68. func TestInsertPipelineWithParemeters(t *testing.T) {
  69. db, _ := test.SetupPG(t)
  70. pk := sdk.RandomString(8)
  71. p := sdk.Project{
  72. Key: pk,
  73. Name: pk,
  74. }
  75. if err := project.Insert(db, &p); err != nil {
  76. t.Fatalf("Cannot insert project : %s", err)
  77. }
  78. pip := &sdk.Pipeline{
  79. Name: "Name",
  80. ProjectID: p.ID,
  81. Parameter: []sdk.Parameter{
  82. {
  83. Name: "P1",
  84. Value: "V1",
  85. Type: sdk.StringParameter,
  86. },
  87. {
  88. Name: "P2",
  89. Value: "V2",
  90. Type: sdk.StringParameter,
  91. },
  92. },
  93. }
  94. test.NoError(t, pipeline.InsertPipeline(db, pip))
  95. pip1, err := pipeline.LoadPipeline(context.TODO(), db, p.Key, "Name", true)
  96. test.NoError(t, err)
  97. assert.Equal(t, len(pip.Parameter), len(pip1.Parameter))
  98. }
  99. func TestInsertPipelineWithWithWrongParemeters(t *testing.T) {
  100. db, _ := test.SetupPG(t)
  101. pk := sdk.RandomString(8)
  102. p := sdk.Project{
  103. Key: pk,
  104. Name: pk,
  105. }
  106. if err := project.Insert(db, &p); err != nil {
  107. t.Fatalf("Cannot insert project : %s", err)
  108. }
  109. pip := &sdk.Pipeline{
  110. Name: "Name",
  111. ProjectID: p.ID,
  112. Parameter: []sdk.Parameter{
  113. {
  114. Value: "V1",
  115. Type: sdk.StringParameter,
  116. },
  117. {
  118. Name: "P2 2",
  119. Value: "V2",
  120. Type: sdk.StringParameter,
  121. },
  122. },
  123. }
  124. assert.Error(t, pipeline.InsertPipeline(db, pip))
  125. }
  126. func TestLoadByWorkflowID(t *testing.T) {
  127. db, cache := test.SetupPG(t, bootstrap.InitiliazeDB)
  128. key := sdk.RandomString(10)
  129. proj := assets.InsertTestProject(t, db, cache, key, key)
  130. app := sdk.Application{
  131. Name: "my-app",
  132. ProjectKey: proj.Key,
  133. ProjectID: proj.ID,
  134. }
  135. test.NoError(t, application.Insert(db, *proj, &app))
  136. pip := sdk.Pipeline{
  137. ProjectID: proj.ID,
  138. ProjectKey: proj.Key,
  139. Name: "pip1",
  140. }
  141. test.NoError(t, pipeline.InsertPipeline(db, &pip))
  142. w := sdk.Workflow{
  143. Name: "test_1",
  144. ProjectID: proj.ID,
  145. ProjectKey: proj.Key,
  146. WorkflowData: sdk.WorkflowData{
  147. Node: sdk.Node{
  148. Type: sdk.NodeTypePipeline,
  149. Context: &sdk.NodeContext{
  150. PipelineID: pip.ID,
  151. ApplicationID: app.ID,
  152. },
  153. },
  154. },
  155. }
  156. test.NoError(t, workflow.RenameNode(context.TODO(), db, &w))
  157. proj, _ = project.LoadByID(db, proj.ID, project.LoadOptions.WithApplications, project.LoadOptions.WithPipelines, project.LoadOptions.WithEnvironments, project.LoadOptions.WithGroups)
  158. test.NoError(t, workflow.Insert(context.TODO(), db, cache, *proj, &w))
  159. actuals, err := pipeline.LoadByWorkflowID(db, w.ID)
  160. assert.NoError(t, err)
  161. assert.Equal(t, 1, len(actuals))
  162. assert.Equal(t, pip.ID, actuals[0].ID)
  163. }
  164. func TestLoadByWorkerModel(t *testing.T) {
  165. db, cache := test.SetupPG(t, bootstrap.InitiliazeDB)
  166. g1 := group.SharedInfraGroup
  167. g2 := assets.InsertTestGroup(t, db, sdk.RandomString(10))
  168. model1 := sdk.Model{Name: sdk.RandomString(10), Group: g1, GroupID: g1.ID}
  169. model2 := sdk.Model{Name: sdk.RandomString(10), Group: g2, GroupID: g2.ID}
  170. model3 := sdk.Model{Name: model1.Name[:5], Group: g1, GroupID: g1.ID}
  171. projectKey := sdk.RandomString(10)
  172. proj := assets.InsertTestProject(t, db, cache, projectKey, projectKey)
  173. require.NoError(t, group.InsertLinkGroupProject(context.TODO(), db, &group.LinkGroupProject{
  174. GroupID: g2.ID,
  175. ProjectID: proj.ID,
  176. Role: sdk.PermissionReadWriteExecute,
  177. }))
  178. // first pipeline with requirement shared.infra/model
  179. pip1 := sdk.Pipeline{ProjectID: proj.ID, ProjectKey: proj.Key, Name: sdk.RandomString(10)}
  180. test.NoError(t, pipeline.InsertPipeline(db, &pip1))
  181. job1 := sdk.Job{
  182. Enabled: true,
  183. Action: sdk.Action{
  184. Enabled: true,
  185. Requirements: []sdk.Requirement{{
  186. Type: sdk.ModelRequirement,
  187. Name: fmt.Sprintf("%s/%s --privileged", model1.Group.Name, model1.Name),
  188. Value: fmt.Sprintf("%s/%s --privileged", model1.Group.Name, model1.Name),
  189. }},
  190. },
  191. }
  192. test.NoError(t, pipeline.InsertJob(db, &job1, 0, &pip1))
  193. // second pipeline with requirement model
  194. pip2 := sdk.Pipeline{ProjectID: proj.ID, ProjectKey: proj.Key, Name: sdk.RandomString(10)}
  195. test.NoError(t, pipeline.InsertPipeline(db, &pip2))
  196. job2 := sdk.Job{
  197. Enabled: true,
  198. Action: sdk.Action{
  199. Enabled: true,
  200. Requirements: []sdk.Requirement{{
  201. Type: sdk.ModelRequirement,
  202. Name: fmt.Sprintf("%s --privileged", model1.Name),
  203. Value: fmt.Sprintf("%s --privileged", model1.Name),
  204. }},
  205. },
  206. }
  207. test.NoError(t, pipeline.InsertJob(db, &job2, 0, &pip2))
  208. // third pipeline with requirement group/model
  209. pip3 := sdk.Pipeline{ProjectID: proj.ID, ProjectKey: proj.Key, Name: sdk.RandomString(10)}
  210. test.NoError(t, pipeline.InsertPipeline(db, &pip3))
  211. job3 := sdk.Job{
  212. Enabled: true,
  213. Action: sdk.Action{
  214. Enabled: true,
  215. Requirements: []sdk.Requirement{{
  216. Type: sdk.ModelRequirement,
  217. Name: fmt.Sprintf("%s/%s --privileged", model2.Group.Name, model2.Name),
  218. Value: fmt.Sprintf("%s/%s --privileged", model2.Group.Name, model2.Name),
  219. }},
  220. },
  221. }
  222. test.NoError(t, pipeline.InsertJob(db, &job3, 0, &pip3))
  223. pips, err := pipeline.LoadByWorkerModel(context.TODO(), db, &model1)
  224. assert.NoError(t, err)
  225. if !assert.Equal(t, 2, len(pips)) {
  226. t.FailNow()
  227. }
  228. sort.Slice(pips, func(i, j int) bool { return pips[i].ID < pips[j].ID })
  229. assert.Equal(t, pip1.Name, pips[0].Name)
  230. assert.Equal(t, pip2.Name, pips[1].Name)
  231. pips, err = pipeline.LoadByWorkerModel(context.TODO(), db, &model3)
  232. assert.NoError(t, err)
  233. if !assert.Equal(t, 0, len(pips)) {
  234. t.FailNow()
  235. }
  236. pips, err = pipeline.LoadByWorkerModel(context.TODO(), db, &model2)
  237. assert.NoError(t, err)
  238. if !assert.Equal(t, 1, len(pips)) {
  239. t.FailNow()
  240. }
  241. assert.Equal(t, pip3.Name, pips[0].Name)
  242. pips, err = pipeline.LoadByWorkerModelAndGroupIDs(context.TODO(), db, &model3, []int64{})
  243. assert.NoError(t, err)
  244. assert.Equal(t, 0, len(pips))
  245. pips, err = pipeline.LoadByWorkerModelAndGroupIDs(context.TODO(), db, &model1, []int64{})
  246. assert.NoError(t, err)
  247. assert.Equal(t, 0, len(pips))
  248. pips, err = pipeline.LoadByWorkerModelAndGroupIDs(context.TODO(), db, &model1, sdk.Groups{*g2}.ToIDs())
  249. assert.NoError(t, err)
  250. if !assert.Equal(t, 2, len(pips)) {
  251. t.FailNow()
  252. }
  253. sort.Slice(pips, func(i, j int) bool { return pips[i].ID < pips[j].ID })
  254. assert.Equal(t, pip1.Name, pips[0].Name)
  255. assert.Equal(t, pip2.Name, pips[1].Name)
  256. pips, err = pipeline.LoadByWorkerModelAndGroupIDs(context.TODO(), db, &model2, sdk.Groups{*g2}.ToIDs())
  257. assert.NoError(t, err)
  258. if !assert.Equal(t, 1, len(pips)) {
  259. t.FailNow()
  260. }
  261. assert.Equal(t, pip3.Name, pips[0].Name)
  262. }