scene7-wrapper 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/Gemfile +19 -0
- data/Gemfile.lock +64 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +24 -0
- data/Rakefile +28 -0
- data/VERSION +1 -0
- data/lib/scene7/asset.rb +104 -0
- data/lib/scene7/client.rb +56 -0
- data/lib/scene7/company.rb +29 -0
- data/lib/scene7/config.rb +33 -0
- data/lib/scene7/crop.rb +24 -0
- data/lib/scene7/folder.rb +60 -0
- data/lib/scene7-wrapper.rb +9 -0
- data/scene7-wrapper.gemspec +119 -0
- data/spec/file_fixtures/fpo.jpg +0 -0
- data/spec/fixtures/create_folder/folder.xml +8 -0
- data/spec/fixtures/delete_asset/success.xml +1 -0
- data/spec/fixtures/delete_folder/empty_response.xml +6 -0
- data/spec/fixtures/get_assets/all_assets.xml +1 -0
- data/spec/fixtures/get_assets_by_name/hat_asset.xml +4 -0
- data/spec/fixtures/get_assets_by_name/jacket_asset.xml +1 -0
- data/spec/fixtures/get_assets_by_name/zero_found.xml +1 -0
- data/spec/fixtures/get_company_info/company.xml +13 -0
- data/spec/fixtures/get_company_info/test_request.xml +1 -0
- data/spec/fixtures/get_folders/folders.xml +26 -0
- data/spec/fixtures/rename_asset/failure.xml +1 -0
- data/spec/fixtures/rename_asset/success.xml +1 -0
- data/spec/fixtures/submit_job/upload_urls_job_response.xml +7 -0
- data/spec/scene7/asset_spec.rb +195 -0
- data/spec/scene7/client_spec.rb +91 -0
- data/spec/scene7/company_spec.rb +63 -0
- data/spec/scene7/config_spec.rb +77 -0
- data/spec/scene7/crop_spec.rb +62 -0
- data/spec/scene7/folder_spec.rb +115 -0
- data/spec/spec_helper.rb +16 -0
- metadata +283 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
2
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
|
3
|
+
<soapenv:Body>
|
4
|
+
<getCompanyInfoReturn xmlns="http://www.scene7.com/IpsApi/xsd/2010-01-31">
|
5
|
+
<companyInfo>
|
6
|
+
<companyHandle>111</companyHandle>
|
7
|
+
<name>Example.com</name>
|
8
|
+
<rootPath>Example.com/</rootPath>
|
9
|
+
<expires>2100-12-31T23:00:00.000-06:00</expires>
|
10
|
+
</companyInfo>
|
11
|
+
</getCompanyInfoReturn>
|
12
|
+
</soapenv:Body>
|
13
|
+
</soapenv:Envelope>
|
@@ -0,0 +1 @@
|
|
1
|
+
<myxml />
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
2
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
|
3
|
+
<soapenv:Body>
|
4
|
+
<getFoldersReturn xmlns="http://www.scene7.com/IpsApi/xsd/2010-01-31">
|
5
|
+
<folderArray>
|
6
|
+
|
7
|
+
<items>
|
8
|
+
<folderHandle>handle-1</folderHandle>
|
9
|
+
<path>folder-path-1</path>
|
10
|
+
<lastModified>20080726T08:36:19.19305:00</lastModified>
|
11
|
+
<childLastModified>20110308T18:43:20.92706:00</childLastModified>
|
12
|
+
<hasSubfolders>true</hasSubfolders>
|
13
|
+
</items>
|
14
|
+
|
15
|
+
<items>
|
16
|
+
<folderHandle>handle-2</folderHandle>
|
17
|
+
<path>folder-path-2</path>
|
18
|
+
<lastModified>20110225T13:45:53.55306:00</lastModified>
|
19
|
+
<childLastModified>20110309T21:49:58.21606:00</childLastModified>
|
20
|
+
<hasSubfolders>false</hasSubfolders>
|
21
|
+
</items>
|
22
|
+
|
23
|
+
</folderArray>
|
24
|
+
</getFoldersReturn>
|
25
|
+
</soapenv:Body>
|
26
|
+
</soapenv:Envelope>
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>ipsApiFault</faultstring><detail><tns:ipsApiFault xmlns:tns="http://www.scene7.com/IpsApi/xsd"><tns:code>30000</tns:code><tns:reason>Asset ID 'katlynf' is already in use.</tns:reason></tns:ipsApiFault></detail></soapenv:Fault></soapenv:Body></soapenv:Envelope>
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><renameAssetReturn xmlns="http://www.scene7.com/IpsApi/xsd/2010-01-31" /></soapenv:Body></soapenv:Envelope>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
2
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
|
3
|
+
<soapenv:Body><submitJobReturn xmlns="http://www.scene7.com/IpsApi/xsd/2010-01-31">
|
4
|
+
<jobHandle>j|110|katlyn||</jobHandle>
|
5
|
+
</submitJobReturn>
|
6
|
+
</soapenv:Body>
|
7
|
+
</soapenv:Envelope>
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Scene7::Asset do
|
4
|
+
subject { Scene7::Asset }
|
5
|
+
let(:valid_config) { {:subdomain => 'test-instance', :user => 'test@example.com', :password => 'password', :app_name => 'MyAppName', :app_version => '1.2' } }
|
6
|
+
|
7
|
+
describe "class methods" do
|
8
|
+
before do
|
9
|
+
Scene7::Client.configure(valid_config)
|
10
|
+
Scene7::Client.stubs(:company_handle).returns('111')
|
11
|
+
Scene7::Client.stubs(:header).returns({
|
12
|
+
:auth_header => {
|
13
|
+
:user => 'test@example.com',
|
14
|
+
:password => 'password',
|
15
|
+
:app_name => 'Example.com',
|
16
|
+
:app_version => '1.0'
|
17
|
+
},
|
18
|
+
:attributes! => { :auth_header => { :xmlns => "http://www.scene7.com/IpsApi/xsd" } }
|
19
|
+
})
|
20
|
+
end
|
21
|
+
|
22
|
+
describe ".find_by_name" do
|
23
|
+
context 'when xml contains one asset' do
|
24
|
+
before do
|
25
|
+
savon.expects(:get_assets_by_name).with(:company_handle => '111', :name_array => {:items => 'Jacket'}, :order! => [:company_handle, :name_array]).returns(:jacket_asset)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "finds an asset" do
|
29
|
+
asset = subject.find_by_name('Jacket')
|
30
|
+
asset.should be_a(Scene7::Asset)
|
31
|
+
asset.name.should == "Jacket"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when xml contains more than one asset' do
|
36
|
+
before do
|
37
|
+
savon.expects(:get_assets_by_name).with(:company_handle => '111', :name_array => {:items => 'Hat'}, :order! => [:company_handle, :name_array]).returns(:hat_asset)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "finds an asset" do
|
41
|
+
asset = subject.find_by_name('Hat')
|
42
|
+
asset.should be_a(Scene7::Asset)
|
43
|
+
asset.handle.should == "a|1234"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".find_all_by_name" do
|
49
|
+
context 'when xml contains zero assets' do
|
50
|
+
before do
|
51
|
+
savon.expects(:get_assets_by_name).with(:company_handle => '111', :name_array => {:items => 'Does not exist'}, :order! => [:company_handle, :name_array]).returns(:zero_found)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "finds a collection containing that asset" do
|
55
|
+
collection = subject.find_all_by_name('Does not exist')
|
56
|
+
collection.length.should == 0
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'when xml contains one asset' do
|
61
|
+
before do
|
62
|
+
savon.expects(:get_assets_by_name).with(:company_handle => '111', :name_array => {:items => 'Jacket'}, :order! => [:company_handle, :name_array]).returns(:jacket_asset)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "finds a collection containing that asset" do
|
66
|
+
collection = subject.find_all_by_name('Jacket')
|
67
|
+
collection.length.should == 1
|
68
|
+
collection.first.name.should == "Jacket"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when xml contains more than one asset' do
|
73
|
+
before do
|
74
|
+
savon.expects(:get_assets_by_name).with(:company_handle => '111', :name_array => {:items => 'Hat'}, :order! => [:company_handle, :name_array]).returns(:hat_asset)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "finds a collection containing the assets" do
|
78
|
+
collection = subject.find_all_by_name('Hat')
|
79
|
+
collection.length.should == 2
|
80
|
+
collection.first.handle.should == "a|1234"
|
81
|
+
collection.second.handle.should == "a|1235"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe '.create' do
|
87
|
+
before do
|
88
|
+
subject.stubs(:job_name).returns("12345678901234567890")
|
89
|
+
|
90
|
+
savon.expects(:submit_job).with({
|
91
|
+
:company_handle => '111',
|
92
|
+
:job_name => '12345678901234567890',
|
93
|
+
:upload_urls_job => {
|
94
|
+
:url_array => {
|
95
|
+
:items => {
|
96
|
+
:source_url => "http://example.com/image.jpg",
|
97
|
+
:dest_path => "SomeRoot/SomeDirectory/image.jpg",
|
98
|
+
:order! => [:source_url, :dest_path]
|
99
|
+
}
|
100
|
+
},
|
101
|
+
:overwrite => false,
|
102
|
+
:ready_for_publish => false,
|
103
|
+
:create_mask => false,
|
104
|
+
:email_setting => "None",
|
105
|
+
:order! => [:url_array, :overwrite, :ready_for_publish, :create_mask, :email_setting]
|
106
|
+
},
|
107
|
+
:order! => [:company_handle, :job_name, :upload_urls_job]
|
108
|
+
}).returns(:upload_urls_job_response)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns once the image object exists" do
|
112
|
+
asset_mock = mock()
|
113
|
+
Scene7::Asset.stubs(:find_by_name).with("image").returns(nil, asset_mock)
|
114
|
+
asset = subject.create(:source_url => "http://example.com/image.jpg", :dest_path => "SomeRoot/SomeDirectory/image.jpg")
|
115
|
+
asset.should == asset_mock
|
116
|
+
end
|
117
|
+
|
118
|
+
it "gives up and assumes an error after 20 seconds" do
|
119
|
+
asset_mock = mock()
|
120
|
+
Scene7::Asset.stubs(:find_by_name).with("image").returns(nil)
|
121
|
+
|
122
|
+
expect { subject.create(:source_url => "http://example.com/image.jpg", :dest_path => "SomeRoot/SomeDirectory/image.jpg") }.to raise_error("Could not create asset")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe ".job_name" do
|
127
|
+
it "returns a 20-char hash of the name and current time" do
|
128
|
+
Timecop.freeze do
|
129
|
+
require 'digest/sha1'
|
130
|
+
name = Digest::SHA1.hexdigest("test#{Time.now.usec}")[0..20]
|
131
|
+
|
132
|
+
subject.job_name("test").should == name
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe "initialization" do
|
139
|
+
let(:attributes) { {:a => 7, :b => 11, :name => "MY_hero", :asset_handle => "...asset handle..." } }
|
140
|
+
subject { Scene7::Asset.new(attributes) }
|
141
|
+
|
142
|
+
its(:attributes) { should == attributes }
|
143
|
+
its(:name) { should == "MY_hero" }
|
144
|
+
its(:handle) { should == "...asset handle..." }
|
145
|
+
end
|
146
|
+
|
147
|
+
describe "#rename" do
|
148
|
+
let(:attributes) { {:a => 7, :b => 11, :name => "MY_hero", :asset_handle => "222" } }
|
149
|
+
subject { Scene7::Asset.new(attributes) }
|
150
|
+
|
151
|
+
before do
|
152
|
+
Scene7::Client.configure(valid_config)
|
153
|
+
Scene7::Client.stubs(:company_handle).returns('111')
|
154
|
+
end
|
155
|
+
|
156
|
+
it "renames the object" do
|
157
|
+
savon.expects(:rename_asset).with({
|
158
|
+
:company_handle => "111",
|
159
|
+
:asset_handle => "222",
|
160
|
+
:new_name => "new name",
|
161
|
+
:validate_name => true,
|
162
|
+
:rename_files => true,
|
163
|
+
:order! => [:company_handle, :asset_handle, :new_name, :validate_name, :rename_files]
|
164
|
+
}).returns(:success)
|
165
|
+
|
166
|
+
subject.rename("new name").should be_true
|
167
|
+
subject.name.should == "new name"
|
168
|
+
end
|
169
|
+
|
170
|
+
it "does not rename the asset if there is a conflict" do
|
171
|
+
savon.expects(:rename_asset).with({
|
172
|
+
:company_handle => "111",
|
173
|
+
:asset_handle => "222",
|
174
|
+
:new_name => "new name",
|
175
|
+
:validate_name => true,
|
176
|
+
:rename_files => true,
|
177
|
+
:order! => [:company_handle, :asset_handle, :new_name, :validate_name, :rename_files]
|
178
|
+
}).returns(:failure)
|
179
|
+
|
180
|
+
expect { subject.rename("new name") }.to raise_error("Could not rename the file -- name already taken.")
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe "#destroy" do
|
185
|
+
before { Scene7::Client.configure(valid_config) }
|
186
|
+
let(:attributes) { {:a => 7, :b => 11, :name => "MY_hero", :asset_handle => "222" } }
|
187
|
+
subject { Scene7::Asset.new(attributes) }
|
188
|
+
|
189
|
+
it "deletes the asset" do
|
190
|
+
Scene7::Client.expects(:company_handle).returns("111")
|
191
|
+
savon.expects(:delete_asset).with(:company_handle => "111", :asset_handle => "222", :order! => [:company_handle, :asset_handle]).returns(:success)
|
192
|
+
subject.destroy.should be_true
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Scene7::Client do
|
4
|
+
subject { Scene7::Client }
|
5
|
+
let(:valid_config_params) { ['test-instance', 'test@example.com', 'password', 'MyAppName', '1.2'] }
|
6
|
+
let(:valid_config_hash) { {:subdomain => 'test-instance', :user => 'test@example.com', :password => 'password', :app_name => 'MyAppName', :app_version => '1.2' } }
|
7
|
+
|
8
|
+
describe ".configure" do
|
9
|
+
it "sets the configuration" do
|
10
|
+
Scene7::Config.expects(:new).with(*valid_config_params).returns('my config')
|
11
|
+
subject.configure(valid_config_hash)
|
12
|
+
|
13
|
+
subject.configuration.should == 'my config'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns the Scene7::Client class" do
|
17
|
+
subject.configure(valid_config_hash).should == Scene7::Client
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.reset_configuration' do
|
22
|
+
it "resets the configuration by setting it to nil" do
|
23
|
+
Scene7::Config.expects(:new).with(*valid_config_params).returns('my config')
|
24
|
+
subject.configure(valid_config_hash)
|
25
|
+
|
26
|
+
subject.reset_configuration
|
27
|
+
|
28
|
+
subject.configuration.should be_nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '.header' do
|
33
|
+
it "delegates to the configuration" do
|
34
|
+
subject.configure(valid_config_hash)
|
35
|
+
subject.configuration.expects(:header).returns('the header')
|
36
|
+
subject.header.should == 'the header'
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'blows up if there is no configuration' do
|
40
|
+
expect { subject.header }.to raise_error('Call Scene7::Client.configure with your configuration first.')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '.perform_request' do
|
45
|
+
before { subject.configure(valid_config_hash) }
|
46
|
+
it 'performs a SOAP call through the Savon client' do
|
47
|
+
savon.expects(:get_company_info).with(:company_name => 'test').returns(:test_request)
|
48
|
+
|
49
|
+
subject.perform_request(:get_company_info, :company_name => 'test').to_xml.chomp.should == "<myxml />"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe ".client" do
|
54
|
+
let(:scene7_client) { Scene7::Client.configure(valid_config_hash) }
|
55
|
+
subject { scene7_client.client }
|
56
|
+
|
57
|
+
it "is a Savon::Client object" do
|
58
|
+
subject.should be_a(Savon::Client)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "has the appropriate namespace" do
|
62
|
+
subject.wsdl.namespace.should == "http://www.scene7.com/IpsApi/xsd/2010-01-31"
|
63
|
+
end
|
64
|
+
|
65
|
+
it "has the appropriate endpoint" do
|
66
|
+
subject.wsdl.endpoint.should == "https://test-instance.scene7.com/scene7/services/IpsApiService"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '.input_for_action' do
|
71
|
+
subject { Scene7::Client }
|
72
|
+
|
73
|
+
it "camel-cases and appends 'Param' to the action name" do
|
74
|
+
subject.input_for_action(:get_foo).should == 'getFooParam'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '.company_handle' do
|
79
|
+
subject { Scene7::Client }
|
80
|
+
|
81
|
+
before do
|
82
|
+
Scene7::Client.configure(valid_config_hash)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "retrieves the company and returns its handle" do
|
86
|
+
Scene7::Company.expects(:find_by_name).with(valid_config_hash[:app_name]).returns(mock(:handle => 'c|11'))
|
87
|
+
subject.company_handle.should == 'c|11'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Scene7::Company do
|
4
|
+
describe "initialization" do
|
5
|
+
it "stores attributes" do
|
6
|
+
attributes = {:a => 7, :b => 11}
|
7
|
+
|
8
|
+
Scene7::Company.new(attributes).attributes == attributes
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#name" do
|
13
|
+
it "pulls its data from stored attributes" do
|
14
|
+
attributes = {:name => "Example.com"}
|
15
|
+
|
16
|
+
Scene7::Company.new(attributes).name.should == "Example.com"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#handle" do
|
21
|
+
it "pulls its data from stored attributes" do
|
22
|
+
attributes = {:company_handle => "...company handle..."}
|
23
|
+
|
24
|
+
Scene7::Company.new(attributes).handle.should == "...company handle..."
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#root_path" do
|
29
|
+
it "pulls its data from stored attributes" do
|
30
|
+
attributes = {:root_path => "Example.com/"}
|
31
|
+
|
32
|
+
Scene7::Company.new(attributes).root_path.should == "Example.com/"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe ".find_by_name" do
|
37
|
+
subject { Scene7::Company }
|
38
|
+
let(:valid_config) { {:subdomain => 'test-instance', :user => 'test@example.com', :password => 'password', :app_name => 'MyAppName', :app_version => '1.2' } }
|
39
|
+
|
40
|
+
before do
|
41
|
+
Scene7::Client.configure(valid_config)
|
42
|
+
Scene7::Client.stubs(:header).returns({
|
43
|
+
:auth_header => {
|
44
|
+
:user => 'test@example.com',
|
45
|
+
:password => 'password',
|
46
|
+
:app_name => 'Example.com',
|
47
|
+
:app_version => '1.0'
|
48
|
+
},
|
49
|
+
:attributes! => { :auth_header => { :xmlns => "http://www.scene7.com/IpsApi/xsd" } }
|
50
|
+
})
|
51
|
+
|
52
|
+
savon.expects(:get_company_info).with(:company_name => "Example.com").returns(:company)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "finds a company" do
|
56
|
+
subject.find_by_name('Example.com').should be_a(Scene7::Company)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "has the right handle" do
|
60
|
+
subject.find_by_name('Example.com').handle.should == "111"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Scene7::Config do
|
4
|
+
subject { Scene7::Config }
|
5
|
+
let(:valid_options) { ['test-instance', 'test@example.com', 'password', 'MyAppName', '1.2'] }
|
6
|
+
|
7
|
+
describe ".new" do
|
8
|
+
it "configures a subdomain" do
|
9
|
+
config = subject.new(*valid_options)
|
10
|
+
config.subdomain.should == 'test-instance'
|
11
|
+
end
|
12
|
+
|
13
|
+
it "configures a user" do
|
14
|
+
config = subject.new(*valid_options)
|
15
|
+
config.user.should == "test@example.com"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "configures a password" do
|
19
|
+
config = subject.new(*valid_options)
|
20
|
+
config.password.should == "password"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "configures an app name" do
|
24
|
+
config = subject.new(*valid_options)
|
25
|
+
config.app_name.should == "MyAppName"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "configures an app_version" do
|
29
|
+
config = subject.new(*valid_options)
|
30
|
+
config.app_version.should == "1.2"
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'app_version' do
|
34
|
+
it "is cast to a string" do
|
35
|
+
config = subject.new(*valid_options)
|
36
|
+
config.app_version.should == "1.2"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#endpoint' do
|
42
|
+
subject { Scene7::Config.new(*valid_options) }
|
43
|
+
|
44
|
+
it 'returns the endpoint containing the subdomain' do
|
45
|
+
subject.endpoint.should == 'https://test-instance.scene7.com/scene7/services/IpsApiService'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'AUTH_NAMESPACE' do
|
50
|
+
Scene7::Config::AUTH_NAMESPACE.should == "http://www.scene7.com/IpsApi/xsd"
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#header' do
|
54
|
+
subject { Scene7::Config.new(*valid_options) }
|
55
|
+
|
56
|
+
it "returns a hash containing the auth info" do
|
57
|
+
subject.expects(:user).returns('test@example.com')
|
58
|
+
subject.expects(:password).returns('mypassword')
|
59
|
+
subject.expects(:app_name).returns('Example.com')
|
60
|
+
subject.expects(:app_version).returns('1.0')
|
61
|
+
|
62
|
+
header = subject.header
|
63
|
+
|
64
|
+
header[:auth_header].should == {
|
65
|
+
:user => 'test@example.com',
|
66
|
+
:password => 'mypassword',
|
67
|
+
:app_name => 'Example.com',
|
68
|
+
:app_version => '1.0'
|
69
|
+
}
|
70
|
+
|
71
|
+
header[:attributes!].should == {
|
72
|
+
:auth_header => { :xmlns => "http://www.scene7.com/IpsApi/xsd" }
|
73
|
+
}
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Scene7::Crop do
|
4
|
+
subject { Scene7::Crop }
|
5
|
+
|
6
|
+
describe '.format_url_params' do
|
7
|
+
let(:params) { {
|
8
|
+
:scale_factor => 0.5,
|
9
|
+
:x => 50.0,
|
10
|
+
:y => 100.1,
|
11
|
+
:height => 149.8,
|
12
|
+
:width => 250.2
|
13
|
+
} }
|
14
|
+
|
15
|
+
it 'includes the scale and scale factor' do
|
16
|
+
subject.format_url_params(params).should == "scl=0.5&crop=50,100,250,150"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "conversion methods" do
|
21
|
+
let(:params) { {
|
22
|
+
:scale_factor => '2.0',
|
23
|
+
:x => '100',
|
24
|
+
:y => '250',
|
25
|
+
:height => '300',
|
26
|
+
:width => '450'
|
27
|
+
} }
|
28
|
+
|
29
|
+
describe ".convert_from_scale_first_and_format" do
|
30
|
+
it "converts, then formats" do
|
31
|
+
subject.convert_from_scale_first_and_format(params).should == "scl=0.5&crop=50,125,225,150"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '.convert_params_from_scale_first' do
|
36
|
+
before do
|
37
|
+
@result = subject.convert_params_from_scale_first(params)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "converts the scale factor from the scale-first style" do
|
41
|
+
@result[:scale_factor].should == 0.5
|
42
|
+
end
|
43
|
+
|
44
|
+
it "converts the height from the scale-first style" do
|
45
|
+
@result[:height].should == 150
|
46
|
+
end
|
47
|
+
|
48
|
+
it "converts the width from the scale-first style" do
|
49
|
+
@result[:width].should == 225
|
50
|
+
end
|
51
|
+
|
52
|
+
it "converts the left coordinate from the scale-first style" do
|
53
|
+
|
54
|
+
@result[:x].should == 50
|
55
|
+
end
|
56
|
+
|
57
|
+
it "converts the top coordinate from the scale-first style" do
|
58
|
+
@result[:y].should == 125
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Scene7::Folder do
|
4
|
+
subject { Scene7::Folder }
|
5
|
+
let(:valid_config) { {:subdomain => 'test-instance', :user => 'test@example.com', :password => 'password', :app_name => 'MyAppName', :app_version => '1.2' } }
|
6
|
+
|
7
|
+
describe "public API" do
|
8
|
+
before do
|
9
|
+
Scene7::Client.configure(valid_config)
|
10
|
+
Scene7::Client.stubs(:company_handle).returns('111')
|
11
|
+
Scene7::Client.stubs(:header).returns({
|
12
|
+
:auth_header => {
|
13
|
+
:user => 'test@example.com',
|
14
|
+
:password => 'password',
|
15
|
+
:app_name => 'Example.com',
|
16
|
+
:app_version => '1.0'
|
17
|
+
},
|
18
|
+
:attributes! => { :auth_header => { :xmlns => "http://www.scene7.com/IpsApi/xsd" } }
|
19
|
+
})
|
20
|
+
end
|
21
|
+
|
22
|
+
describe ".all" do
|
23
|
+
it "retrieves all folders" do
|
24
|
+
savon.expects(:get_folders).with(:company_handle => "111").returns(:folders)
|
25
|
+
|
26
|
+
subject.all
|
27
|
+
end
|
28
|
+
|
29
|
+
it "retrives a collection of Folders" do
|
30
|
+
savon.stubs(:get_folders).with(:company_handle => "111").returns(:folders)
|
31
|
+
|
32
|
+
folders = subject.all
|
33
|
+
|
34
|
+
folders.all? { |f| f.is_a?(subject) }.should be_true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns folders that are properly initialized" do
|
38
|
+
savon.stubs(:get_folders).with(:company_handle => "111").returns(:folders)
|
39
|
+
|
40
|
+
folders = subject.all
|
41
|
+
|
42
|
+
folder = folders.first
|
43
|
+
|
44
|
+
folder.handle.should == "handle-1"
|
45
|
+
folder.path.should == "folder-path-1"
|
46
|
+
folder.last_modified.should == "20080726T08:36:19.19305:00"
|
47
|
+
folder.has_subfolders.should == true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe ".find_by_file_handle" do
|
52
|
+
it "should return a single folder instance" do
|
53
|
+
savon.stubs(:get_folders).with(:company_handle => "111").returns(:folders)
|
54
|
+
|
55
|
+
folder = Scene7::Folder.find_by_handle("handle-2")
|
56
|
+
|
57
|
+
folder.handle.should == "handle-2"
|
58
|
+
folder.path.should == "folder-path-2"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should return nil if the file does not exist" do
|
62
|
+
savon.stubs(:get_folders).with(:company_handle => "111").returns(:folders)
|
63
|
+
|
64
|
+
Scene7::Folder.find_by_handle("non-existant-handle").should be_nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe ".create" do
|
69
|
+
pending "it handles errors"
|
70
|
+
# already exists
|
71
|
+
# bad path
|
72
|
+
|
73
|
+
it "creates a folder" do
|
74
|
+
savon.expects(:create_folder).with(:company_handle => "111", :folder_path => "SomeRoot/SomeFolder", :order! => [:company_handle, :folder_path]).returns(:folder)
|
75
|
+
|
76
|
+
subject.create(:folder_path => "SomeRoot/SomeFolder")
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should return a folder that knows its handle" do
|
80
|
+
savon.stubs(:create_folder).with(:company_handle => "111", :folder_path => "SomeRoot/SomeFolder").returns(:folder)
|
81
|
+
|
82
|
+
response = subject.create(:folder_path => "SomeRoot/SomeFolder")
|
83
|
+
|
84
|
+
response.handle.should == "exampleFolderHandle"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should raise an error if folder path is not set" do
|
88
|
+
savon.stubs(:create_folder)
|
89
|
+
|
90
|
+
expect { subject.create(:bogus_param => "bogus!") }.should raise_error(RuntimeError, ":folder_path is required to create a folder")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#destroy" do
|
95
|
+
it "should destroy a folder" do
|
96
|
+
folder = Scene7::Folder.new(:folder_handle => "folder-handle-1")
|
97
|
+
|
98
|
+
savon.expects(:delete_folder).with(:company_handle => "111", :folder_handle => "folder-handle-1", :order! => [:company_handle, :folder_handle]).returns(:empty_response)
|
99
|
+
|
100
|
+
folder.destroy
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should return true if the deletion is successful" do
|
104
|
+
folder = Scene7::Folder.new(:folder_handle => "folder-handle-1")
|
105
|
+
|
106
|
+
savon.stubs(:delete_folder).with(:company_handle => "111", :folder_handle => "folder-handle-1").returns(:empty_response)
|
107
|
+
|
108
|
+
folder.destroy.should be_true
|
109
|
+
end
|
110
|
+
|
111
|
+
pending "error handling"
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'scene7-wrapper'
|
2
|
+
require 'savon_spec'
|
3
|
+
require 'timecop'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.include Savon::Spec::Macros
|
7
|
+
|
8
|
+
config.before(:each) do
|
9
|
+
Scene7::Client.reset_configuration
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Savon::Spec::Fixture.path = File.join(File.dirname(__FILE__), 'fixtures')
|
14
|
+
Savon.configure do |config|
|
15
|
+
config.log = false
|
16
|
+
end
|