squall 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/.gitignore +3 -0
  2. data/.rbenv-version +1 -0
  3. data/.rspec +1 -1
  4. data/.rvmrc +41 -1
  5. data/.travis.yml +13 -3
  6. data/README.md +122 -27
  7. data/Rakefile +5 -34
  8. data/lib/squall/data_store_zone.rb +58 -0
  9. data/lib/squall/firewall_rule.rb +66 -0
  10. data/lib/squall/hypervisor.rb +63 -11
  11. data/lib/squall/hypervisor_zone.rb +135 -0
  12. data/lib/squall/ip_address.rb +50 -3
  13. data/lib/squall/ip_address_join.rb +46 -0
  14. data/lib/squall/network.rb +21 -4
  15. data/lib/squall/network_zone.rb +73 -0
  16. data/lib/squall/payment.rb +59 -0
  17. data/lib/squall/role.rb +28 -11
  18. data/lib/squall/statistic.rb +3 -3
  19. data/lib/squall/{base.rb → support/base.rb} +8 -4
  20. data/lib/squall/{config.rb → support/config.rb} +4 -0
  21. data/lib/squall/{exception.rb → support/exception.rb} +0 -0
  22. data/lib/squall/{params.rb → support/params.rb} +0 -0
  23. data/lib/squall/support/version.rb +3 -0
  24. data/lib/squall/support/yaml.rb +5 -0
  25. data/lib/squall/template.rb +4 -0
  26. data/lib/squall/transaction.rb +4 -0
  27. data/lib/squall/user.rb +126 -30
  28. data/lib/squall/user_group.rb +56 -0
  29. data/lib/squall/virtual_machine.rb +176 -52
  30. data/lib/squall/whitelist.rb +74 -0
  31. data/lib/squall.rb +21 -12
  32. data/spec/spec_helper.rb +21 -16
  33. data/spec/squall/data_store_zone_spec.rb +97 -0
  34. data/spec/squall/firewall_rule_spec.rb +112 -0
  35. data/spec/squall/hypervisor_spec.rb +101 -48
  36. data/spec/squall/hypervisor_zone_spec.rb +190 -0
  37. data/spec/squall/ip_address_join_spec.rb +67 -0
  38. data/spec/squall/ip_address_spec.rb +68 -6
  39. data/spec/squall/network_spec.rb +0 -1
  40. data/spec/squall/network_zone_spec.rb +147 -0
  41. data/spec/squall/payment_spec.rb +98 -0
  42. data/spec/squall/role_spec.rb +31 -46
  43. data/spec/squall/statistic_spec.rb +7 -9
  44. data/spec/squall/{base_spec.rb → support/base_spec.rb} +5 -7
  45. data/spec/squall/{config_spec.rb → support/config_spec.rb} +0 -0
  46. data/spec/{params_spec.rb → squall/support/params_spec.rb} +0 -0
  47. data/spec/squall/template_spec.rb +0 -1
  48. data/spec/squall/transaction_spec.rb +0 -1
  49. data/spec/squall/user_group_spec.rb +74 -0
  50. data/spec/squall/user_spec.rb +142 -59
  51. data/spec/squall/virtual_machine_spec.rb +179 -67
  52. data/spec/squall/whitelist_spec.rb +113 -0
  53. data/spec/squall_spec.rb +4 -8
  54. data/spec/vcr_cassettes/data_store_zone/create.yml +40 -0
  55. data/spec/vcr_cassettes/data_store_zone/delete.yml +77 -0
  56. data/spec/vcr_cassettes/data_store_zone/edit.yml +77 -0
  57. data/spec/vcr_cassettes/data_store_zone/list.yml +40 -0
  58. data/spec/vcr_cassettes/data_store_zone/show.yml +77 -0
  59. data/spec/vcr_cassettes/firewall_rule/create.yml +75 -0
  60. data/spec/vcr_cassettes/firewall_rule/delete.yml +75 -0
  61. data/spec/vcr_cassettes/firewall_rule/edit.yml +75 -0
  62. data/spec/vcr_cassettes/firewall_rule/list.yml +40 -0
  63. data/spec/vcr_cassettes/hypervisor/add_data_store_join.yml +40 -0
  64. data/spec/vcr_cassettes/hypervisor/add_network_join.yml +40 -0
  65. data/spec/vcr_cassettes/hypervisor/create.yml +7 -44
  66. data/spec/vcr_cassettes/hypervisor/data_store_joins.yml +40 -0
  67. data/spec/vcr_cassettes/hypervisor/delete.yml +11 -11
  68. data/spec/vcr_cassettes/hypervisor/edit.yml +7 -46
  69. data/spec/vcr_cassettes/hypervisor/list.yml +7 -7
  70. data/spec/vcr_cassettes/hypervisor/network_joins.yml +40 -0
  71. data/spec/vcr_cassettes/hypervisor/reboot.yml +13 -13
  72. data/spec/vcr_cassettes/hypervisor/remove_data_store_join.yml +40 -0
  73. data/spec/vcr_cassettes/hypervisor/remove_network_join.yml +40 -0
  74. data/spec/vcr_cassettes/hypervisor/show.yml +13 -13
  75. data/spec/vcr_cassettes/hypervisor_zones/add_data_store_join.yml +40 -0
  76. data/spec/vcr_cassettes/hypervisor_zones/add_network_join.yml +40 -0
  77. data/spec/vcr_cassettes/hypervisor_zones/create.yml +40 -0
  78. data/spec/vcr_cassettes/hypervisor_zones/data_store_joins.yml +40 -0
  79. data/spec/vcr_cassettes/hypervisor_zones/delete.yml +77 -0
  80. data/spec/vcr_cassettes/hypervisor_zones/edit.yml +77 -0
  81. data/spec/vcr_cassettes/hypervisor_zones/hypervisors.yml +40 -0
  82. data/spec/vcr_cassettes/hypervisor_zones/list.yml +40 -0
  83. data/spec/vcr_cassettes/hypervisor_zones/network_joins.yml +40 -0
  84. data/spec/vcr_cassettes/hypervisor_zones/remove_data_store_join.yml +40 -0
  85. data/spec/vcr_cassettes/hypervisor_zones/remove_network_join.yml +40 -0
  86. data/spec/vcr_cassettes/hypervisor_zones/show.yml +77 -0
  87. data/spec/vcr_cassettes/ipaddress/create.yml +40 -0
  88. data/spec/vcr_cassettes/ipaddress/delete.yml +40 -0
  89. data/spec/vcr_cassettes/ipaddress/edit.yml +40 -0
  90. data/spec/vcr_cassettes/ipaddress/list.yml +17 -17
  91. data/spec/vcr_cassettes/ipaddress_join/assign.yml +77 -0
  92. data/spec/vcr_cassettes/ipaddress_join/delete.yml +77 -0
  93. data/spec/vcr_cassettes/ipaddress_join/list.yml +77 -0
  94. data/spec/vcr_cassettes/network/create.yml +15 -15
  95. data/spec/vcr_cassettes/network/delete.yml +6 -6
  96. data/spec/vcr_cassettes/network/edit.yml +18 -18
  97. data/spec/vcr_cassettes/network/list.yml +3 -3
  98. data/spec/vcr_cassettes/network_zones/attach.yml +114 -0
  99. data/spec/vcr_cassettes/network_zones/create.yml +40 -0
  100. data/spec/vcr_cassettes/network_zones/delete.yml +77 -0
  101. data/spec/vcr_cassettes/network_zones/detach.yml +114 -0
  102. data/spec/vcr_cassettes/network_zones/edit.yml +77 -0
  103. data/spec/vcr_cassettes/network_zones/list.yml +40 -0
  104. data/spec/vcr_cassettes/network_zones/show.yml +77 -0
  105. data/spec/vcr_cassettes/payment/create.yml +78 -0
  106. data/spec/vcr_cassettes/payment/delete.yml +77 -0
  107. data/spec/vcr_cassettes/payment/edit.yml +77 -0
  108. data/spec/vcr_cassettes/payment/list.yml +41 -0
  109. data/spec/vcr_cassettes/role/create.yml +7 -44
  110. data/spec/vcr_cassettes/role/delete.yml +6 -6
  111. data/spec/vcr_cassettes/role/edit.yml +13 -75
  112. data/spec/vcr_cassettes/role/list.yml +7 -7
  113. data/spec/vcr_cassettes/role/permissions.yml +7 -7
  114. data/spec/vcr_cassettes/role/show.yml +13 -13
  115. data/spec/vcr_cassettes/statistic/usage_statistics.yml +7 -7
  116. data/spec/vcr_cassettes/template/list.yml +3 -3
  117. data/spec/vcr_cassettes/template/make_public.yml +6 -6
  118. data/spec/vcr_cassettes/transaction/list.yml +3 -3
  119. data/spec/vcr_cassettes/transaction/show.yml +6 -6
  120. data/spec/vcr_cassettes/user/activate.yml +7 -7
  121. data/spec/vcr_cassettes/user/create.yml +7 -83
  122. data/spec/vcr_cassettes/user/data_store_zones.yml +79 -0
  123. data/spec/vcr_cassettes/user/delete.yml +11 -11
  124. data/spec/vcr_cassettes/user/edit.yml +40 -0
  125. data/spec/vcr_cassettes/user/edit_role.yml +9 -9
  126. data/spec/vcr_cassettes/user/generate_api_key.yml +7 -7
  127. data/spec/vcr_cassettes/user/hypervisors.yml +77 -0
  128. data/spec/vcr_cassettes/user/limits.yml +77 -0
  129. data/spec/vcr_cassettes/user/list.yml +8 -8
  130. data/spec/vcr_cassettes/user/monthly_bills.yml +40 -0
  131. data/spec/vcr_cassettes/user/network_zones.yml +79 -0
  132. data/spec/vcr_cassettes/user/show.yml +29 -29
  133. data/spec/vcr_cassettes/user/stats.yml +6 -6
  134. data/spec/vcr_cassettes/user/suspend.yml +7 -7
  135. data/spec/vcr_cassettes/user/virtual_machines.yml +18 -20
  136. data/spec/vcr_cassettes/user_group/create.yml +40 -0
  137. data/spec/vcr_cassettes/user_group/delete.yml +77 -0
  138. data/spec/vcr_cassettes/user_group/edit.yml +77 -0
  139. data/spec/vcr_cassettes/user_group/list.yml +40 -0
  140. data/spec/vcr_cassettes/virtual_machine/build.yml +7 -7
  141. data/spec/vcr_cassettes/virtual_machine/change_owner.yml +8 -8
  142. data/spec/vcr_cassettes/virtual_machine/change_password.yml +13 -13
  143. data/spec/vcr_cassettes/virtual_machine/console.yml +63 -0
  144. data/spec/vcr_cassettes/virtual_machine/create.yml +9 -11
  145. data/spec/vcr_cassettes/virtual_machine/delete.yml +11 -11
  146. data/spec/vcr_cassettes/virtual_machine/edit.yml +16 -18
  147. data/spec/vcr_cassettes/virtual_machine/list.yml +3 -3
  148. data/spec/vcr_cassettes/virtual_machine/migrate.yml +22 -24
  149. data/spec/vcr_cassettes/virtual_machine/reboot.yml +22 -22
  150. data/spec/vcr_cassettes/virtual_machine/resize.yml +13 -13
  151. data/spec/vcr_cassettes/virtual_machine/segregate.yml +114 -0
  152. data/spec/vcr_cassettes/virtual_machine/set_ssh_keys.yml +77 -0
  153. data/spec/vcr_cassettes/virtual_machine/set_vip.yml +77 -0
  154. data/spec/vcr_cassettes/virtual_machine/show.yml +6 -6
  155. data/spec/vcr_cassettes/virtual_machine/shutdown.yml +6 -6
  156. data/spec/vcr_cassettes/virtual_machine/startup.yml +6 -6
  157. data/spec/vcr_cassettes/virtual_machine/stats.yml +63 -0
  158. data/spec/vcr_cassettes/virtual_machine/stop.yml +22 -22
  159. data/spec/vcr_cassettes/virtual_machine/suspend.yml +13 -13
  160. data/spec/vcr_cassettes/virtual_machine/unlock.yml +13 -13
  161. data/spec/vcr_cassettes/virtual_machine/unsuspend.yml +6 -6
  162. data/spec/vcr_cassettes/whitelist/create.yml +77 -0
  163. data/spec/vcr_cassettes/whitelist/delete.yml +77 -0
  164. data/spec/vcr_cassettes/whitelist/edit.yml +77 -0
  165. data/spec/vcr_cassettes/whitelist/list.yml +40 -0
  166. data/spec/vcr_cassettes/whitelist/show.yml +77 -0
  167. data/squall.gemspec +3 -2
  168. metadata +247 -131
  169. data/Gemfile.lock +0 -100
  170. data/lib/squall/version.rb +0 -3
