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
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metaforce::Job::Retrieve do
4
+ let(:client) { double('metadata client') }
5
+ let(:job) { described_class.new client }
6
+
7
+ describe '.result' do
8
+ let(:response) { Hashie::Mash.new(success: true) }
9
+
10
+ before do
11
+ client.should_receive(:status).with(job.id, :retrieve).and_return(response)
12
+ end
13
+
14
+ subject { job.result }
15
+ it { should eq response }
16
+ end
17
+
18
+ describe '.zip_file' do
19
+ let(:response) { Hashie::Mash.new(success: true, zip_file: 'foobar') }
20
+
21
+ before do
22
+ client.should_receive(:status).with(job.id, :retrieve).and_return(response)
23
+ end
24
+
25
+ subject { job.zip_file }
26
+ it { should eq "~\x8A\e" }
27
+ end
28
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metaforce::Job do
4
+ let(:client) { double('client') }
5
+ let(:job) { described_class.new(client) }
6
+
7
+ describe '.perform' do
8
+ it 'starts a heart beat' do
9
+ job.should_receive(:start_heart_beat)
10
+ job.perform
11
+ end
12
+ end
13
+
14
+ describe '.on_complete' do
15
+ it 'allows the user to register an on_complete callback' do
16
+ client.should_receive(:status).any_number_of_times.and_return(Hashie::Mash.new(done: true, state: 'Completed'))
17
+ called = false
18
+ block = lambda { |job| called = true }
19
+ job.on_complete &block
20
+ job.perform
21
+ expect(called).to be_true
22
+ end
23
+ end
24
+
25
+ describe '.on_error' do
26
+ it 'allows the user to register an on_error callback' do
27
+ client.should_receive(:status).any_number_of_times.and_return(Hashie::Mash.new(done: true, state: 'Error'))
28
+ called = false
29
+ block = lambda { |job| called = true }
30
+ job.on_error &block
31
+ job.perform
32
+ expect(called).to be_true
33
+ end
34
+ end
35
+
36
+ describe '.status' do
37
+ before do
38
+ client.should_receive(:status)
39
+ end
40
+
41
+ subject { job.status }
42
+ it { should be_nil }
43
+ end
44
+
45
+ describe '.done?' do
46
+ subject { job.done? }
47
+
48
+ context 'when done' do
49
+ before do
50
+ client.should_receive(:status).and_return(Hashie::Mash.new(done: true))
51
+ end
52
+
53
+ it { should be_true }
54
+ end
55
+
56
+ context 'when not done' do
57
+ before do
58
+ client.should_receive(:status).and_return(Hashie::Mash.new(done: false))
59
+ end
60
+
61
+ it { should be_false }
62
+ end
63
+ end
64
+
65
+ describe '.state' do
66
+ subject { job.state }
67
+
68
+ context 'when done' do
69
+ before do
70
+ client.should_receive(:status).twice.and_return(Hashie::Mash.new(done: true, state: 'Completed'))
71
+ end
72
+
73
+ it { should eq 'Completed' }
74
+ end
75
+
76
+ context 'when not done' do
77
+ before do
78
+ client.should_receive(:status).once.and_return(Hashie::Mash.new(done: false))
79
+ end
80
+
81
+ it { should be_false }
82
+ end
83
+ end
84
+
85
+ %w[Queued InProgress Completed Error].each do |state|
86
+ describe ".#{state.underscore}?" do
87
+ before do
88
+ client.should_receive(:status).twice.and_return(Hashie::Mash.new(done: true, state: state))
89
+ end
90
+
91
+ subject { job.send(:"#{state.underscore}?") }
92
+ it { should be_true }
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metaforce::Login do
4
+ let(:klass) { described_class.new('foo', 'bar', 'whizbang') }
5
+
6
+ describe '.login' do
7
+ before do
8
+ savon.expects(:login).with(:username => 'foo', :password => 'barwhizbang').returns(:success)
9
+ end
10
+
11
+ subject { klass.login }
12
+ it { should be_a Hash }
13
+ its([:session_id]) { should eq '00DU0000000Ilbh!AQoAQHVcube9Z6CRlbR9Eg8ZxpJlrJ6X8QDbnokfyVZItFKzJsLH' \
14
+ 'IRGiqhzJkYsNYRkd3UVA9.s82sbjEbZGUqP3mG6TP_P8' }
15
+ its([:metadata_server_url]) { should eq 'https://na12-api.salesforce.com/services/Soap/m/23.0/00DU0000000Albh' }
16
+ its([:server_url]) { should eq 'https://na12-api.salesforce.com/services/Soap/u/23.0/00DU0000000Ilbh' }
17
+ end
18
+ end
@@ -1,181 +1,35 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Metaforce::Manifest do
4
-
5
- before(:all) do
6
- @package_xml = File.open(File.join(File.dirname(__FILE__), '../fixtures/package.xml'), 'r').read
7
- end
8
-
9
- before(:each) do
10
- @package_hash = {
11
- :apex_class => ['TestClass', 'AnotherClass'],
4
+ let(:package_xml) { File.open(File.join(File.dirname(__FILE__), '../fixtures/package.xml'), 'r').read }
5
+ let(:package_hash) do
6
+ { :apex_class => ['TestClass', 'AnotherClass'],
12
7
  :apex_component => ['Component'],
13
- :static_resource => ['Assets']
14
- }
15
- end
16
-
17
- describe ".new" do
18
- context "when given a hash" do
19
- describe ".to_xml" do
20
-
21
- it "returns a string containing xml" do
22
- package = Metaforce::Manifest.new(@package_hash)
23
- response = package.to_xml
24
- response.should eq(@package_xml)
25
- end
26
-
27
- end
28
- end
29
- context "when given a string" do
30
- describe ".to_hash" do
31
-
32
- it "returns the xml content as a hash" do
33
- package = Metaforce::Manifest.new(@package_xml)
34
- response = package.to_hash
35
- response.should eq(@package_hash)
36
- end
37
-
38
- end
39
- end
40
- end
41
-
42
- describe ".add" do
43
-
44
- it "can add additional components" do
45
- package = Metaforce::Manifest.new(@package_hash)
46
- package.add(:apex_class, 'AdditionalClass')
47
- response = package.to_hash
48
- @package_hash = {
49
- :apex_class => ['TestClass', 'AnotherClass', 'AdditionalClass'],
50
- :apex_component => ['Component'],
51
- :static_resource => ['Assets']
52
- }
53
- response.should eq(@package_hash)
54
- end
55
-
56
- it "can add additional components from an array" do
57
- package = Metaforce::Manifest.new(@package_hash)
58
- package.add(:apex_class, ['class1', 'class2'])
59
- response = package.to_hash
60
- @package_hash = {
61
- :apex_class => ['TestClass', 'AnotherClass', 'class1', 'class2'],
62
- :apex_component => ['Component'],
63
- :static_resource => ['Assets']
64
- }
65
- response.should eq(@package_hash)
66
- end
67
-
68
- it "strips directories and extensions" do
69
- package = Metaforce::Manifest.new(@package_hash)
70
- package.add(:apex_class, 'src/classes/AdditionalClass.cls')
71
- response = package.to_hash
72
- @package_hash = {
73
- :apex_class => ['TestClass', 'AnotherClass', 'AdditionalClass'],
74
- :apex_component => ['Component'],
75
- :static_resource => ['Assets']
76
- }
77
- response.should eq(@package_hash)
78
- end
79
-
8
+ :static_resource => ['Assets'] }
80
9
  end
