sem4r 0.1.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.
Files changed (187) hide show
  1. data/LICENSE +22 -0
  2. data/README.rdoc +74 -0
  3. data/Rakefile +126 -0
  4. data/VERSION.yml +5 -0
  5. data/bin/sem +34 -0
  6. data/config/sem4r.example.yml +51 -0
  7. data/examples_blog/2009-11-29-hello-world.rb +12 -0
  8. data/examples_blog/2009-12-12-create-campaign.rb +29 -0
  9. data/examples_blog/2010-02-06-constants-scope.rb +8 -0
  10. data/examples_blog/2010-02-07-ad-parameters.rb +47 -0
  11. data/examples_sem4r/01_get_account.rb +37 -0
  12. data/examples_sem4r/02_get_info.rb +32 -0
  13. data/examples_sem4r/03_list_ad.rb +47 -0
  14. data/examples_sem4r/04_list_keywords.rb +54 -0
  15. data/examples_sem4r/05_request_report.rb +51 -0
  16. data/examples_sem4r/05_request_report_2010.rb +40 -0
  17. data/examples_sem4r/06_create_campaigns.rb +86 -0
  18. data/examples_sem4r/07_create_campaigns_block.rb +99 -0
  19. data/examples_sem4r/07_create_campaigns_simple.rb +65 -0
  20. data/examples_sem4r/08_ad_params.rb +70 -0
  21. data/examples_sem4r/09_targeting_idea.rb +59 -0
  22. data/examples_sem4r/10_get_location.rb +28 -0
  23. data/examples_sem4r/11_submit_bulk_job.rb +82 -0
  24. data/examples_sem4r/12_list_bulk_job.rb +29 -0
  25. data/examples_sem4r/30_prune_empty_adgroup.rb +50 -0
  26. data/examples_sem4r/31_empty_accounts.rb +40 -0
  27. data/examples_sem4r/example_helper.rb +115 -0
  28. data/lib/sem4r/account.rb +349 -0
  29. data/lib/sem4r/ad_extension_override/ad_extension_override_service.rb +30 -0
  30. data/lib/sem4r/ad_group/ad_group.rb +340 -0
  31. data/lib/sem4r/ad_group/ad_group_bids.rb +170 -0
  32. data/lib/sem4r/ad_group/ad_group_service.rb +75 -0
  33. data/lib/sem4r/ad_group/mobile_ad_image.rb +33 -0
  34. data/lib/sem4r/ad_group_ad/ad_group_ad.rb +98 -0
  35. data/lib/sem4r/ad_group_ad/ad_group_ad_operations.rb +38 -0
  36. data/lib/sem4r/ad_group_ad/ad_group_ad_service.rb +56 -0
  37. data/lib/sem4r/ad_group_ad/ad_group_mobile_ad.rb +137 -0
  38. data/lib/sem4r/ad_group_ad/ad_group_text_ad.rb +98 -0
  39. data/lib/sem4r/ad_group_criterion/ad_group_criterion.rb +144 -0
  40. data/lib/sem4r/ad_group_criterion/ad_group_criterion_bids.rb +115 -0
  41. data/lib/sem4r/ad_group_criterion/ad_group_criterion_operations.rb +35 -0
  42. data/lib/sem4r/ad_group_criterion/ad_group_criterion_service.rb +58 -0
  43. data/lib/sem4r/ad_group_criterion/criterion.rb +67 -0
  44. data/lib/sem4r/ad_group_criterion/criterion_keyword.rb +80 -0
  45. data/lib/sem4r/ad_group_criterion/criterion_placement.rb +66 -0
  46. data/lib/sem4r/ad_param/ad_param.rb +96 -0
  47. data/lib/sem4r/ad_param/ad_param_operation.rb +34 -0
  48. data/lib/sem4r/ad_param/ad_param_service.rb +59 -0
  49. data/lib/sem4r/adwords.rb +242 -0
  50. data/lib/sem4r/api_counters.rb +7 -0
  51. data/lib/sem4r/base.rb +43 -0
  52. data/lib/sem4r/bulk_mutate_job/bulk_mutate_job.rb +108 -0
  53. data/lib/sem4r/bulk_mutate_job/bulk_mutate_job_selector.rb +56 -0
  54. data/lib/sem4r/bulk_mutate_job/bulk_mutate_job_service.rb +57 -0
  55. data/lib/sem4r/bulk_mutate_job/job_operations.rb +35 -0
  56. data/lib/sem4r/campaign/campaign.rb +193 -0
  57. data/lib/sem4r/campaign/campaign_service.rb +91 -0
  58. data/lib/sem4r/campaign_criterion/campaign_criterion_service.rb +30 -0
  59. data/lib/sem4r/campaign_target/campaign_target_service.rb +30 -0
  60. data/lib/sem4r/cli/cli_command.rb +101 -0
  61. data/lib/sem4r/cli/cli_commands.rb +60 -0
  62. data/lib/sem4r/cli/cli_common_args.rb +293 -0
  63. data/lib/sem4r/cli/cli_download_report.rb +81 -0
  64. data/lib/sem4r/cli/cli_helpers.rb +57 -0
  65. data/lib/sem4r/cli/cli_ideas.rb +100 -0
  66. data/lib/sem4r/cli/cli_list_ads.rb +74 -0
  67. data/lib/sem4r/cli/cli_list_keywords.rb +76 -0
  68. data/lib/sem4r/cli/cli_request_report.rb +104 -0
  69. data/lib/sem4r/cli/cli_sem.rb +64 -0
  70. data/lib/sem4r/common/operation.rb +78 -0
  71. data/lib/sem4r/credentials.rb +86 -0
  72. data/lib/sem4r/extensions.rb +62 -0
  73. data/lib/sem4r/geo_location/geo_location_service.rb +59 -0
  74. data/lib/sem4r/info/info_service.rb +115 -0
  75. data/lib/sem4r/report_definition/report_definition.rb +104 -0
  76. data/lib/sem4r/report_definition/report_definition_operation.rb +34 -0
  77. data/lib/sem4r/report_definition/report_definition_selector.rb +31 -0
  78. data/lib/sem4r/report_definition/report_definition_service.rb +55 -0
  79. data/lib/sem4r/sem4r_error.rb +28 -0
  80. data/lib/sem4r/services/service.rb +74 -0
  81. data/lib/sem4r/services/soap_call.rb +100 -0
  82. data/lib/sem4r/services/soap_connector.rb +284 -0
  83. data/lib/sem4r/services/soap_error.rb +38 -0
  84. data/lib/sem4r/services/soap_message_v13.rb +129 -0
  85. data/lib/sem4r/services/soap_message_v2009.rb +170 -0
  86. data/lib/sem4r/soap_attributes.rb +141 -0
  87. data/lib/sem4r/targeting_idea/targeting_idea.rb +158 -0
  88. data/lib/sem4r/targeting_idea/targeting_idea_selector.rb +200 -0
  89. data/lib/sem4r/targeting_idea/targeting_idea_service.rb +51 -0
  90. data/lib/sem4r/v13_account/account_service.rb +54 -0
  91. data/lib/sem4r/v13_account/billing_address.rb +67 -0
  92. data/lib/sem4r/v13_report/report.rb +185 -0
  93. data/lib/sem4r/v13_report/report_job.rb +51 -0
  94. data/lib/sem4r/v13_report/report_service.rb +89 -0
  95. data/lib/sem4r/v13_traffic_estimator/traffic_estimator_service.rb +30 -0
  96. data/lib/sem4r.rb +142 -0
  97. data/lib/sem4r_cli.rb +40 -0
  98. data/sem4r.gemspec +247 -0
  99. data/spec/aggregates_spec_helper.rb +59 -0
  100. data/spec/fixtures/sem4r.example.yml +26 -0
  101. data/spec/fixtures/services/ad_group/get-first-req.xml +28 -0
  102. data/spec/fixtures/services/ad_group/get-first-res.xml +91 -0
  103. data/spec/fixtures/services/ad_group/get-manual-cpm-bids-req.xml +106 -0
  104. data/spec/fixtures/services/ad_group/get-manual-cpm-bids-res.xml +75 -0
  105. data/spec/fixtures/services/ad_group/mutate_add-req.xml +52 -0
  106. data/spec/fixtures/services/ad_group/mutate_add-res.xml +33 -0
  107. data/spec/fixtures/services/ad_group_ad/get_mobile_ad-req.xml +28 -0
  108. data/spec/fixtures/services/ad_group_ad/get_mobile_ad-res.xml +194 -0
  109. data/spec/fixtures/services/ad_group_ad/get_text_ad-req.xml +29 -0
  110. data/spec/fixtures/services/ad_group_ad/get_text_ad-res.xml +55 -0
  111. data/spec/fixtures/services/ad_group_ad/mutate_add_mobile_ad-req.xml +50 -0
  112. data/spec/fixtures/services/ad_group_ad/mutate_add_mobile_ad-res.xml +42 -0
  113. data/spec/fixtures/services/ad_group_ad/mutate_add_text_ad-req.xml +37 -0
  114. data/spec/fixtures/services/ad_group_ad/mutate_add_text_ad-res.xml +32 -0
  115. data/spec/fixtures/services/ad_group_ad/mutate_add_two_criterions-req.xml +83 -0
  116. data/spec/fixtures/services/ad_group_ad/mutate_add_two_criterions-res.xml +95 -0
  117. data/spec/fixtures/services/ad_group_criterion/get-req.xml +28 -0
  118. data/spec/fixtures/services/ad_group_criterion/get-res.xml +242 -0
  119. data/spec/fixtures/services/ad_group_criterion/mutate_add_criterion_keyword-req.xml +48 -0
  120. data/spec/fixtures/services/ad_group_criterion/mutate_add_criterion_keyword-res.xml +47 -0
  121. data/spec/fixtures/services/ad_group_criterion/mutate_add_criterion_placement-req.xml +35 -0
  122. data/spec/fixtures/services/ad_group_criterion/mutate_add_criterion_placement-res.xml +32 -0
  123. data/spec/fixtures/services/ad_group_criterion/mutate_add_negative_keyword-req.xml +37 -0
  124. data/spec/fixtures/services/ad_group_criterion/mutate_add_negative_keyword-res.xml +51 -0
  125. data/spec/fixtures/services/ad_param/mutate_set-req.xml +43 -0
  126. data/spec/fixtures/services/ad_param/mutate_set-res.xml +29 -0
  127. data/spec/fixtures/services/bulk_mutate_job/get-req.xml +36 -0
  128. data/spec/fixtures/services/bulk_mutate_job/get-res.xml +54 -0
  129. data/spec/fixtures/services/bulk_mutate_job/mutate-req.xml +69 -0
  130. data/spec/fixtures/services/bulk_mutate_job/mutate-res.xml +48 -0
  131. data/spec/fixtures/services/campaign/get-req.xml +37 -0
  132. data/spec/fixtures/services/campaign/get-res.xml +1986 -0
  133. data/spec/fixtures/services/campaign/mutate_add-req.xml +37 -0
  134. data/spec/fixtures/services/campaign/mutate_add-res.xml +42 -0
  135. data/spec/fixtures/services/error.xml +28 -0
  136. data/spec/fixtures/services/info/get_unit_count-req.xml +30 -0
  137. data/spec/fixtures/services/info/get_unit_count-res.xml +29 -0
  138. data/spec/fixtures/services/report_definition/mutate_add-req.xml +24 -0
  139. data/spec/fixtures/services/report_definition/mutate_add-req_orig.xml +45 -0
  140. data/spec/fixtures/services/targeting_idea/get-req-all-options.xml +57 -0
  141. data/spec/fixtures/services/targeting_idea/get-req.xml +60 -0
  142. data/spec/fixtures/services/targeting_idea/get-res.xml +3601 -0
  143. data/spec/fixtures/services/v13_account/get_account_info-req.xml +23 -0
  144. data/spec/fixtures/services/v13_account/get_account_info-res.xml +54 -0
  145. data/spec/fixtures/services/v13_account/get_client_accounts-req.xml +22 -0
  146. data/spec/fixtures/services/v13_account/get_client_accounts-res.xml +37 -0
  147. data/spec/fixtures/services/v13_report/get_all_jobs-req.xml +21 -0
  148. data/spec/fixtures/services/v13_report/get_all_jobs-res.xml +109 -0
  149. data/spec/fixtures/services/v13_report/schedule_report_job-req.xml +56 -0
  150. data/spec/fixtures/services/v13_report/schedule_report_job-res.xml +24 -0
  151. data/spec/sem4r/account_spec.rb +86 -0
  152. data/spec/sem4r/ad_group/ad_group_bids_spec.rb +67 -0
  153. data/spec/sem4r/ad_group/ad_group_service_spec.rb +66 -0
  154. data/spec/sem4r/ad_group/ad_group_spec.rb +212 -0
  155. data/spec/sem4r/ad_group_ad/ad_group_ad_operation_spec.rb +88 -0
  156. data/spec/sem4r/ad_group_ad/ad_group_ad_service_spec.rb +55 -0
  157. data/spec/sem4r/ad_group_ad/ad_group_ad_spec.rb +173 -0
  158. data/spec/sem4r/ad_group_criterion/ad_group_criterion_bids_spec.rb +60 -0
  159. data/spec/sem4r/ad_group_criterion/ad_group_criterion_service_spec.rb +55 -0
  160. data/spec/sem4r/ad_group_criterion/ad_group_criterion_spec.rb +103 -0
  161. data/spec/sem4r/ad_group_criterion/criterion_spec.rb +85 -0
  162. data/spec/sem4r/ad_param/ad_param_service_spec.rb +55 -0
  163. data/spec/sem4r/ad_param/ad_param_spec.rb +59 -0
  164. data/spec/sem4r/adwords_spec.rb +110 -0
  165. data/spec/sem4r/bulk_mutate_job/bulk_mutate_job_service_spec.rb +63 -0
  166. data/spec/sem4r/bulk_mutate_job/bulk_mutate_job_spec.rb +69 -0
  167. data/spec/sem4r/bulk_mutate_job/job_operation_spec.rb +48 -0
  168. data/spec/sem4r/campaign/campaign_service_spec.rb +66 -0
  169. data/spec/sem4r/campaign/campaign_spec.rb +105 -0
  170. data/spec/sem4r/cli/cli_spec.rb +71 -0
  171. data/spec/sem4r/credentials_spec.rb +65 -0
  172. data/spec/sem4r/report_definition/report_definition_service_spec.rb +44 -0
  173. data/spec/sem4r/report_definition/report_definition_spec.rb +105 -0
  174. data/spec/sem4r/rexml_parsing_spec.rb +103 -0
  175. data/spec/sem4r/services/service_spec.rb +36 -0
  176. data/spec/sem4r/services/soap_call_spec.rb +115 -0
  177. data/spec/sem4r/services/soap_message_v13_spec.rb +54 -0
  178. data/spec/sem4r/soap_attributes_spec.rb +116 -0
  179. data/spec/sem4r/targeting_idea/targeting_idea_selector_spec.rb +120 -0
  180. data/spec/sem4r/targeting_idea/targeting_idea_service_spec.rb +44 -0
  181. data/spec/sem4r/targeting_idea/targeting_idea_spec.rb +53 -0
  182. data/spec/sem4r/v13_account/account_service_spec.rb +60 -0
  183. data/spec/sem4r/v13_report/report_service_spec.rb +104 -0
  184. data/spec/sem4r/v13_report/report_spec.rb +79 -0
  185. data/spec/sem4r_spec_helper.rb +353 -0
  186. data/spec/spec_helper.rb +12 -0
  187. metadata +375 -0