@@ -2,22 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  describe Squall::Role do
4
4
  before(:each) do
5
- default_config
6
5
  @role = Squall::Role.new
7
- @keys = ["label", "created_at", "updated_at", "id", "permissions", "identifier"]
8
6
  end
9
7
 
10
8
  describe "#list" do
11
9
  use_vcr_cassette "role/list"
12
10
  it "returns roles" do
13
11
  roles = @role.list
14
- roles.size.should be(2)
15
- end
16
-
17
- it "contains the role of a user" do
18
- role = @role.list.first
19
- role.keys.should include(*@keys)
20
- role['label'].should == "Administrator"
12
+ roles.all?{|r| r.first == "role"}
21
13
  end
22
14
  end
23
15
 
@@ -27,14 +19,13 @@ describe Squall::Role do
27
19
  expect { @role.show }.to raise_error(ArgumentError)
28
20
  end
29
21
 
30
- it "returns not found for invalid user" do
31
- expect { @role.show(5) }.to raise_error(Squall::NotFound)
22
+ it "returns 404 for invalid id" do
23
+ expect { @role.show(404) }.to raise_error(Squall::NotFound)
32
24
  end
33
25
 
34
26
  it "returns a role" do
35
27
  role = @role.show(1)
36
- role.keys.should include(*@keys)
37
- role['label'].should == "Administrator"
28
+ role.should be_a(Hash)
38
29
  end
