stack_master 0.17.0 → 0.18.0

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +7 -5
  3. data/README.md +15 -0
  4. data/features/apply.feature +0 -1
  5. data/features/apply_with_compile_time_parameters.feature +93 -0
  6. data/lib/stack_master/parameter_loader.rb +41 -12
  7. data/lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb +35 -0
  8. data/lib/stack_master/sparkle_formation/compile_time/allowed_values_validator.rb +37 -0
  9. data/lib/stack_master/sparkle_formation/compile_time/definitions_validator.rb +33 -0
  10. data/lib/stack_master/sparkle_formation/compile_time/empty_validator.rb +32 -0
  11. data/lib/stack_master/sparkle_formation/compile_time/max_length_validator.rb +36 -0
  12. data/lib/stack_master/sparkle_formation/compile_time/max_size_validator.rb +36 -0
  13. data/lib/stack_master/sparkle_formation/compile_time/min_length_validator.rb +36 -0
  14. data/lib/stack_master/sparkle_formation/compile_time/min_size_validator.rb +36 -0
  15. data/lib/stack_master/sparkle_formation/compile_time/number_validator.rb +35 -0
  16. data/lib/stack_master/sparkle_formation/compile_time/parameters_validator.rb +27 -0
  17. data/lib/stack_master/sparkle_formation/compile_time/state_builder.rb +32 -0
  18. data/lib/stack_master/sparkle_formation/compile_time/string_validator.rb +33 -0
  19. data/lib/stack_master/sparkle_formation/compile_time/value_builder.rb +40 -0
  20. data/lib/stack_master/sparkle_formation/compile_time/value_validator.rb +40 -0
  21. data/lib/stack_master/sparkle_formation/compile_time/value_validator_factory.rb +41 -0
  22. data/lib/stack_master/stack.rb +4 -3
  23. data/lib/stack_master/template_compiler.rb +2 -2
  24. data/lib/stack_master/template_compilers/cfndsl.rb +1 -1
  25. data/lib/stack_master/template_compilers/json.rb +1 -1
  26. data/lib/stack_master/template_compilers/sparkle_formation.rb +33 -4
  27. data/lib/stack_master/template_compilers/yaml.rb +1 -1
  28. data/lib/stack_master/validator.rb +4 -1
  29. data/lib/stack_master/version.rb +1 -1
  30. data/spec/spec_helper.rb +3 -0
  31. data/spec/stack_master/parameter_loader_spec.rb +65 -53
  32. data/spec/stack_master/sparkle_formation/compile_time/allowed_pattern_validator_spec.rb +47 -0
  33. data/spec/stack_master/sparkle_formation/compile_time/allowed_values_validator_spec.rb +47 -0
  34. data/spec/stack_master/sparkle_formation/compile_time/definitions_validator_spec.rb +36 -0
  35. data/spec/stack_master/sparkle_formation/compile_time/empty_validator_spec.rb +47 -0
  36. data/spec/stack_master/sparkle_formation/compile_time/max_length_validator_spec.rb +37 -0
  37. data/spec/stack_master/sparkle_formation/compile_time/max_size_validator_spec.rb +27 -0
  38. data/spec/stack_master/sparkle_formation/compile_time/min_length_validator_spec.rb +36 -0
  39. data/spec/stack_master/sparkle_formation/compile_time/min_size_validator_spec.rb +28 -0
  40. data/spec/stack_master/sparkle_formation/compile_time/number_validator_spec.rb +41 -0
  41. data/spec/stack_master/sparkle_formation/compile_time/parameters_validator_spec.rb +65 -0
  42. data/spec/stack_master/sparkle_formation/compile_time/state_builder_spec.rb +28 -0
  43. data/spec/stack_master/sparkle_formation/compile_time/string_validator_spec.rb +35 -0
  44. data/spec/stack_master/sparkle_formation/compile_time/value_build_spec.rb +52 -0
  45. data/spec/stack_master/sparkle_formation/compile_time/value_validator_factory_spec.rb +40 -0
  46. data/spec/stack_master/stack_spec.rb +15 -13
  47. data/spec/stack_master/template_compiler_spec.rb +7 -6
  48. data/spec/stack_master/template_compilers/cfndsl_spec.rb +4 -1
  49. data/spec/stack_master/template_compilers/json_spec.rb +4 -1
  50. data/spec/stack_master/template_compilers/sparkle_formation_spec.rb +53 -9
  51. data/spec/stack_master/template_compilers/yaml_spec.rb +4 -1
  52. data/spec/stack_master/validator_spec.rb +10 -6
  53. data/spec/support/gemfiles/Gemfile.activesupport-4.0.0 +5 -0
  54. data/spec/support/validator_spec.rb +23 -0
  55. data/stack_master.gemspec +1 -1
  56. metadata +55 -6
