occi-core 4.1.3 → 4.2.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 (125) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile +8 -0
  3. data/README.md +49 -17
  4. data/lib/occi/collection.rb +37 -21
  5. data/lib/occi/core/action.rb +5 -5
  6. data/lib/occi/core/action_instance.rb +45 -3
  7. data/lib/occi/core/actions.rb +2 -1
  8. data/lib/occi/core/attributes.rb +253 -73
  9. data/lib/occi/core/categories.rb +1 -0
  10. data/lib/occi/core/category.rb +25 -8
  11. data/lib/occi/core/entities.rb +1 -0
  12. data/lib/occi/core/entity.rb +51 -74
  13. data/lib/occi/core/kind.rb +15 -11
  14. data/lib/occi/core/kinds.rb +1 -1
  15. data/lib/occi/core/link.rb +14 -15
  16. data/lib/occi/core/links.rb +1 -1
  17. data/lib/occi/core/mixin.rb +5 -5
  18. data/lib/occi/core/mixins.rb +2 -2
  19. data/lib/occi/core/properties.rb +90 -12
  20. data/lib/occi/core/resource.rb +7 -3
  21. data/lib/occi/core/resources.rb +2 -2
  22. data/lib/occi/errors/attribute_definitions_converted_error.rb +5 -0
  23. data/lib/occi/errors/attribute_missing_error.rb +5 -0
  24. data/lib/occi/errors/attribute_name_invalid_error.rb +5 -0
  25. data/lib/occi/errors/attribute_not_defined_error.rb +5 -0
  26. data/lib/occi/errors/attribute_property_type_error.rb +5 -0
  27. data/lib/occi/errors/attribute_type_error.rb +5 -0
  28. data/lib/occi/errors/kind_not_defined_error.rb +5 -0
  29. data/lib/occi/errors/parser_input_error.rb +5 -0
  30. data/lib/occi/errors/parser_type_error.rb +5 -0
  31. data/lib/occi/errors.rb +1 -0
  32. data/lib/occi/extensions/hashie.rb +25 -0
  33. data/lib/occi/helpers/comparators/action_instance.rb +22 -0
  34. data/lib/occi/helpers/comparators/attributes.rb +22 -0
  35. data/lib/occi/helpers/comparators/categories.rb +22 -0
  36. data/lib/occi/helpers/comparators/category.rb +22 -0
  37. data/lib/occi/helpers/comparators/collection.rb +40 -0
  38. data/lib/occi/helpers/comparators/entities.rb +22 -0
  39. data/lib/occi/helpers/comparators/entity.rb +22 -0
  40. data/lib/occi/helpers/comparators/properties.rb +26 -0
  41. data/lib/occi/helpers/comparators.rb +1 -0
  42. data/lib/occi/infrastructure/compute.rb +11 -9
  43. data/lib/occi/infrastructure/network.rb +27 -27
  44. data/lib/occi/infrastructure/networkinterface.rb +22 -23
  45. data/lib/occi/infrastructure/os_tpl.rb +1 -1
  46. data/lib/occi/infrastructure/resource_tpl.rb +1 -1
  47. data/lib/occi/infrastructure/storage.rb +7 -6
  48. data/lib/occi/infrastructure/storagelink.rb +4 -4
  49. data/lib/occi/log.rb +13 -10
  50. data/lib/occi/model.rb +9 -8
  51. data/lib/occi/parser/json.rb +11 -9
  52. data/lib/occi/parser/ova.rb +12 -6
  53. data/lib/occi/parser/ovf.rb +173 -116
  54. data/lib/occi/parser/text/constants.rb +87 -0
  55. data/lib/occi/parser/text.rb +161 -200
  56. data/lib/occi/parser/xml.rb +10 -8
  57. data/lib/occi/parser.rb +100 -50
  58. data/lib/occi/settings.rb +2 -1
  59. data/lib/occi/version.rb +1 -1
  60. data/lib/occi-core.rb +6 -4
  61. data/occi-core.gemspec +0 -7
  62. data/spec/occi/collection_samples/collection1.json +1 -0
  63. data/spec/occi/collection_samples/directory2/collection2.json +1 -0
  64. data/spec/occi/collection_spec.rb +961 -31
  65. data/spec/occi/core/action_instance_spec.rb +317 -0
  66. data/spec/occi/core/action_spec.rb +71 -0
  67. data/spec/occi/core/attributes_spec.rb +582 -27
  68. data/spec/occi/core/category_spec.rb +194 -18
  69. data/spec/occi/core/entities_spec.rb +96 -0
  70. data/spec/occi/core/entity_spec.rb +317 -28
  71. data/spec/occi/core/kind_spec.rb +127 -16
  72. data/spec/occi/core/link_spec.rb +35 -0
  73. data/spec/occi/core/links_spec.rb +130 -0
  74. data/spec/occi/core/mixins_spec.rb +107 -0
  75. data/spec/occi/core/properties_spec.rb +167 -0
  76. data/spec/occi/core/resource_spec.rb +23 -9
  77. data/spec/occi/core_spec.rb +12 -0
  78. data/spec/occi/infrastructure/compute_spec.rb +218 -18
  79. data/spec/occi/infrastructure/network_spec.rb +96 -0
  80. data/spec/occi/infrastructure/networkinterface_spec.rb +96 -0
  81. data/spec/occi/infrastructure/storage_spec.rb +33 -0
  82. data/spec/occi/infrastructure/storagelink_spec.rb +45 -0
  83. data/spec/occi/log_spec.rb +104 -1
  84. data/spec/occi/model_spec.rb +251 -39
  85. data/spec/occi/{test.json → parser/json_samples/test.json} +0 -0
  86. data/spec/occi/parser/ova_samples/test.dump +0 -0
  87. data/spec/occi/{test.ova → parser/ova_samples/test.ova} +0 -0
  88. data/spec/occi/parser/ovf_samples/test.dump +0 -0
  89. data/spec/occi/{test.ovf → parser/ovf_samples/test.ovf} +0 -0
  90. data/spec/occi/parser/text_samples/occi_categories.dump +0 -0
  91. data/spec/occi/parser/text_samples/occi_categories.text +2 -0
  92. data/spec/occi/parser/text_samples/occi_compute_rocci_server.dump +0 -0
  93. data/spec/occi/parser/text_samples/occi_compute_rocci_server.resource.dump +0 -0
  94. data/spec/occi/parser/text_samples/occi_compute_rocci_server.text +10 -0
  95. data/spec/occi/parser/text_samples/occi_link_resource_instance.dump +0 -0
  96. data/spec/occi/parser/text_samples/occi_link_resource_instance.text +7 -0
  97. data/spec/occi/parser/text_samples/occi_link_simple.dump +0 -0
  98. data/spec/occi/parser/text_samples/occi_link_simple.link_string.dump +0 -0
  99. data/spec/occi/parser/text_samples/occi_link_simple.text +1 -0
  100. data/spec/occi/parser/text_samples/occi_link_w_attributes.dump +0 -0
  101. data/spec/occi/parser/text_samples/occi_link_w_attributes.text +7 -0
  102. data/spec/occi/parser/text_samples/occi_link_w_category.dump +0 -0
  103. data/spec/occi/parser/text_samples/occi_link_w_category.text +3 -0
  104. data/spec/occi/parser/text_samples/occi_model_rocci_server.dump +0 -0
  105. data/spec/occi/parser/text_samples/occi_model_rocci_server.text +51 -0
  106. data/spec/occi/parser/text_samples/occi_network_rocci_server.dump +0 -0
  107. data/spec/occi/parser/text_samples/occi_network_rocci_server.resource.dump +0 -0
  108. data/spec/occi/parser/text_samples/occi_network_rocci_server.text +11 -0
  109. data/spec/occi/parser/text_samples/occi_resource_w_attributes.dump +0 -0
  110. data/spec/occi/parser/text_samples/occi_resource_w_attributes.text +11 -0
  111. data/spec/occi/parser/text_samples/occi_resource_w_inline_links.dump +0 -0
  112. data/spec/occi/parser/text_samples/occi_resource_w_inline_links.text +16 -0
  113. data/spec/occi/parser/text_samples/occi_resource_w_inline_links_only.dump +0 -0
  114. data/spec/occi/parser/text_samples/occi_resource_w_inline_links_only.text +13 -0
  115. data/spec/occi/parser/text_samples/occi_storage_rocci_server.dump +0 -0
  116. data/spec/occi/parser/text_samples/occi_storage_rocci_server.resource.dump +0 -0
  117. data/spec/occi/parser/text_samples/occi_storage_rocci_server.text +9 -0
  118. data/spec/occi/parser/text_spec.rb +274 -78
  119. data/spec/occi/parser/xml_samples/test.xml +352 -0
  120. data/spec/occi/parser_spec.rb +255 -104
  121. data/spec/occi-core_spec.rb +31 -0
  122. data/spec/spec_helper.rb +6 -2
  123. metadata +110 -111
  124. checksums.yaml +0 -7
  125. data/spec/occi/core/attribute_spec.rb +0 -0
