squall 1.0.2 → 1.1.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 (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