@@ -1,81 +1,93 @@
1
1
  RSpec.describe StackMaster::ParameterLoader do
2
- subject(:parameters) { StackMaster::ParameterLoader.load(parameter_files) }
3
- let(:parameter_files) { [
4
- '/base_dir/parameters/stack_name.yml',
5
- '/base_dir/parameters/us-east-1/stack_name.yml'
6
- ] }
7
-
8
- context "no parameter file" do
9
- before do
10
- allow(File).to receive(:exists?).and_return(false)
11
- end
2
+ let(:stack_file_name) { '/base_dir/parameters/stack_name.yml' }
3
+ let(:region_file_name) { '/base_dir/parameters/us-east-1/stack_name.yml' }
12
4
 
13
- it "returns empty parameters" do
14
- expect(parameters).to eq({})
15
- end
5
+ subject(:parameters) { StackMaster::ParameterLoader.load([stack_file_name, region_file_name]) }
6
+
7
+ before do
8
+ file_mock(stack_file_name, stack_file_returns)
9
+ file_mock(region_file_name, region_file_returns)
16
10
  end
17
11
 
18
- context "an empty stack parameter file" do
19
- before do
20
- allow(File).to receive(:exists?).with('/base_dir/parameters/stack_name.yml').and_return(true)
21
- allow(File).to receive(:exists?).with('/base_dir/parameters/us-east-1/stack_name.yml').and_return(false)
22
- allow(File).to receive(:read).with('/base_dir/parameters/stack_name.yml').and_return("")
23
- end
12
+ context 'no parameter file' do
13
+ let(:stack_file_returns) { {exists: false} }
14
+ let(:region_file_returns) { {exists: false} }
24
15
 
25
- it "returns an empty hash" do
26
- expect(parameters).to eq({})
16
+ it 'returns empty parameters' do
17
+ expect(parameters).to eq(template_parameters: {}, compile_time_parameters: {})
27
18
  end
28
19
  end
29
20
 
30
- context "stack parameter file" do
31
- before do
32
- allow(File).to receive(:exists?).with('/base_dir/parameters/stack_name.yml').and_return(true)
33
- allow(File).to receive(:exists?).with('/base_dir/parameters/us-east-1/stack_name.yml').and_return(false)
34
- allow(File).to receive(:read).with('/base_dir/parameters/stack_name.yml').and_return("Param1: value1")
21
+ context 'an empty stack parameter file' do
22
+ let(:stack_file_returns) { {exists: true, read: ''} }
23
+ let(:region_file_returns) { {exists: false} }
24
+
25
+ it 'returns an empty hash' do
26
+ expect(parameters).to eq({template_parameters: {}, compile_time_parameters: {}})
35
27
  end
28
+ end
29
+
30
+ context 'stack parameter file' do
31
+ let(:stack_file_returns) { {exists: true, read: 'Param1: value1'} }
32
+ let(:region_file_returns) { {exists: false} }
36
33
 
37
- it "returns params from stack_name.yml" do
38
- expect(parameters).to eq({ 'Param1' => 'value1' })
34
+ it 'returns params from stack_name.yml' do
35
+ expect(parameters).to eq(template_parameters: {'Param1' => 'value1'}, compile_time_parameters: {})
39
36
  end
40
37
  end
41
38
 