@@ -4,21 +4,33 @@ module Occi
4
4
 
5
5
  describe '#get_class' do
6
6
 
7
- it 'gets OCCI Resource class by term and scheme' do
8
- scheme = 'http://schemas.ogf.org/occi/core'
9
- term = 'resource'
10
- klass = Occi::Core::Kind.get_class scheme, term
11
- klass.should be Occi::Core::Resource
12
- klass.superclass.should be Occi::Core::Entity
7
+ context 'OCCI Resource class' do
8
+ let(:scheme){ 'http://schemas.ogf.org/occi/core' }
9
+ let(:term){ 'resource' }
10
+ let(:klass){ Occi::Core::Kind.get_class scheme, term }
11
+
12
+ it 'gets OCCI Resource class by term term and scheme' do
13
+ expect(klass).to be Occi::Core::Resource
14
+ end
15
+ it 'also gets the superclass' do
16
+ expect(klass.superclass).to be Occi::Core::Entity
17
+ #TODO: Possibly move this test to resource_spec?
18
+ end
13
19
  end
14
20
 
15
- it 'gets non predefined OCCI class by term, scheme and related class' do
16
- scheme = 'http://example.com/occi'
17
- term = 'test'
18
- related = ['http://schemas.ogf.org/occi/core#resource']
19
- klass = Occi::Core::Kind.get_class scheme, term, related
20
- klass.should be Com::Example::Occi::Test
21
- klass.superclass.should be Occi::Core::Resource
21
+ context 'non-predefined OCCI class' do
22
+ let(:scheme){ 'http://example.com/occi' }
23
+ let(:term){ 'test' }
24
+ let(:related){ ['http://schemas.ogf.org/occi/core#resource'] }
25
+ let(:klass){ Occi::Core::Kind.get_class scheme, term, related }
26
+
27
+ it 'gets non predefined OCCI class by term, scheme and related class' do
28
+ expect(klass).to be Com::Example::Occi::Test
29
+ end
30
+ it 'also gets the superclass' do
31
+ expect(klass.superclass).to be Occi::Core::Resource
32
+ #TODO: Possibly move this test to resource_spec?
33
+ end
22
34
  end
