metaforce 0.5.3 → 1.0.0a

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 (72) hide show
  1. data/.gitignore +1 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +1 -11
  4. data/LICENSE +22 -0
  5. data/README.md +91 -96
  6. data/Rakefile +6 -14
  7. data/examples/example.rb +51 -0
  8. data/lib/metaforce/abstract_client.rb +76 -0
  9. data/lib/metaforce/client.rb +27 -0
  10. data/lib/metaforce/config.rb +41 -19
  11. data/lib/metaforce/job/crud.rb +13 -0
  12. data/lib/metaforce/job/deploy.rb +87 -0
  13. data/lib/metaforce/job/retrieve.rb +92 -0
  14. data/lib/metaforce/job.rb +183 -0
  15. data/lib/metaforce/login.rb +39 -0
  16. data/lib/metaforce/manifest.rb +18 -93
  17. data/lib/metaforce/metadata/client/crud.rb +86 -0
  18. data/lib/metaforce/metadata/client/file.rb +113 -0
  19. data/lib/metaforce/metadata/client.rb +7 -225
  20. data/lib/metaforce/services/client.rb +45 -86
  21. data/lib/metaforce/version.rb +1 -1
  22. data/lib/metaforce.rb +27 -7
  23. data/metaforce.gemspec +19 -16
  24. data/spec/fixtures/package.xml +1 -1
  25. data/spec/fixtures/payload.zip +0 -0
  26. data/spec/fixtures/requests/{describe_layout → foo}/invalid_session.xml +0 -0
  27. data/spec/fixtures/requests/send_email/success.xml +1 -0
  28. data/spec/lib/client_spec.rb +34 -0
  29. data/spec/lib/config_spec.rb +8 -50
  30. data/spec/lib/job/deploy_spec.rb +53 -0
  31. data/spec/lib/job/retrieve_spec.rb +28 -0
  32. data/spec/lib/job_spec.rb +95 -0
  33. data/spec/lib/login_spec.rb +18 -0
  34. data/spec/lib/manifest_spec.rb +22 -168
  35. data/spec/lib/metadata/client_spec.rb +84 -179
  36. data/spec/lib/metaforce_spec.rb +20 -0
  37. data/spec/lib/services/client_spec.rb +22 -35
  38. data/spec/spec_helper.rb +24 -3
  39. data/spec/support/client.rb +38 -0
  40. data/wsdl/26.0/metadata.xml +4750 -0
  41. data/wsdl/26.0/partner.xml +3340 -0
  42. metadata +114 -77
  43. data/Guardfile +0 -9
  44. data/bin/metaforce +0 -6
  45. data/lib/metaforce/core_extensions/string.rb +0 -31
  46. data/lib/metaforce/core_extensions.rb +0 -1
  47. data/lib/metaforce/custom_actions.rb +0 -29
  48. data/lib/metaforce/error.rb +0 -3
  49. data/lib/metaforce/login_details.rb +0 -28
  50. data/lib/metaforce/metadata/crud.rb +0 -103
  51. data/lib/metaforce/metadata/file.rb +0 -74
  52. data/lib/metaforce/metadata/transaction.rb +0 -100
  53. data/lib/metaforce/metadata.rb +0 -4
  54. data/lib/metaforce/rake/deploy.rb +0 -35
  55. data/lib/metaforce/rake/retrieve.rb +0 -39
  56. data/lib/metaforce/rake/tests.rb +0 -62
  57. data/lib/metaforce/rake.rb +0 -43
  58. data/lib/metaforce/services.rb +0 -1
  59. data/lib/metaforce/tasks/README.md +0 -62
  60. data/lib/metaforce/tasks/metaforce.rake +0 -5
  61. data/lib/metaforce/thor/metaforce.rb +0 -117
  62. data/lib/metaforce/types.rb +0 -249
  63. data/spec/.gitignore +0 -1
  64. data/spec/fixtures/sample/Rakefile +0 -2
  65. data/spec/fixtures/sample/metaforce.yml +0 -13
  66. data/spec/fixtures/sample/src/classes/TestClass.cls +0 -2
  67. data/spec/fixtures/sample/src/classes/TestClass.cls-meta.xml +0 -5
  68. data/spec/fixtures/sample/src/package.xml +0 -8
  69. data/spec/lib/core_extensions/string_spec.rb +0 -23
  70. data/spec/lib/metadata/crud_spec.rb +0 -66
  71. data/spec/lib/metadata/file_spec.rb +0 -17
  72. data/spec/lib/metadata/transaction_spec.rb +0 -68
