foreman_deployments 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +619 -0
  3. data/README.md +52 -0
  4. data/Rakefile +30 -0
  5. data/app/controllers/foreman_deployments/api/v2/base_controller.rb +25 -0
  6. data/app/controllers/foreman_deployments/api/v2/deployments_controller.rb +102 -0
  7. data/app/controllers/foreman_deployments/api/v2/stacks_controller.rb +52 -0
  8. data/app/controllers/foreman_deployments/create_resources_controller.rb +62 -0
  9. data/app/controllers/foreman_deployments/deployments_controller.rb +5 -0
  10. data/app/controllers/foreman_deployments/stacks_controller.rb +5 -0
  11. data/app/lib/foreman_deployments/base_dereference_visitor.rb +55 -0
  12. data/app/lib/foreman_deployments/config.rb +16 -0
  13. data/app/lib/foreman_deployments/config/array.rb +91 -0
  14. data/app/lib/foreman_deployments/config/configurator.rb +23 -0
  15. data/app/lib/foreman_deployments/config/hash.rb +81 -0
  16. data/app/lib/foreman_deployments/config/load_visitor.rb +23 -0
  17. data/app/lib/foreman_deployments/config/merge_visitor.rb +23 -0
  18. data/app/lib/foreman_deployments/config/save_visitor.rb +23 -0
  19. data/app/lib/foreman_deployments/inputs/base_input_definition.rb +39 -0
  20. data/app/lib/foreman_deployments/inputs/value.rb +25 -0
  21. data/app/lib/foreman_deployments/planner_visitor.rb +26 -0
  22. data/app/lib/foreman_deployments/registry.rb +67 -0
  23. data/app/lib/foreman_deployments/stack_definition.rb +37 -0
  24. data/app/lib/foreman_deployments/stack_parser.rb +121 -0
  25. data/app/lib/foreman_deployments/task_reference.rb +48 -0
  26. data/app/lib/foreman_deployments/tasks/base_action.rb +6 -0
  27. data/app/lib/foreman_deployments/tasks/base_definition.rb +72 -0
  28. data/app/lib/foreman_deployments/tasks/creation_task_definition.rb +68 -0
  29. data/app/lib/foreman_deployments/tasks/host_creation_task_definition.rb +44 -0
  30. data/app/lib/foreman_deployments/tasks/search_task_definition.rb +55 -0
  31. data/app/lib/foreman_deployments/tasks/stack_deploy_action.rb +10 -0
  32. data/app/lib/foreman_deployments/tasks/wait_until_built_task_definition.rb +65 -0
  33. data/app/lib/foreman_deployments/validation/dereference_visitor.rb +18 -0
  34. data/app/lib/foreman_deployments/validation/remove_ids_visitor.rb +59 -0
  35. data/app/lib/foreman_deployments/validation/validation_error.rb +12 -0
  36. data/app/lib/foreman_deployments/validation/validation_result.rb +26 -0
  37. data/app/lib/foreman_deployments/validation/validation_visitor.rb +20 -0
  38. data/app/lib/foreman_deployments/validation/validator.rb +29 -0
  39. data/app/models/foreman_deployments/concerns/belongs_to_single_taxonomy.rb +42 -0
  40. data/app/models/foreman_deployments/concerns/belongs_to_stack_taxonomy.rb +24 -0
  41. data/app/models/foreman_deployments/configuration.rb +26 -0
  42. data/app/models/foreman_deployments/deployment.rb +57 -0
  43. data/app/models/foreman_deployments/resource_models/create_resource.rb +18 -0
  44. data/app/models/foreman_deployments/stack.rb +20 -0
  45. data/app/views/foreman_deployments/api/v2/deployments/base.json.rabl +3 -0
  46. data/app/views/foreman_deployments/api/v2/deployments/create.json.rabl +3 -0
  47. data/app/views/foreman_deployments/api/v2/deployments/index.json.rabl +3 -0
  48. data/app/views/foreman_deployments/api/v2/deployments/main.json.rabl +5 -0
  49. data/app/views/foreman_deployments/api/v2/deployments/merge_configuration.json.rabl +3 -0
  50. data/app/views/foreman_deployments/api/v2/deployments/replace_configuration.json.rabl +3 -0
  51. data/app/views/foreman_deployments/api/v2/deployments/run.json.rabl +3 -0
  52. data/app/views/foreman_deployments/api/v2/deployments/show.json.rabl +11 -0
  53. data/app/views/foreman_deployments/api/v2/deployments/update.json.rabl +3 -0
  54. data/app/views/foreman_deployments/api/v2/stacks/base.json.rabl +3 -0
  55. data/app/views/foreman_deployments/api/v2/stacks/create.json.rabl +3 -0
  56. data/app/views/foreman_deployments/api/v2/stacks/index.json.rabl +3 -0
  57. data/app/views/foreman_deployments/api/v2/stacks/main.json.rabl +3 -0
  58. data/app/views/foreman_deployments/api/v2/stacks/show.json.rabl +7 -0
  59. data/app/views/foreman_deployments/api/v2/stacks/update.json.rabl +3 -0
  60. data/app/views/foreman_deployments/create_resources/new.html.erb +6 -0
  61. data/config/routes.rb +41 -0
  62. data/db/migrate/20150623140612_create_stacks.rb +10 -0
  63. data/db/migrate/20150814092932_create_deployment.rb +20 -0
  64. data/db/migrate/20150916133305_add_task_to_deployments.rb +5 -0
  65. data/db/migrate/20150917130618_add_taxonomy_to_deployments.rb +8 -0
  66. data/db/seeds.d/03-permissions.rb +14 -0
  67. data/doc/deployment_process.md +112 -0
  68. data/doc/design/capsule_stack.puml +51 -0
  69. data/doc/design/complete_stack.puml +17 -0
  70. data/doc/design/config_resource_overview.puml +15 -0
  71. data/doc/design/design.md +230 -0
  72. data/doc/design/diagrams/capsule_stack.png +0 -0
  73. data/doc/design/diagrams/capsule_stack.svg +1 -0
  74. data/doc/design/diagrams/complete_stack.png +0 -0
  75. data/doc/design/diagrams/complete_stack.svg +1 -0
  76. data/doc/design/diagrams/config_resource_overview.png +0 -0
  77. data/doc/design/diagrams/config_resource_overview.svg +1 -0
  78. data/doc/design/diagrams/ordered_resource_overview.png +0 -0
  79. data/doc/design/diagrams/ordered_resource_overview.svg +1 -0
  80. data/doc/design/diagrams/overview.png +0 -0
  81. data/doc/design/diagrams/overview.svg +1 -0
  82. data/doc/design/diagrams/overview_class.png +0 -0
  83. data/doc/design/diagrams/overview_class.svg +1 -0
  84. data/doc/design/diagrams/sat_stack.png +0 -0
  85. data/doc/design/diagrams/sat_stack.svg +1 -0
  86. data/doc/design/diagrams/solr_usecase.png +0 -0
  87. data/doc/design/diagrams/solr_usecase.svg +1 -0
  88. data/doc/design/examples.md +192 -0
  89. data/doc/design/generate-diagrams.sh +7 -0
  90. data/doc/design/implementation.md +128 -0
  91. data/doc/design/ordered_resource_overview.puml +15 -0
  92. data/doc/design/overview.puml +42 -0
  93. data/doc/design/overview_class.puml +64 -0
  94. data/doc/design/resources.md +134 -0
  95. data/doc/design/sat_stack.puml +37 -0
  96. data/doc/design/shared.puml +171 -0
  97. data/doc/design/solr_usecase.puml +189 -0
  98. data/doc/design/tasks.md +74 -0
  99. data/doc/design/user_interfaces.md +189 -0
  100. data/doc/introduction.md +84 -0
  101. data/doc/writing_stacks.md +102 -0
  102. data/lib/foreman_deployments.rb +7 -0
  103. data/lib/foreman_deployments/engine.rb +94 -0
  104. data/lib/foreman_deployments/monkey_patches.rb +9 -0
  105. data/lib/foreman_deployments/version.rb +3 -0
  106. data/lib/tasks/foreman_deployments_tasks.rake +22 -0
  107. data/locale/Makefile +62 -0
  108. data/test/factories/foreman_deployments.rb +70 -0
  109. data/test/functional/api/v2/deployments_controller_test.rb +318 -0
  110. data/test/functional/api/v2/stacks_controller_test.rb +140 -0
  111. data/test/test_plugin_helper.rb +14 -0
  112. data/test/unit/lib/config/array_test.rb +217 -0
  113. data/test/unit/lib/config/configurator_test.rb +66 -0
  114. data/test/unit/lib/config/hash_test.rb +178 -0
  115. data/test/unit/lib/inputs/value_test.rb +47 -0
  116. data/test/unit/lib/registry_test.rb +117 -0
  117. data/test/unit/lib/stack_definition_test.rb +54 -0
  118. data/test/unit/lib/stack_parser_test.rb +129 -0
  119. data/test/unit/lib/task_reference_test.rb +63 -0
  120. data/test/unit/lib/tasks/base_definition_test.rb +137 -0
  121. data/test/unit/lib/tasks/creation_task_definition_test.rb +57 -0
  122. data/test/unit/lib/tasks/host_creation_task_definition_test.rb +10 -0
  123. data/test/unit/lib/tasks/search_task_definition_test.rb +49 -0
  124. data/test/unit/lib/tasks/stack_deploy_action_test.rb +83 -0
  125. data/test/unit/lib/tasks/wait_until_built_task_definition_test.rb +71 -0
  126. data/test/unit/lib/validation/dereference_visitor_test.rb +48 -0
  127. data/test/unit/lib/validation/remove_ids_visitor_test.rb +90 -0
  128. data/test/unit/lib/validation/validation_result_test.rb +40 -0
  129. data/test/unit/lib/validation/validation_visitor_test.rb +67 -0
  130. data/test/unit/model/configuration_test.rb +88 -0
  131. data/test/unit/model/deployment_test.rb +159 -0
  132. data/test/unit/model/stack_test.rb +33 -0
  133. metadata +241 -0
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+
3
+ class CreationTaskDefinitionTest < ActiveSupport::TestCase
4
+ let(:definition_class) { ForemanDeployments::Tasks::CreationTaskDefinition }
5
+
6
+ describe 'build' do
7
+ test 'it returns instance of HostCreationTaskDefinition for Host' do
8
+ definition = definition_class.build('class' => 'Host')
9
+ assert_equal(ForemanDeployments::Tasks::HostCreationTaskDefinition, definition.class)
10
+ end
11
+
12
+ test 'it returns instance of HostCreationTaskDefinition for Host::Managed' do
13
+ definition = definition_class.build('class' => 'Host::Managed')
14
+ assert_equal(ForemanDeployments::Tasks::HostCreationTaskDefinition, definition.class)
15
+ end
16
+
17
+ test 'it returns instance of CreationTaskDefinition for other classes' do
18
+ definition = definition_class.build('class' => 'Architecture')
19
+ assert_equal(ForemanDeployments::Tasks::CreationTaskDefinition, definition.class)
20
+ end
21
+ end
22
+
23
+ describe 'object creation' do
24
+ test 'it returns instance of the class' do
25
+ object = definition_class.create_object(
26
+ 'class' => 'Architecture'
27
+ )
28
+ assert_equal(Architecture, object.class)
29
+ end
30
+
31
+ test 'it sets the parameters' do
32
+ object = definition_class.create_object(
33
+ 'class' => 'Architecture',
34
+ 'params' => {
35
+ 'name' => 'test'
36
+ }
37
+ )
38
+ assert_equal('test', object.name)
39
+ end
40
+
41
+ test "it ignores parameters that don't exist" do
42
+ object = definition_class.create_object(
43
+ 'class' => 'Architecture',
44
+ 'params' => {
45
+ 'name' => 'test',
46
+ 'unknown' => 123
47
+ }
48
+ )
49
+ assert_equal('test', object.name)
50
+ end
51
+ end
52
+
53
+ test 'it returns correct dynflow action' do
54
+ action = definition_class.build('class' => 'Architecture').dynflow_action
55
+ assert_equal(ForemanDeployments::Tasks::CreationTaskDefinition::Action, action)
56
+ end
57
+ end
@@ -0,0 +1,10 @@
1
+ require 'test_helper'
2
+
3
+ class HostCreationTaskDefinitionTest < ActiveSupport::TestCase
4
+ let(:definition_class) { ForemanDeployments::Tasks::HostCreationTaskDefinition }
5
+
6
+ test 'it returns correct dynflow action' do
7
+ action = definition_class.build('class' => 'Host').dynflow_action
8
+ assert_equal(ForemanDeployments::Tasks::HostCreationTaskDefinition::Action, action)
9
+ end
10
+ end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ class SearchTaskDefinitionTest < ActiveSupport::TestCase
4
+ class DummyModel < ActiveRecord::Base
5
+ end
6
+
7
+ setup do
8
+ @params = {
9
+ 'class' => 'SearchTaskDefinitionTest::DummyModel',
10
+ 'search_term' => 'a = b'
11
+ }
12
+ @params = HashWithIndifferentAccess[@params]
13
+ end
14
+
15
+ describe 'validate' do
16
+ test 'fails, if could not find a matching object' do
17
+ task = ForemanDeployments::Tasks::SearchTaskDefinition.new(@params)
18
+ DummyModel.expects(:search_for).returns([])
19
+
20
+ result = task.validate
21
+
22
+ assert_equal(1, result.messages.count)
23
+ assert_match(
24
+ "SearchTaskDefinitionTest::DummyModel.search_for('a = b') didn't return valid objects",
25
+ result.messages.first
26
+ )
27
+ end
28
+
29
+ test 'succeeds, if there is at least one matching object' do
30
+ task = ForemanDeployments::Tasks::SearchTaskDefinition.new(@params)
31
+ DummyModel.expects(:search_for).returns([mock('DummyModel1')])
32
+
33
+ result = task.validate
34
+
35
+ assert result.valid?
36
+ end
37
+ end
38
+
39
+ test 'should return valid search results for validation process' do
40
+ task = ForemanDeployments::Tasks::SearchTaskDefinition.new(@params)
41
+ search_result1 = mock('DummyModel1')
42
+ search_result1.expects(:id).returns(1)
43
+ DummyModel.expects(:search_for).returns([search_result1])
44
+
45
+ result = task.preliminary_output
46
+
47
+ assert_equal [search_result1], result['results']
48
+ end
49
+ end
@@ -0,0 +1,83 @@
1
+ require 'test_helper'
2
+ require 'dynflow/testing'
3
+
4
+ class StackDeployActionTest < ActiveSupport::TestCase
5
+ include ::Dynflow::Testing
6
+
7
+ class TestTaskDefinition < ForemanDeployments::Tasks::BaseDefinition
8
+ class Action < ForemanDeployments::Tasks::BaseAction; end
9
+
10
+ def dynflow_action
11
+ Action
12
+ end
13
+ end
14
+
15
+ def get_planned_params(task)
16
+ task.planned.plan_input[0]
17
+ end
18
+
19
+ describe 'plan' do
20
+ test 'plans actions in deployment' do
21
+ stack = ForemanDeployments::StackDefinition.new(
22
+ :task1 => TestTaskDefinition.new,
23
+ :task2 => TestTaskDefinition.new,
24
+ :task3 => TestTaskDefinition.new
25
+ )
26
+
27
+ stack.tasks.each do |_task_id, task|
28
+ task.expects(:plan).once
29
+ end
30
+
31
+ create_and_plan_action(ForemanDeployments::Tasks::StackDeployAction, stack)
32
+ end
33
+
34
+ test 'planned actions recieve dereferenced input' do
35
+ task3 = TestTaskDefinition.new({})
36
+ task2 = TestTaskDefinition.new(
37
+ :param => ForemanDeployments::TaskReference.new(:task3, :id, task3)
38
+ )
39
+ task1 = TestTaskDefinition.new(
40
+ :param => ForemanDeployments::TaskReference.new(:task2, :some_value, task2)
41
+ )
42
+
43
+ stack = ForemanDeployments::StackDefinition.new(
44
+ :task1 => task1,
45
+ :task2 => task2,
46
+ :task3 => task3
47
+ )
48
+
49
+ create_and_plan_action(ForemanDeployments::Tasks::StackDeployAction, stack)
50
+
51
+ task_params = get_planned_params(task1)
52
+ assert_equal(Dynflow::ExecutionPlan::OutputReference, task_params['param'].class)
53
+ assert_equal(['some_value'], task_params['param'].subkeys)
54
+
55
+ task_params = get_planned_params(task2)
56
+ assert_equal(Dynflow::ExecutionPlan::OutputReference, task_params['param'].class)
57
+ assert_equal(['id'], task_params['param'].subkeys)
58
+
59
+ assert_equal({}, get_planned_params(task3))
60
+ end
61
+
62
+ test 'plans referenced tasks only once' do
63
+ task2 = TestTaskDefinition.new({})
64
+ task1 = TestTaskDefinition.new(
65
+ :param => ForemanDeployments::TaskReference.new(:task2, :some_value, task2)
66
+ )
67
+
68
+ stack = ForemanDeployments::StackDefinition.new(
69
+ :task1 => task1,
70
+ :task2 => task2
71
+ )
72
+
73
+ planned = mock
74
+ planned.stubs(:output)
75
+
76
+ stack.tasks.each do |_task_id, task|
77
+ task.expects(:plan).once.returns(planned)
78
+ end
79
+
80
+ create_and_plan_action(ForemanDeployments::Tasks::StackDeployAction, stack)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,71 @@
1
+ require 'test_helper'
2
+
3
+ class WaitUntilBuiltTaskDefinitionTest < ActiveSupport::TestCase
4
+ let(:definition_class) { ForemanDeployments::Tasks::WaitUntilBuiltTaskDefinition }
5
+
6
+ describe 'build' do
7
+ test 'it returns instance of WaitUntilBuiltTaskDefinition' do
8
+ definition = definition_class.build
9
+ assert_equal(ForemanDeployments::Tasks::WaitUntilBuiltTaskDefinition, definition.class)
10
+ end
11
+ end
12
+
13
+ describe 'build status' do
14
+ setup do
15
+ @reports = []
16
+ @host = stub(
17
+ :reports => @reports
18
+ )
19
+ end
20
+
21
+ test 'is negative for nil' do
22
+ status = definition_class.build_status(nil)
23
+ assert_equal(false, status['build'])
24
+ end
25
+
26
+ test 'is negative for host with only one report' do
27
+ @reports << stub(:error? => false)
28
+ status = definition_class.build_status(@host)
29
+ assert_equal(false, status['build'])
30
+ end
31
+
32
+ test 'is negative for host with two reports, where the last failed' do
33
+ @reports << stub(:error? => false)
34
+ @reports << stub(:error? => true)
35
+ status = definition_class.build_status(@host)
36
+ assert_equal(false, status['build'])
37
+ end
38
+
39
+ test 'is positive for host with two reports, where the last succeeded' do
40
+ @reports << stub(:error? => false)
41
+ @reports << stub(:error? => true)
42
+ @reports << stub(:error? => false)
43
+ status = definition_class.build_status(@host)
44
+ assert_equal(true, status['build'])
45
+ end
46
+ end
47
+
48
+ describe 'validation' do
49
+ setup do
50
+ @definition = definition_class.build
51
+ end
52
+
53
+ test 'it is valid when a host_id is passed' do
54
+ @definition.configure('host_id' => 1)
55
+ result = @definition.validate
56
+
57
+ assert result.valid?
58
+ end
59
+
60
+ test 'it is invalid when a host_id is missing' do
61
+ result = @definition.validate
62
+ refute result.valid?
63
+ assert result.messages.include?("'host_id' is a required parameter")
64
+ end
65
+ end
66
+
67
+ test 'it returns correct dynflow action' do
68
+ action = definition_class.build.dynflow_action
69
+ assert_equal(ForemanDeployments::Tasks::WaitUntilBuiltTaskDefinition::Action, action)
70
+ end
71
+ end
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ class DereferenceVisitorTest < ActiveSupport::TestCase
4
+ class TestTask < ForemanDeployments::Tasks::BaseDefinition
5
+ def validate
6
+ ForemanDeployments::Validation::ValidationResult.new
7
+ end
8
+
9
+ def preliminary_output
10
+ {}
11
+ end
12
+ end
13
+
14
+ setup do
15
+ @visitor = ForemanDeployments::Validation::DereferenceVisitor.new
16
+ end
17
+
18
+ test 'it resolves dependencies' do
19
+ # We're also testing presence of the cache by setting .expects(:preliminary_output).once
20
+ # and having multiple references to a single task
21
+
22
+ task3 = TestTask.new
23
+ task3.expects(:preliminary_output).once.returns('result' => 789)
24
+
25
+ task2 = TestTask.new(
26
+ 'param1' => 2,
27
+ 'param2' => ForemanDeployments::TaskReference.new('task3', 'result', task3)
28
+ )
29
+ task2.expects(:preliminary_output).once.returns('result1' => 123, 'result2' => 456)
30
+
31
+ task1 = TestTask.new(
32
+ 'param1' => 1,
33
+ 'param2' => ForemanDeployments::TaskReference.new('task2', 'result1', task2),
34
+ 'param3' => ForemanDeployments::TaskReference.new('task2', 'result2', task2)
35
+ )
36
+
37
+ definition = ForemanDeployments::StackDefinition.new(
38
+ 'task1' => task1,
39
+ 'task2' => task2,
40
+ 'task3' => task3
41
+ )
42
+ definition.accept(@visitor)
43
+
44
+ assert_equal({}, task3.parameters)
45
+ assert_equal({ 'param1' => 2, 'param2' => 789 }, task2.parameters)
46
+ assert_equal({ 'param1' => 1, 'param2' => 123, 'param3' => 456 }, task1.parameters)
47
+ end
48
+ end
@@ -0,0 +1,90 @@
1
+ require 'test_helper'
2
+
3
+ class RemoveIdsVisitorTest < ActiveSupport::TestCase
4
+ class TestTask < ForemanDeployments::Tasks::CreationTaskDefinition
5
+ def validate
6
+ ForemanDeployments::Validation::ValidationResult.new
7
+ end
8
+
9
+ def preliminary_output
10
+ {}
11
+ end
12
+ end
13
+
14
+ setup do
15
+ @visitor = ForemanDeployments::Validation::RemoveIdsVisitor.new
16
+ end
17
+
18
+ test 'it turns id reference into object reference in parameters' do
19
+ task2 = TestTask.new
20
+
21
+ task2_ref = ForemanDeployments::TaskReference.new('task2', 'resource.id')
22
+ task2_ref.task = task2
23
+
24
+ task1 = TestTask.new(
25
+ :test_resource_id => task2_ref
26
+ )
27
+
28
+ definition = ForemanDeployments::StackDefinition.new(
29
+ 'task1' => task1,
30
+ 'task2' => task2
31
+ )
32
+ definition.accept(@visitor)
33
+
34
+ assert_equal('resource', task1.parameters['test_resource'].output_key)
35
+ end
36
+
37
+ test 'it turns single reference to multiple ids into an object reference' do
38
+ task2 = TestTask.new
39
+
40
+ task2_ref = ForemanDeployments::TaskReference.new('task2', 'resource.ids')
41
+ task2_ref.task = task2
42
+
43
+ task1 = TestTask.new(
44
+ :test_resource_ids => task2_ref
45
+ )
46
+
47
+ definition = ForemanDeployments::StackDefinition.new(
48
+ 'task1' => task1,
49
+ 'task2' => task2
50
+ )
51
+ definition.accept(@visitor)
52
+
53
+ assert_equal('resources', task1.parameters['test_resources'].output_key)
54
+ end
55
+
56
+ test 'it turns array of id references into array of object references in parameters' do
57
+ task2 = TestTask.new
58
+
59
+ task2_ref = ForemanDeployments::TaskReference.new('task2', 'resource.id')
60
+ task2_ref.task = task2
61
+
62
+ task1 = TestTask.new(
63
+ :test_resource_ids => [task2_ref]
64
+ )
65
+
66
+ definition = ForemanDeployments::StackDefinition.new(
67
+ 'task1' => task1,
68
+ 'task2' => task2
69
+ )
70
+ definition.accept(@visitor)
71
+
72
+ assert_equal(1, task1.parameters['test_resources'].size)
73
+ assert_equal('resource', task1.parameters['test_resources'][0].output_key)
74
+ end
75
+
76
+ test 'it does not change parameters that are not references' do
77
+ params = {
78
+ 'test_resource_id' => 1,
79
+ 'test_resource_ids' => [1, 2]
80
+ }
81
+ task1 = TestTask.new(params)
82
+
83
+ definition = ForemanDeployments::StackDefinition.new(
84
+ 'task1' => task1
85
+ )
86
+ definition.accept(@visitor)
87
+
88
+ assert_equal(params, task1.parameters)
89
+ end
90
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class ValidationResultTest < ActiveSupport::TestCase
4
+ describe 'valid?' do
5
+ test 'returns true when there are no messages' do
6
+ result = ForemanDeployments::Validation::ValidationResult.new
7
+ assert result.valid?
8
+ end
9
+
10
+ test 'returns false when there are some messages' do
11
+ result = ForemanDeployments::Validation::ValidationResult.new([
12
+ 'Some error message'
13
+ ])
14
+ refute result.valid?
15
+ end
16
+ end
17
+
18
+ describe 'to_s' do
19
+ test 'is empty for valid results' do
20
+ result = ForemanDeployments::Validation::ValidationResult.new
21
+ assert_equal('', result.to_s)
22
+ end
23
+
24
+ test 'contains messages for the invalid results' do
25
+ result = ForemanDeployments::Validation::ValidationResult.new([
26
+ 'Some error',
27
+ 'Another error'
28
+ ])
29
+ assert_equal("Some error\nAnother error", result.to_s)
30
+ end
31
+
32
+ test 'contains messages for the invalid results stored in hashes' do
33
+ result = ForemanDeployments::Validation::ValidationResult.new(
34
+ 'e1' => 'Some error',
35
+ 'e2' => 'Another error'
36
+ )
37
+ assert_equal("e1: Some error\ne2: Another error", result.to_s)
38
+ end
39
+ end
40
+ end