23
35
 
24
36
  it 'does not get OCCI class by term and scheme if it relates to existing class not derived from OCCI Entity' do
@@ -28,17 +40,116 @@ module Occi
28
40
  expect { Occi::Core::Kind.get_class scheme, term, related }.to raise_error
29
41
  end
30
42
 
43
+ context 'in case of improper input' do
44
+
45
+ it 'handles parent overriden with nil' do
46
+ expect(Occi::Core::Kind.get_class 'http://schemas.ogf.org/occi/core', 'resource', nil).to eq Occi::Core::Resource
47
+ end
48
+
49
+ it 'copes with invalid characters in scheme' do
50
+ expect{Occi::Core::Kind.get_class 'http://schemas ogf.org/occi/core', 'resource'}.to raise_error(URI::InvalidURIError)
51
+ end
52
+ it 'copes with non-URI-like structure of the scheme' do
53
+ expect{Occi::Core::Kind.get_class 'doesnotexist', 'resource'}.to raise_error(StandardError)
54
+ end
55
+
56
+ context 'handling invalid characters in term' do
57
+ after { Occi::Settings.reload! }
58
+ it 'copes with compatibility on' do
59
+ Occi::Settings['compatibility'] = true
60
+ expect(Occi::Core::Kind.get_class 'http://schemas.ogf.org/occi/core', '# #resource$').to eq Occi::Core::Resource
61
+ end
62
+
63
+ it 'copes with compatibility off' do
64
+ Occi::Settings['compatibility'] = false
65
+ expect{Occi::Core::Kind.get_class 'http://schemas.ogf.org/occi/core', '# #resource$'}.to raise_error(ArgumentError)
66
+ end
67
+ end
68
+
69
+ it 'handles nil scheme' do
70
+ expect{Occi::Core::Kind.get_class nil, 'resource'}.to raise_error(ArgumentError)
71
+ end
72
+
73
+ it 'handles nil resource' do
74
+ expect{Occi::Core::Kind.get_class 'http://schemas.ogf.org/occi/core', nil}.to raise_error(ArgumentError)
75
+ end
76
+
77
+ it 'copes with invalid parent' do
78
+ expect{Occi::Core::Kind.get_class 'http://example.com/occi', 'test', 'http://s chemas.ogf.org/occi/core#resource'}.to raise_error(URI::InvalidURIError)
79
+ end
80
+
81
+ it 'copes with parent missing term' do
82
+ expect{Occi::Core::Kind.get_class 'http://example.com/occi', 'test', 'http://s chemas.ogf.org/occi/core'}.to raise_error(ArgumentError)
83
+ end
84
+
85
+ end
86
+
31
87
  end