@@ -0,0 +1,353 @@
1
+ # -------------------------------------------------------------------------
2
+ # Copyright (c) 2009-2010 Sem4r sem4ruby@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #
23
+ # -------------------------------------------------------------------------
24
+
25
+ # comparing xml is always a b-i-a-t-c-h in any testing environment. here is a
26
+ # little snippet for ruby that, i think, it a good first pass at making it
27
+ # easier. comment with your improvements please!
28
+ #
29
+ # http://drawohara.com/post/89110816/ruby-comparing-xml
30
+ require 'rexml/document'
31
+ require 'differ'
32
+ require 'differ/string'
33
+
34
+ def pretty_xml(xml)
35
+ normalized = Class.new(REXML::Formatters::Pretty) do
36
+ def write_text(node, output)
37
+ super(node.to_s.strip, output)
38
+ end
39
+ end
40
+ normalized.new(0,false).write(xml, xml_pretty='')
41
+ xml_pretty
42
+ end
43
+
44
+ Spec::Matchers.define :xml_equivalent do |expected_xml|
45
+ match do |xml|
46
+ if expected_xml.class == String
47
+ # erase namespaces i.e. <ns1:tag> -> <tag>
48
+ expected_xml = expected_xml.gsub(/(ns\d:|xsi:|s:|^\n)/, "").strip
49
+ expected_xml = REXML::Document.new(expected_xml)
50
+ end
51
+ expected_normalized = pretty_xml(expected_xml)
52
+ # erase namespaces i.e. <ns1:tag> -> <tag>
53
+ expected_normalized = expected_normalized.gsub(/(ns\d:|xsi:|s:|^\n| {2,})/, "").strip
54
+
55
+ if xml.class == String
56
+ xml = xml.gsub(/(ns\d:|xsi:|s:|^\n)/, "").strip
57
+ begin
58
+ xml = REXML::Document.new(xml)
59
+ rescue RuntimeError
60
+ puts "----------------------------------"
61
+ puts xml
62
+ puts "----------------------------------"
63
+ raise
64
+ end
65
+ end
66
+ xml_normalized = pretty_xml(xml)
67
+ xml_normalized = xml_normalized.gsub(/(ns\d:|xsi:|s:|^\n)/, "").strip
68
+
69
+ if xml_normalized != expected_normalized
70
+ puts "----differ start"
71
+
72
+ puts xml_normalized
73
+
74
+ puts "---"
75
+ puts expected_normalized
76
+ puts "---"
77
+ diff = Differ.diff_by_line(xml_normalized, expected_normalized)
78
+ puts diff.format_as(:ascii)
79
+ puts "----differ end"
80
+ false
81
+ else
82
+ true
83
+ end
84
+ end
85
+ end
86
+
87
+ Spec::Matchers.define :xml_contains do |expected_xml|
88
+ match do |xml|
89
+ if expected_xml.class == String
90
+ # erase namespaces i.e. <ns1:tag> -> <tag>
91
+ expected_xml = expected_xml.gsub(/(ns\d:|xsi:|s:|^\n)/, "").strip
92
+ expected_xml = REXML::Document.new(expected_xml)
93
+ end
94
+ expected_normalized = pretty_xml(expected_xml)
95
+ # erase namespaces i.e. <ns1:tag> -> <tag>
96
+ expected_normalized = expected_normalized.gsub(/(ns\d:|xsi:|s:|^\n)/, "").strip
97
+
98
+ if xml.class == String
99
+ xml = xml.gsub(/(ns\d:|xsi:|s:|^\n)/, "").strip
100
+ begin
101
+ xml = REXML::Document.new(xml)
102
+ rescue RuntimeError
103
+ puts "----------------------------------"
104
+ puts xml
105
+ puts "----------------------------------"
106
+ raise
107
+ end
108
+ end
109
+ xml_normalized = pretty_xml(xml)
110
+ xml_normalized = xml_normalized.gsub(/(ns\d:|xsi:|s:|^\n)/, "").strip
111
+
112
+ unless xml_normalized.match(expected_normalized)
113
+ false
114
+ else
115
+ true
116
+ end
117
+ end
118
+ end
119
+
120
+ module Sem4rSpecHelper
121
+
122
+ require "stringio"
123
+ def with_stdout_captured
124
+ old_stdout = $stdout
125
+ out = StringIO.new
126
+ $stdout = out
127
+ begin
128
+ yield
129
+ ensure
130
+ $stdout = old_stdout
131
+ end
132
+ out.string
133
+ end
134
+
135
+
136
+ ##
137
+ # rSpec Hash additions.
138
+ #
139
+ # From
140
+ # * http://wincent.com/knowledge-base/Fixtures_considered_harmful%3F
141
+ # * Neil Rahilly
142
+
143
+ class Hash
144
+
145
+ ##
146
+ # Filter keys out of a Hash.
147
+ #
148
+ # { :a => 1, :b => 2, :c => 3 }.except(:a)
149
+ # => { :b => 2, :c => 3 }
150
+
151
+ def except(*keys)
152
+ self.reject { |k,v| keys.include?(k || k.to_sym) }
153
+ end
154
+
155
+ ##
156
+ # Override some keys.
157
+ #
158
+ # { :a => 1, :b => 2, :c => 3 }.with(:a => 4)
159
+ # => { :a => 4, :b => 2, :c => 3 }
160
+
161
+ def with(overrides = {})
162
+ self.merge overrides
163
+ end
164
+
165
+ ##
166
+ # Returns a Hash with only the pairs identified by +keys+.
167
+ #
168
+ # { :a => 1, :b => 2, :c => 3 }.only(:a)
169
+ # => { :a => 1 }
170
+
171
+ def only(*keys)
172
+ self.reject { |k,v| !keys.include?(k || k.to_sym) }
173
+ end
174
+
175
+ end
176
+
177
+
178
+ #############################################################################
179
+
180
+ def read_xml_file(*args)
181
+ xml_filepath = File.join(File.dirname(__FILE__), "fixtures", *args)
182
+ unless File.exist?(xml_filepath)
183
+ raise "file #{xml_filepath} not exists"
184
+ end
185
+ File.open(xml_filepath).read
186
+ end
187
+
188
+ def read_model(xpath, *args, &blk)
189
+ contents = read_xml_file(*args)
190
+ response_xml_wns = contents.gsub(/n(s?)\d:/, "")
191
+ xml_document = REXML::Document.new(response_xml_wns)
192
+ if xpath && blk
193
+ el = REXML::XPath.each(xml_document, xpath) do |node|
194
+ yield node
195
+ end
196
+ elsif xpath
197
+ el = REXML::XPath.first(xml_document, xpath)
198
+ else
199
+ el = xml_document.root.elements.to_a.first
200
+ end
201
+ if el.nil?
202
+ raise "xml element not found '#{xpath}'"
203
+ end
204
+ el
205
+ end
206
+
207
+ def read_xml_document(*args)
208
+ contents = read_xml_file(*args)
209
+ response_xml_wns = contents.gsub(/ns\d:/, "")
210
+ REXML::Document.new(response_xml_wns)
211
+ end
212
+
213
+ #############################################################################
214
+
215
+ def stub_service_account(service)
216
+ xml_document = read_xml_document("services", "v13_account", "get_account_info-res.xml")
217
+ soap_message = stub("soap_message", :response => xml_document, :counters => nil)
218
+ account_service = stub("account_service", :account_info => soap_message)
219
+ service.stub(:account).and_return(account_service)
220
+ end
221
+
222
+ def stub_service_info(service)
223
+ xml_document = read_xml_document("services", "info", "get_unit_count-res.xml")
224
+ soap_message = stub("soap_message", :response => xml_document, :counters => nil)
225
+ account_service = stub("account_service", :unit_cost => soap_message)
226
+ service.stub(:info).and_return(account_service)
227
+ end
228
+
229
+ def stub_service_campaign(service)
230
+ xml_document = read_xml_document("services", "campaign", "mutate_add-res.xml")
231
+ soap_message_create = stub("soap_message", :response => xml_document, :counters => nil)
232
+
233
+ xml_document = read_xml_document("services", "campaign", "get-res.xml")
234
+ soap_message_all = stub("soap_message", :response => xml_document, :counters => nil)
235
+
236
+ campaign_service = stub("campaign_service", :create => soap_message_create, :all => soap_message_all)
237
+ service.stub(:campaign).and_return(campaign_service)
238
+ end
239
+
240
+ def stub_service_ad_group(service)
241
+ xml_document = read_xml_document("services", "ad_group", "mutate_add-res.xml")
242
+ soap_message = stub("soap_message", :response => xml_document, :counters => nil)
243
+ ad_group_service = stub("adgroup_service", :create => soap_message)
244
+ service.stub(:ad_group).and_return(ad_group_service)
245
+ end
246
+
247
+ def stub_service_ad_group_ad(service)
248
+ xml_document = read_xml_document("services", "ad_group_ad", "mutate_add_text_ad-res.xml")
249
+ soap_message = stub("soap_message", :response => xml_document, :counters => nil)
250
+ ad_group_ad_service = stub("ad_group_ad_service", :mutate => soap_message)
251
+ service.stub(:ad_group_ad).and_return(ad_group_ad_service)
252
+ end
253
+
254
+ def stub_service_ad_group_criterion(service)
255
+ xml_document = read_xml_document("services", "ad_group_criterion", "mutate_add_criterion_keyword-res.xml")
256
+ soap_message = stub("soap_message", :response => xml_document, :counters => nil)
257
+ ad_group_criterion_service = stub("ad_group_criterion_service", :mutate => soap_message)
258
+ service.stub(:ad_group_criterion).and_return(ad_group_criterion_service)
259
+ end
260
+
261
+ def stub_service_ad_param(service)
262
+ # xml_document = read_xml_document("services", "ad_group_criterion_service", "mutate_add_criterion_keyword-res.xml")
263
+ soap_message = stub("soap_message", :response => nil, :counters => nil)
264
+ ad_param_service = stub("ad_param_service", :mutate => soap_message)
265
+ service.stub(:ad_param).and_return(ad_param_service)
266
+ end
267
+
268
+ def stub_service_report(service)
269
+ all_xml_document = read_xml_document("services", "v13_report", "get_all_jobs-res.xml")
270
+ all_soap_message = stub("soap_message", :response => all_xml_document, :counters => nil)
271
+ set_soap_message = stub("soap_message", :response => nil, :counters => nil)
272
+ report_service = stub("report_service",
273
+ :set => set_soap_message,
274
+ :all => all_soap_message)
275
+
276
+ service.stub(:report).and_return(report_service)
277
+ end
278
+
279
+ def stub_service_report_definition(service)
280
+ report_definition_service = stub("report_definition_service")
281
+ service.stub(:report_definition).and_return(report_definition_service)
282
+ end
283
+
284
+ #############################################################################
285
+
286
+ def stub_services
287
+ double("services")
288
+ end
289
+
290
+ def stub_adwords(services = nil)
291
+ stub("adwords",
292
+ :service => services ||= stub_services,
293
+ :add_counters => nil)
294
+ end
295
+
296
+ def stub_credentials
297
+ stub("credentials",
298
+ :sandbox? => true,
299
+ :email => "example@gmail.com",
300
+ :password => "secret",
301
+ :client_email => nil,
302
+ :useragent => "sem4r",
303
+ :developer_token => "dev_token",
304
+ :authentication_token => "1234567890",
305
+ :mutable? => false
306
+ )
307
+ end
308
+
309
+ def stub_account(services = nil)
310
+ adwords = stub_adwords(services)
311
+ credentials = stub_credentials
312
+ campaign = stub("account",
313
+ :adwords => adwords,
314
+ :credentials => credentials,
315
+ :id => 1000)
316
+ campaign
317
+ end
318
+
319
+ def stub_campaign(services = nil)
320
+ adwords = stub_adwords(services)
321
+ credentials = stub_credentials
322
+
323
+ campaign = stub("campaign",
324
+ :adwords => adwords,
325
+ :credentials => credentials,
326
+ :inside_initialize? => false,
327
+ :id => 1000)
328
+ campaign
329
+ end
330
+
331
+ def stub_adgroup(services = nil, id = 1000)
332
+ adwords = stub_adwords(services)
333
+ credentials = stub_credentials
334
+ stub("adgroup",
335
+ :adwords => adwords,
336
+ :credentials => credentials,
337
+ :inside_initialize? => false,
338
+ :id => id)
339
+ end
340
+
341
+ def stub_criterion(services = nil)
342
+ adwords = stub_adwords(services)
343
+ credentials = stub_credentials
344
+
345
+ stub("criterion",
346
+ :adwords => adwords,
347
+ :credentials => credentials,
348
+ :inside_initialize? => false,
349
+ :id => 1000,
350
+ :ad_group => stub_adgroup(services))
351
+ end
352
+ end
353
+
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ require 'sem4r'
5
+ require 'sem4r_cli'
6
+ include Sem4r
7
+
8
+ require 'sem4r_spec_helper'
9
+ require 'aggregates_spec_helper'
10
+
11
+ # Spec::Runner.configure do |config|
12
+ # end