39
30
  end
40
31
 
@@ -44,21 +35,23 @@ describe Squall::Role do
44
35
  expect { @role.edit }.to raise_error(ArgumentError)
45
36
  end
46
37
 
47
- it "returns not found for invalid user" do
48
- expect { @role.edit(5) }.to raise_error(Squall::NotFound)
38
+ it "returns 404 for invalid id" do
39
+ expect { @role.edit(404) }.to raise_error(Squall::NotFound)
49
40
  end
50
41
 
51
- it "allows :label and/or :permission" do
52
- expect { @role.edit(3, :missing => 1) }.to raise_error(ArgumentError, /Unknown.*missing/)
42
+ it "allows all optional params" do
43
+ optional = [:label, :permission_ids]
44
+ optional.each do |param|
45
+ args = [:put, '/roles/1.json', @role.default_params(param => 1)]
46
+ @role.should_receive(:request).with(*args).once.and_return([])
47
+ @role.edit(1, param => 1 )
48
+ end
53
49
  end
54
50
 
55
51
  it "updates the role" do
56
52
  pending "OnApp is returning an empty response" do
57
- old_role = @role.show(3)
58
- old_role['label'].should == "Other"
59
-
60
- new_role = @role.edit(3, :label => 'New')
61
- new_role['label'].should == 'New'
53
+ role = @role.edit(1, :label => 'New')
54
+ role['label'].should == 'New'
62
55
  end
