tim 0.0.1
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.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +392 -0
- data/Rakefile +33 -0
- data/app/assets/javascripts/tim/application.js +15 -0
- data/app/assets/stylesheets/tim/application.css +13 -0
- data/app/controllers/tim/application_controller.rb +19 -0
- data/app/controllers/tim/base_images_controller.rb +59 -0
- data/app/controllers/tim/entrypoint_controller.rb +8 -0
- data/app/controllers/tim/image_versions_controller.rb +48 -0
- data/app/controllers/tim/provider_images_controller.rb +59 -0
- data/app/controllers/tim/target_images_controller.rb +61 -0
- data/app/controllers/tim/templates_controller.rb +47 -0
- data/app/filters/tim/user_keys_filter.rb +59 -0
- data/app/helpers/tim/application_helper.rb +4 -0
- data/app/models/tim/base.rb +6 -0
- data/app/models/tim/base_image.rb +15 -0
- data/app/models/tim/image_version.rb +13 -0
- data/app/models/tim/provider_image.rb +51 -0
- data/app/models/tim/target_image.rb +50 -0
- data/app/models/tim/template.rb +19 -0
- data/app/responders/tim/custom_responder.rb +24 -0
- data/app/validators/template_validator.rb +15 -0
- data/app/views/layouts/tim/application.html.erb +14 -0
- data/app/views/tim/base_images/_base_image.xml.haml +11 -0
- data/app/views/tim/base_images/_base_image_minimal.xml.haml +2 -0
- data/app/views/tim/base_images/_form.html.erb +17 -0
- data/app/views/tim/base_images/edit.html.erb +6 -0
- data/app/views/tim/base_images/index.html.erb +17 -0
- data/app/views/tim/base_images/index.xml.haml +4 -0
- data/app/views/tim/base_images/new.html.erb +5 -0
- data/app/views/tim/base_images/show.html.erb +5 -0
- data/app/views/tim/base_images/show.xml.haml +2 -0
- data/app/views/tim/entrypoint/index.xml.haml +7 -0
- data/app/views/tim/image_versions/_form.html.erb +17 -0
- data/app/views/tim/image_versions/_image_version.xml.haml +9 -0
- data/app/views/tim/image_versions/_image_version_minimal.xml.haml +2 -0
- data/app/views/tim/image_versions/edit.html.erb +6 -0
- data/app/views/tim/image_versions/index.html.erb +17 -0
- data/app/views/tim/image_versions/index.xml.haml +4 -0
- data/app/views/tim/image_versions/new.html.erb +5 -0
- data/app/views/tim/image_versions/show.html.erb +5 -0
- data/app/views/tim/image_versions/show.xml.haml +2 -0
- data/app/views/tim/images/_form.html.erb +17 -0
- data/app/views/tim/images/edit.html.erb +6 -0
- data/app/views/tim/images/index.html.erb +21 -0
- data/app/views/tim/images/new.html.erb +5 -0
- data/app/views/tim/images/show.html.erb +5 -0
- data/app/views/tim/layouts/application.html.erb +14 -0
- data/app/views/tim/provider_images/_form.html.erb +17 -0
- data/app/views/tim/provider_images/_provider_image.xml.haml +12 -0
- data/app/views/tim/provider_images/_provider_image_minimal.xml.haml +2 -0
- data/app/views/tim/provider_images/edit.html.erb +6 -0
- data/app/views/tim/provider_images/index.html.erb +17 -0
- data/app/views/tim/provider_images/index.xml.haml +4 -0
- data/app/views/tim/provider_images/new.html.erb +5 -0
- data/app/views/tim/provider_images/show.html.erb +5 -0
- data/app/views/tim/provider_images/show.xml.haml +2 -0
- data/app/views/tim/target_images/_form.html.erb +17 -0
- data/app/views/tim/target_images/_target_image.xml.haml +13 -0
- data/app/views/tim/target_images/_target_image_minimal.xml.haml +2 -0
- data/app/views/tim/target_images/edit.html.erb +6 -0
- data/app/views/tim/target_images/index.html.erb +21 -0
- data/app/views/tim/target_images/index.xml.haml +4 -0
- data/app/views/tim/target_images/new.html.erb +5 -0
- data/app/views/tim/target_images/show.html.erb +5 -0
- data/app/views/tim/target_images/show.xml.haml +2 -0
- data/app/views/tim/templates/_form.html.erb +17 -0
- data/app/views/tim/templates/_template.xml.haml +8 -0
- data/app/views/tim/templates/_template_minimal.xml.haml +2 -0
- data/app/views/tim/templates/edit.html.erb +6 -0
- data/app/views/tim/templates/index.html.erb +17 -0
- data/app/views/tim/templates/index.xml.haml +4 -0
- data/app/views/tim/templates/new.html.erb +5 -0
- data/app/views/tim/templates/show.html.erb +5 -0
- data/app/views/tim/templates/show.xml.haml +2 -0
- data/config/cucumber.yml +8 -0
- data/config/initializers/haml.rb +1 -0
- data/config/routes.rb +9 -0
- data/config/schemas/tdl.rng +282 -0
- data/config/user_keys.yml +26 -0
- data/db/migrate/20120906180351_create_tim_base_images.rb +12 -0
- data/db/migrate/20120906210106_create_tim_image_versions.rb +10 -0
- data/db/migrate/20120910175233_create_tim_templates.rb +9 -0
- data/db/migrate/20120911202321_create_tim_target_images.rb +14 -0
- data/db/migrate/20120911204329_create_tim_provider_images.rb +19 -0
- data/lib/generators/tim/install_generator.rb +15 -0
- data/lib/generators/tim/templates/README +6 -0
- data/lib/generators/tim/templates/tim.rb +8 -0
- data/lib/image_factory/image_factory.rb +4 -0
- data/lib/image_factory/model/base.rb +88 -0
- data/lib/image_factory/model/provider_image.rb +6 -0
- data/lib/image_factory/model/target_image.rb +6 -0
- data/lib/tasks/cucumber.rake +59 -0
- data/lib/tasks/tim_tasks.rake +4 -0
- data/lib/tim.rb +8 -0
- data/lib/tim/engine.rb +9 -0
- data/lib/tim/version.rb +3 -0
- data/spec/controllers/base_images_controller_spec.rb +131 -0
- data/spec/controllers/entrypoint_controller_spec.rb +32 -0
- data/spec/controllers/image_versions_controller_spec.rb +146 -0
- data/spec/controllers/provider_images_controller_spec.rb +156 -0
- data/spec/controllers/target_images_controller_spec.rb +153 -0
- data/spec/controllers/templates_controller_spec.rb +41 -0
- data/spec/decorators/controllers/templates_controller_decorator_spec.rb +13 -0
- data/spec/factories/tim/base_image.rb +10 -0
- data/spec/factories/tim/image_factory/provider_image.rb +10 -0
- data/spec/factories/tim/image_factory/status_detail.rb +0 -0
- data/spec/factories/tim/image_factory/target_image.rb +7 -0
- data/spec/factories/tim/image_version.rb +20 -0
- data/spec/factories/tim/provider_image.rb +9 -0
- data/spec/factories/tim/target_image.rb +10 -0
- data/spec/factories/tim/template.rb +23 -0
- data/spec/filters/user_keys_filter_spec.rb +41 -0
- data/spec/fixtures/template.xml +13 -0
- data/spec/models/base_image_spec.rb +39 -0
- data/spec/models/dummy/pool_family_spec.rb +14 -0
- data/spec/models/dummy/provider_account_spec.rb +18 -0
- data/spec/models/dummy/provider_type_spec.rb +18 -0
- data/spec/models/dummy/user_spec.rb +14 -0
- data/spec/models/image_version_spec.rb +27 -0
- data/spec/models/provider_image_spec.rb +69 -0
- data/spec/models/target_image_spec.rb +75 -0
- data/spec/models/template_spec.rb +16 -0
- data/spec/spec_helper.rb +56 -0
- data/spec/support/routes.rb +41 -0
- data/spec/validators/template_validator_spec.rb +19 -0
- data/spec/views/base_images_spec.rb +23 -0
- data/spec/views/image_versions_spec.rb +25 -0
- data/spec/views/provider_images_spec.rb +30 -0
- data/spec/views/target_images_spec.rb +25 -0
- data/spec/views/templates_spec.rb +24 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/decorators/tim/controllers/templates_controller_decorator.rb +8 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/pool_family.rb +3 -0
- data/test/dummy/app/models/provider_account.rb +3 -0
- data/test/dummy/app/models/provider_type.rb +3 -0
- data/test/dummy/app/models/tim/base_image.rb +6 -0
- data/test/dummy/app/models/user.rb +3 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/tim/base_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/image_versions/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/tim/provider_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/target_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/templates/_custom.xml.haml +1 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +58 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +28 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/tim.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20120326103723532622_create_users.rb +9 -0
- data/test/dummy/db/migrate/20120423123114264114_create_pool_families.rb +7 -0
- data/test/dummy/db/migrate/20120911182850_add_pool_family_id_to_tim_base_image.rb +5 -0
- data/test/dummy/db/migrate/20120911202845_add_provider_type_id_to_tim_target_image.rb +5 -0
- data/test/dummy/db/migrate/20120911203222_create_provider_types.rb +7 -0
- data/test/dummy/db/migrate/20120911205431_create_provider_accounts.rb +7 -0
- data/test/dummy/db/schema.rb +86 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +982 -0
- data/test/dummy/log/test.log +8629 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test.rb +0 -0
- data/test/dummy/tmp/cache/assets/C7A/BB0/sprockets%2F13445f7a19078dd2df39517062aa6711 +0 -0
- data/test/dummy/tmp/cache/assets/C8C/CC0/sprockets%2F95d79f3b3096348427f3e4e38b5202e3 +0 -0
- data/test/dummy/tmp/cache/assets/CB0/2B0/sprockets%2F79106b90879c02a115d7f6f1c8390ac4 +0 -0
- data/test/dummy/tmp/cache/assets/CE0/690/sprockets%2F04c628c2a636286bfa92a4966b82b92a +0 -0
- data/test/dummy/tmp/cache/assets/D03/040/sprockets%2Fd9e94204d4b307145f12efc109b16c1f +0 -0
- data/test/dummy/tmp/cache/assets/D06/DC0/sprockets%2Fcd282851b6e4c463409ba3ece67e0510 +0 -0
- data/test/dummy/tmp/cache/assets/D23/5F0/sprockets%2F2a521f3183c6bbcd71bd26a5490b201e +0 -0
- data/test/dummy/tmp/cache/assets/D64/3A0/sprockets%2F56ac1aed10c39b12a88cb1b30f668f58 +0 -0
- data/test/dummy/tmp/cache/assets/D69/BD0/sprockets%2F0aaf75cf34556b33a9fec534fe4d0415 +0 -0
- data/test/dummy/tmp/cache/assets/D87/D80/sprockets%2Fefa3c8b210e87358c7add88cd6f49597 +0 -0
- data/test/dummy/tmp/cache/assets/D89/200/sprockets%2Ff9b4e953c874ed6a87de6490d055d9db +0 -0
- data/test/dummy/tmp/cache/assets/DF4/430/sprockets%2F403bb1de60cae4325cebd7e6c389b8ad +0 -0
- data/test/dummy/tmp/cache/assets/E00/500/sprockets%2Faaddc5b6f2cb6b98930cc54cf4c64a95 +0 -0
- data/test/dummy/tmp/cache/assets/EB3/CE0/sprockets%2Fd75a89c9fffacd99bce7eed96844eafc +0 -0
- metadata +432 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Tim
|
|
4
|
+
describe EntrypointController, :type => :controller do
|
|
5
|
+
render_views
|
|
6
|
+
Tim::Engine.routes.default_url_options = {:host => 'test.host'}
|
|
7
|
+
|
|
8
|
+
context "XML format response for " do
|
|
9
|
+
before do
|
|
10
|
+
send_and_accept_xml
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "#index" do
|
|
14
|
+
before do
|
|
15
|
+
get :index
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it { response.should be_success }
|
|
19
|
+
it { response.headers['Content-Type'].should include("application/xml") }
|
|
20
|
+
it "should have all resources URLs" do
|
|
21
|
+
resp = Hash.from_xml(response.body)
|
|
22
|
+
api = resp['api']
|
|
23
|
+
api['templates']['href'].should == templates_url
|
|
24
|
+
api['base_images']['href'].should == base_images_url
|
|
25
|
+
api['image_versions']['href'].should == image_versions_url
|
|
26
|
+
api['target_images']['href'].should == target_images_url
|
|
27
|
+
api['provider_images']['href'].should == provider_images_url
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
module Tim
|
|
4
|
+
describe ImageVersionsController do
|
|
5
|
+
render_views
|
|
6
|
+
|
|
7
|
+
describe "Image Versions API" do
|
|
8
|
+
before(:each) do
|
|
9
|
+
send_and_accept_xml
|
|
10
|
+
TargetImage.any_instance.stub(:create_factory_target_image).and_return(true)
|
|
11
|
+
ImageVersionsController.any_instance.stub(:template_exists?).and_return false
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "Create Image Version" do
|
|
15
|
+
|
|
16
|
+
context "Success" do
|
|
17
|
+
it "should return a new image version as xml" do
|
|
18
|
+
post :create, { :image_version => {}}
|
|
19
|
+
response.code.should == "201"
|
|
20
|
+
|
|
21
|
+
body = Hash.from_xml(response.body)
|
|
22
|
+
body.keys.should == ["image_version"]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should return a new image version with base image as xml" do
|
|
26
|
+
post :create, { :image_version => {:base_image => {:name => "Name"}}}
|
|
27
|
+
response.code.should == "201"
|
|
28
|
+
|
|
29
|
+
body = Hash.from_xml(response.body)
|
|
30
|
+
body.keys.should == ["image_version"]
|
|
31
|
+
body["image_version"].keys.should =~ ["base_image", "id", "href", "target_images"]
|
|
32
|
+
body["image_version"]["base_image"].keys.should =~ ["id", "href"]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "failure" do
|
|
37
|
+
it "should return a unprocessable entity error when the client sends invalid content" do
|
|
38
|
+
post :create, { :invalid_image => FactoryGirl.build(:image_version).attributes }
|
|
39
|
+
response.code.should == "422"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe "Show Image Version" do
|
|
45
|
+
context "Success" do
|
|
46
|
+
it "should return an existing image version as XML" do
|
|
47
|
+
image_version = FactoryGirl.create(:image_version_with_base_image)
|
|
48
|
+
get :show, :id => image_version.id
|
|
49
|
+
|
|
50
|
+
response.code.should == "200"
|
|
51
|
+
|
|
52
|
+
body = Hash.from_xml(response.body)
|
|
53
|
+
body.keys.should == ["image_version"]
|
|
54
|
+
body["image_version"].keys.should =~ ["id", "href", "target_images", "base_image"]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should return an existing base image as XML with target images" do
|
|
58
|
+
image_version = FactoryGirl.create(:image_version_with_target_images)
|
|
59
|
+
get :show, :id => image_version.id
|
|
60
|
+
|
|
61
|
+
response.code.should == "200"
|
|
62
|
+
|
|
63
|
+
body = Hash.from_xml(response.body)
|
|
64
|
+
body.keys.should == ["image_version"]
|
|
65
|
+
body["image_version"].keys.should =~ ["base_image", "id", "href", "target_images"]
|
|
66
|
+
body["image_version"]["target_images"]["target_image"].size.should == 2
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context "failure" do
|
|
71
|
+
it "should return a not found response when an image version does not exist" do
|
|
72
|
+
get :show, :id => -1
|
|
73
|
+
response.code.should == "404"
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "List Image Versions" do
|
|
79
|
+
context "Success" do
|
|
80
|
+
it "should return a list of existing base images as XML" do
|
|
81
|
+
3.times do
|
|
82
|
+
FactoryGirl.create(:image_version_with_base_image)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
get :index
|
|
86
|
+
|
|
87
|
+
body = Hash.from_xml(response.body)
|
|
88
|
+
body.keys.should == ["image_versions"]
|
|
89
|
+
body["image_versions"]["image_version"].first.keys.should =~ ["id", "href"]
|
|
90
|
+
body["image_versions"]["image_version"].size.should == ImageVersion.all.size
|
|
91
|
+
response.code.should == "200"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe "Delete Image Version" do
|
|
97
|
+
context "Success" do
|
|
98
|
+
it "should return a no content code when deleting an image version" do
|
|
99
|
+
image_version = FactoryGirl.create(:image_version)
|
|
100
|
+
delete :destroy, :id => image_version.id
|
|
101
|
+
response.code.should == "204"
|
|
102
|
+
|
|
103
|
+
expect { ImageVersion.find(image_version.id) }.to raise_error(ActiveRecord::RecordNotFound)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context "Failure" do
|
|
108
|
+
it "should return a not found code when deleting an image version that does not exist" do
|
|
109
|
+
delete :destroy, :id => -1
|
|
110
|
+
response.code.should == "404"
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
describe "Update Image Version" do
|
|
116
|
+
|
|
117
|
+
context "Success" do
|
|
118
|
+
it "should return an updated image version as xml" do
|
|
119
|
+
image_version = FactoryGirl.create(:image_version_with_full_tree)
|
|
120
|
+
image_version.base_image = FactoryGirl.create(:base_image)
|
|
121
|
+
put :update, :id => image_version.id, :image_version => image_version.attributes
|
|
122
|
+
response.code.should == "200"
|
|
123
|
+
|
|
124
|
+
body = Hash.from_xml(response.body)
|
|
125
|
+
body.keys.should == ["image_version"]
|
|
126
|
+
|
|
127
|
+
ImageVersion.find(image_version.id).base_image.should == image_version.base_image
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
context "failure" do
|
|
132
|
+
it "should return a unprocessable entity error when the client sends invalid content" do
|
|
133
|
+
image_version = FactoryGirl.create(:image_version)
|
|
134
|
+
post :update, :id => image_version.id, :invalid_image => image_version.attributes
|
|
135
|
+
response.code.should == "422"
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "should return a not found code when updating an image version that does not exist" do
|
|
139
|
+
post :update, :id => -1, :image_version => FactoryGirl.build(:image_version).attributes
|
|
140
|
+
response.code.should == "404"
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
module Tim
|
|
4
|
+
describe ProviderImagesController do
|
|
5
|
+
render_views
|
|
6
|
+
|
|
7
|
+
describe "Provider Images API" do
|
|
8
|
+
before(:each) do
|
|
9
|
+
send_and_accept_xml
|
|
10
|
+
TargetImage.any_instance.stub(:template).and_return(FactoryGirl.build(:template))
|
|
11
|
+
ProviderImage.any_instance.stub(:create_factory_provider_image).and_return(true)
|
|
12
|
+
TargetImage.any_instance.stub(:create_factory_target_image).and_return(true)
|
|
13
|
+
@status_detail = mock(:status)
|
|
14
|
+
@status_detail.stub(:activity).and_return("Building")
|
|
15
|
+
ImageFactory::TargetImage.stub(:create).and_return(FactoryGirl.build(:image_factory_target_image, :status_detail => @status_detail))
|
|
16
|
+
ProviderImagesController.any_instance.stub(:template_exists?).and_return false
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "Create Provider Image" do
|
|
20
|
+
before(:each) do
|
|
21
|
+
ImageFactory::ProviderImage.stub(:create).and_return(FactoryGirl.build(:image_factory_provider_image))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "Success" do
|
|
25
|
+
it "should return a new provider image as xml" do
|
|
26
|
+
provider_image = FactoryGirl.build(:provider_image_with_full_tree)
|
|
27
|
+
post :create, { :provider_image => provider_image.attributes }
|
|
28
|
+
response.code.should == "201"
|
|
29
|
+
|
|
30
|
+
body = Hash.from_xml(response.body)
|
|
31
|
+
body.keys.should == ["provider_image"]
|
|
32
|
+
body["provider_image"].keys.should =~ ["external_image_id", "provider",
|
|
33
|
+
"snapshot", "status_detail", "progress", "href", "id","target_image", "status"]
|
|
34
|
+
body["provider_image"]["target_image"]["id"].should == provider_image.target_image .id.to_s
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "failure" do
|
|
39
|
+
it "should return a unprocessable entity error when the client sends invalid content" do
|
|
40
|
+
post :create, { :invalid_image => FactoryGirl.build(:provider_image).attributes }
|
|
41
|
+
response.code.should == "422"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "Show Provider Image" do
|
|
47
|
+
context "Success" do
|
|
48
|
+
it "should return an existing provider image as XML" do
|
|
49
|
+
provider_image = FactoryGirl.create(:provider_image_with_full_tree)
|
|
50
|
+
get :show, :id => provider_image.id
|
|
51
|
+
|
|
52
|
+
response.code.should == "200"
|
|
53
|
+
|
|
54
|
+
body = Hash.from_xml(response.body)
|
|
55
|
+
body.keys.should == ["provider_image"]
|
|
56
|
+
body["provider_image"].keys.should =~ ["external_image_id", "provider",
|
|
57
|
+
"snapshot", "status_detail", "progress", "href", "id","target_image", "status"]
|
|
58
|
+
body["provider_image"]["target_image"]["id"].should == provider_image.target_image .id.to_s
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context "failure" do
|
|
63
|
+
it "should return a not found response when an provider image does not exist" do
|
|
64
|
+
get :show, :id => -1
|
|
65
|
+
response.code.should == "404"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe "List Image Versions" do
|
|
71
|
+
context "Success" do
|
|
72
|
+
it "should return a list of existing provider images as XML" do
|
|
73
|
+
3.times do
|
|
74
|
+
FactoryGirl.create(:provider_image)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
get :index
|
|
78
|
+
|
|
79
|
+
body = Hash.from_xml(response.body)
|
|
80
|
+
body.keys.should == ["provider_images"]
|
|
81
|
+
body["provider_images"]["provider_image"].first.keys.should =~ ["id", "href"]
|
|
82
|
+
response.code.should == "200"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "Delete Provider Image" do
|
|
88
|
+
context "Success" do
|
|
89
|
+
it "should return a no content code when deleting a provider image" do
|
|
90
|
+
provider_image = FactoryGirl.create(:provider_image)
|
|
91
|
+
delete :destroy, :id => provider_image.id
|
|
92
|
+
response.code.should == "204"
|
|
93
|
+
|
|
94
|
+
expect { ProviderImage.find(provider_image.id) }.to raise_error(ActiveRecord::RecordNotFound)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context "Failure" do
|
|
99
|
+
it "should return a not found code when deleting a provider image" do
|
|
100
|
+
delete :destroy, :id => -1
|
|
101
|
+
response.code.should == "404"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
describe "Update Provider Image" do
|
|
107
|
+
|
|
108
|
+
context "Success" do
|
|
109
|
+
it "should return an updated provider image as xml" do
|
|
110
|
+
provider_image = FactoryGirl.create(:provider_image_with_full_tree)
|
|
111
|
+
provider_image.target_image = FactoryGirl.create(:target_image )
|
|
112
|
+
put :update, :id => provider_image.id, :provider_image => provider_image.attributes
|
|
113
|
+
response.code.should == "200"
|
|
114
|
+
|
|
115
|
+
body = Hash.from_xml(response.body)
|
|
116
|
+
body.keys.should == ["provider_image"]
|
|
117
|
+
|
|
118
|
+
ProviderImage.find(provider_image.id).target_image.should == provider_image.target_image
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
context "failure" do
|
|
123
|
+
it "should return a unprocessable entity error when the client sends invalid content" do
|
|
124
|
+
provider_image = FactoryGirl.create(:provider_image)
|
|
125
|
+
post :update, :id => provider_image.id, :invalid_image => provider_image.attributes
|
|
126
|
+
response.code.should == "422"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should return a not found code when updating a Provider image that does not exist" do
|
|
130
|
+
delete :update, :id => -1, :provider_image => FactoryGirl.create(:provider_image).attributes
|
|
131
|
+
response.code.should == "404"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
describe "Update Provider Image via factory callback" do
|
|
137
|
+
before(:each) do
|
|
138
|
+
send_and_accept_json
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "should update provider image status attributes via json" do
|
|
142
|
+
provider_image = FactoryGirl.create(:provider_image_with_full_tree)
|
|
143
|
+
factory_attributes = {:percent_complete => "100", "status_detail" => {:activity => "Building Image"} }
|
|
144
|
+
hash = provider_image.attributes.merge(factory_attributes)
|
|
145
|
+
put :update, :id => provider_image.id, :provider_image => hash
|
|
146
|
+
response.code.should == "200"
|
|
147
|
+
|
|
148
|
+
body = JSON.parse(response.body)
|
|
149
|
+
body.keys.should == ["provider_image"]
|
|
150
|
+
body["provider_image"]["status_detail"].should == "Building Image"
|
|
151
|
+
body["provider_image"]["progress"].should == "100"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
module Tim
|
|
4
|
+
describe TargetImagesController do
|
|
5
|
+
render_views
|
|
6
|
+
|
|
7
|
+
describe "Target Images API" do
|
|
8
|
+
before(:each) do
|
|
9
|
+
send_and_accept_xml
|
|
10
|
+
TargetImage.any_instance.stub(:template).and_return(FactoryGirl.build(:template))
|
|
11
|
+
TargetImage.any_instance.stub(:create_factory_target_image).and_return(true)
|
|
12
|
+
@status_detail = mock(:status)
|
|
13
|
+
@status_detail.stub(:activity).and_return("Building")
|
|
14
|
+
TargetImagesController.any_instance.stub(:template_exists?).and_return false
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "Create Target Image" do
|
|
18
|
+
before(:each) do
|
|
19
|
+
ImageFactory::TargetImage.stub(:create).and_return(FactoryGirl.build(:image_factory_target_image, :status_detail => @status_detail))
|
|
20
|
+
TargetImage.any_instance.stub(:template).and_return FactoryGirl.build(:template)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "Success" do
|
|
24
|
+
it "should return a new target image as xml" do
|
|
25
|
+
target_image = FactoryGirl.build(:target_image_with_full_tree)
|
|
26
|
+
post :create, { :target_image => target_image.attributes }
|
|
27
|
+
response.code.should == "201"
|
|
28
|
+
|
|
29
|
+
body = Hash.from_xml(response.body)
|
|
30
|
+
body.keys.should == ["target_image"]
|
|
31
|
+
body["target_image"].keys.should =~ ["target", "status", "status_detail", "progress", "href", "id", "provider_images", "image_version"]
|
|
32
|
+
body["target_image"]["image_version"]["id"].should == target_image.image_version.id.to_s
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "failure" do
|
|
37
|
+
it "should return a unprocessable entity error when the client sends invalid content" do
|
|
38
|
+
post :create, { :invalid_image => FactoryGirl.build(:target_image).attributes }
|
|
39
|
+
response.code.should == "422"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe "Show Target Image" do
|
|
45
|
+
context "Success" do
|
|
46
|
+
it "should return an existing target image as XML" do
|
|
47
|
+
target_image = FactoryGirl.create(:target_image_with_full_tree)
|
|
48
|
+
get :show, :id => target_image.id
|
|
49
|
+
|
|
50
|
+
response.code.should == "200"
|
|
51
|
+
|
|
52
|
+
body = Hash.from_xml(response.body)
|
|
53
|
+
body.keys.should == ["target_image"]
|
|
54
|
+
body["target_image"].keys.should =~ ["id", "href", "image_version",
|
|
55
|
+
"provider_images", "target", "status", "status_detail", "progress"]
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "failure" do
|
|
60
|
+
it "should return a not found response when an target image does not exist" do
|
|
61
|
+
get :show, :id => -1
|
|
62
|
+
response.code.should == "404"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe "List Image Versions" do
|
|
68
|
+
context "Success" do
|
|
69
|
+
it "should return a list of existing target images as XML" do
|
|
70
|
+
3.times do
|
|
71
|
+
FactoryGirl.create(:target_image)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
get :index
|
|
75
|
+
|
|
76
|
+
body = Hash.from_xml(response.body)
|
|
77
|
+
body.keys.should == ["target_images"]
|
|
78
|
+
body["target_images"]["target_image"].first.keys.should =~ ["id", "href"]
|
|
79
|
+
response.code.should == "200"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
describe "Delete Target Image" do
|
|
85
|
+
context "Success" do
|
|
86
|
+
it "should return a no content code when deleting a target image" do
|
|
87
|
+
target_image = FactoryGirl.create(:target_image)
|
|
88
|
+
delete :destroy, :id => target_image.id
|
|
89
|
+
response.code.should == "204"
|
|
90
|
+
|
|
91
|
+
expect { TargetImage.find(target_image.id) }.to raise_error(ActiveRecord::RecordNotFound)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context "Failure" do
|
|
96
|
+
it "should return a not found code when deleting a target image" do
|
|
97
|
+
delete :destroy, :id => -1
|
|
98
|
+
response.code.should == "404"
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
describe "Update Target Image" do
|
|
104
|
+
|
|
105
|
+
context "Success" do
|
|
106
|
+
it "should return an updated target image as xml" do
|
|
107
|
+
target_image = FactoryGirl.create(:target_image_with_full_tree)
|
|
108
|
+
target_image.image_version = FactoryGirl.create(:image_version)
|
|
109
|
+
put :update, :id => target_image.id, :target_image => target_image.attributes
|
|
110
|
+
response.code.should == "200"
|
|
111
|
+
|
|
112
|
+
body = Hash.from_xml(response.body)
|
|
113
|
+
body.keys.should == ["target_image"]
|
|
114
|
+
|
|
115
|
+
TargetImage.find(target_image.id).image_version.should == target_image.image_version
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context "failure" do
|
|
120
|
+
it "should return a unprocessable entity error when the client sends invalid content" do
|
|
121
|
+
target_image = FactoryGirl.create(:target_image)
|
|
122
|
+
put :update, :id => target_image.id, :invalid_image => target_image.attributes
|
|
123
|
+
response.code.should == "422"
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "should return a not found code when updating a target image that does not exist" do
|
|
127
|
+
delete :update, :id => -1, :target_image => FactoryGirl.build(:target_image).attributes
|
|
128
|
+
response.code.should == "404"
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
describe "Update Target Image via factory callback" do
|
|
134
|
+
before(:each) do
|
|
135
|
+
send_and_accept_json
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "should update target image status attributes via json" do
|
|
139
|
+
target_image = FactoryGirl.create(:target_image_with_full_tree)
|
|
140
|
+
factory_attributes = {:percent_complete => "100", :status_detail => {:activity => "Building Image"} }
|
|
141
|
+
hash = target_image.attributes.merge(factory_attributes)
|
|
142
|
+
put :update, :id => target_image.id, :target_image => hash
|
|
143
|
+
response.code.should == "200"
|
|
144
|
+
|
|
145
|
+
body = JSON.parse(response.body)
|
|
146
|
+
body.keys.should == ["target_image"]
|
|
147
|
+
body["target_image"]["status_detail"].should == "Building Image"
|
|
148
|
+
body["target_image"]["progress"].should == "100"
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|