@@ -1,232 +1,14 @@
1
- require 'metaforce/manifest'
2
- require 'savon'
3
- require 'zip/zip'
4
- require 'base64'
5
- require 'tmpdir'
6
-
7
1
  module Metaforce
8
2
  module Metadata
9
- class Client
10
-
11
- # Performs a login and sets the session_id and metadata_server_url.
12
- #
13
- # +options+ should be hash containing the +:username+, +:password+ and
14
- # +:security_token+ keys.
15
- #
16
- # == Examples
17
- #
18
- # Metaforce::Metadata::Client.new :username => "username",
19
- # :password => "password",
20
- # :security_token => "security token"
21
- def initialize(options=nil)
22
- @session = Services::Client.new(options).session
23
- @client = Savon::Client.new File.expand_path("../../../../wsdl/#{Metaforce.configuration.api_version}/metadata.xml", __FILE__) do |wsdl|
24
- wsdl.endpoint = @session[:metadata_server_url]
25
- end
26
- @client.http.auth.ssl.verify_mode = :none
27
- @header = {
28
- "ins0:SessionHeader" => {
29
- "ins0:sessionId" => @session[:session_id]
30
- }
31
- }
32
- end
33
-
34
- # Specify an array of component types to list.
35
- #
36
- # == Examples
37
- #
38
- # # Get a list of apex classes on the server and output the names of each
39
- # client.list(:type => "ApexClass").collect { |t| t[:full_name] }
40
- # #=> ["al__SObjectPaginatorListenerForTesting", "al__IndexOutOfBoundsException", ... ]
41
- #
42
- # # Get a list of apex components and apex classes
43
- # client.list([{ :type => "CustomObject" }, { :type => "ApexComponent" }])
44
- # #=> ["ContractContactRole", "Solution", "Invoice_Statements__c", ... ]
45
- def list(queries=[])
46
- if queries.is_a?(Symbol)
47
- queries = { :type => queries.to_s.camelcase }
48
- elsif queries.is_a?(String)
49
- queries = { :type => queries }
50
- end
51
- queries = [ queries ] unless queries.is_a?(Array)
52
- response = @client.request(:list_metadata) do |soap|
53
- soap.header = @header
54
- soap.body = {
55
- :queries => queries
56
- }
57
- end
58
- return [] unless response.body[:list_metadata_response]
59
- response.body[:list_metadata_response][:result]
60
- end
61
-
62
- # Describe the organization's metadata and cache the response
63
- #
64
- # == Examples
65
- #
66
- # # List the names of all metadata types
67
- # client.describe[:metadata_objects].collect { |t| t[:xml_name] }
68
- # #=> ["CustomLabels", "StaticResource", "Scontrol", "ApexComponent", ... ]
69
- def describe(version=nil)
70
- @describe ||= describe!(version)
71
- end
72
-
73
- # See +describe+
74
- def describe!(version=nil)
75
- response = @client.request(:describe_metadata) do |soap|
76
- soap.header = @header
77
- soap.body = { :api_version => version } unless version.nil?
78
- end
79
- @describe = response.body[:describe_metadata_response][:result]
80
- end
81
-
82
- # Lists all metadata objects on the org. Same as
83
- # +client.describe[:metadata_objects]
84
- #
85
- # == Examples
86
- #
87
- # # List the names of all metadata types
88
- # client.metadata_objects.collect { |t| t[:xml_name] }
89
- # #=> ["CustomLabels", "StaticResource", "Scontrol", "ApexComponent", ... ]
90
- def metadata_objects(version=nil)
91
- describe(version)[:metadata_objects]
92
- end
93
-
94
- # Checks the status of an async result. If type is +:retrieve+ or +:deploy+,
95
- # it returns the RetrieveResult or DeployResult, respectively
96
- #
97
- # == Examples
98
- #
99
- # client.status('04sU0000000Wx6KIAS')
100
- # #=> {:done=>true, :id=>"04sU0000000Wx6KIAS", :state=>"Completed", :state_detail_last_modified_date=>#<DateTime: 2012-02-03T18:30:38+00:00 ((2455961j,66638s,0n),+0s,2299161j)>}
101
- def status(ids, type=nil)
102
- request = "check_status"
103
- request = "check_#{type.to_s}_status" unless type.nil?
104
- ids = [ ids ] unless ids.is_a?(Array)
105
-
106
- Metaforce.log("Polling server for status on #{ids.join(', ')}")
107
-
108
- response = @client.request(request.to_sym) do |soap|
109
- soap.header = @header
110
- soap.body = {
111
- :ids => ids
112
- }
113
- end
114
- response.body["#{request}_response".to_sym][:result]
115
- end
116
-
117
- # Returns true if the deployment with id id is done, false otherwise
118
- #
119
- # == Examples
120
- #
121
- # client.done?('04sU0000000Wx6KIAS')
122
- # #=> true
123
- def done?(id)
124
- self.status(id)[:done] || false
125
- end
126
-
127
- # Deploys +path+ to the organisation. +path+ can either be a path to
128
- # a directory or a path to a zip file.
129
- #
130
- # +options+ can contain any of the following keys:
131
- #
132
- # +options+:
133
- # See http://www.salesforce.com/us/developer/docs/api_meta/Content/meta_deploy.htm#deploy_options
134
- # for a list of _deploy_options_. Options should be convereted from
135
- # camelCase to an :underscored_symbol.
136
- #
137
- # == Examples
138
- #
139
- # deploy = client.deploy File.expand_path("myeclipseproj")
140
- # #=> #<Metaforce::Transaction:0x1159bd0 @id='04sU0000000Wx6KIAS' @type=:deploy>
141
- #
142
- # deploy.done?
143
- # #=> true
144
- #
145
- # deploy.status[:state]
146
- # #=> "Completed"
147
- def deploy(path, options={})
148
- if path.is_a?(String)
149
- zip_contents = create_deploy_file(path)
150
- elsif path.is_a?(File)
151
- zip_contents = Base64.encode64(path.read)
152
- end
153
-
154
- Metaforce.log('Executing deploy')
155
-
156
- response = @client.request(:deploy) do |soap|
157
- soap.header = @header
158
- soap.body = {
159
- :zip_file => zip_contents,
160
- :deploy_options => options[:options] || {}
161
- }
162
- end
163
- Transaction.deployment self, response[:deploy_response][:result][:id]
164
- end
165
-
166
- # Performs a retrieve
167
- #
168
- # See http://www.salesforce.com/us/developer/docs/api_meta/Content/meta_retrieve_request.htm
169
- # for a list of _retrieve_request_ options. Options should be convereted from
170
- # camelCase to an :underscored_symbol. _retrieve_request_ options should
171
- # be specified under the +:options+ key in options.
172
- def retrieve(options={})
173
- Metaforce.log('Executing retrieve')
174
-
175
- response = @client.request(:retrieve) do |soap|
176
- soap.header = @header
177
- soap.body = {
178
- :retrieve_request => options[:options] || {}
179
- }
180
- end
181
- Transaction.retrieval(self, response[:retrieve_response][:result][:id])
182
- end
183
-
184
- # Retrieves files specified in the manifest file (package.xml). Specificy any extra options in +options[:options]+.
185
- #
186
- # == Examples
187
- #
188
- # retrieve = client.retrieve_unpackaged File.expand_path("spec/fixtures/sample/src/package.xml")
189
- # #=> #<Metaforce::Transaction:0x1159bd0 @id='04sU0000000Wx6KIAS' @type=:retrieve>
190
- def retrieve_unpackaged(manifest, options={})
191
- if manifest.is_a?(Metaforce::Manifest)
192
- package = manifest.to_package
193
- elsif manifest.is_a?(String)
194
- package = Metaforce::Manifest.new(File.open(manifest).read).to_package
195
- end
196
- options[:options] = {
197
- :api_version => Metaforce.configuration.api_version,
198
- :single_package => true,
199
- :unpackaged => {
200
- :types => package
201
- }
202
- }.merge(options[:options] || {})
203
- retrieve(options)
204
- end
205
-
206
- private
207
-
208
- def method_missing(name, *args, &block)
209
- if name =~ /^list_(.*)$/ && metadata_objects.any? { |m| m[:xml_name] == $1.camelcase }
210
- list("#{$1}".to_sym)
211
- else
212
- super
213
- end
214
- end
3
+ class Client < Metaforce::AbstractClient
4
+ require 'metaforce/metadata/client/file'
5
+ require 'metaforce/metadata/client/crud'
215
6
 
