lumberg 0.9.5

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 (84) hide show
  1. data/.gitignore +9 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +98 -0
  6. data/LICENSE +20 -0
  7. data/README.md +178 -0
  8. data/Rakefile +49 -0
  9. data/lib/cacert.pem +3910 -0
  10. data/lib/lumberg.rb +23 -0
  11. data/lib/lumberg/exceptions.rb +6 -0
  12. data/lib/lumberg/version.rb +3 -0
  13. data/lib/lumberg/whm.rb +70 -0
  14. data/lib/lumberg/whm/account.rb +329 -0
  15. data/lib/lumberg/whm/args.rb +113 -0
  16. data/lib/lumberg/whm/base.rb +28 -0
  17. data/lib/lumberg/whm/dns.rb +205 -0
  18. data/lib/lumberg/whm/reseller.rb +268 -0
  19. data/lib/lumberg/whm/server.rb +290 -0
  20. data/lib/net_http_hacked.rb +42 -0
  21. data/lumberg.gemspec +28 -0
  22. data/spec/lumberg_spec.rb +9 -0
  23. data/spec/spec_helper.rb +33 -0
  24. data/spec/vcr_cassettes/whm/account/accountsummary.yml +43 -0
  25. data/spec/vcr_cassettes/whm/account/changepackage.yml +64 -0
  26. data/spec/vcr_cassettes/whm/account/createacct.yml +43 -0
  27. data/spec/vcr_cassettes/whm/account/domainuserdata.yml +43 -0
  28. data/spec/vcr_cassettes/whm/account/editquota.yml +85 -0
  29. data/spec/vcr_cassettes/whm/account/limitbw.yml +85 -0
  30. data/spec/vcr_cassettes/whm/account/listaccts.yml +147 -0
  31. data/spec/vcr_cassettes/whm/account/listsuspended.yml +43 -0
  32. data/spec/vcr_cassettes/whm/account/modifyacct.yml +63 -0
  33. data/spec/vcr_cassettes/whm/account/myprivs.yml +43 -0
  34. data/spec/vcr_cassettes/whm/account/passwd.yml +43 -0
  35. data/spec/vcr_cassettes/whm/account/removeacct.yml +85 -0
  36. data/spec/vcr_cassettes/whm/account/restoreaccount.yml +198 -0
  37. data/spec/vcr_cassettes/whm/account/setsiteip.yml +190 -0
  38. data/spec/vcr_cassettes/whm/account/suspend.yml +64 -0
  39. data/spec/vcr_cassettes/whm/account/unsuspend.yml +43 -0
  40. data/spec/vcr_cassettes/whm/dns/adddns.yml +64 -0
  41. data/spec/vcr_cassettes/whm/dns/addzonerecord.yml +43 -0
  42. data/spec/vcr_cassettes/whm/dns/dumpzone.yml +43 -0
  43. data/spec/vcr_cassettes/whm/dns/editzonerecord.yml +64 -0
  44. data/spec/vcr_cassettes/whm/dns/getzonerecord.yml +64 -0
  45. data/spec/vcr_cassettes/whm/dns/killdns.yml +43 -0
  46. data/spec/vcr_cassettes/whm/dns/listmxs.yml +22 -0
  47. data/spec/vcr_cassettes/whm/dns/listzones.yml +22 -0
  48. data/spec/vcr_cassettes/whm/dns/lookupnsip.yml +43 -0
  49. data/spec/vcr_cassettes/whm/dns/removezonerecord.yml +64 -0
  50. data/spec/vcr_cassettes/whm/dns/resetzone.yml +43 -0
  51. data/spec/vcr_cassettes/whm/dns/resolvedomainname.yml +43 -0
  52. data/spec/vcr_cassettes/whm/dns/savemxs.yml +22 -0
  53. data/spec/vcr_cassettes/whm/reseller/acctcounts.yml +43 -0
  54. data/spec/vcr_cassettes/whm/reseller/listacls.yml +22 -0
  55. data/spec/vcr_cassettes/whm/reseller/listresellers.yml +22 -0
  56. data/spec/vcr_cassettes/whm/reseller/resellerstats.yml +43 -0
  57. data/spec/vcr_cassettes/whm/reseller/saveacllist.yml +85 -0
  58. data/spec/vcr_cassettes/whm/reseller/setacls.yml +43 -0
  59. data/spec/vcr_cassettes/whm/reseller/setresellerips.yml +42 -0
  60. data/spec/vcr_cassettes/whm/reseller/setresellerlimits.yml +43 -0
  61. data/spec/vcr_cassettes/whm/reseller/setresellermainip.yml +64 -0
  62. data/spec/vcr_cassettes/whm/reseller/setresellernameservers.yml +64 -0
  63. data/spec/vcr_cassettes/whm/reseller/setresellerpackagelimit.yml +64 -0
  64. data/spec/vcr_cassettes/whm/reseller/setupreseller.yml +43 -0
  65. data/spec/vcr_cassettes/whm/reseller/suspendreseller.yml +64 -0
  66. data/spec/vcr_cassettes/whm/reseller/terminatereseller.yml +64 -0
  67. data/spec/vcr_cassettes/whm/reseller/unsetupreseller.yml +43 -0
  68. data/spec/vcr_cassettes/whm/reseller/unsuspendreseller.yml +43 -0
  69. data/spec/vcr_cassettes/whm/server/applist.yml +22 -0
  70. data/spec/vcr_cassettes/whm/server/gethostname.yml +22 -0
  71. data/spec/vcr_cassettes/whm/server/getlanglist.yml +22 -0
  72. data/spec/vcr_cassettes/whm/server/loadavg.yml +28 -0
  73. data/spec/vcr_cassettes/whm/server/my_function.yml +64 -0
  74. data/spec/vcr_cassettes/whm/server/response_type.yml +85 -0
  75. data/spec/vcr_cassettes/whm/server/systemloadavg.yml +43 -0
  76. data/spec/vcr_cassettes/whm/server/version.yml +22 -0
  77. data/spec/whm/account_spec.rb +577 -0
  78. data/spec/whm/args_spec.rb +179 -0
  79. data/spec/whm/base_spec.rb +28 -0
  80. data/spec/whm/dns_spec.rb +352 -0
  81. data/spec/whm/reseller_spec.rb +359 -0
  82. data/spec/whm/server_spec.rb +288 -0
  83. data/spec/whm/whm_spec.rb +41 -0
  84. metadata +265 -0
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+ require 'lumberg/whm/args'
3
+
4
+ module Lumberg
5
+ describe Whm::Args do
6
+ context "required_parms" do
7
+ it "raises an error when missing" do
8
+ options = {:arg1 => true}
9
+ args = lambda {
10
+ Whm::Args.new(options) do |c|
11
+ c.requires :arg2
12
+ end
13
+ }
14
+ expect { args.call }.to raise_error(WhmArgumentError, /Missing required parameter: arg2/)
15
+ end
16
+
17
+ it "does not raise an error with valid params" do
18
+ options = {:arg1 => true}
19
+ args = Whm::Args.new(options) { |c|
20
+ c.requires :arg1
21
+ }
22
+
23
+ args.required_params.should have(1).value
24
+ args.required_params.should include(:arg1)
25
+ end
26
+
27
+ it "sets optional_params" do
28
+ options = {:arg1 => true, :arg2 => 2}
29
+ args = Whm::Args.new(options) { |c|
30
+ c.requires :arg1, :arg2
31
+ }
32
+
33
+ args.optional_params.should have(2).values
34
+ args.required_params.should have(2).values
35
+
36
+ args.optional_params.should include(*args.required_params)
37
+ end
38
+
39
+ it "does not set boolean_params" do
40
+ options = {:arg1 => true, :arg2 => 2}
41
+ args = Whm::Args.new(options) { |c|
42
+ c.requires :arg1, :arg2
43
+ }
44
+
45
+ args.boolean_params.should be_empty
46
+ end
47
+ end
48
+
49
+ context "boolean_params" do
50
+ it "raises an error when the param is not boolean" do
51
+ options = {:arg1 => 'string'}
52
+ args = lambda {
53
+ Whm::Args.new(options) do |c|
54
+ c.booleans :arg1
55
+ end
56
+ }
57
+ expect { args.call }.to raise_error(WhmArgumentError, /Boolean parameter must be.*: arg1/)
58
+ end
59
+
60
+ it "raises an error with boolean params" do
61
+ options = {:arg1 => true}
62
+ args = Whm::Args.new(options) { |c|
63
+ c.booleans :arg1
64
+ }
65
+
66
+ args.boolean_params.should have(1).value
67
+ args.boolean_params.should include(:arg1)
68
+ end
69
+
70
+ it "sets optional_params" do
71
+ options = {:arg1 => true, :arg2 => false}
72
+ args = Whm::Args.new(options) { |c|
73
+ c.booleans :arg1, :arg2
74
+ }
75
+
76
+ args.optional_params.should have(2).values
77
+ args.boolean_params.should have(2).values
78
+
79
+ args.optional_params.should include(:arg1, :arg2)
80
+ end
81
+
82
+ it "sets required_params" do
83
+ options = {:arg1 => true, :arg2 => false}
84
+ args = Whm::Args.new(options) { |c|
85
+ c.booleans :arg1, :arg2
86
+ }
87
+
88
+ args.required_params.should be_empty
89
+ end
90
+ end
91
+
92
+ context "optional_params" do
93
+ it "raises an error with unknown params" do
94
+ options = {:arg1 => true}
95
+ args = lambda {
96
+ Whm::Args.new(options) do |c|
97
+ c.optionals :arg2
98
+ end
99
+ }
100
+
101
+ expect { args.call }.to raise_error(WhmArgumentError, /Not a valid parameter: arg1/)
102
+ end
103
+
104
+ it "does not raise an error with known params" do
105
+ options = {:arg1 => true, :arg2 => 2}
106
+ args = Whm::Args.new(options) { |c|
107
+ c.optionals :arg1, :arg2
108
+ }
109
+
110
+ args.optional_params.should have(2).values
111
+ args.optional_params.should include(:arg1, :arg2)
112
+ end
113
+
114
+ it "does not set required_params" do
115
+ options = {:arg1 => true, :arg2 => 2}
116
+ args = Whm::Args.new(options) { |c|
117
+ c.optionals :arg1, :arg2
118
+ }
119
+
120
+ args.required_params.should be_empty
121
+ end
122
+
123
+ it "does not set boolean_params" do
124
+ options = {:arg1 => true, :arg2 => 2}
125
+ args = Whm::Args.new(options) { |c|
126
+ c.optionals :arg1, :arg2
127
+ }
128
+
129
+ args.boolean_params.should be_empty
130
+ end
131
+ end
132
+
133
+ context "one_of" do
134
+ it "allows one arg" do
135
+ options = {:arg1 => true}
136
+ args = lambda {
137
+ Whm::Args.new(options) do |c|
138
+ c.one_of :arg1
139
+ end
140
+ }
141
+
142
+ expect { args.call }.to raise_error(WhmArgumentError, /One of requires two or more items/)
143
+ end
144
+
145
+ it "allows two or more args" do
146
+ options = {:arg1 => true}
147
+
148
+ args = Whm::Args.new(options) do |c|
149
+ c.one_of :arg1, :arg2
150
+ end
151
+
152
+ args.one_of_params.should have(2).values
153
+ args.one_of_params.should include(:arg1, :arg2)
154
+ end
155
+
156
+ it "does not allow 0 params" do
157
+ options = {}
158
+ args = lambda {
159
+ Whm::Args.new(options) do |c|
160
+ c.one_of :arg1, :arg2
161
+ end
162
+ }
163
+
164
+ expect { args.call }.to raise_error(WhmArgumentError, /The parameters may include only one of 'arg1, arg2'/)
165
+ end
166
+
167
+ it "does not allow both args" do
168
+ options = {:arg1 => true, :arg2 => 2}
169
+ args = lambda {
170
+ Whm::Args.new(options) do |c|
171
+ c.one_of :arg1, :arg2
172
+ end
173
+ }
174
+
175
+ expect { args.call }.to raise_error(WhmArgumentError, /The parameters may include only one of 'arg1, arg2'/)
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'lumberg/whm'
3
+
4
+ module Lumberg
5
+ describe Whm::Base do
6
+ before(:each) do
7
+ @login = { :host => @whm_host, :hash => @whm_hash }
8
+ @server = Whm::Server.new(@login.dup)
9
+ @base = Whm::Base.new(:server => @server)
10
+ end
11
+
12
+ describe "#initialize" do
13
+ it "creates a new instance of server" do
14
+ expect { Whm::Base.new }.to raise_error(WhmArgumentError, /Missing required param/)
15
+ end
16
+
17
+ it "allows a server instance to be passed in" do
18
+ @base.server.should be_a(Whm::Server)
19
+ end
20
+
21
+ it "allows a server hash to be passed in" do
22
+ base = Whm::Base.new(:server => @login)
23
+ base.server.should be_a(Whm::Server)
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,352 @@
1
+ require 'spec_helper'
2
+ require 'lumberg/whm'
3
+
4
+ module Lumberg
5
+ describe Whm::Dns do
6
+ before(:each) do
7
+ @login = { :host => @whm_host, :hash => @whm_hash }
8
+ @server = Whm::Server.new(@login.dup)
9
+ @dns = Whm::Dns.new(:server => @server.dup)
10
+ end
11
+
12
+ describe "#addzone" do
13
+ it "requires a domain" do
14
+ @dns.stub(:perform_request)
15
+ requires_attr('domain') { @dns.add_zone }
16
+ end
17
+
18
+ it "requires an ip" do
19
+ requires_attr('ip') { @dns.add_zone(:domain => 'example.com') }
20
+ end
21
+
22
+ it "allows template" do
23
+ @dns.server.stub(:perform_request)
24
+ @dns.add_zone(:domain => 'example.com', :ip => '127.0.0.1', :template => 'something')
25
+ end
26
+
27
+ it "allows trueowner" do
28
+ @dns.server.stub(:perform_request)
29
+ @dns.add_zone(:domain => 'example.com', :ip => '127.0.0.1', :trueowner => 'something')
30
+ end
31
+
32
+ use_vcr_cassette "whm/dns/adddns"
33
+
34
+ it "creates a zone" do
35
+ result = @dns.add_zone(:domain => 'example.com', :ip => '192.1.2.3')
36
+ result[:success].should be_true
37
+ result[:message].should match(/added example\.com .*user root.*/i)
38
+ end
39
+
40
+ it "creates a zone under a user" do
41
+ result = @dns.add_zone(:domain => 'example.com', :ip => '192.1.2.3', :trueowner => 'something')
42
+ result[:success].should be_true
43
+ result[:message].should match(/added example\.com .*user something.*/i)
44
+ end
45
+ end
46
+
47
+ describe "#addzonerecord" do
48
+ it "requires a zone" do
49
+ requires_attr('zone') { @dns.add_zone_record }
50
+ end
51
+
52
+ use_vcr_cassette "whm/dns/addzonerecord"
53
+
54
+ it "adds a zone record" do
55
+ result = @dns.add_zone_record(:zone => 'example.com',
56
+ :name => 'example.com.',
57
+ :address => '192.1.2.3',
58
+ :type => 'A')
59
+ result[:success].should be_true
60
+ result[:message].should match(/Bind reloading on .*example.com/i)
61
+ end
62
+
63
+ it "adds a zone record reverse" do
64
+ result = @dns.add_zone_record(:zone => 'example.com',
65
+ :name => '1',
66
+ :ptdrname => 'example.com',
67
+ :type => 'PTR')
68
+ result[:success].should be_true
69
+ result[:message].should match(/Bind reloading on .*example.com/i)
70
+ end
71
+ end
72
+
73
+ describe "#listzones" do
74
+ use_vcr_cassette "whm/dns/listzones"
75
+
76
+ it "lists all the zones" do
77
+ result = @dns.list_zones
78
+ params = result[:params]
79
+ params.size.should == 2
80
+ params[0][:zonefile].should == "thisisathrowawayagain22.com.db"
81
+ params[0][:domain].should == "thisisathrowawayagain22.com"
82
+ end
83
+ end
84
+
85
+ describe "#getzonerecord" do
86
+ use_vcr_cassette "whm/dns/getzonerecord"
87
+
88
+ it "requires a domain" do
89
+ requires_attr('domain') { @dns.get_zone_record(:Line => 1) }
90
+ end
91
+
92
+ it "requires a Line" do
93
+ requires_attr('Line') { @dns.get_zone_record(:domain => "example.com") }
94
+ end
95
+
96
+ it "returns the zone" do
97
+ result = @dns.get_zone_record(:domain => "example.com", :Line => 1)
98
+ result[:success].should be_true
99
+ result[:message].should match(/Record obtained/i)
100
+ result[:params][:record][:Line].should == 1
101
+ result[:params][:record][:raw].should == "; cPanel 11.25.0-STABLE_44718"
102
+ end
103
+
104
+ it "returns an error when the domain was not found" do
105
+ result = @dns.get_zone_record(:domain => "notexists.com", :Line => 1)
106
+ result[:success].should_not be_true
107
+ result[:message].should match(/Zone does not exist/i)
108
+ end
109
+
110
+ it "returns an error for a line with no data" do
111
+ result = @dns.get_zone_record(:domain => "example.com", :Line => 20)
112
+ result[:success].should be_false
113
+ result[:message].should match(/No record available on selected line/i)
114
+ end
115
+ end
116
+
117
+ describe "#dumpzone" do
118
+ use_vcr_cassette "whm/dns/dumpzone"
119
+
120
+ it "requires a domain" do
121
+ requires_attr('domain') { @dns.dump_zone }
122
+ end
123
+
124
+ it "dumps the zone" do
125
+ result = @dns.dump_zone(:domain => "example.com")
126
+ result[:success].should be_true
127
+ result[:message].should match(/Zone Serialized/i)
128
+ result[:params][:record][0][:raw].should match(/; cPanel first:11\.25\.0-STABLE_44718 latest:11\.28\.64-STABLE_51024 Cpanel::ZoneFile::VERSION:1\.3 mtime:1299509628/i)
129
+ result[:params][:record][20][:ttl].should == "14400"
130
+ end
131
+
132
+ it "returns an error when the domain is not found" do
133
+ result = @dns.dump_zone(:domain => "notexists.com")
134
+ result[:success].should be_false
135
+ result[:message].should match(/Zone does not exist/i)
136
+ end
137
+ end
138
+
139
+ describe "#resolvedomainname" do
140
+ use_vcr_cassette "whm/dns/resolvedomainname"
141
+
142
+ it "requires a domain" do
143
+ requires_attr('domain') { @dns.resolve_domain("api.version".to_sym => 1) }
144
+ end
145
+
146
+ it "requires the api version" do
147
+ requires_attr('api.version') { @dns.resolve_domain(:domain => "example.com") }
148
+ end
149
+
150
+ it "returns the ip address of the domain" do
151
+ result = @dns.resolve_domain(:domain => "example.com", "api.version".to_sym => 1)
152
+ result[:params][:ip].should == "192.1.2.3"
153
+ end
154
+
155
+ it "returns an error when the ip address cannot be determined" do
156
+ result = @dns.resolve_domain(:domain => "notexists.com", "api.version".to_sym => 1)
157
+ result[:params][:ip].should be_nil
158
+ result[:message].should match(/Unable to resolve domain name/i)
159
+ end
160
+ end
161
+
162
+ describe "#editzonerecord" do
163
+ use_vcr_cassette "whm/dns/editzonerecord"
164
+
165
+ it "requires a domain" do
166
+ requires_attr('domain') { @dns.edit_zone_record(:Line => 1) }
167
+ end
168
+
169
+ it "requires a Line" do
170
+ requires_attr('Line') { @dns.edit_zone_record(:domain => "example.com") }
171
+ end
172
+
173
+ it "updates the zone record" do
174
+ result = @dns.edit_zone_record(:domain => "example.com", :Line => 1, :ttl => "86400")
175
+ result[:success].should be_true
176
+ result[:message].should match(/Bind reloading on .* using rndc zone.*example.com/i)
177
+ end
178
+
179
+ it "returns an error for an unknown domain or invalid Line" do
180
+ result = @dns.edit_zone_record(:domain => "notexists.com", :Line => 1, :ttl => "86400")
181
+ result[:success].should be_false
182
+ result[:message].should match(/Failed to serialize record/i)
183
+ end
184
+
185
+ it "returns an error for an invalid Line" do
186
+ result = @dns.edit_zone_record(:domain => "example.com", :Line => 200, :ttl => "86400")
187
+ result[:success].should be_false
188
+ result[:message].should match(/Failed to serialize record/i)
189
+ end
190
+ end
191
+
192
+ describe "#killdns" do
193
+ use_vcr_cassette "whm/dns/killdns"
194
+
195
+ it "requires a domain" do
196
+ requires_attr('domain') { @dns.kill_dns }
197
+ end
198
+
199
+ it "kills the dns" do
200
+ result = @dns.kill_dns(:domain => "example.com")
201
+ result[:success].should be_true
202
+ result[:message].should match(/Zones Removed/i)
203
+ end
204
+
205
+ it "returns an error when the domain does not exist" do
206
+ result = @dns.kill_dns(:domain => "notexists.com")
207
+ result[:success].should be_false
208
+ result[:message].should match(/Unable to remove zone that does not exist/i)
209
+ end
210
+ end
211
+
212
+ describe "#lookupnsip" do
213
+ use_vcr_cassette "whm/dns/lookupnsip"
214
+
215
+ it "requires a nameserver" do
216
+ requires_attr('nameserver') { @dns.lookup_nameserver_ip }
217
+ end
218
+
219
+ it "returns the nameserver's ip" do
220
+ result = @dns.lookup_nameserver_ip(:nameserver => "example.com")
221
+ result[:params][:ip].should == "192.1.2.3"
222
+ end
223
+
224
+ it "returns null if the ip cannot be determined" do
225
+ result = @dns.lookup_nameserver_ip(:nameserver => "notexists.com")
226
+ result[:params][:ip].should be_nil
227
+ end
228
+ end
229
+
230
+ describe "#removezonerecord" do
231
+ use_vcr_cassette "whm/dns/removezonerecord"
232
+
233
+ it "requires a zone" do
234
+ requires_attr('zone') { @dns.remove_zone_record(:Line => 1) }
235
+ end
236
+
237
+ it "requires a Line" do
238
+ requires_attr('Line') { @dns.remove_zone_record(:zone => "example.com") }
239
+ end
240
+
241
+ it "removes the zone record" do
242
+ result = @dns.remove_zone_record(:zone => "example.com", :Line => 1)
243
+ result[:success].should be_true
244
+ result[:message].should match(/Bind reloading on .*example.com/i)
245
+ end
246
+
247
+ it "returns an error for an unknown zone " do
248
+ result = @dns.remove_zone_record(:zone => "notexists.com", :Line => 1)
249
+ result[:success].should be_false
250
+ result[:message].should match(/Unable to find a record on specified line/i)
251
+ end
252
+
253
+ it "returns an error for an invalid line" do
254
+ result = @dns.remove_zone_record(:zone => "example.com", :Line => 200)
255
+ result[:success].should be_false
256
+ result[:message].should match(/Unable to find a record on specified line/i)
257
+ end
258
+ end
259
+
260
+ describe "#resetzone" do
261
+ use_vcr_cassette "whm/dns/resetzone"
262
+
263
+ it "requires a domain" do
264
+ requires_attr('domain') { @dns.reset_zone(:zone => "example.com") }
265
+ end
266
+
267
+ it "requires a zone" do
268
+ requires_attr('zone') { @dns.reset_zone(:domain => "example.com") }
269
+ end
270
+
271
+ it "resets the zone" do
272
+ result = @dns.reset_zone(:domain => "example.com", :zone => "example.com")
273
+ result[:success].should be_true
274
+ result[:message].should match(/Bind reloading on .*example.com/i)
275
+ end
276
+
277
+ it "returns an error for an unknown domain" do
278
+ result = @dns.reset_zone(:domain => "notexists.com", :zone => "notexists.com")
279
+ result[:success].should be_false
280
+ result[:message].should match(/Unable to determine the IP address for notexists.com/i)
281
+ end
282
+ end
283
+
284
+ describe "#listmxs" do
285
+ use_vcr_cassette "whm/dns/listmxs"
286
+
287
+ it "requires a domain" do
288
+ requires_attr('domain') { @dns.list_mxs("api.version".to_sym => 1) }
289
+ end
290
+
291
+ it "requires the api.version" do
292
+ requires_attr('api.version') { @dns.list_mxs(:domain => "example.com") }
293
+ end
294
+
295
+ it "returns a list of mxs" do
296
+ result = @dns.list_mxs(:domain => "example.com", "api.version".to_sym => 1)
297
+ result[:params][:record].should be_a_kind_of Array
298
+ result[:params][:record].size.should == 1
299
+ result[:params][:record].first[:exchange].should == "example.com"
300
+ result[:params][:record].first[:name].should == "example.com."
301
+ end
302
+ end
303
+
304
+ describe "#savemxs" do
305
+ use_vcr_cassette "whm/dns/savemxs"
306
+
307
+ it "requires the api.version" do
308
+ requires_attr('api.version') { @dns.save_mx(:domain => "example.com",
309
+ :name => "mail.example.com",
310
+ :exchange => "example.com",
311
+ :preference => 10) }
312
+ end
313
+
314
+ it "requires a domain" do
315
+ requires_attr('domain') { @dns.save_mx("api.version".to_sym => 1,
316
+ :name => "mail.example.com",
317
+ :exchange => "example.com",
318
+ :preference => 10) }
319
+ end
320
+
321
+ it "requires a name" do
322
+ requires_attr('name') { @dns.save_mx("api.version".to_sym => 1,
323
+ :domain => "example.com",
324
+ :exchange => "example.com",
325
+ :preference => 10) }
326
+ end
327
+
328
+ it "requires an exchange" do
329
+ requires_attr('exchange') { @dns.save_mx("api.version".to_sym => 1,
330
+ :domain => "example.com",
331
+ :name => "mail.example.com",
332
+ :preference => 10) }
333
+ end
334
+
335
+ it "requires a preference" do
336
+ requires_attr('preference') { @dns.save_mx("api.version".to_sym => 1,
337
+ :domain => "example.com",
338
+ :name => "mail.example.com",
339
+ :exchange => "example.com") }
340
+ end
341
+
342
+ it "saves the mx record" do
343
+ result = @dns.save_mx("api.version".to_sym => 1,
344
+ :domain => "example.com",
345
+ :name => "mail.example.com",
346
+ :exchange => "example.com",
347
+ :preference => 10)
348
+ result[:message].should match(/Bind reloading on .*example.com/i)
349
+ end
350
+ end
351
+ end
352
+ end