1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
require 'spec_helper'
require 'puppet/pops'
require 'puppet_spec/compiler'
describe 'the annotate function' do
include PuppetSpec::Compiler
let(:annotation) { <<-PUPPET }
type MyAdapter = Object[{
parent => Annotation,
attributes => {
id => Integer,
value => String[1]
}
}]
PUPPET
let(:annotation2) { <<-PUPPET }
type MyAdapter2 = Object[{
parent => Annotation,
attributes => {
id => Integer,
value => String[1]
}
}]
PUPPET
context 'with object and hash arguments' do
it 'creates new annotation on object' do
code = <<-PUPPET
#{annotation}
type MyObject = Object[{
}]
$my_object = MyObject({})
MyAdapter.annotate($my_object, { 'id' => 2, 'value' => 'annotation value' })
notice(MyAdapter.annotate($my_object).value)
PUPPET
expect(eval_and_collect_notices(code)).to eql(['annotation value'])
end
it 'forces creation of new annotation' do
code = <<-PUPPET
#{annotation}
type MyObject = Object[{
}]
$my_object = MyObject({})
MyAdapter.annotate($my_object, { 'id' => 2, 'value' => 'annotation value' })
notice(MyAdapter.annotate($my_object).value)
MyAdapter.annotate($my_object, { 'id' => 2, 'value' => 'annotation value 2' })
notice(MyAdapter.annotate($my_object).value)
PUPPET
expect(eval_and_collect_notices(code)).to eql(['annotation value', 'annotation value 2'])
end
end
context 'with object and block arguments' do
it 'creates new annotation on object' do
code = <<-PUPPET
#{annotation}
type MyObject = Object[{
}]
$my_object = MyObject({})
MyAdapter.annotate($my_object) || { { 'id' => 2, 'value' => 'annotation value' } }
notice(MyAdapter.annotate($my_object).value)
PUPPET
expect(eval_and_collect_notices(code)).to eql(['annotation value'])
end
it 'does not recreate annotation' do
code = <<-PUPPET
#{annotation}
type MyObject = Object[{
}]
$my_object = MyObject({})
MyAdapter.annotate($my_object) || {
notice('should call this');
{ 'id' => 2, 'value' => 'annotation value' }
}
MyAdapter.annotate($my_object) || {
notice('should not call this');
{ 'id' => 2, 'value' => 'annotation value 2' }
}
notice(MyAdapter.annotate($my_object).value)
PUPPET
expect(eval_and_collect_notices(code)).to eql(['should call this', 'annotation value'])
end
end
it "with object and 'clear' arguments, clears and returns annotation" do
code = <<-PUPPET
#{annotation}
type MyObject = Object[{
}]
$my_object = MyObject({})
MyAdapter.annotate($my_object, { 'id' => 2, 'value' => 'annotation value' })
notice(MyAdapter.annotate($my_object, clear).value)
notice(MyAdapter.annotate($my_object) == undef)
PUPPET
expect(eval_and_collect_notices(code)).to eql(['annotation value', 'true'])
end
context 'when object is an annotated Type' do
it 'finds annotation declared in the type' do
code = <<-PUPPET
#{annotation}
type MyObject = Object[{
annotations => {
MyAdapter => { 'id' => 2, 'value' => 'annotation value' }
}
}]
notice(MyAdapter.annotate(MyObject).value)
PUPPET
expect(eval_and_collect_notices(code)).to eql(['annotation value'])
end
it 'fails attempts to clear a declared annotation' do
code = <<-PUPPET
#{annotation}
type MyObject = Object[{
annotations => {
MyAdapter => { 'id' => 2, 'value' => 'annotation value' }
}
}]
notice(MyAdapter.annotate(MyObject).value)
notice(MyAdapter.annotate(MyObject, clear).value)
PUPPET
expect { eval_and_collect_notices(code) }.to raise_error(/attempt to clear MyAdapter annotation declared on MyObject/)
end
it 'fails attempts to redefine a declared annotation' do
code = <<-PUPPET
#{annotation}
type MyObject = Object[{
annotations => {
MyAdapter => { 'id' => 2, 'value' => 'annotation value' }
}
}]
notice(MyAdapter.annotate(MyObject).value)
notice(MyAdapter.annotate(MyObject, { 'id' => 3, 'value' => 'some other value' }).value)
PUPPET
expect { eval_and_collect_notices(code) }.to raise_error(/attempt to redefine MyAdapter annotation declared on MyObject/)
end
it 'allows annotation that are not declared in the type' do
code = <<-PUPPET
#{annotation}
#{annotation2}
type MyObject = Object[{
annotations => {
MyAdapter => { 'id' => 2, 'value' => 'annotation value' }
}
}]
notice(MyAdapter.annotate(MyObject).value)
notice(MyAdapter2.annotate(MyObject, { 'id' => 3, 'value' => 'some other value' }).value)
PUPPET
expect(eval_and_collect_notices(code)).to eql(['annotation value', 'some other value'])
end
end
it 'used on Pcore, can add multiple annotations an object' do
code = <<-PUPPET
#{annotation}
#{annotation2}
type MyObject = Object[{
}]
$my_object = Pcore.annotate(MyObject({}), {
MyAdapter => { 'id' => 2, 'value' => 'annotation value' },
MyAdapter2 => { 'id' => 3, 'value' => 'second annotation value' }
})
notice(MyAdapter.annotate($my_object).value)
notice(MyAdapter2.annotate($my_object).value)
PUPPET
expect(eval_and_collect_notices(code)).to eql(['annotation value', 'second annotation value'])
end
end
|