216
- # Creates the deploy file, reads in the contents and returns the base64
217
- # encoded data
218
- def create_deploy_file(dir)
219
- Dir.mktmpdir do |path|
220
- path = File.join path, 'deploy.zip'
221
- Zip::ZipFile.open(path, Zip::ZipFile::CREATE) do |zip|
222
- Dir["#{dir}/**/**"].each do |file|
223
- zip.add(file.sub("#{File.dirname(dir)}/", ''), file)
224
- end
225
- end
226
- Base64.encode64(File.open(path, "rb").read)
227
- end
228
- end
7
+ include Metaforce::Metadata::Client::File
8
+ include Metaforce::Metadata::Client::CRUD
229
9
 
10
+ endpoint :metadata_server_url
11
+ wsdl Metaforce.configuration.metadata_wsdl
230
12
  end
231
13
  end
232
14
  end
@@ -1,106 +1,65 @@
1
- require 'savon'
2
-
3
1
  module Metaforce
4
2
  module Services
5
- class Client
6
- # Contains the session_id and metadata_server_url
7
- attr_reader :session
8
-
9
- # Initializes a new instance of Client and logs in. _options_ should be a
10
- # hash containing the username, password and security token. If options
11
- # is nil, it will get the username, password and security token from the
12
- # configuration.
13
- def initialize(options=nil)
14
- @options = options
15
- # Convert string keys to hashes
16
- @options.dup.each { |key, value| options[key.to_sym] = value } if options.is_a?(Hash)
3
+ class Client < Metaforce::AbstractClient
4
+ endpoint :server_url
5
+ wsdl Metaforce.configuration.partner_wsdl
17
6
 