42
- context "region parameter file" do
43
- before do
44
- allow(File).to receive(:exists?).with('/base_dir/parameters/stack_name.yml').and_return(false)
45
- allow(File).to receive(:exists?).with('/base_dir/parameters/us-east-1/stack_name.yml').and_return(true)
46
- allow(File).to receive(:read).with('/base_dir/parameters/us-east-1/stack_name.yml').and_return("Param2: value2")
39
+ context 'region parameter file' do
40
+ let(:stack_file_returns) { {exists: false } }
41
+ let(:region_file_returns) { {exists: true, read: 'Param2: value2'} }
42
+
43
+ it 'returns params from the region base stack_name.yml' do
44
+ expect(parameters).to eq(template_parameters: {'Param2' => 'value2'}, compile_time_parameters: {})
47
45
  end
46
+ end
48
47
 
49
- it "returns params from the region base stack_name.yml" do
50
- expect(parameters).to eq({ 'Param2' => 'value2' })
48
+ context 'stack and region parameter file' do
49
+ let(:stack_file_returns) { {exists: true, read: "Param1: value1\nParam2: valueX" } }
50
+ let(:region_file_returns) { {exists: true, read: 'Param2: value2'} }
51
+
52
+ it 'returns params from the region base stack_name.yml' do
53
+ expect(parameters).to eq(template_parameters: {'Param1' => 'value1', 'Param2' => 'value2'}, compile_time_parameters: {})
51
54
  end
52
55
  end
53
56
 
54
- context "stack and region parameter file" do
55
- before do
56
- allow(File).to receive(:exists?).with('/base_dir/parameters/stack_name.yml').and_return(true)
57
- allow(File).to receive(:exists?).with('/base_dir/parameters/us-east-1/stack_name.yml').and_return(true)
58
- allow(File).to receive(:read).with('/base_dir/parameters/stack_name.yml').and_return("Param1: value1\nParam2: valueX")
59
- allow(File).to receive(:read).with('/base_dir/parameters/us-east-1/stack_name.yml').and_return("Param2: value2")
57
+ context 'compile time parameters' do
58
+
59
+ context 'stack parameter file' do
60
+ let(:stack_file_returns) { {exists: true, read: "Param1: value1\nCompileTimeParameters:\n Param2: value2" } }
61
+ let(:region_file_returns) { {exists: false} }
62
+
63
+ it 'returns params from stack_name.yml' do
64
+ expect(parameters).to eq(template_parameters: {'Param1' => 'value1'}, compile_time_parameters: {'Param2' => 'value2'})
65
+ end
60
66
  end
61
67
 
62
- it "returns params from the region base stack_name.yml" do
63
- expect(parameters).to eq({
64
- 'Param1' => 'value1',
65
- 'Param2' => 'value2'
66
- })
68
+ context 'stack and region parameter file' do
69
+ let(:stack_file_returns) { {exists: true, read: "Param1: value1\nCompileTimeParameters:\n Param2: valueX" } }
70
+ let(:region_file_returns) { {exists: true, read: "CompileTimeParameters:\n Param2: value2"} }
71
+
72
+ it 'returns params from the region base stack_name.yml' do
73
+ expect(parameters).to eq(template_parameters: {'Param1' => 'value1'}, compile_time_parameters: {'Param2' => 'value2'})
74
+ end
67
75
  end
76
+
68
77
  end
69
78
 
70
79
  context 'underscored parameter names' do
71
- before do
72
- allow(File).to receive(:exists?).with('/base_dir/parameters/stack_name.yml').and_return(true)
73
- allow(File).to receive(:exists?).with('/base_dir/parameters/us-east-1/stack_name.yml').and_return(false)
74
- allow(File).to receive(:read).with('/base_dir/parameters/stack_name.yml').and_return("vpc_id: vpc-xxxxxx")
75
- end
80
+ let(:stack_file_returns) { {exists: true, read: 'vpc_id: vpc-xxxxxx' } }
81
+ let(:region_file_returns) { {exists: false} }
76
82
 
77
- it "camelcases them" do
78
- expect(parameters).to eq({'VpcId' => 'vpc-xxxxxx'})
83
+ it 'camelcases them' do
84
+ expect(parameters).to eq(template_parameters: {'VpcId' => 'vpc-xxxxxx'}, compile_time_parameters: {})
79
85
  end
80
86
  end