63
56
  end
64
57
  end
@@ -81,43 +74,35 @@ describe Squall::Role do
81
74
 
82
75
  describe "#permissions" do
83
76
  use_vcr_cassette "role/permissions"
77
+
84
78
  it "returns permissions" do
85
79
  permissions = @role.permissions
86
- permissions.size.should be(229)
87
-
88
- keys = ["label", "created_at", "updated_at", "id", "identifier"]
89
- first = permissions.first
90
- first.keys.should include(*keys)
91
-
92
- keys.each do |key|
93
- first[key].should_not be_nil
94
- first[key].to_s.size.should be >= 1
95
- end
80
+ permissions.should be_an(Array)
81
+ end
82
+
83
+ it "contains role data" do
84
+ permissions = @role.permissions
85
+ permissions.all?.should be_true
96
86
  end
87
+
97
88
  end
98
89
 
99
90
  describe "#create" do
100
91
  use_vcr_cassette "role/create"
101
- it "requires login" do
102
- requires_attr(:label) { @role.create }
103
- end
104
92
 
105
93
  it "requires label" do
106
- requires_attr(:identifier) { @role.create(:label => 'my-label') }
94
+ requires_attr(:label) { @role.create }
107
95
  end
108
-
109
- it "raises error on duplicate" do
110
- expect {
111
- @role.create(:label => 'Test', :identifier => 'testing')
112
- }.to raise_error(Squall::RequestError)
113
- @role.errors['identifier'].should include("has already been taken")
96
+
97
+ it "allows permission_ids" do
98
+ @role.should_receive(:request).once.and_return Hash.new('role' => [])
99
+ @role.create(:label => "test", :permission_ids => 1)
114
100
  end
115
101
 
116
102
  it "creates a role" do
117
- value = {:label => 'Test Create', :identifier => 'testing-create'}
118
- role = @role.create(value)
119
- role['label'].should == value[:label]
120
- role['identifier'].should == value[:identifier]
103
+ response = @role.create({:label => 'Test Create', :permission_ids => 1})
104
+ response["role"]['label'].should == 'Test Create'
105
+ response["role"]['permissions'].should_not be_empty
121
106
  end
122
107
  end
123
108
  end
@@ -2,22 +2,20 @@ require 'spec_helper'
2
2
 
3
3
  describe Squall::Statistic do
4
4
  before(:each) do
5
- default_config
6
5
  @statistic = Squall::Statistic.new
7
6
  end
8
7
 
9
8
  describe "#usage_statistic" do
10
9
  use_vcr_cassette "statistic/usage_statistics"
11
10
 
12
- it "requires an id" do
13
- expect { @statistic.daily_stats }.to raise_error(ArgumentError)
14
- @statistic.success.should be_false
15
- end
16
-
17
11
  it "returns the daily statistics" do