18
- @options = {
19
- :username => Metaforce.configuration.username,
20
- :password => Metaforce.configuration.password,
21
- :security_token => Metaforce.configuration.security_token
22
- } if @options.nil?
23
- @session = self.login(@options[:username], @options[:password], @options[:security_token])
24
-
25
- @client = Savon::Client.new File.expand_path("../../../../wsdl/#{Metaforce.configuration.api_version}/partner.xml", __FILE__) do |wsdl|
26
- wsdl.endpoint = @session[:services_url]
27
- end
28
- @client.http.auth.ssl.verify_mode = :none
29
- end
30
-
31
- # Performs a login and retrurns the session
32
- def login(username, password, security_token=nil)
33
- password = "#{password}#{security_token}" unless security_token.nil?
34
- client = Savon::Client.new File.expand_path("../../../../wsdl/#{Metaforce.configuration.api_version}/partner.xml", __FILE__) do |wsdl|
35
- wsdl.endpoint = wsdl.endpoint.to_s.sub(/login/, 'test') if Metaforce.configuration.test
36
- Metaforce.log("Logging in via #{wsdl.endpoint.to_s}")
37
- end
38
- client.http.auth.ssl.verify_mode = :none
39
-
40
- response = client.request(:login) do
7
+ # Public: Sends an email using Salesforce.
8
+ #
9
+ # options - Hash of email options (http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_calls_sendemail.htm)
10
+ #
11
+ # Examples
12
+ #
13
+ # client.send_email(
14
+ # to_addresses: ['foo@bar.com'],
15
+ # subject: 'Hello World',
16
+ # plain_text_body: 'Hello World'
17
+ # )
18
+ #
19
+ # Returns the result.
20
+ def send_email(options={})
21
+ request :send_email do |soap|
41
22
  soap.body = {
42
- :username => username,
43
- :password => password
23
+ :messages => options,
24
+ :attributes! => { 'ins0:messages' => { 'xsi:type' => 'ins0:SingleEmailMessage' } }
44
25
  }
45
26
  end
46
- { :session_id => response.body[:login_response][:result][:session_id],
47
- :metadata_server_url => response.body[:login_response][:result][:metadata_server_url],
48
- :services_url => response.body[:login_response][:result][:server_url] }
49
27
  end
50
28
 
51
- # Returns the layout metadata for the sobject.
52
- # If a +record_type_id+ is passed in, it will only return the layout for
53
- # that record type.
29
+ # Public: Retrieves layout information for the specified sobject.
54
30
  #