10
+ let(:package) { package_xml }
11
+ let(:manifest) { described_class.new(package) }
81
12
 
82
- describe ".remove" do
83
-
84
- it "can remove components" do
85
- package = Metaforce::Manifest.new(@package_hash)
86
- package.remove(:apex_class, 'TestClass')
87
- response = package.to_hash
88
- @package_hash = {
89
- :apex_class => ['AnotherClass'],
90
- :apex_component => ['Component'],
91
- :static_resource => ['Assets']
92
- }
93
- response.should eq(@package_hash)
94
- end
95
-
96
- it "can remove components in an array" do
97
- package = Metaforce::Manifest.new(@package_hash)
98
- package.remove(:apex_class, ['TestClass', 'AnotherClass'])
99
- response = package.to_hash
100
- @package_hash = {
101
- :apex_component => ['Component'],
102
- :static_resource => ['Assets']
103
- }
104
- response.should eq(@package_hash)
105
- end
106
-
107
- it "strips directories and extensions" do
108
- package = Metaforce::Manifest.new(@package_hash)
109
- package.remove(:apex_class, 'src/classes/TestClass.cls')
110
- response = package.to_hash
111
- @package_hash = {
112
- :apex_class => ['AnotherClass'],
113
- :apex_component => ['Component'],
114
- :static_resource => ['Assets']
115
- }
116
- response.should eq(@package_hash)
117
- end
118
-
13
+ describe '.to_xml' do
14
+ let(:package) { package_hash }
15
+ subject { manifest.to_xml }
16
+ it { should eq package_xml }
119
17
  end