32
88
 
33
89
  describe '#related_to?' do
90
+ let(:base){ Occi::Core::Kind.new 'http://occi.test.case/core/kind', 'base' }
91
+ let(:related){ Occi::Core::Kind.new 'http://occi.test.case/core/kind/base', 'related', 'title', Occi::Core::Attributes.new, base }
92
+ let(:unrelated){ Occi::Core::Kind.new 'http://occi.test.case/core/kind', 'unrelated' }
93
+
94
+ it 'recognizes existing relationship' do
95
+ expect(related.related_to?(base)).to eq true
96
+ end
97
+
98
+ it 'does not give false positives on non-existent relationship' do
99
+ expect(base.related_to?(unrelated)).to eq false
100
+ end
34
101
 
35
- it 'checks if the kind is related to another kind' do
36
- kind = Occi::Core::Resource.kind
37
- kind.related_to?(Occi::Core::Entity.kind).should be true
102
+ it 'recognizes transitive relationships' #do #TODO This test actually works, but fails because te feature is not yet implemented
103
+ # grandchild = Occi::Core::Kind.new 'http://occi.test.case/core/kind/base', 'related', 'title', Occi::Core::Attributes.new, related
104
+ # expect(grandchild.related_to?(base)).to eq true
105
+ # end
106
+ end
107
+
108
+ describe '#as_json' do
109
+ let(:kind){ Occi::Core::Kind.new }
110
+
111
+ it 'renders JSON correctly from freshly initialized object' do
112
+ expected = '{"location":"/kind/","term":"kind","scheme":"http://schemas.ogf.org/occi/core#","attributes":{}}'
113
+ hash=Hashie::Mash.new(JSON.parse(expected))
114
+ expect(kind.as_json).to eql(hash)
115
+ end
116
+
117
+ it 'renders JSON correctly with optional attributes' do
118
+ kind.title = "test title"
119
+ expected = '{"location":"/kind/","term":"kind","scheme":"http://schemas.ogf.org/occi/core#","title":"test title","attributes":{}}'
120
+ hash=Hashie::Mash.new(JSON.parse(expected))
121
+ expect(kind.as_json).to eql(hash)
122
+ end
123
+
124
+ it 'renders JSON correctly with special characters' do
125
+ kind.title = "Some special characters @#\$%"
126
+ expected = '{"location":"/kind/","term":"kind","scheme":"http://schemas.ogf.org/occi/core#","title":"Some special characters @#\$%","attributes":{}}'
127
+ hash=Hashie::Mash.new(JSON.parse(expected))
128
+ expect(kind.as_json).to eql(hash)
38
129
  end
39
130
 
40
131
  end
41
132
 
133
+ describe '#to_string' do
134
+ let(:kind){ Occi::Core::Kind.new }
135
+
136
+ it 'produces a string correctly from freshly initialized object' do
137
+ expected = ('scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/kind/";kind').split(/;/)
138
+ actual = kind.to_string.split(/;/)
139
+ expect(actual).to match_array(expected)
140
+ end
141
+
142
+ it 'produces a string correctly with optional attributes' do
143
+ kind.title = "test title"
144
+ expected = ('scheme="http://schemas.ogf.org/occi/core#";class="kind";location="/kind/";kind;title="test title"').split(/;/)
145
+ actual = kind.to_string.split(/;/)
146
+ expect(actual).to match_array(expected)
147
+ end
148
+
149
+ # TODO: Optional attributes, special characters
150
+
151
+ end
152
+
42
153
  end
43
154
  end
44
155
  end