55
- # This method is really useful finding out picklist values that are
56
- # available for a certain record type
31
+ # sobject - String name of the sobject.
32
+ # record_type_id - String id of a record type to filter on.
57
33
  #
58
- # == Examples
34
+ # Examples
59
35
  #
60
- # @picklists_for_record_type = client.describe_layout('Account', '0123000000100Rn')[:record_type_mappings][:picklists_for_record_type]
36
+ # client.describe_layout('Account', '012000000000000AAA')
61
37
  #
62
- # def picklist_values_for(field)
63
- # picklist_values = @picklists_for_record_type.select { |f| f[:picklist_name] == field }.first[:picklist_values]
64
- # picklist_values.select { |p| p[:active] }.collect { |p| [ p[:label], p[:value] ] }
65
- # end
66
- #
67
- # picklist_values_for('some_field__c')
68
- # # => [ ['label1', 'value1'], ['label2', 'value2'] ]
38
+ # Returns the layout metadata for the sobject.
69
39
  def describe_layout(sobject, record_type_id=nil)
70
- body = {
71
- 'sObjectType' => sobject
72
- }
73
- body['recordTypeID'] = record_type_id if record_type_id
74
- response = request(:describe_layout) do |soap|
75
- soap.header = header
76
- soap.body = body
40
+ request :describe_layout do |soap|
41
+ soap.body = { 'sObjectType' => sobject }
42
+ soap.body.merge!('recordTypeID' => record_type_id) if record_type_id
77
43
  end
78
- response.body[:describe_layout_response][:result]
79
- end
80
-
81
- private
82
-
83
- def header
84
- {
85
- "ins0:SessionHeader" => {
86
- "ins0:sessionId" => @session[:session_id]
87
- }
88
- }
89
44
  end
90
45
 
91
- def request(*args, &block)
92
- begin
93
- @client.request(*args, &block)
94
- rescue Savon::SOAP::Fault => e
95
- if e.message =~ /INVALID_SESSION_ID/
96
- @session = self.login(@options[:username], @options[:password], @options[:security_token])
97
- @client.request(*args, &block)
98
- else
99
- raise e
100
- end
101
- end
46
+ # Public: Get active picklists for a record type.
47
+ #
48
+ # sobject - String name of the sobject.
49
+ # record_type_id - String id of a record type to filter on.
50
+ # field - String name of the field to get picklist values for.
51
+ #
52
+ # Examples
53
+ #
54
+ # client.picklist_values('Account', '012000000000000AAA', 'Some_Field__c')
55
+ # # => [['Label', 'Value']]
56
+ #
57
+ # Returns the picklist_values
58
+ def picklist_values(sobject, record_type_id, field)
59
+ describe_layout(sobject, record_type_id).record_type_mappings.picklists_for_record_type
60
+ .select { |p| p.picklist_name == field }.first.picklist_values
61
+ .select { |p| p.active }.collect { |p| [ p.label, p.value ] }
102
62
  end
103
-
104
63
  end
105
64
  end
106
65
  end
@@ -1,3 +1,3 @@
1
1
  module Metaforce
2
- VERSION = "0.5.3"
2
+ VERSION = '1.0.0a'
3
3
  end
data/lib/metaforce.rb CHANGED
@@ -1,9 +1,29 @@
1
+ require 'savon'
2
+ require 'hashie'
3
+ require 'active_support/core_ext'
4
+
1
5
  require 'metaforce/version'
2
- require 'metaforce/core_extensions'
3
6
  require 'metaforce/config'
4
- require 'metaforce/error'
5
- require 'metaforce/manifest'
6
- require 'metaforce/services'
7
- require 'metaforce/metadata'
8
- require 'metaforce/custom_actions'
9
- require 'metaforce/login_details'
7
+ require 'metaforce/job'
8
+ require 'metaforce/abstract_client'
9
+ require 'metaforce/services/client'
10
+ require 'metaforce/metadata/client'
11
+
12
+ module Metaforce
13
+ autoload :Manifest, 'metaforce/manifest'
14
+ autoload :Login, 'metaforce/login'
15
+ autoload :Client, 'metaforce/client'
16
+
17
+ class << self
18
+ # Public: Initializes instances of the metadata and services api clients
19
+ # and provides helper methods for deploying and retrieving code.
20
+ def new(*args)
21
+ Client.new(*args)
22
+ end
23
+
24
+ # Performs a login and retrurns the session
25
+ def login(options={})
26
+ Login.new(options.delete(:username), options.delete(:password), options.delete(:security_token)).login
27
+ end
28
+ end
29
+ end
data/metaforce.gemspec CHANGED
@@ -1,30 +1,33 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "metaforce/version"
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'metaforce/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "metaforce"
6
+ s.name = 'metaforce'
7
7
  s.version = Metaforce::VERSION