120
18
 
121
- describe ".only" do
122
-
123
- it "filters the components based on a list of files" do
124
- package = Metaforce::Manifest.new(@package_hash)
125
- package.only(['classes/TestClass'])
126
- response = package.to_hash
127
- @package_hash = {
128
- :apex_class => ['TestClass']
129
- }
130
- response.should eq(@package_hash)
131
- end
132
-
133
- it "ignores file extensions" do
134
- package = Metaforce::Manifest.new(@package_hash)
135
- package.only(['classes/TestClass.cls', 'components/Component.component'])
136
- response = package.to_hash
137
- @package_hash = {
138
- :apex_class => ['TestClass'],
139
- :apex_component => ['Component']
140
- }
141
- response.should eq(@package_hash)
142
- end
143
-
144
- it "strips any leading directories" do
145
- package = Metaforce::Manifest.new(@package_hash)
146
- package.only(['src/classes/TestClass.cls', 'src/components/Component.component'])
147
- response = package.to_hash
148
- @package_hash = {
149
- :apex_class => ['TestClass'],
150
- :apex_component => ['Component']
151
- }
152
- response.should eq(@package_hash)
153
- end
154
-
155
- it "ignores case of folder" do
156
- package = Metaforce::Manifest.new(@package_hash)
157
- package.only(['src/Classes/TestClass.cls', 'src/Components/Component.component'])
158
- response = package.to_hash
159
- @package_hash = {
160
- :apex_class => ['TestClass'],
161
- :apex_component => ['Component']
162
- }
163
- response.should eq(@package_hash)
164
- end
165
-
19
+ describe '.to_hash' do
20
+ let(:package) { package_xml }
21
+ subject { manifest.to_hash }
22
+ it { should eq package_hash }
166
23
  end
167
24
 
168
- describe ".to_package" do
169
-
170
- it "returns a in package format" do
171
- package = Metaforce::Manifest.new(@package_hash)
172
- response = package.to_package
173
- response.should eq([
174
- { :members => ["TestClass", "AnotherClass"], :name => "ApexClass" },
175
- { :members => ["Component"], :name => "ApexComponent" },
176
- { :members => ["Assets"], :name => "StaticResource" }
177
- ])
25
+ describe '.to_package' do
26
+ subject { manifest.to_package }
27
+ it do
28
+ should eq [
29
+ { :members => ['TestClass', 'AnotherClass'], :name => 'ApexClass' },
30
+ { :members => ['Component'], :name => 'ApexComponent' },
31
+ { :members => ['Assets'], :name => 'StaticResource' }
32
+ ]
178
33
  end
179
-
180
34
  end
181
35
  end
@@ -1,230 +1,135 @@
1
- require "spec_helper"
2
- require "tempfile"
1
+ require 'spec_helper'
3
2
 
4
3
  describe Metaforce::Metadata::Client do
4
+ let(:client) { described_class.new(:session_id => 'foobar', :metadata_server_url => 'https://na12-api.salesforce.com/services/Soap/u/23.0/00DU0000000Ilbh') }
5
5
 
6
- before(:each) do
7
- savon.expects(:login).with(:username => 'valid', :password => 'password').returns(:success)
8
- end
9
-
10
- let(:client) do
11
- Metaforce::Metadata::Client.new(:username => 'valid', :password => 'password')
12
- end
13
-
14
- describe ".list" do
15
-
16
- it "returns an array" do
17
- savon.expects(:list_metadata).with(:queries => [ :type => "ApexClass"]).returns(:objects)
18
- client.list(:type => "ApexClass").should be_an(Array)
19
- end
20
-
21
- it "returns an empty array when no results are returned" do
22
- savon.expects(:list_metadata).with(:queries => [ :type => "ApexClass"]).returns(:no_result)
23
- client.list(:type => "ApexClass").should be_an(Array)
24
- end
25
-
26
- it "accepts a symbol" do
27
- savon.expects(:list_metadata).with(:queries => [ :type => "ApexClass"]).returns(:no_result)
28
- client.list(:apex_class).should be_an(Array)
29
- end
30
-
31
- it "accepts a string" do
32
- savon.expects(:list_metadata).with(:queries => [ :type => "ApexClass"]).returns(:no_result)
33
- client.list("ApexClass").should be_an(Array)
34
- end
35
-
36
- end
37
-
38
- it "should respond to dynamically defined list methods" do
39
- savon.expects(:describe_metadata).returns(:success)
40
- savon.expects(:list_metadata).with(:queries => [ :type => "ApexClass"]).returns(:no_result)
41
- client.list_apex_class.should be_an(Array)
6
+ it_behaves_like 'a client'
42
7
 
