gapinc-cobbler 2.0.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.
@@ -0,0 +1,44 @@
1
+ #! /usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../../../spec_helper'
3
+
4
+ class TestDebug
5
+ include Cobbler::Common::Debug
6
+ end
7
+
8
+ describe Cobbler::Common::Debug do
9
+
10
+ it "should provide a way to set and query a debug flag" do
11
+ TestDebug.should respond_to(:debug_enabled)
12
+ TestDebug.should respond_to(:debug_enabled=)
13
+ end
14
+
15
+ it "should provide a way to set and query an output engine" do
16
+ TestDebug.should respond_to(:output)
17
+ TestDebug.should respond_to(:output=)
18
+ end
19
+
20
+ it "should provide a method to print debug messages on class and instance level" do
21
+ TestDebug.should respond_to(:debug)
22
+ TestDebug.new.should respond_to(:debug)
23
+ end
24
+
25
+ it "should not have debugging enabled by default" do
26
+ TestDebug.debug_enabled.should == false
27
+ end
28
+
29
+ it "should not print out a debug message if the debug flag is not set" do
30
+ output = Object.new
31
+ output.expects(:puts).with('foo').never
32
+ TestDebug.output = output
33
+ TestDebug.debug('foo')
34
+ end
35
+
36
+ it "should print out a debug message if the debug flag is set" do
37
+ TestDebug.debug_enabled = true
38
+ output = Object.new
39
+ output.expects(:puts).with('foo').once
40
+ TestDebug.output = output
41
+ TestDebug.debug('foo')
42
+ end
43
+
44
+ end
@@ -0,0 +1,101 @@
1
+ #! /usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../../../spec_helper'
3
+
4
+ class TestFinder
5
+
6
+ def initialize(a,b)
7
+
8
+ end
9
+
10
+ include Cobbler::Common::Debug
11
+ include Cobbler::Connection::Handling
12
+ include Cobbler::Common::Lifecycle
13
+ include Cobbler::Common::Finders
14
+ end
15
+
16
+ describe Cobbler::Common::Finders do
17
+ it "should provide a way to find all" do
18
+ TestFinder.should respond_to(:find)
19
+ end
20
+ it "should provide a way to find one" do
21
+ TestFinder.should respond_to(:find_one)
22
+ end
23
+
24
+ describe "lookup" do
25
+ it "should raise an exception if we don't know how to lookup all" do
26
+ api_methods = Object.new
27
+ api_methods.stubs(:[]).with(:find_all).returns(nil)
28
+ TestFinder.stubs(:api_methods).returns(api_methods)
29
+ lambda{ TestFinder.find_all }.should raise_error(Exception)
30
+ end
31
+
32
+ it "should raise an exception if we don't know how to lookup an item" do
33
+ api_methods = Object.new
34
+ api_methods.stubs(:[]).with(:find_one).returns(nil)
35
+ TestFinder.stubs(:api_methods).returns(api_methods)
36
+ lambda{ TestFinder.find_one('foo') }.should raise_error(Exception)
37
+ end
38
+
39
+ it "should use the :find_one api_method to lookup an item" do
40
+ TestFinder.api_methods[:find_one] = 'find_one'
41
+ connection = Object.new
42
+ TestFinder.expects(:connect).returns(connection)
43
+ TestFinder.stubs(:make_call).with('find_one','foo').returns({})
44
+ item = TestFinder.find_one('foo')
45
+ item.should be_nil
46
+ end
47
+
48
+ it "should return nil if api returns '~'" do
49
+ TestFinder.api_methods[:find_one] = 'find_one'
50
+ connection = Object.new
51
+ TestFinder.expects(:connect).returns(connection)
52
+ TestFinder.stubs(:make_call).with('find_one','foo').returns('~')
53
+ item = TestFinder.find_one('foo')
54
+ item.should be_nil
55
+ end
56
+
57
+ describe "is unsuccessful" do
58
+ it "should return an empty array if nothing is found" do
59
+ TestFinder.stubs(:in_transaction).returns([])
60
+ TestFinder.find.should be_empty
61
+ end
62
+ it "should return nil if nothing is found" do
63
+ TestFinder.stubs(:in_transaction).returns({})
64
+ TestFinder.find_one('foo').should be_nil
65
+ end
66
+ end
67
+
68
+ describe "successfully all items" do
69
+ before(:each) do
70
+ TestFinder.stubs(:in_transaction).returns([1,2])
71
+ end
72
+ it "should return an array of Objects of itself if something is found" do
73
+ items = TestFinder.find
74
+ items.should have(2).items
75
+ items.first.should be_a(TestFinder)
76
+ items.last.should be_a(TestFinder)
77
+ end
78
+
79
+ it "should pass each found item to the passed block but return the found items" do
80
+ items = TestFinder.find do |item|
81
+ item.should be_a(TestFinder)
82
+ end
83
+ items.should have(2).items
84
+ items.first.should be_a(TestFinder)
85
+ items.last.should be_a(TestFinder)
86
+ end
87
+ end
88
+
89
+ describe "successfully one item" do
90
+ it "should return an item" do
91
+ TestFinder.stubs(:in_transaction).returns({:a => 1})
92
+ TestFinder.find_one('foo').should be_a(TestFinder)
93
+ end
94
+
95
+ it "should return nil if nothing is found" do
96
+ TestFinder.stubs(:in_transaction).returns({})
97
+ TestFinder.find_one('foo').should be_nil
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,192 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ class TestLifecycle
4
+
5
+ def initialize(a=nil,b=nil)
6
+ @definitions = Hash.new(a)
7
+ end
8
+
9
+ include Cobbler::Common::Debug
10
+ include Cobbler::Connection::Handling
11
+ include Cobbler::Common::Lifecycle
12
+
13
+ cobbler_field :name
14
+ cobbler_field :foo, :locked => true
15
+ cobbler_field :findme, :findable => 'find_me'
16
+ cobbler_field :super_field, :locked => true, :findable => 'find_super'
17
+
18
+ cobbler_fields :foo1, :foo2
19
+
20
+ cobbler_collection :coll1
21
+ cobbler_collection :coll2, :packing => Hash
22
+ cobbler_collection :coll3, :store => :foobar
23
+ end
24
+
25
+ class TestLifecycle2
26
+ def initialize(a,b); end
27
+ include Cobbler::Common::Debug
28
+ include Cobbler::Connection::Handling
29
+ include Cobbler::Common::Lifecycle
30
+ cobbler_field :name, :locked => false, :findable => false
31
+ cobbler_lifecycle :find_all => 'foobar', :find_one => false
32
+ end
33
+
34
+ describe Cobbler::Common::Lifecycle do
35
+
36
+ it "should provide a bunch of api_methods for that object" do
37
+ TestLifecycle.api_methods.keys.should_not be_empty
38
+ end
39
+
40
+ [ :find_all, :find_one, :handle, :remove, :save, :new, :modify].each do |method|
41
+ it "should provide an api_method for #{method} and be derived from the classname" do
42
+ TestLifecycle.api_methods[method].should_not be_nil
43
+ TestLifecycle.api_methods[method].should =~ /test_lifecycle/
44
+ end
45
+ end
46
+
47
+ describe "defining lifecycle" do
48
+ it "should provide a way to define a lifecycle" do
49
+ TestLifecycle.should respond_to(:cobbler_lifecycle)
50
+ end
51
+
52
+ it "should set the api_method according to the one we defined" do
53
+ TestLifecycle2.api_methods[:find_all].should == 'foobar'
54
+ TestLifecycle2.api_methods[:find_one].should be_false
55
+ end
56
+
57
+ [ :handle, :remove, :save, :new, :modify].each do |method|
58
+ it "should define method #{method}" do
59
+ TestLifecycle2.api_methods[method].should_not be_nil
60
+ TestLifecycle2.api_methods[method].should =~ /test_lifecycle/
61
+ end
62
+
63
+ end
64
+ end
65
+
66
+ describe "define a cobbler field" do
67
+ it "should provide a way to define a cobbler field" do
68
+ TestLifecycle.should respond_to(:cobbler_field)
69
+ end
70
+
71
+ it "should provide a way to define multiple cobbler fields" do
72
+ TestLifecycle.should respond_to(:cobbler_fields)
73
+ end
74
+
75
+ it "should add this field to the record fields" do
76
+ TestLifecycle.cobbler_record_fields.should include(:name)
77
+ end
78
+
79
+ it "should add the name field as findable" do
80
+ TestLifecycle.should respond_to(:find_by_name)
81
+ end
82
+
83
+ it "should lock the name field" do
84
+ TestLifecycle.locked_fields.should include(:name)
85
+ end
86
+
87
+ it "should not add the name field as findable if we mark it" do
88
+ TestLifecycle2.should_not respond_to(:find_by_name)
89
+ end
90
+
91
+ it "should lock the name field" do
92
+ TestLifecycle2.locked_fields.should_not include(:name)
93
+ end
94
+
95
+ it "should be available as getter and setter on an instance" do
96
+ test = TestLifecycle.new
97
+ test.should respond_to(:name)
98
+ test.should respond_to(:name=)
99
+ end
100
+
101
+ it "should handle cobbler_fields over to cobbler_field" do
102
+ test = TestLifecycle.new
103
+ [:foo1,:foo2].each do |field|
104
+ test.should respond_to(field)
105
+ test.should respond_to(:"#{field}=")
106
+ TestLifecycle.cobbler_record_fields.should include(field)
107
+ end
108
+ end
109
+
110
+ it "should be possible to mark that field as locked" do
111
+ TestLifecycle.locked_fields.should include(:foo)
112
+ TestLifecycle.locked_fields.should include(:super_field)
113
+ end
114
+
115
+ it "should be possible to mark a field as findable" do
116
+ TestLifecycle.should respond_to(:find_by_findme)
117
+ TestLifecycle.should respond_to(:find_by_super_field)
118
+ end
119
+
120
+ describe "which is findable" do
121
+ before(:each) do
122
+ connection = Object.new
123
+ TestLifecycle.expects(:connect).returns(connection)
124
+ end
125
+
126
+ it "should lookup that field" do
127
+ TestLifecycle.expects(:make_call).with('get_test_lifecycle','foo').returns('a')
128
+ item = TestLifecycle.find_by_name('foo')
129
+ item.should be_a(TestLifecycle)
130
+ end
131
+ it "should lookup the field with the appropriate api method" do
132
+ TestLifecycle.expects(:make_call).with('find_super','foo').returns('a')
133
+ item = TestLifecycle.find_by_super_field('foo')
134
+ item.should be_a(TestLifecycle)
135
+ end
136
+
137
+ it "should return nil if nothing is found" do
138
+ TestLifecycle.expects(:make_call).with('get_test_lifecycle','foo').returns(nil)
139
+ TestLifecycle.find_by_name('foo').should be_nil
140
+ end
141
+ end
142
+ end
143
+ describe "define a cobbler collection" do
144
+ it "should provide a way to define a cobbler collection" do
145
+ TestLifecycle.should respond_to(:cobbler_collection)
146
+ end
147
+
148
+ it "should provide accessor and setter for a collection" do
149
+ TestLifecycle.new.should respond_to(:coll1)
150
+ TestLifecycle.new.should respond_to(:coll1=)
151
+ end
152
+
153
+ it "should add the collection to the fields" do
154
+ TestLifecycle.cobbler_record_fields.should include(:coll1)
155
+ TestLifecycle.cobbler_record_fields.should include(:coll2)
156
+ end
157
+
158
+ it "should set a default type to be an array" do
159
+ TestLifecycle.new.coll1.should be_a(Array)
160
+ end
161
+
162
+ it "should be possible to set packing as Hash" do
163
+ TestLifecycle.new.coll2.should be_a(Hash)
164
+ end
165
+
166
+ it "should be possible to define a special store callback" do
167
+ TestLifecycle.cobbler_record_fields.should_not include(:coll3)
168
+ TestLifecycle.cobbler_collections_store_callbacks.should include(:foobar)
169
+ end
170
+ end
171
+
172
+ describe "assigning new values" do
173
+ it "should not be added to the original definitions" do
174
+ test = TestLifecycle.new
175
+ test.name = 'foo'
176
+ test.name.should == 'foo'
177
+ test.definitions['name'].should_not == 'foo'
178
+ test.user_definitions['name'].should == 'foo'
179
+ end
180
+
181
+ it "should always be added to the user_definitions if it as collection" do
182
+ test = TestLifecycle.new
183
+ test.coll1.should == []
184
+ test.coll1 = [1,2]
185
+ test.coll1.should == [1,2]
186
+ test.user_definitions['coll1'].should == [1,2]
187
+ test.coll1 << 3
188
+ test.coll1 == [1,2,3]
189
+ end
190
+ end
191
+
192
+ end
@@ -0,0 +1,59 @@
1
+ #! /usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../../../spec_helper'
3
+
4
+ class TestConnection
5
+ include Cobbler::Common::Debug
6
+ include Cobbler::Connection::Handling
7
+ include Cobbler::Connection::Common
8
+ end
9
+
10
+ describe Cobbler::Connection::Common do
11
+ it "should provide a method to test a connection" do
12
+ TestConnection.should respond_to(:test_connection)
13
+ end
14
+
15
+ it "should provide a method to start a sync" do
16
+ TestConnection.should respond_to(:sync)
17
+ end
18
+
19
+ describe "testing a connection" do
20
+
21
+ before(:each) do
22
+ connection = Object.new
23
+ TestConnection.expects(:connect).returns(connection)
24
+ end
25
+
26
+ it "should return false if login fails" do
27
+ TestConnection.expects(:login).returns(nil)
28
+ TestConnection.test_connection.should be_false
29
+ end
30
+ it "should return true if login succeeds and logout" do
31
+ TestConnection.expects(:login).returns("true")
32
+ TestConnection.expects(:logout)
33
+ TestConnection.test_connection.should be_true
34
+ end
35
+ end
36
+
37
+ with_real_cobbler(TestConnection) do |cobbler_yml|
38
+ describe "testing a real connection" do
39
+ before(:each) do
40
+ TestConnection.hostname = yml['hostname']
41
+ TestConnection.username = yml['username']
42
+ TestConnection.password = yml['password']
43
+ end
44
+
45
+ it "should "
46
+ end
47
+ end
48
+
49
+ describe "syncing a cobbler" do
50
+ it "should send the sync command" do
51
+ connection =
52
+ TestConnection.expects(:connect).returns(Object.new)
53
+ TestConnection.expects(:login).returns('foobar')
54
+ TestConnection.expects(:logout)
55
+ TestConnection.expects(:make_call).with('sync','foobar')
56
+ TestConnection.sync
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,119 @@
1
+ #! /usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../../../spec_helper'
3
+
4
+ class TestConnection
5
+ include Cobbler::Common::Debug
6
+ include Cobbler::Connection::Handling
7
+ end
8
+
9
+ describe Cobbler::Connection::Handling do
10
+ [:hostname, :username, :password].each do |field|
11
+ it "should provide getters and setters for #{field}" do
12
+ TestConnection.should respond_to(field)
13
+ TestConnection.should respond_to("#{field}=".to_sym)
14
+ end
15
+ end
16
+
17
+ it "should provide a way to query the version of the cobbler server" do
18
+ TestConnection.should respond_to(:remote_version)
19
+ end
20
+
21
+ describe "querying remote version" do
22
+ before(:each) do
23
+ connection = Object.new
24
+ TestConnection.expects(:connect).returns(connection)
25
+ TestConnection.expects(:connection).returns(nil)
26
+ end
27
+
28
+ it "should return the version" do
29
+ TestConnection.expects(:make_call).with('version').returns("2.0")
30
+ TestConnection.remote_version.should == "2.0"
31
+ end
32
+ end
33
+
34
+ it "should provide a way to login to the cobbler server" do
35
+ TestConnection.should respond_to(:login)
36
+ end
37
+
38
+ describe "logging into cobbler server" do
39
+
40
+ it "should call the login server" do
41
+ TestConnection.username = 'foobar'
42
+ TestConnection.password = 'password'
43
+ TestConnection.expects(:make_call).with('login','foobar','password')
44
+ TestConnection.login
45
+ end
46
+
47
+ it "should not relogin if we are still logged in" do
48
+ TestConnection.username = 'foobar'
49
+ TestConnection.password = 'password'
50
+ TestConnection.expects(:make_call).with('login','foobar','password').returns("token")
51
+ TestConnection.login
52
+
53
+ TestConnection.username = 'foobar2'
54
+ TestConnection.password = 'password2'
55
+ TestConnection.expects(:make_call).with('login','foobar2','password2').never
56
+ TestConnection.login
57
+ end
58
+ end
59
+ it "should provide a way to connect to the cobbler server" do
60
+ TestConnection.should respond_to(:connect)
61
+ end
62
+
63
+ it "should connect to the cobbler server" do
64
+ TestConnection.hostname = 'localhost'
65
+ @connection = Object.new
66
+ XMLRPC::Client.expects(:new2).with('http://localhost/cobbler_api').returns(@connection)
67
+ TestConnection.send(:connect)
68
+ end
69
+
70
+ describe "making a call" do
71
+ it "should raise an exception if no connection have been established so far" do
72
+ TestConnection.expects(:connection).returns(nil)
73
+ lambda { TestConnection.make_call('foobar') }.should raise_error(Exception)
74
+ end
75
+
76
+ it "should pass all arguments to the connection and return the resul" do
77
+ connection = Object.new
78
+ connection.expects(:call).with('foo','bar').returns('juhu')
79
+ TestConnection.expects(:connection).twice.returns(connection)
80
+ TestConnection.make_call('foo','bar')
81
+ end
82
+ end
83
+
84
+ describe "handling transactions" do
85
+ it "should initialze and end a connection" do
86
+ TestConnection.expects(:begin_transaction)
87
+ TestConnection.expects(:end_transaction)
88
+ TestConnection.send(:in_transaction) do
89
+ #
90
+ end
91
+ end
92
+
93
+ it "should cleanup the connection" do
94
+ TestConnection.expects(:connect).returns('foobar')
95
+ TestConnection.in_transaction do
96
+ #
97
+ end
98
+ TestConnection.send(:connection).should be_nil
99
+ end
100
+
101
+ it "should login if you want a login and pass the token into the transaction and logout" do
102
+ connection = Object.new
103
+ TestConnection.expects(:login).returns('token')
104
+ TestConnection.expects(:logout)
105
+ TestConnection.expects(:connect).returns('foobar')
106
+ TestConnection.in_transaction(true) do |token|
107
+ token.should == 'token'
108
+ end
109
+ end
110
+
111
+ it "should ensure that the connection is cleaned up" do
112
+ TestConnection.expects(:connect).returns('foobar')
113
+ lambda { TestConnection.in_transaction do
114
+ raise "foobar"
115
+ end }.should raise_error(Exception)
116
+ TestConnection.send(:connection).should be_nil
117
+ end
118
+ end
119
+ end