@@ -0,0 +1,35 @@
1
+ module Occi
2
+ module Core
3
+ describe Link do
4
+ # XXX This is a poor man's spec file, by no means exhaustive
5
+ # XXX So far it is only used to cover code otherwise not
6
+ # XXX covered by calls from other specs
7
+
8
+ context '#check' do
9
+ let(:defs){
10
+ defs = Occi::Core::Attributes.new
11
+ defs['occi.core.id'] = { :type=> 'string', :required => true }
12
+ defs['stringtype'] = { :type => 'string', :pattern => '[adefltuv]+',
13
+ :default => 'defaultforlink', :mutable => true, :required => true }
14
+ defs }
15
+
16
+ it 'sets default for required attribute' do
17
+ link = Occi::Core::Link.new
18
+ link.kind.attributes.merge!(defs)
19
+ model = Occi::Model.new
20
+ model.register(link.kind)
21
+ link.model = model
22
+
23
+ link.check
24
+ expect(link.attributes['stringtype']).to eql 'defaultforlink'
25
+ end
26
+
27
+ it 'raises error if no relationship is set' do
28
+ norel = Occi::Core::Link.new
29
+ norel.instance_eval { @rel=nil }
30
+ expect{ norel.check }.to raise_exception ArgumentError
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,130 @@
1
+ module Occi
2
+ module Core
3
+ describe Links do
4
+
5
+ context '.initialize' do
6
+ it 'initializes an empty Links set' do
7
+ links = Occi::Core::Links.new
8
+ expect(links).to eql []
9
+ end
10
+
11
+ context 'with multiple members' do
12
+ let(:link1){ Occi::Core::Link.new }
13
+ let(:link2){ Occi::Core::Link.new }
14
+ let(:links){ Occi::Core::Links.new [link1,link2] }
15
+ let(:expected){ expected = []
16
+ links.each { |ln| expected << ln.id }
17
+ expected }
18
+
19
+ it 'produces the right number of members' do
20
+ expect(links.count).to eql 2
21
+ end
22
+
23
+ it 'has the first link' do
24
+ expect(link1.id).to satisfy { |id| expected.include?(id) }
25
+ end
26
+
27
+ it 'has the second link' do
28
+ expect(link2.id).to satisfy { |id| expected.include?(id) }
29
+ end
30
+ end
31
+
32
+ context 'with strings' do
33
+ it 'produces the right number of members, strings only' do
34
+ links = Occi::Core::Links.new ["target1","target2"]
35
+ expect(links.count).to eql 2
36
+ end
37
+
38
+ it 'populates target in the link' do
39
+ links = Occi::Core::Links.new ["target1"]
40
+ expect(links.first.target).to eql "target1"
41
+ end
42
+
43
+ it 'produces the right number of members, string/link combination' do
44
+ link2 = Occi::Core::Link.new
45
+ links = Occi::Core::Links.new ["target1",link2]
46
+ expect(links.count).to eql 2
47
+ end
48
+ end
49
+
50
+
51
+ end
52
+
53
+ context '<<' do
54
+ context 'into an empty set' do
55
+ let(:link1){ Occi::Core::Link.new }
56
+ let(:links){ links = Occi::Core::Links.new
57
+ links << link1
58
+ links }
59
+
60
+ it 'produces the right number of members' do
61
+ expect(links.count).to eql 1
62
+ end
63
+
64
+ it 'has the link' do
65
+ expect(links.first.id).to eql link1.id
66
+ end
67
+ end
68
+
69
+ context 'into a populated set' do
70
+ let(:link1){ Occi::Core::Link.new }
71
+ let(:link2){ Occi::Core::Link.new }
72
+ let(:links){ links = Occi::Core::Links.new [link2]
73
+ links << link1
74
+ links }
75
+ let(:expected){ expected = []
76
+ links.each { |ln| expected << ln.id }
77
+ expected }
78
+
79
+ it 'produces the right number of members' do
80
+ expect(links.count).to eql 2
81
+ end
82
+
83
+ it 'has the first link' do
84
+ expect(link1.id).to satisfy { |id| expected.include?(id) }
85
+ end
86
+
87
+ it 'has the second link' do
88
+ expect(link2.id).to satisfy { |id| expected.include?(id) }
89
+ end
90
+ end
91
+ end
92
+
93
+ context '.create' do
94
+ context 'in an empty set' do
95
+ let!(:links){ Occi::Core::Links.new }
96
+ let!(:link1){ links.create }
97
+
98
+ it 'produces the right number of members' do
99
+ expect(links.count).to eql 1
100
+ end
101
+
102
+ it 'has the link' do
103
+ expect(links.first.id).to eql link1.id
104
+ end
105
+ end
106
+
107
+ context 'in a populated set' do
108
+ let(:link2){ Occi::Core::Link.new }
109
+ let!(:links){ Occi::Core::Links.new [link2] }
110
+ let!(:link1){ links.create }
111
+ let!(:expected){ expected = []
112
+ links.each { |ln| expected << ln.id }
113
+ expected }
114
+
115
+ it 'produces the right number of members' do
116
+ expect(links.count).to eql 2
117
+ end
118
+
119
+ it 'has the first link' do
120
+ expect(link1.id).to satisfy { |id| expected.include?(id) }
121
+ end
122
+
123
+ it 'has the second link' do
124
+ expect(link2.id).to satisfy { |id| expected.include?(id) }
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,107 @@
1
+ module Occi
2
+ module Core
3
+ describe Mixins do
4
+
5
+ context '#entity=' do
6
+ let(:ent){ Occi::Core::Entity.new }
7
+ let(:mixins){ Occi::Core::Mixins.new }
8
+
9
+ context 'assignment with mixins set empty' do
10
+ let(:mixin){ Occi::Core::Mixin.new }
11
+ it 'assigns entity to an empty mixin' do
12
+ mixins.entity = ent
13
+ expect(mixins.entity).to eql ent
14
+ end
15
+ end
16
+
17
+ context 'converting attributes form members into the assigned entity' do
18
+ let(:mixin){ mixin = Occi::Core::Mixin.new
19
+ mixin.attributes['stringtype'] = { :type => 'string',
20
+ :pattern => '[adefltuv]+',
21
+ :default => 'defaultvalue',
22
+ :mutable => true }
23
+ mixin.attributes['stringtype'] = 'flute'
24
+ mixin }
25
+
26
+ before(:each) {
27
+ mixins << mixin
28
+ mixins.entity = ent }
29
+
30
+ it 'removes assigned values' do
31
+ expect(mixins.entity.attributes['stringtype']).to eql nil
32
+ end
33
+
34
+ it 'preserves attribute properties' do
35
+ expect(mixins.entity.attributes['_stringtype']).to_not eql nil
36
+ end
37
+ end
38
+ end
39
+
40
+ context '<<' do
41
+ let!(:mixins){ Occi::Core::Mixins.new }
42
+
43
+ it 'adds a mixin to an empty set' do
44
+ mixins << Occi::Infrastructure::OsTpl.mixin
45
+ expect(mixins.include?(Occi::Infrastructure::OsTpl.mixin)).to eql true
46
+ end
47
+
48
+ it 'adds a mixin to an empty set' do
49
+ mixins << Occi::Infrastructure::OsTpl.mixin
50
+ mixins << Occi::Infrastructure::ResourceTpl.mixin
51
+ expect(mixins.include?(Occi::Infrastructure::ResourceTpl.mixin)).to eql true
52
+ end
53
+
54
+ it 'only adds the supplied mixin' do
55
+ mixins << Occi::Infrastructure::OsTpl.mixin
56
+ expect(mixins.include?(Occi::Infrastructure::ResourceTpl.mixin)).to eql false
57
+ end
58
+
59
+ it 'adds mixin from string' do
60
+ mixins << "http://schemas.ogf.org/occi/core#testmixin"
61
+ expect(mixins.first.term).to eql "testmixin"
62
+ end
63
+ end
64
+
65
+ context '#remove' do
66
+ let!(:mixins){ Occi::Core::Mixins.new }
67
+
68
+ it 'removes last mixin from the set' do
69
+ mixins << Occi::Infrastructure::OsTpl.mixin
70
+ mixins.remove(Occi::Infrastructure::OsTpl.mixin)
71
+ expect(mixins.include?(Occi::Infrastructure::OsTpl.mixin)).to eql false
72
+ end
73
+
74
+ it 'removes mixin from among multiple members' do
75
+ mixins << Occi::Infrastructure::OsTpl.mixin
76
+ mixins << Occi::Infrastructure::ResourceTpl.mixin
77
+ mixins.remove(Occi::Infrastructure::OsTpl.mixin)
78
+ expect(mixins.include?(Occi::Infrastructure::OsTpl.mixin)).to eql false
79
+ end
80
+
81
+ it 'leaves other unaffected' do
82
+ mixins << Occi::Infrastructure::OsTpl.mixin
83
+ mixins << Occi::Infrastructure::ResourceTpl.mixin
84
+ mixins.remove(Occi::Infrastructure::OsTpl.mixin)
85
+ expect(mixins.include?(Occi::Infrastructure::ResourceTpl.mixin)).to eql true
86
+ end
87
+
88
+ it 'removes attributes from the entity attribute' do
89
+ ent = Occi::Core::Entity.new
90
+ mixin = Occi::Core::Mixin.new
91
+ mixin.attributes['stringtype'] = { :type => 'string', :pattern => '[adefltuv]+', :default => 'defaultvalue', :mutable => true }
92
+ mixin.attributes['stringtype'] = 'flute'
93
+
94
+ mixins << mixin
95
+ mixins.entity = ent
96
+
97
+ mixins.remove(mixin)
98
+
99
+ expect(mixins.entity.attributes['_stringtype']).to eql nil
100
+ end
101
+ end
102
+
103
+ context '#convert' do
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,167 @@
1
+ module Occi
2
+ module Core
3
+ describe Properties do
4
+
5
+ context '#type=' do
6
+ let(:properties){ Occi::Core::Properties.new }
7
+ it 'accepts string' do
8
+ expect{ properties.type = 'string' }.to_not raise_exception
9
+ end
10
+
11
+ it 'accepts number' do
12
+ expect{ properties.type = 'number' }.to_not raise_exception
13
+ end
14
+
15
+ it 'accepts boolean' do
16
+ expect{ properties.type = 'boolean' }.to_not raise_exception
17
+ end
18
+
19
+ it 'rejects another string' do
20
+ expect{ properties.type = 'other' }.to raise_exception Occi::Errors::AttributePropertyTypeError
21
+ end
22
+
23
+ end
24
+
25
+ context '#check_value_for_type' do
26
+ context 'string' do
27
+ let(:properties){ properties = Occi::Core::Properties.new
28
+ properties.type = 'string'
29
+ properties }
30
+
31
+ it 'permits string' do
32
+ expect{ properties.check_value_for_type("string") }.to_not raise_exception
33
+ end
34
+
35
+ it 'rejects nil' do
36
+ expect{ properties.check_value_for_type(nil) }.to raise_exception(Occi::Errors::AttributeTypeError)
37
+ end
38
+
39
+ it 'rejects another class' do
40
+ expect{ properties.check_value_for_type(true) }.to raise_exception(Occi::Errors::AttributeTypeError)
41
+ end
42
+ end
43
+
44
+ context 'number' do
45
+ let(:properties){ properties = Occi::Core::Properties.new
46
+ properties.type = 'number'
47
+ properties }
48
+
49
+ it 'permits number' do
50
+ expect{ properties.check_value_for_type(42) }.to_not raise_exception
51
+ end
52
+
53
+ it 'rejects nil' do
54
+ expect{ properties.check_value_for_type(nil) }.to raise_exception(Occi::Errors::AttributeTypeError)
55
+ end
56
+
57
+ it 'rejects another class' do
58
+ expect{ properties.check_value_for_type("string") }.to raise_exception(Occi::Errors::AttributeTypeError)
59
+ end
60
+ end
61
+
62
+ context 'boolean' do
63
+ let(:properties){ properties = Occi::Core::Properties.new
64
+ properties.type = 'boolean'
65
+ properties }
66
+
67
+ it 'permits true' do
68
+ expect{ properties.check_value_for_type(true) }.to_not raise_exception
69
+ end
70
+
71
+ it 'permits false' do
72
+ expect{ properties.check_value_for_type(false) }.to_not raise_exception
73
+ end
74
+
75
+ it 'rejects nil' do
76
+ expect{ properties.check_value_for_type(nil) }.to raise_exception(Occi::Errors::AttributeTypeError)
77
+ end
78
+
79
+ it 'rejects another class' do
80
+ expect{ properties.check_value_for_type(0) }.to raise_exception(Occi::Errors::AttributeTypeError)
81
+ end
82
+ end
83
+ end
84
+
85
+ context 'rendering' do
86
+ let(:properties) { properties = Occi::Core::Properties.new
87
+ properties.type = "string"
88
+ properties.required = true
89
+ properties.mutable = true
90
+ properties.default = "defaultvalue"
91
+ properties.description = "Required string value"
92
+ properties.pattern = "[adefltuv]+"
93
+ properties }
94
+
95
+ context '#to_hash' do
96
+ it 'makes a correct rendering' do
97
+ expected = Hash.new
98
+ expected["description"] = "Required string value"
99
+ expected["mutable"] = true
100
+ expected["pattern"] = "[adefltuv]+"
101
+ expected["required"] = true
102
+ expected["type"] = "string"
103
+
104
+ expect(properties.to_hash).to eql expected
105
+ end
106
+ end
107
+
108
+ context '#as_json' do
109
+ it 'makes a correct rendering' do
110
+ expected = Hash.new
111
+ expected["description"] = "Required string value"
112
+ expected["mutable"] = true
113
+ expected["pattern"] = "[adefltuv]+"
114
+ expected["required"] = true
115
+ expected["type"] = "string"
116
+
117
+ expect(properties.to_hash).to eql expected
118
+ end
119
+
120
+ it 'makes a correct rendering of empty props' do
121
+ empty = Occi::Core::Properties.new
122
+ expected = Hash.new
123
+ expected["mutable"] = false
124
+ expected["pattern"] = ".*"
125
+ expected["required"] = false
126
+ expected["type"] = "string"
127
+
128
+ expect(empty.to_hash).to eql expected
129
+ end
130
+
131
+ end
132
+
133
+ context '#to_json' do
134
+ it 'makes a correct rendering' do
135
+ expected = '{"type":"string","required":true,"mutable":true,"pattern":"[adefltuv]+","description":"Required string value"}'
136
+ expect(properties.to_json).to eql expected
137
+ end
138
+ end
139
+ end
140
+
141
+ context '#empty?' do
142
+ let(:properties) { properties = Occi::Core::Properties.new
143
+ properties.type = "string"
144
+ properties.required = true
145
+ properties.mutable = true
146
+ properties.default = "defaultvalue"
147
+ properties.description = "Required string value"
148
+ properties.pattern = "[adefltuv]+"
149
+ properties }
150
+
151
+ it 'Returns false for non-empty props' do
152
+ expect(properties.empty?).to be false
153
+ end
154
+
155
+ it 'Returns true for empty props' do
156
+ empty = Occi::Core::Properties.new
157
+ empty.mutable = nil
158
+ empty.pattern = nil
159
+ empty.required = nil
160
+ empty.instance_eval { @type=nil }
161
+
162
+ expect(empty.empty?).to be true
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
@@ -1,18 +1,32 @@
1
1
  module Occi