8
- s.authors = ["Eric J. Holmes", "Kevin J. Poorman"]
9
- s.email = ["eric@ejholmes.net", "Kevinp@madronasg.com"]
10
- s.homepage = "https://github.com/ejholmes/metaforce"
8
+ s.authors = ['Eric J. Holmes', 'Kevin J. Poorman']
9
+ s.email = ['eric@ejholmes.net', 'Kevinp@madronasg.com']
10
+ s.homepage = 'https://github.com/ejholmes/metaforce'
11
11
  s.summary = %q{A Ruby gem for interacting with the Salesforce Metadata API}
12
12
  s.description = %q{A Ruby gem for interacting with the Salesforce Metadata API}
13
+ s.post_install_message = <<-EOL
14
+ Warning! Metaforce 1.0.x is a complete rewrite and is not backwards compatible with 0.5.x
15
+ EOL
13
16
 
14
- s.rubyforge_project = "metaforce"
17
+ s.rubyforge_project = 'metaforce'
15
18
 
16
19
  s.files = `git ls-files`.split("\n")
17
20
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
21
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.require_paths = ["lib"]
22
+ s.require_paths = ['lib']
20
23
 
21
- s.add_dependency "nokogiri", "~> 1.5.0"
22
- s.add_dependency "savon", "~> 0.9.7"
23
- s.add_dependency "rubyzip", "~> 0.9.5"
24
- s.add_dependency "term-ansicolor"
24
+ s.add_dependency 'savon', '~> 1.2.0'
25
+ s.add_dependency 'rubyzip', '~> 0.9.9'
26
+ s.add_dependency 'activesupport'
27
+ s.add_dependency 'hashie'
25
28
 
26
- s.add_development_dependency "rake"
27
- s.add_development_dependency "rspec"
28
- s.add_development_dependency "mocha"
29
- s.add_development_dependency "savon_spec", "~> 0.1.6"
29
+ s.add_development_dependency 'rake'
30
+ s.add_development_dependency 'rspec'
31
+ s.add_development_dependency 'webmock'
32
+ s.add_development_dependency 'savon_spec', '~> 1.3.0'
30
33
  end
@@ -13,5 +13,5 @@
13
13
  <members>Assets</members>
14
14
  <name>StaticResource</name>
15
15
  </types>
16
- <version>23.0</version>
16
+ <version>26.0</version>
17
17
  </Package>