18
- result = @statistic.daily_stats(1)
19
- result['id'].to_i.should == 1
20
- result['cost'].to_f.should == 0.0
12
+ result = @statistic.daily_stats
13
+ result.should be_an(Array)
14
+ end
15
+
16
+ it "contains the statistic data" do
17
+ result = @statistic.daily_stats
18
+ result.all?.should be_true
21
19
  end
22
20
  end
23
21
  end
@@ -9,17 +9,16 @@ end
9
9
 
10
10
  describe Squall::Base do
11
11
  before(:each) do
12
- default_config
13
12
  @base = Squall::Base.new
14
13
  end
15
14
 
16
15
  describe "#initialize" do
17
16
  it "sets the base_uri" do
18
- @base.class.base_uri.should == 'http://www.example.com'
17
+ @base.class.base_uri.should_not be_nil
19
18
  end
20
19
 
21
20
  it "sets credentials" do
22
- @base.class.default_options[:basic_auth].should include(:username => 'user', :password => 'pass')
21
+ @base.class.default_options[:basic_auth].should include(:username, :password)
23
22
  end
24
23
 
25
24
  it "uses JSON" do
@@ -34,11 +33,10 @@ describe Squall::Base do
34
33
  describe "#request" do
35
34
  it "200-207 returns success" do
36
35
  (200..207).each do |i|
37
- mock_request(:get, "/#{i}", :status => [i, "OK"], :body => "Body is OK")
36
+ mock_request(:get, "/#{i}", :status => [i, "OK"], :body => "{\"something\":[\"OK\"]}")
38
37
  base = Squall::Base.new
39
38
  base.request(:get, "/#{i}")
40
39
  base.success.should be_true
41
- base.result.should match(/OK/)
42
40
  end
43
41
  end
44
42
 
@@ -68,13 +66,13 @@ describe Squall::Base do
68
66
 
69
67
  describe "#errors" do
70
68
  it "is empty on success" do
71
- mock_request(:get, '/200_errors', :status => [200, "OK"], :body => '"{\"something\":[\"OK\"]}"')
69
+ mock_request(:get, '/200_errors', :status => [200, "OK"], :body => "{\"something\":[\"errors\"]}")
72
70
  @base.request(:get, '/200_errors')
73
71
  @base.errors.should be_empty
74
72
  end
75
73
 
76
74
  it "returns an error hash" do
77
- mock_request(:get, '/500_errors', :status => [500, "Internal Server Error"], :body => '"{\"something\":[\"errors\"]}"')
75
+ mock_request(:get, '/500_errors', :status => [500, "Internal Server Error"], :body => "{\"something\":[\"errors\"]}")
78
76
  expect { @base.request(:get, '/500_errors') }.to raise_error(Squall::ServerError)
79
77
  @base.errors.should_not be_empty
80
78
  end
@@ -2,7 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe Squall::Template do
4
4
  before(:each) do
5
- default_config
6
5
  @template = Squall::Template.new