43
- expect { client.list_undefined_type }.to raise_error(NoMethodError)
44
- end
45
-
46
- describe ".describe" do
47
- context "when given valid information" do
48
-
49
- it "returns a hash" do
50
- savon.expects(:describe_metadata).returns(:success)
51
- client.describe.should be_a(Hash)
8
+ describe '.list_metadata' do
9
+ context 'with a single symbol' do
10
+ before do
11
+ savon.expects(:list_metadata).with(:queries => [{:type => 'ApexClass'}]).returns(:objects)
52
12
  end
53
13
 
54
- it "caches the response" do
55
- savon.expects(:describe_metadata).returns(:success)
56
- client.describe.should be_a(Hash)
57
- expect { client.describe }.to_not raise_error
58
- end
59
-
60
- end
61
- end
62
-
63
- describe ".metadata_objects" do
64
- it "returns the :metadata_objects key from the describe call" do
65
- savon.expects(:describe_metadata).returns(:success)
66
- client.metadata_objects.should be_a(Array)
14
+ subject { client.list_metadata(:apex_class) }
15
+ it { should be_an Array }
67
16
  end
68
- end
69
17
 
70
- describe ".describe!" do
71
- context "when given valid information" do
72
-
73
- it "returns a hash" do
74
- savon.expects(:describe_metadata).returns(:success)
75
- client.describe!.should be_a(Hash)
76
- end
77
-
78
- it "doesn't cache the response" do
79
- savon.expects(:describe_metadata).returns(:success)
80
- client.describe!.should be_a(Hash)
81
- savon.expects(:describe_metadata).returns(:success)
82
- expect { client.describe! }.to_not raise_error
18
+ context 'with a single string' do
19
+ before do
20
+ savon.expects(:list_metadata).with(:queries => [{:type => 'ApexClass'}]).returns(:objects)
83
21
  end
84
22
 
23
+ subject { client.list_metadata('ApexClass') }
24
+ it { should be_an Array }
85
25
  end
86
26
  end
87
27
 
88
- describe ".status" do
89
- context "when given an invalid id" do
90
-
91
- it "raises an" do
92
- expect { client.status("badId") }.to raise_error
93
- end
94
-
95
- end
96
- context "when given an id of a result that has completed" do
97
-
98
- it "returns a hash and the :done key contains true" do
99
- savon.expects(:check_status).with(:ids => [ "04sU0000000WNWoIAO" ]).returns(:done)
100
- status = client.status("04sU0000000WNWoIAO")
101
- status.should be_a(Hash)
102
- status[:done].should eq(true)
28
+ describe '.describe' do
29
+ context 'with no version' do
30
+ before do
31
+ savon.expects(:describe_metadata).with(nil).returns(:success)
103
32
  end
104
33
 
34
+ subject { client.describe }
35
+ it { should be_a Hash }
105
36
  end
106
- context "when given an id of a result that has not completed" do
107
37
 
108
- it "returns a hash and the :done key contains false" do
109
- savon.expects(:check_status).with(:ids => [ "04sU0000000WNWoIAo" ]).returns(:not_done)
110
- status = client.status("04sU0000000WNWoIAo")
111
- status.should be_a(Hash)
112
- status[:done].should eq(false)
38
+ context 'with a version' do
39
+ before do
40
+ savon.expects(:describe_metadata).with(:api_version => '18.0').returns(:success)
113
41
  end
114
42
 
43
+ subject { client.describe('18.0') }
44
+ it { should be_a Hash }
115
45
  end
116
- context "when given and id of a deploy that has completed" do
46
+ end
117
47
 
118
- it "returns a hash" do
119
- savon.expects(:check_deploy_status).with(:ids => [ "04sU0000000WNWoIAO" ]).returns(:done)
120
- status = client.status("04sU0000000WNWoIAO", :deploy)
121
- status.should be_a(Hash)
48
+ describe '.status' do
49
+ context 'with a single id' do
50
+ before do
51
+ savon.expects(:check_status).with(:ids => ['1234']).returns(:done)
122
52
  end