Binary file
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com"><soapenv:Body><sendEmailResponse><result><success>true</success></result></sendEmailResponse></soapenv:Body></soapenv:Envelope>
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metaforce::Client do
4
+ let(:options) { { session_id: 'foobar' } }
5
+ let(:client) { described_class.new(options) }
6
+
7
+ describe '.metadata' do
8
+ subject { client.metadata }
9
+ it { should be_a Metaforce::Metadata::Client }
10
+ end
11
+
12
+ describe '.services' do
13
+ subject { client.services }
14
+ it { should be_a Metaforce::Services::Client }
15
+ end
16
+
17
+ describe '.method_missing' do
18
+ %w[services metadata].each do |type|
19
+ context "when the #{type} client responds to method" do
20
+ it 'proxies to the method' do
21
+ client.send(type.to_sym).should_receive(:respond_to?).with(:foobar, false).and_return(true)
22
+ client.send(type.to_sym).should_receive(:foobar)
23
+ client.foobar
24
+ end
25
+ end
26
+ end
27
+
28
+ context 'when neither client responds to method' do
29
+ it 'raises an exception' do
30
+ expect { client.foobar }.to raise_error NoMethodError
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,54 +1,12 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe Metaforce do
4
- describe ".configuration" do
5
-
6
- it "sets the default api version to 23.0" do
7
- Metaforce.configuration.api_version.should eq("23.0")
8
- end
9
-
10
- it "allows you to configure the api version" do
11
- Metaforce.configuration.api_version = "21.0"
12
- Metaforce.configuration.api_version.should eq("21.0")
13
- end
14
-
15
- end
16
-
17
- describe ".configure" do
18
-
19
- it "allows you to configure the api version" do
20
- Metaforce.configure do |config|
21
- config.api_version = "21.0"
22
- end
23
- Metaforce.configuration.api_version.should eq("21.0")
24
- end
25
-
26
- context "credentials" do
27
-
28
- it "allows you to set the credentials via the configure block" do
29
- Metaforce.configure do |config|
30
- config.api_version = "23.0"
31
- config.username = "valid"
32
- config.password = "password"
33
- end
34
- savon.expects(:login).with(:username => 'valid', :password => 'password').returns(:success)
35
- session = Metaforce::Services::Client.new.session
36
- session.should eq({ :session_id => "00DU0000000Ilbh!AQoAQHVcube9Z6CRlbR9Eg8ZxpJlrJ6X8QDbnokfyVZItFKzJsLHIRGiqhzJkYsNYRkd3UVA9.s82sbjEbZGUqP3mG6TP_P8",
37
- :metadata_server_url => "https://na12-api.salesforce.com/services/Soap/m/23.0/00DU0000000Albh",
38
- :services_url => "https://na12-api.salesforce.com/services/Soap/u/23.0/00DU0000000Ilbh" })
39
- end
40
-
41
- it "allows you to set the credentials via the configure block" do
42
- Metaforce.configure do |config|
43
- config.api_version = "23.0"
44
- config.username = "valid"
45
- config.password = "password"
46
- end
47
- savon.expects(:login).with(:username => 'valid', :password => 'password').returns(:success)
48
- expect { Metaforce::Metadata::Client.new }.to_not raise_error
49
- end
50
-
51
- end
52
-
4
+ describe '.configuration' do
5
+ subject { Metaforce.configuration }
6
+ it { should set_default(:api_version).to('26.0') }
7
+ it { should set_default(:host).to('login.salesforce.com') }
8
+ it { should set_default(:endpoint).to('https://login.salesforce.com/services/Soap/u/26.0') }
9
+ it { should set_default(:partner_wsdl).to(File.expand_path('../../../wsdl/26.0/partner.xml', __FILE__)) }
10
+ it { should set_default(:metadata_wsdl).to(File.expand_path('../../../wsdl/26.0/metadata.xml', __FILE__)) }
53
11
  end
54
12
  end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metaforce::Job::Deploy do
4
+ let(:client) { double('metadata client') }
5
+ let(:path) { File.expand_path('../../../fixtures/payload.zip', __FILE__) }
6
+ let(:job) { described_class.new client, path }
7
+
8
+ describe '.payload' do
9
+ subject { job.payload }
10
+
11
+ context 'when the path is a file' do
12
+ it { should be_a String }
13
+ end
14
+
15
+ context 'when the path is a directory' do
16
+ let(:path) { File.expand_path('../../../fixtures', __FILE__) }
17
+ it { should be_a String }
18
+ end
19
+ end
20
+
21
+ describe '.perform' do
22
+ before do
23
+ client.should_receive(:_deploy).with(job.payload, {}).and_return(Hashie::Mash.new(id: '1234'))
24
+ client.should_receive(:status).any_number_of_times.and_return(Hashie::Mash.new(done: true, state: 'Completed'))
25
+ end
26
+
27
+ subject { job.perform }
28
+ it { should eq job }
29
+ its(:id) { should eq '1234' }
30
+ end
31
+
32
+ describe '.result' do
33
+ let(:response) { Hashie::Mash.new(success: true) }
34
+
35
+ before do
36
+ client.should_receive(:status).with(job.id, :deploy).and_return(response)
37
+ end
38
+
39
+ subject { job.result }
40
+ it { should eq response }
41
+ end
42
+
43
+ describe '.success?' do
44
+ let(:response) { Hashie::Mash.new(success: true) }
45
+
46
+ before do
47
+ client.should_receive(:status).with(job.id, :deploy).and_return(response)
48
+ end
49
+
50
+ subject { job.success? }
51
+ it { should be_true }
52
+ end
53
+ end