2
2
  module Core
3
3
  describe Resource do
4
-
5
- it "links another resource succesfully" do
6
- resource = Occi::Core::Resource.new
7
- target = Occi::Core::Resource.new
8
- # create a random ID as the resource must already exist and therefore must have an ID assigned
9
- target.id = UUIDTools::UUID.random_create.to_s
4
+ let(:resource){ resource = Occi::Core::Resource.new
10
5
  resource.link target
11
- resource.links.should have(1).link
12
- resource.links.first.should be_kind_of Occi::Core::Link
13
- resource.links.first.target.should be target
6
+ resource.attributes.occi!.core!.summary = "Resource Summary"
7
+ resource }
8
+ let(:target){ target = Occi::Core::Resource.new }
9
+
10
+ context '#link' do
11
+ it "creates the appropriate No. of links" do
12
+ expect(resource.links).to have(1).link
13
+ end
14
+
15
+ it "has the correct kind" do
16
+ expect(resource.links.first).to be_kind_of Occi::Core::Link
17
+ end
18
+
19
+ it 'sets the right target' do
20
+ expect(resource.links.first.target).to eql target
21
+ end
14
22
  end
15
23
 
24
+ context '#summary' do
25
+ it 'gets the summary attribute corectly' do
26
+ expected = "Resource Summary"
27
+ expect(resource.summary).to eql expected
28
+ end
29
+ end
16
30
  end
17
31
  end
18
32
  end
@@ -0,0 +1,12 @@
1
+ module Occi
2
+ describe Core do
3
+
4
+ context ".kinds" do
5
+ it 'initializes kinds' do
6
+ kinds = Occi::Core.kinds
7
+ expected = Occi::Core::Kinds.new << Occi::Core::Entity.kind << Occi::Core::Link.kind << Occi::Core::Resource.kind
8
+ expect(kinds).to eql expected
9
+ end
10
+ end
11
+ end
12
+ end