123
53
 
54
+ subject { client.status '1234' }
55
+ it { should be_a Hash }
124
56
  end
125
57
  end
126
58
 
127
- describe ".done?" do
128
- context "when given an id of a result that has completed" do
129
-
130
- it "returns true" do
131
- savon.expects(:check_status).with(:ids => [ "04sU0000000WNWoIAO" ]).returns(:done)
132
- client.done?("04sU0000000WNWoIAO").should eq(true)
133
- end
134
-
59
+ describe '._deploy' do
60
+ before do
61
+ savon.expects(:deploy).with(:zip_file => 'foobar', :deploy_options => {}).returns(:in_progress)
135
62
  end
136
- context "when given an id of a result that has not completed" do
137
63
 
138
- it "returns false" do
139
- savon.expects(:check_status).with(:ids => [ "04sU0000000WNWoIAo" ]).returns(:not_done)
140
- client.done?("04sU0000000WNWoIAo").should eq(false)
141
- end
64
+ subject { client._deploy('foobar') }
65
+ it { should be_a Hash }
66
+ end
142
67
 
143
- end
68
+ describe '.deploy' do
69
+ subject { client.deploy File.expand_path('../../path/to/zip') }
70
+ it { should be_a Metaforce::Job::Deploy }
144
71
  end
145
72
 
146
- describe ".deploy" do
73
+ describe '._retrieve' do
74
+ let(:options) { double('options') }
147
75
 
148
- before(:each) do
149
- Metaforce::Metadata::Client.any_instance.stubs(:create_deploy_file).returns('')
76
+ before do
77
+ savon.expects(:retrieve).with(:retrieve_request => options).returns(:in_progress)
150
78
  end
151
-
152
- context "when given a directory to deploy" do
153
-
154
- it "deploys the directory and returns a transaction" do
155
- savon.expects(:deploy).with(:zip_file => '', :deploy_options => {}).returns(:in_progress)
156
- savon.expects(:check_status).with(:ids => ['04sU0000000WNWoIAO']).returns(:done);
157
- deployment = client.deploy(File.expand_path('../../../fixtures/sample', __FILE__))
158
- deployment.should be_a(Metaforce::Transaction)
159
- deployment.id.should eq("04sU0000000WNWoIAO")
160
- end
161
79
 
162
- end
163
-
164
- it "allows deploy options to be configured via a hash" do
165
- savon.expects(:deploy).with(:zip_file => '', :deploy_options => { :run_all_tests => true }).returns(:in_progress)
166
- savon.expects(:check_status).with(:ids => ['04sU0000000WNWoIAO']).returns(:done);
167
- expect {
168
- client.deploy('', :options => { :run_all_tests => true })
169
- }.to_not raise_error
170
- end
80
+ subject { client._retrieve(options) }
81
+ it { should be_a Hash }
82
+ end
171
83
 
84
+ describe '.retrieve' do
85
+ subject { client.retrieve }
86
+ it { should be_a Metaforce::Job::Retrieve }
172
87
  end
173
88
 
174
- describe ".retrieve" do
89
+ describe '.retrieve_unpackaged' do
90
+ let(:manifest) { Metaforce::Manifest.new(:custom_object => ['Account']) }
91
+ subject { client.retrieve_unpackaged(manifest) }
92
+ it { should be_a Metaforce::Job::Retrieve }
93
+ end
175
94
 
176
- let(:manifest) do
177
- Metaforce::Manifest.new(File.open(File.expand_path('../../../fixtures/sample/src/package.xml', __FILE__)).read)
95
+ describe '._create' do
96
+ before do
97
+ savon.expects(:create).with(:metadata => [{:full_name => 'component', :label => 'test', :content => "Zm9vYmFy\n"}], :attributes! => {'ins0:metadata' => {'xsi:type' => 'ins0:ApexComponent'}}).returns(:in_progress)
178
98
  end
179
99
 