7
6
  @keys = ["label", "operating_system_distro", "operating_system_arch", "created_at",
8
7
  "operating_system_tail", "operating_system", "updated_at", "operating_system_edition",
@@ -2,7 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe Squall::Transaction do
4
4
  before(:each) do
5
- default_config
6
5
  @transaction = Squall::Transaction.new
7
6
  @keys = ["pid", "created_at", "updated_at", "actor", "priority",
8
7
  "parent_type", "action", "id", "user_id", "dependent_transaction_id",
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe Squall::UserGroup do
4
+ before(:each) do
5
+ @keys = ["amount"]
6
+ @user_group = Squall::UserGroup.new
7
+ @valid = {:label => "My new group"}
8
+ end
9
+
10
+ describe "#list" do
11
+ use_vcr_cassette "user_group/list"
12
+
13
+ it "returns a list of user groups" do
14
+ user_groups = @user_group.list
15
+ user_groups.should be_an(Array)
16
+ end
17
+
18
+ it "contains first user group's data" do
19
+ user_group = @user_group.list.first
20
+ user_group.should be_a(Hash)
21
+ end
22
+ end
23
+
24
+ describe "#create" do
25
+ use_vcr_cassette "user_group/create"
26
+ it "requires label" do
27
+ invalid = @valid.reject{|k,v| k == :label }
28
+ requires_attr(:label) { @user_group.create(invalid) }
29
+ end
30
+
31
+ it "raises error on unknown params" do
32
+ expect { @user_group.create(@valid.merge(:what => 'what')) }.to raise_error(ArgumentError, 'Unknown params: what')
33
+ end
34
+
35
+ it "creates a user group" do
36
+ @user_group.create(@valid)
37
+ @user_group.success.should be_true
38
+ end
39
+ end
40
+
41
+ describe "#edit" do
42
+ use_vcr_cassette "user_group/edit"
43
+
44
+ it "raises error on unknown params" do
45
+ expect { @user_group.edit(1, :what => 'what') }.to raise_error(ArgumentError, 'Unknown params: what')
46
+ end
47
+
48
+ it "edits a user group" do
49
+ @user_group.edit(1, @valid)
50
+ @user_group.success.should be_true
51
+ end
52
+
53
+ it "raises an error for an invalid user group id" do
54
+ expect { @user_group.edit(404, @valid) }.to raise_error(Squall::NotFound)
55
+ end
56
+ end
57
+
58
+ describe "#delete" do
59
+ use_vcr_cassette "user_group/delete"
60
+ it "requires an id" do
61
+ expect { @user_group.delete }.to raise_error(ArgumentError)
62
+ end
63
+
64
+ it "deletes a user group" do
65
+ @user_group.delete(1)
66
+ @user_group.success.should be_true
67
+ end
68
+
69
+ it "returns NotFound for missing user" do
70
+ expect { @user_group.delete(404) }.to raise_error(Squall::NotFound)
71
+ end
72
+ end
73
+
74
+ end
@@ -2,46 +2,83 @@ require 'spec_helper'
2
2
 
3
3
  describe Squall::User do
4
4
  before(:each) do
5
- default_config
6
5
  @keys = ["total_amount", "activated_at", "created_at", "memory_available", "remember_token_expires_at",
7
6
  "used_disk_size", "deleted_at", "updated_at", "used_ip_addresses", "activation_code", "used_cpu_shares",
8
7
  "used_cpus", "group_id", "id", "used_memory", "payment_amount", "last_name", "remember_token",
9
8
  "disk_space_available", "time_zone", "outstanding_amount", "login", "roles", "email", "first_name"]
10
9
  @user = Squall::User.new
11
- @valid = {:login => 'user', :email => 'me@example.com', :password => 'CD2480A3413F',
12
- :first_name => 'John', :last_name => 'Doe', :group_id => 10 }
10
+ @valid = {:login => 'johndoe', :email => 'johndoe@example.com', :password => 'CD2480A3413F',
11
+ :password_confirmation => 'CD2480A3413F', :first_name => 'John', :last_name => 'Doe' }
13
12
  end
14
13
 
15
14
  describe "#create" do
16
15
  use_vcr_cassette "user/create"
17
16
  it "requires login" do
18
- requires_attr(:login) { @user.create }
17
+ invalid = @valid.reject{|k,v| k == :login }
18
+ requires_attr(:login) { @user.create(invalid) }
19
19
  end
20
20
 
21
21
  it "requires email" do
22
- requires_attr(:email) { @user.create(:login => @valid[:login]) }
22
+ invalid = @valid.reject{|k,v| k == :email }
23
+ requires_attr(:email) { @user.create(invalid) }
23
24
  end
24
25
 
25
26
  it "requires password" do
26
- requires_attr(:password) {
27
- @user.create(:login => @valid[:login], :email => @valid[:email])
28
- }
27
+ invalid = @valid.reject{|k,v| k == :password }
28
+ requires_attr(:password) { @user.create(invalid) }
29
29
  end
30
-
31
- it "raises error on duplicate account" do
32
- expect {
33
- @user.create(@valid.merge(:login => 'usertaken', :email => 'metaken@example.com'))
34
- }.to raise_error(Squall::RequestError)
35
- @user.errors['login'].should include("has already been taken")
36
- @user.errors['email'].should include("has already been taken")
30
+
31
+ it "requires password confirmation" do
32
+ invalid = @valid.reject{|k,v| k == :password_confirmation }
33
+ requires_attr(:password_confirmation) { @user.create(invalid) }
34
+ end
35
+
36
+ it "requires first name" do
37
+ invalid = @valid.reject{|k,v| k == :first_name }
38
+ requires_attr(:first_name) { @user.create(invalid) }
39
+ end
40
+
41
+ it "requires last name" do
42
+ invalid = @valid.reject{|k,v| k == :last_name }
43
+ requires_attr(:last_name) { @user.create(invalid) }
44
+ end
45
+
46
+ it "allows all optional params" do
47
+ optional = [:role, :time_zone, :locale, :status, :billing_plan_id, :role_ids, :suspend_after_hours, :suspend_at]
48
+ @user.should_receive(:request).exactly(optional.size).times.and_return Hash.new("user" => {})
49
+ optional.each do |param|
50
+ @user.create(@valid.merge(param => "test"))
51
+ end
52
+ end
53
+
54
+ it "raises error on unknown params" do
55
+ expect { @user.create(@valid.merge(:what => 'what')) }.to raise_error(ArgumentError, 'Unknown params: what')
37
56
  end
38
57
 
39
58
  it "creates a user" do
40
59
  user = @user.create(@valid)
41
- user['email'].should == @valid['email']
42
- user['first_name'].should == @valid['first_name']
43
- user['last_name'].should == @valid['last_name']
44
- user['group_id'].should == @valid['group_id']
60
+ @user.success.should be_true
61
+ end
62
+ end
63
+
64
+ describe "#edit" do
65
+ use_vcr_cassette "user/edit"
66
+
67
+ it "allows select params" do
68
+ optional = [:email, :password, :password_confirmation, :first_name, :last_name, :user_group_id, :billing_plan_id, :role_ids, :suspend_at]
69
+ @user.should_receive(:request).exactly(optional.size).times.and_return Hash.new()
70
+ optional.each do |param|
71
+ @user.edit(1, param => "test")
72
+ end
73
+ end
74
+
75
+ it "raises error on unknown params" do
76
+ expect { @user.edit(1, :what => 'what') }.to raise_error(ArgumentError, 'Unknown params: what')
77
+ end
78
+
79
+ it "edits a user" do
80
+ user = @user.edit(1, :first_name => "Test")
81
+ @user.success.should be_true
45
82
  end
46
83
  end
47
84
 
@@ -49,13 +86,12 @@ describe Squall::User do
49
86
  use_vcr_cassette "user/list"
50
87
  it "returns a user list" do
51
88
  users = @user.list
52
- users.size.should be(2)
89
+ users.should be_an(Array)
53
90
  end
54
91
 
55
92
  it "contains first users data" do
56
93
  user = @user.list.first
57
- user.keys.should include(*@keys)
58
- user['email'].should == "user@example.com"
94
+ user.should be_a(Hash)
59
95
  end
60
96
  end
61
97
 
@@ -66,12 +102,12 @@ describe Squall::User do
66
102
  end
67
103
 
68
104
  it "returns not found for invalid users" do
69
- expect { @user.show(5) }.to raise_error(Squall::NotFound)
105
+ expect { @user.show(404) }.to raise_error(Squall::NotFound)
70
106
  end
71
107
 
72
108
  it "returns a user" do
73
109
  user = @user.show(1)
74
- user['login'].should == 'user'
110
+ user.should be_a(Hash)
75
111
  end
76
112
  end
77
113
 
@@ -82,10 +118,8 @@ describe Squall::User do
82
118
  end
83
119
 
84
120
  it "generates a new key" do
85
- pending "Broken in OnApp" do
86
- user = @user.generate_api_key(1)
87
- user['api_key'].should == '7d97e98f8af710c7e7fe703abc8f639e0ee507c4'
88
- end
121
+ user = @user.generate_api_key(1)
122
+ user.should be_a(Hash)
89
123
  end
90
124
  end
91
125
 
@@ -96,7 +130,7 @@ describe Squall::User do
96
130
  end
97
131
 
98
132
  it "suspends a user" do
99
- user = @user.suspend(2)
133
+ user = @user.suspend(1)
100
134
  user['status'].should == "suspended"
101
135
  end
102
136
  end
@@ -108,7 +142,7 @@ describe Squall::User do
108
142
  end
109
143
 
110
144
  it "activates a user" do
111
- user = @user.activate(2)
145
+ user = @user.activate(1)
112
146
  user['status'].should == "active"
113
147
  end
114
148
 
@@ -123,13 +157,13 @@ describe Squall::User do
123
157
  expect { @user.delete }.to raise_error(ArgumentError)
124
158
  end
125
159
 
126
- it "deltes a user" do
127
- delete = @user.delete(6)
128
- delete.should be_true
160
+ it "deletes a user" do
161
+ @user.delete(1)
162
+ @user.success.should be_true
129
163
  end
130
164
 
131
165
  it "returns NotFound for missing user" do
132
- expect { @user.delete(22222) }.to raise_error(Squall::NotFound)
166
+ expect { @user.delete(404) }.to raise_error(Squall::NotFound)
133
167
  end
134
168
  end
135
169
 
@@ -141,10 +175,19 @@ describe Squall::User do
141
175
 
142
176
  it "returns stats" do
143
177
  stats = @user.stats(1)
144
- stats['virtual_machine_id'].should == 55
145
- keys = ["created_at", "cost", "updated_at", "stat_time", "id",
146
- "user_id", "vm_billing_stat_id", "billing_stats", "virtual_machine_id"]
147
- stats.keys.should include *keys
178
+ stats.should be_an(Array)
179
+ end
180
+ end
181
+
182
+ describe "#monthly_bills" do
183
+ use_vcr_cassette "user/monthly_bills"
184
+ it "requires an id" do
185
+ expect { @user.monthly_bills }.to raise_error(ArgumentError)
186
+ end
187
+
188
+ it "returns an array of bills for the user" do
189
+ stats = @user.monthly_bills(1)
190
+ stats.should be_an(Array)
148
191
  end
149
192
  end
150
193
 
@@ -155,41 +198,81 @@ describe Squall::User do
155
198
  end
156
199
 
157
200
  it "404s on not found" do
158
- pending "Broken in OnApp" do
159
- expect { @user.virtual_machines(500) }.to raise_error(Squall::NotFound)
160
- end
201
+ expect { @user.virtual_machines(404) }.to raise_error(Squall::NotFound)
161
202
  end
162
203
 
163
204
  it "returns the virtual_machines" do
164
205
  virtual_machines = @user.virtual_machines(1)
165
- virtual_machines.size.should be(2)
166
- keys = ["monthly_bandwidth_used", "cpus", "label", "created_at", "operating_system_distro", "cpu_shares",
167
- "operating_system", "template_id", "allowed_swap", "local_remote_access_port", "memory", "updated_at",
168
- "allow_resize_without_reboot", "recovery_mode", "hypervisor_id", "id", "xen_id", "user_id", "total_disk_size",
169
- "booted", "hostname", "template_label", "identifier", "initial_root_password", "min_disk_size",
170
- "remote_access_password", "built", "locked", "ip_addresses"]
171
- virtual_machines.first.should include(*keys)
206
+ virtual_machines.should be_an(Array)
172
207
  end
173
208
  end
209
+
210
+ describe "#hypervisors" do
211
+ use_vcr_cassette "user/hypervisors"
212
+ it "requires an id" do
213
+ expect { @user.hypervisors }.to raise_error(ArgumentError)
214
+ end
174
215
 
175
- describe "#edit_role" do
176
- use_vcr_cassette "user/edit_role"
216
+ it "404s on not found" do
217
+ expect { @user.hypervisors(404) }.to raise_error(Squall::NotFound)
218
+ end
219
+
220
+ it "returns the virtual_machines" do
221
+ hypervisors = @user.hypervisors(1)
222
+ hypervisors.should be_an(Array)
223
+ end
224
+ end
225
+
226
+ describe "#data_store_zones" do
227
+ use_vcr_cassette "user/data_store_zones"
177
228
  it "requires an id" do
178
- expect { @user.edit_role }.to raise_error(ArgumentError)
229
+ expect { @user.data_store_zones }.to raise_error(ArgumentError)
179
230
  end
180
231
 
181
232
  it "404s on not found" do
182
- expect { @user.edit_role(500, nil) }.to raise_error(Squall::NotFound)
233
+ pending "Broken on OnApp: returns success despite non-existent user" do
234
+ expect { @user.data_store_zones(2532564353245) }.to raise_error(Squall::NotFound)
235
+ end
183
236
  end
184
237
 
185
- it "edits one role for a user" do
186
- @user.edit_role(7, 4)
187
- @user.success.should be_true
238
+ it "returns the virtual_machines" do
239
+ data_store_zones = @user.data_store_zones(1)
240
+ data_store_zones.should be_an(Array)
188
241
  end
242
+ end
189
243
 
190
- it "edits two roles for a user" do
191
- @user.edit_role(7, 4, 2)
192
- @user.success.should be_true
244
+ describe "#network_zones" do
245
+ use_vcr_cassette "user/network_zones"
246
+ it "requires an id" do
247
+ expect { @user.network_zones }.to raise_error(ArgumentError)
248
+ end
249
+
250
+ it "404s on not found" do
251
+ pending "Broken on OnApp: returns success despite non-existent user" do
252
+ expect { @user.network_zones(2532564353245) }.to raise_error(Squall::NotFound)
253
+ end
254
+ end
255
+
256
+ it "returns the network_zones" do
257
+ network_zones = @user.network_zones(1)
258
+ network_zones.should be_an(Array)
259
+ end
260
+ end
261
+
262
+ describe "#limits" do
263
+ use_vcr_cassette "user/limits"
264
+ it "requires an id" do
265
+ expect { @user.limits }.to raise_error(ArgumentError)
266
+ end
267
+
268
+ it "404s on not found" do
269
+ expect { @user.limits(438768534623) }.to raise_error(Squall::NotFound)
270
+ end
271
+
272
+ it "returns the limits" do
273
+ limits = @user.limits(1)
274
+ limits.should be_a(Hash)
193
275
  end
194
276
  end
195
- end
277
+
278
+ end