87
+
88
+ def file_mock(file_name, exists: false, read: nil)
89
+ allow(File).to receive(:exists?).with(file_name).and_return(exists)
90
+ allow(File).to receive(:read).with(file_name).and_return(read) if read
91
+ end
92
+
81
93
  end
@@ -0,0 +1,47 @@
1
+ RSpec.describe StackMaster::SparkleFormation::CompileTime::AllowedPatternValidator do
2
+
3
+ describe '#validate' do
4
+ let(:name) { 'name' }
5
+ let(:error_message) { -> (error, definition) { "#{name}:#{error} does not match allowed_pattern:#{definition[:allowed_pattern]}" } }
6
+
7
+ context 'string validation' do
8
+ let(:definition) { {type: :string, allowed_pattern: '^a'} }
9
+ validate_valid_parameter('a')
10
+ validate_valid_parameter(['a'])
11
+ validate_invalid_parameter('b', ['b'])
12
+ validate_invalid_parameter(['b'], ['b'])
13
+ end
14
+
15
+ context 'string validation with default' do
16
+ let(:definition) { {type: :string, allowed_pattern: '^a', default: 'a'} }
17
+ validate_valid_parameter(nil)
18
+ end
19
+
20
+ context 'string validation with multiple' do
21
+ let(:definition) { {type: :string, allowed_pattern: '^a', multiple: true} }
22
+ validate_valid_parameter('a,ab')
23
+ validate_invalid_parameter('a,,ab', [''])
24
+ validate_invalid_parameter('a, ,ab', [''])
25
+ end
26
+
27
+ context 'string validation with multiple default values' do
28
+ let(:definition) { {type: :string, allowed_pattern: '^a', multiple: true, default:'a,a'} }
29
+ validate_valid_parameter(nil)
30
+ end
31
+
32
+ context 'numerical validation' do
33
+ let(:definition) { {type: :number, allowed_pattern: '^1'} }
34
+ validate_valid_parameter(1)
35
+ validate_valid_parameter('1')
36
+ validate_valid_parameter([1])
37
+ validate_valid_parameter(['1'])
38
+ validate_invalid_parameter(2, [2])
39
+ validate_invalid_parameter('2', ['2'])
40
+ end
41
+
42
+ context 'validation with default value' do
43
+ let(:definition) { {type: :number, allowed_pattern: '^1', default: '1'} }
44
+ validate_valid_parameter(nil)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,47 @@
1
+ RSpec.describe StackMaster::SparkleFormation::CompileTime::AllowedValuesValidator do
2
+
3
+ describe '#validate' do
4
+ let(:name) { 'name' }
5
+ let(:error_message) { -> (error, definition) { "#{name}:#{error} is not in allowed_values:#{definition[:allowed_values]}" } }
6
+
7
+ context 'string validation' do
8
+ let(:definition) { {type: :string, allowed_values: ['a']} }
9
+ validate_valid_parameter('a')
10
+ validate_valid_parameter(['a'])
11
+ validate_invalid_parameter('b', ['b'])
12
+ validate_invalid_parameter(['b'], ['b'])
13
+ end
14
+
15
+ context 'string validation with default' do
16
+ let(:definition) { {type: :string, allowed_values: ['a'], default:'a'} }
17
+ validate_valid_parameter(nil)
18
+ end
19
+
20
+ context 'string validation with multiple' do
21
+ let(:definition) { {type: :string, allowed_values: ['a'], multiple: true} }
22
+ validate_valid_parameter('a,a')
23
+ validate_invalid_parameter( 'a,, a', [''])
24
+ validate_invalid_parameter( 'a,,b', ['', 'b'])
25
+ end
26
+
27
+ context 'string validation with multiple default values' do
28
+ let(:definition) { {type: :string, allowed_values: ['a'], multiple: true, default: 'a,a'} }
29
+ validate_valid_parameter(nil)
30
+ end
31
+
32
+ context 'numerical validation' do
33
+ let(:definition) { {type: :number, allowed_values: [1]} }
34
+ validate_valid_parameter(1)
35
+ validate_valid_parameter('1')
36
+ validate_valid_parameter([1])
37
+ validate_valid_parameter(['1'])
38
+ validate_invalid_parameter(2, [2])
39
+ validate_invalid_parameter('2', ['2'])
40
+ end
41
+
42
+ context 'numerical validation with default value' do
43
+ let(:definition) { {type: :number, allowed_values: [1], default: 1} }
44
+ validate_valid_parameter(nil)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,36 @@
1
+ RSpec.describe StackMaster::SparkleFormation::CompileTime::DefinitionsValidator do
2
+
3
+ describe '#validate' do
4
+
5
+ let(:key) {:key}
6
+ let(:definition){ {key: {type: type}} }
7
+
8
+ subject {described_class.new(definition)}
9
+
10
+ [:string, :number].each do |type|
11
+
12
+ context "with :#{type} type definition" do
13
+
14
+ let(:type) {type}
15
+
16
+ it 'should not raise an exception' do
17
+ expect {subject.validate}.to_not raise_error
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+ context 'with other type definition' do
25
+
26
+ let(:type) {:other}
27
+
28
+ it 'should not raise an exception' do
29
+ expect {subject.validate}.to raise_error(ArgumentError, "Unknown compile time parameter type: #{key}:#{type} valid types are #{[:string, :number]}")
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,47 @@
1
+ RSpec.describe StackMaster::SparkleFormation::CompileTime::EmptyValidator do
2
+
3
+ describe '#validate' do
4
+ let(:name) { 'name' }
5
+ let(:error_message) { -> (error, _definition) { "#{name} cannot contain empty parameters:#{error.inspect}" } }
6
+
7
+ context 'string validation' do
8
+ let(:definition) { {type: :string} }
9
+ validate_valid_parameter('a')
10
+ validate_valid_parameter(['a'])
11
+ validate_invalid_parameter(nil, nil)
12
+ validate_invalid_parameter(['a', nil], ['a', nil])
13
+ end
14
+
15
+ context 'string validation with default' do
16
+ let(:definition) { {type: :string, default: 'a'} }
17
+ validate_valid_parameter(nil)
18
+ end
19
+
20
+ context 'string validation with multiples' do
21
+ let(:definition) { {type: :string, multiple: true} }
22
+ validate_valid_parameter('a,b')
23
+ validate_invalid_parameter('a,,b', 'a,,b')
24
+ end
25
+
26
+ context 'string validation with multiples and defaults' do
27
+ let(:definition) { {type: :string, multiple: true, default: 'a,b'} }
28
+ validate_valid_parameter(nil)
29
+ end
30
+
31
+ context 'numerical validation' do
32
+ let(:definition) { {type: :number} }
33
+ validate_valid_parameter(1)
34
+ validate_valid_parameter('1')
35
+ validate_valid_parameter([1])
36
+ validate_valid_parameter(['1'])
37
+ validate_invalid_parameter(nil, nil)
38
+ validate_invalid_parameter([1, nil], [1, nil])
39
+ validate_invalid_parameter(['1', nil], ['1', nil])
40
+ end
41
+
42
+ context 'numerical validation with default' do
43
+ let(:definition) { {type: :number, default: '1'} }
44
+ validate_valid_parameter(nil)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,37 @@
1
+ RSpec.describe StackMaster::SparkleFormation::CompileTime::MaxLengthValidator do
2
+
3
+ describe '#validate' do
4
+ let(:name) { 'name' }
5
+ let(:error_message) { -> (error, definition) { "#{name}:#{error} must not exceed max_length:#{definition[:max_length]} characters" } }
6
+
7
+ context 'string validation' do
8
+ let(:definition) { {type: :string, max_length: 1} }
9
+ validate_valid_parameter('a')
10
+ validate_valid_parameter(['a'])
11
+ validate_invalid_parameter('ab', ['ab'])
12
+ validate_invalid_parameter(['ab'], ['ab'])
13
+ end
14
+
15
+ context 'string validation with default value' do
16
+ let(:definition) { {type: :string, max_length: 1, default: 'a'} }
17
+ validate_valid_parameter(nil)
18
+ end
19
+
20
+ context 'string validation with multiples' do
21
+ let(:definition) { {type: :string, max_length: 1, multiple: true} }
22
+ validate_valid_parameter('a,a')
23
+ validate_valid_parameter('a,,a')
24
+ validate_invalid_parameter('a,, ab', ['ab'])
25
+ end
26
+
27
+ context 'string validation wtih multiples and default' do
28
+ let(:definition) { {type: :string, max_length: 1, multiple: true, default: 'a,a'} }
29
+ validate_valid_parameter(nil)
30
+ end
31
+
32
+ context 'numerical validation' do
33
+ let(:definition) { {type: :number, max_length: 1} }
34
+ validate_valid_parameter('ab')
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ RSpec.describe StackMaster::SparkleFormation::CompileTime::MaxSizeValidator do
2
+
3
+ describe '#validate' do
4
+ let(:name) { 'name' }
5
+ let(:error_message) { -> (error, definition) { "#{name}:#{error} must not be greater than max_size:#{definition[:max_size]}" } }
6
+
7
+ context 'numerical validation' do
8
+ let(:definition) { {type: :number, max_size: 1} }
9
+ validate_valid_parameter(1)
10
+ validate_valid_parameter('1')
11
+ validate_valid_parameter([1])
12
+ validate_valid_parameter(['1'])
13
+ validate_invalid_parameter(2, [2])
14
+ validate_invalid_parameter('2', ['2'])
15
+ end
16
+
17
+ context 'numerical validation with default' do
18
+ let(:definition) { {type: :number, max_size: 1, default: 1} }
19
+ validate_valid_parameter(nil)
20
+ end
21
+
22
+ context 'string validation' do
23
+ let(:definition) { {type: :string, max_size: 1} }
24
+ validate_valid_parameter(2)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ RSpec.describe StackMaster::SparkleFormation::CompileTime::MinLengthValidator do
2
+
3
+ describe '#validate' do
4
+ let(:name) { 'name' }
5
+ let(:error_message) { -> (error, definition) { "#{name}:#{error} must be at least min_length:#{definition[:min_length]} characters" } }
6
+
7
+ context 'string validation' do
8
+ let(:definition) { {type: :string, min_length: 2} }
9
+ validate_valid_parameter('ab')
10
+ validate_valid_parameter(['ab'])
11
+ validate_invalid_parameter('a', ['a'])
12
+ validate_invalid_parameter(['a'], ['a'])
13
+ end
14
+
15
+ context 'string validation with default value' do
16
+ let(:definition) { {type: :string, min_length: 2, default: 'ab'} }
17
+ validate_valid_parameter(nil)
18
+ end
19
+
20
+ context 'string validation with multiples' do
21
+ let(:definition) { {type: :string, min_length: 2, multiple: true} }
22
+ validate_valid_parameter('ab,cd')
23
+ validate_invalid_parameter('a,, cd', ['a', ''])
24
+ end
25
+
26
+ context 'string validation with multiples and default' do
27
+ let(:definition) { {type: :string, min_length: 2, multiple: true, default: 'ab,cd'} }
28
+ validate_valid_parameter(nil)
29
+ end
30
+
31
+ context 'numerical validation' do
32
+ let(:definition) { {type: :number, min_length: 2} }
33
+ validate_valid_parameter('a')
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ RSpec.describe StackMaster::SparkleFormation::CompileTime::MinSizeValidator do
2
+
3
+ describe '#validate' do
4
+ let(:name) { 'name' }
5
+ let(:error_message) { -> (error, definition) { "#{name}:#{error} must not be lesser than min_size:#{definition[:min_size]}" } }
6
+
7
+ context 'numerical validation' do
8
+ let(:definition) { {type: :number, min_size: 1} }
9
+ validate_valid_parameter(1)
10
+ validate_valid_parameter('1')
11
+ validate_valid_parameter([1])
12
+ validate_valid_parameter(['1'])
13
+ validate_invalid_parameter(0, [0])
14
+ validate_invalid_parameter('0', ['0'])
15
+ end
16
+
17
+ context 'numerical validation with default value' do
18
+ let(:definition) { {type: :number, min_size: 1, default: 1} }
19
+ validate_valid_parameter(nil)
20
+ end
21
+
22
+ context 'string validation' do
23
+ let(:definition) { {type: :string, min_size: 1} }
24
+ validate_valid_parameter(0)
25
+ end
26
+
27
+ end
28
+ end