180
- describe ".retrieve_unpackaged" do
181
-
182
- context "when given a manifest file" do
183
- before(:each) do
184
- savon.expects(:retrieve).with(:retrieve_request => { :api_version => Metaforce.configuration.api_version, :single_package => true, :unpackaged => { :types => manifest.to_package } }).returns(:in_progress)
185
- savon.expects(:check_status).with(:ids => ['04sU0000000WkdIIAS']).returns(:done)
186
- savon.expects(:check_retrieve_status).with(:ids => ['04sU0000000WkdIIAS']).returns(:success)
187
- end
188
-
189
- it "returns a valid retrieve result" do
190
- retrieval = client.retrieve_unpackaged(manifest)
191
- retrieval.done?
192
- result = retrieval.result
193
- result.should be_a(Hash)
194
- end
100
+ subject { client._create(:apex_component, :full_name => 'component', :label => 'test', :content => 'foobar') }
101
+ it { should be_a Hash }
102
+ end
195
103
 
104
+ describe '._delete' do
105
+ context 'with a single name' do
106
+ before do
107
+ savon.expects(:delete).with(:metadata => [{:full_name => 'component'}], :attributes! => {'ins0:metadata' => {'xsi:type' => 'ins0:ApexComponent'}}).returns(:in_progress)
196
108
  end
197
109
 
198
- context "when given the path to a manifest file" do
199
- before(:each) do
200
- savon.expects(:retrieve).with(:retrieve_request => { :api_version => Metaforce.configuration.api_version, :single_package => true, :unpackaged => { :types => manifest.to_package } }).returns(:in_progress)
201
- savon.expects(:check_status).with(:ids => ['04sU0000000WkdIIAS']).returns(:done)
202
- savon.expects(:check_retrieve_status).with(:ids => ['04sU0000000WkdIIAS']).returns(:success)
203
- end
204
-
205
- it "returns a valid retrieve result" do
206
- retrieval = client.retrieve_unpackaged(File.expand_path('../../../fixtures/sample/src/package.xml', __FILE__))
207
- retrieval.done?
208
- result = retrieval.result
209
- result.should be_a(Hash)
210
- end
110
+ subject { client._delete(:apex_component, 'component') }
111
+ it { should be_a Hash }
112
+ end
211
113
 
114
+ context 'with multiple' do
115
+ before do
116
+ savon.expects(:delete).with(:metadata => [{:full_name => 'component1'}, {:full_name => 'component2'}], :attributes! => {'ins0:metadata' => {'xsi:type' => 'ins0:ApexComponent'}}).returns(:in_progress)
212
117
  end
213
118
 
214
- context "when given extra retrieve options" do
215
- before(:each) do
216
- savon.expects(:retrieve).with(:retrieve_request => { :api_version => Metaforce.configuration.api_version, :single_package => true, :unpackaged => { :types => manifest.to_package }, :extra => true }).returns(:in_progress)
217
- savon.expects(:check_status).with(:ids => ['04sU0000000WkdIIAS']).returns(:done);
218
- end
219
-
220
- it "merges the options" do
221
- expect {
222
- retrieval = client.retrieve_unpackaged(File.expand_path('../../../fixtures/sample/src/package.xml', __FILE__), :options => { :extra => true })
223
- }.to_not raise_error
224
- end
119
+ subject { client._delete(:apex_component, 'component1', 'component2') }
120
+ it { should be_a Hash }
121
+ end
122
+ end
225
123
 
226
- end
124
+ describe '._update' do
125
+ before do
126
+ savon.expects(:update).with(:metadata => {:current_name => 'old_component', :metadata => [{:full_name => 'component', :label => 'test', :content => "Zm9vYmFy\n"}], :attributes! => {:metadata => {'xsi:type' => 'ins0:ApexComponent'}}}).returns(:in_progress)
227
127
  end
228
128
 
129
+ subject { client._update(:apex_component, 'old_component', :full_name => 'component', :label => 'test', :content => 'foobar') }
130
+ it { should be_a Hash }
229
131
  end
230
132
  end
133
+
134
+
135
+
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metaforce do
4
+ describe '#new' do
5
+ let(:klass) { described_class.new(session_id: 'foobar') }
6
+ subject { klass }
7
+
8
+ it { should be_a Metaforce::Client }
9
+ end
10
+
11
+ describe '#login' do
12
+ let(:args) { {:username => 'foo', :password => 'foobar', :security_token => 'whizbang'} }
13
+
14
+ it 'proxies the login call' do
15
+ Metaforce::Login.should_receive(:new).with('foo', 'foobar', 'whizbang').and_call_original
16
+ Metaforce::Login.any_instance.should_receive(:login)
17
+ described_class.login args
18
+ end
19
+ end
20
+ end