sitemap_generator_ftbpro 5.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +13 -0
  3. data/Gemfile.lock +35 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +1139 -0
  6. data/Rakefile +43 -0
  7. data/VERSION +1 -0
  8. data/lib/capistrano/sitemap_generator.rb +1 -0
  9. data/lib/capistrano/tasks/sitemap_generator.cap +36 -0
  10. data/lib/sitemap_generator/adapters/file_adapter.rb +43 -0
  11. data/lib/sitemap_generator/adapters/fog_adapter.rb +28 -0
  12. data/lib/sitemap_generator/adapters/s3_adapter.rb +41 -0
  13. data/lib/sitemap_generator/adapters/wave_adapter.rb +21 -0
  14. data/lib/sitemap_generator/adapters.rb +0 -0
  15. data/lib/sitemap_generator/application.rb +49 -0
  16. data/lib/sitemap_generator/builder/sitemap_file.rb +171 -0
  17. data/lib/sitemap_generator/builder/sitemap_index_file.rb +149 -0
  18. data/lib/sitemap_generator/builder/sitemap_index_url.rb +28 -0
  19. data/lib/sitemap_generator/builder/sitemap_url.rb +250 -0
  20. data/lib/sitemap_generator/builder.rb +8 -0
  21. data/lib/sitemap_generator/core_ext/big_decimal.rb +45 -0
  22. data/lib/sitemap_generator/core_ext/numeric.rb +48 -0
  23. data/lib/sitemap_generator/core_ext.rb +3 -0
  24. data/lib/sitemap_generator/helpers/number_helper.rb +237 -0
  25. data/lib/sitemap_generator/interpreter.rb +80 -0
  26. data/lib/sitemap_generator/link_set.rb +665 -0
  27. data/lib/sitemap_generator/railtie.rb +7 -0
  28. data/lib/sitemap_generator/sitemap_location.rb +192 -0
  29. data/lib/sitemap_generator/sitemap_namer.rb +75 -0
  30. data/lib/sitemap_generator/tasks.rb +53 -0
  31. data/lib/sitemap_generator/templates.rb +41 -0
  32. data/lib/sitemap_generator/utilities.rb +181 -0
  33. data/lib/sitemap_generator.rb +82 -0
  34. data/lib/tasks/sitemap_generator_tasks.rake +1 -0
  35. data/rails/install.rb +2 -0
  36. data/rails/uninstall.rb +2 -0
  37. data/spec/blueprint.rb +15 -0
  38. data/spec/files/sitemap.create.rb +12 -0
  39. data/spec/files/sitemap.groups.rb +49 -0
  40. data/spec/sitemap_generator/adapters/s3_adapter_spec.rb +23 -0
  41. data/spec/sitemap_generator/alternate_sitemap_spec.rb +79 -0
  42. data/spec/sitemap_generator/application_spec.rb +69 -0
  43. data/spec/sitemap_generator/builder/sitemap_file_spec.rb +110 -0
  44. data/spec/sitemap_generator/builder/sitemap_index_file_spec.rb +124 -0
  45. data/spec/sitemap_generator/builder/sitemap_index_url_spec.rb +28 -0
  46. data/spec/sitemap_generator/builder/sitemap_url_spec.rb +186 -0
  47. data/spec/sitemap_generator/core_ext/bigdecimal_spec.rb +20 -0
  48. data/spec/sitemap_generator/core_ext/numeric_spec.rb +43 -0
  49. data/spec/sitemap_generator/file_adaptor_spec.rb +20 -0
  50. data/spec/sitemap_generator/geo_sitemap_spec.rb +30 -0
  51. data/spec/sitemap_generator/helpers/number_helper_spec.rb +196 -0
  52. data/spec/sitemap_generator/interpreter_spec.rb +90 -0
  53. data/spec/sitemap_generator/link_set_spec.rb +864 -0
  54. data/spec/sitemap_generator/mobile_sitemap_spec.rb +27 -0
  55. data/spec/sitemap_generator/news_sitemap_spec.rb +42 -0
  56. data/spec/sitemap_generator/pagemap_sitemap_spec.rb +57 -0
  57. data/spec/sitemap_generator/sitemap_generator_spec.rb +582 -0
  58. data/spec/sitemap_generator/sitemap_groups_spec.rb +144 -0
  59. data/spec/sitemap_generator/sitemap_location_spec.rb +210 -0
  60. data/spec/sitemap_generator/sitemap_namer_spec.rb +96 -0
  61. data/spec/sitemap_generator/templates_spec.rb +24 -0
  62. data/spec/sitemap_generator/utilities/existence_spec.rb +26 -0
  63. data/spec/sitemap_generator/utilities/hash_spec.rb +57 -0
  64. data/spec/sitemap_generator/utilities/rounding_spec.rb +31 -0
  65. data/spec/sitemap_generator/utilities_spec.rb +101 -0
  66. data/spec/sitemap_generator/video_sitemap_spec.rb +117 -0
  67. data/spec/spec_helper.rb +24 -0
  68. data/spec/support/file_macros.rb +39 -0
  69. data/spec/support/schemas/siteindex.xsd +73 -0
  70. data/spec/support/schemas/sitemap-geo.xsd +41 -0
  71. data/spec/support/schemas/sitemap-mobile.xsd +32 -0
  72. data/spec/support/schemas/sitemap-news.xsd +159 -0
  73. data/spec/support/schemas/sitemap-pagemap.xsd +97 -0
  74. data/spec/support/schemas/sitemap-video.xsd +643 -0
  75. data/spec/support/schemas/sitemap.xsd +115 -0
  76. data/spec/support/xml_macros.rb +67 -0
  77. data/templates/sitemap.rb +27 -0
  78. metadata +226 -0
@@ -0,0 +1,582 @@
1
+ require 'spec_helper'
2
+ require 'cgi'
3
+
4
+ class Holder
5
+ class << self
6
+ attr_accessor :executed
7
+ end
8
+ end
9
+
10
+ def with_max_links(num)
11
+ original = SitemapGenerator::MAX_SITEMAP_LINKS
12
+ SitemapGenerator::Utilities.with_warnings(nil) do
13
+ SitemapGenerator.const_set(:MAX_SITEMAP_LINKS, num)
14
+ end
15
+ yield
16
+ SitemapGenerator::Utilities.with_warnings(nil) do
17
+ SitemapGenerator.const_set(:MAX_SITEMAP_LINKS, original)
18
+ end
19
+ end
20
+
21
+ describe "SitemapGenerator" do
22
+
23
+ describe "reset!" do
24
+ before :each do
25
+ SitemapGenerator::Sitemap.default_host # Force initialization of the LinkSet
26
+ end
27
+
28
+ it "should set a new LinkSet instance" do
29
+ first = SitemapGenerator::Sitemap.instance_variable_get(:@link_set)
30
+ first.should be_a(SitemapGenerator::LinkSet)
31
+ SitemapGenerator::Sitemap.reset!
32
+ second = SitemapGenerator::Sitemap.instance_variable_get(:@link_set)
33
+ second.should be_a(SitemapGenerator::LinkSet)
34
+ first.should_not be(second)
35
+ end
36
+ end
37
+
38
+ describe "root" do
39
+ it "should be set to the root of the gem" do
40
+ SitemapGenerator.root.should == File.expand_path('../../../' , __FILE__)
41
+ end
42
+ end
43
+
44
+ describe "generate sitemap with normal config" do
45
+ before :all do
46
+ SitemapGenerator::Sitemap.reset!
47
+ clean_sitemap_files_from_rails_app
48
+ copy_sitemap_file_to_rails_app(:create)
49
+ with_max_links(10) { execute_sitemap_config }
50
+ end
51
+
52
+ it "should create sitemaps" do
53
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
54
+ file_should_exist(rails_path('public/sitemap1.xml.gz'))
55
+ file_should_exist(rails_path('public/sitemap2.xml.gz'))
56
+ file_should_not_exist(rails_path('public/sitemap3.xml.gz'))
57
+ end
58
+
59
+ it "should have 13 links" do
60
+ SitemapGenerator::Sitemap.link_count.should == 13
61
+ end
62
+
63
+ it "index XML should validate" do
64
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
65
+ end
66
+
67
+ it "sitemap XML should validate" do
68
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap1.xml.gz'), 'sitemap'
69
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap2.xml.gz'), 'sitemap'
70
+ end
71
+
72
+ it "index XML should not have excess whitespace" do
73
+ gzipped_xml_file_should_have_minimal_whitespace rails_path('public/sitemap.xml.gz')
74
+ end
75
+
76
+ it "sitemap XML should not have excess whitespace" do
77
+ gzipped_xml_file_should_have_minimal_whitespace rails_path('public/sitemap1.xml.gz')
78
+ end
79
+ end
80
+
81
+ describe "sitemap with groups" do
82
+ before :all do
83
+ SitemapGenerator::Sitemap.reset!
84
+ clean_sitemap_files_from_rails_app
85
+ copy_sitemap_file_to_rails_app(:groups)
86
+ with_max_links(2) { execute_sitemap_config }
87
+ @expected = %w[
88
+ public/en/xxx.xml.gz
89
+ public/fr/abc3.xml.gz
90
+ public/fr/abc4.xml.gz
91
+ public/fr/def.xml.gz
92
+ public/fr/new_sitemaps.xml.gz
93
+ public/fr/new_sitemaps1.xml.gz
94
+ public/fr/new_sitemaps2.xml.gz
95
+ public/fr/new_sitemaps3.xml.gz
96
+ public/fr/new_sitemaps4.xml.gz]
97
+ @sitemaps = (@expected - %w[public/fr/new_sitemaps.xml.gz])
98
+ end
99
+
100
+ it "should create sitemaps" do
101
+ @expected.each { |file| file_should_exist(rails_path(file)) }
102
+ file_should_not_exist(rails_path('public/fr/new_sitemaps5.xml.gz'))
103
+ file_should_not_exist(rails_path('public/en/xxx1.xml.gz'))
104
+ file_should_not_exist(rails_path('public/fr/abc5.xml.gz'))
105
+ end
106
+
107
+ it "should have 16 links" do
108
+ SitemapGenerator::Sitemap.link_count.should == 16
109
+ end
110
+
111
+ it "index XML should validate" do
112
+ gzipped_xml_file_should_validate_against_schema rails_path('public/fr/new_sitemaps.xml.gz'), 'siteindex'
113
+ end
114
+
115
+ it "index XML should not have excess whitespace" do
116
+ gzipped_xml_file_should_have_minimal_whitespace rails_path('public/fr/new_sitemaps.xml.gz')
117
+ end
118
+
119
+ it "sitemaps XML should validate" do
120
+ @sitemaps.each { |file| gzipped_xml_file_should_validate_against_schema(rails_path(file), 'sitemap') }
121
+ end
122
+
123
+ it "sitemap XML should not have excess whitespace" do
124
+ @sitemaps.each { |file| gzipped_xml_file_should_have_minimal_whitespace(rails_path(file)) }
125
+ end
126
+ end
127
+
128
+ describe "should handle links added manually" do
129
+ before :each do
130
+ clean_sitemap_files_from_rails_app
131
+ ::SitemapGenerator::Sitemap.reset!
132
+ ::SitemapGenerator::Sitemap.default_host = "http://www.example.com"
133
+ ::SitemapGenerator::Sitemap.namer = ::SitemapGenerator::SimpleNamer.new(:sitemap, :start => 4)
134
+ ::SitemapGenerator::Sitemap.create do
135
+ 3.times do |i|
136
+ add_to_index "sitemap#{i}.xml.gz"
137
+ end
138
+ add '/home'
139
+ end
140
+ end
141
+
142
+ it "should create the index and start the sitemap numbering from 4" do
143
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
144
+ file_should_exist(rails_path('public/sitemap4.xml.gz'))
145
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
146
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap4.xml.gz'), 'sitemap'
147
+ end
148
+ end
149
+
150
+ describe "should handle links added manually" do
151
+ before :each do
152
+ clean_sitemap_files_from_rails_app
153
+ ::SitemapGenerator::Sitemap.reset!
154
+ ::SitemapGenerator::Sitemap.default_host = "http://www.example.com"
155
+ ::SitemapGenerator::Sitemap.include_root = false
156
+ end
157
+
158
+ it "should create the index" do
159
+ with_max_links(1) {
160
+ ::SitemapGenerator::Sitemap.create do
161
+ add_to_index "customsitemap.xml.gz"
162
+ add '/one'
163
+ add '/two'
164
+ end
165
+ }
166
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
167
+ file_should_exist(rails_path('public/sitemap1.xml.gz'))
168
+ file_should_exist(rails_path('public/sitemap2.xml.gz'))
169
+ file_should_not_exist(rails_path('public/sitemap3.xml.gz'))
170
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
171
+ end
172
+
173
+ it "should create the index" do
174
+ with_max_links(1) {
175
+ ::SitemapGenerator::Sitemap.create do
176
+ add '/one'
177
+ add_to_index "customsitemap.xml.gz"
178
+ add '/two'
179
+ end
180
+ }
181
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
182
+ file_should_exist(rails_path('public/sitemap1.xml.gz'))
183
+ file_should_exist(rails_path('public/sitemap2.xml.gz'))
184
+ file_should_not_exist(rails_path('public/sitemap3.xml.gz'))
185
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
186
+ end
187
+
188
+ it "should create an index when only manually added links" do
189
+ with_max_links(1) {
190
+ ::SitemapGenerator::Sitemap.create(:create_index => :auto) do
191
+ add_to_index "customsitemap1.xml.gz"
192
+ end
193
+ }
194
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
195
+ file_should_not_exist(rails_path('public/sitemap1.xml.gz'))
196
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
197
+ end
198
+
199
+ it "should create an index when only manually added links" do
200
+ with_max_links(1) {
201
+ ::SitemapGenerator::Sitemap.create(:create_index => :auto) do
202
+ add_to_index "customsitemap1.xml.gz"
203
+ add_to_index "customsitemap2.xml.gz"
204
+ add_to_index "customsitemap3.xml.gz"
205
+ end
206
+ }
207
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
208
+ file_should_not_exist(rails_path('public/sitemap1.xml.gz'))
209
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
210
+ end
211
+
212
+ it "should not create an index" do
213
+ # Create index is explicity turned off and no links added to sitemap,
214
+ # respect the setting and don't create the index. There is no sitemap file either.
215
+ ::SitemapGenerator::Sitemap.create(:create_index => false) do
216
+ add_to_index "customsitemap1.xml.gz"
217
+ add_to_index "customsitemap2.xml.gz"
218
+ add_to_index "customsitemap3.xml.gz"
219
+ end
220
+ file_should_not_exist(rails_path('public/sitemap.xml.gz'))
221
+ file_should_not_exist(rails_path('public/sitemap1.xml.gz'))
222
+ end
223
+
224
+ it "should not create an index" do
225
+ ::SitemapGenerator::Sitemap.create(:create_index => false) do
226
+ add '/one'
227
+ end
228
+ file_should_exist(rails_path('public/sitemap.xml.gz')) # the sitemap, not an index
229
+ file_should_not_exist(rails_path('public/sitemap1.xml.gz'))
230
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'sitemap'
231
+ end
232
+ end
233
+
234
+ describe "sitemap path" do
235
+ before :each do
236
+ clean_sitemap_files_from_rails_app
237
+ ::SitemapGenerator::Sitemap.reset!
238
+ ::SitemapGenerator::Sitemap.default_host = 'http://test.local'
239
+ ::SitemapGenerator::Sitemap.filename = 'sitemap'
240
+ ::SitemapGenerator::Sitemap.create_index = true
241
+ end
242
+
243
+ it "should allow changing of the filename" do
244
+ ::SitemapGenerator::Sitemap.create(:filename => :geo_sitemap) do
245
+ add '/goerss', :geo => { :format => 'georss' }
246
+ add '/kml', :geo => { :format => 'kml' }
247
+ end
248
+ file_should_exist(rails_path('public/geo_sitemap.xml.gz'))
249
+ file_should_exist(rails_path('public/geo_sitemap1.xml.gz'))
250
+ end
251
+
252
+ it "should support setting a sitemap path" do
253
+ directory_should_not_exist(rails_path('public/sitemaps/'))
254
+
255
+ sm = ::SitemapGenerator::Sitemap
256
+ sm.sitemaps_path = 'sitemaps/'
257
+ sm.create do
258
+ add '/'
259
+ add '/another'
260
+ end
261
+
262
+ file_should_exist(rails_path('public/sitemaps/sitemap.xml.gz'))
263
+ file_should_exist(rails_path('public/sitemaps/sitemap1.xml.gz'))
264
+ end
265
+
266
+ it "should support setting a deeply nested sitemap path" do
267
+ directory_should_not_exist(rails_path('public/sitemaps/deep/directory'))
268
+
269
+ sm = ::SitemapGenerator::Sitemap
270
+ sm.sitemaps_path = 'sitemaps/deep/directory/'
271
+ sm.create do
272
+ add '/'
273
+ add '/another'
274
+ add '/yet-another'
275
+ end
276
+
277
+ file_should_exist(rails_path('public/sitemaps/deep/directory/sitemap.xml.gz'))
278
+ file_should_exist(rails_path('public/sitemaps/deep/directory/sitemap1.xml.gz'))
279
+ end
280
+ end
281
+
282
+ describe "external dependencies" do
283
+ it "should work outside of Rails" do
284
+ Object.stubs(:Rails => nil)
285
+ lambda { ::SitemapGenerator::LinkSet.new }.should_not raise_exception
286
+ end
287
+ end
288
+
289
+ describe "verbose" do
290
+ it "should be set via ENV['VERBOSE']" do
291
+ original = SitemapGenerator.verbose
292
+ SitemapGenerator.verbose = nil
293
+ ENV['VERBOSE'] = 'true'
294
+ SitemapGenerator.verbose.should be_true
295
+ SitemapGenerator.verbose = nil
296
+ ENV['VERBOSE'] = 'false'
297
+ SitemapGenerator.verbose.should be_false
298
+ SitemapGenerator.verbose = original
299
+ end
300
+ end
301
+
302
+ describe "yield_sitemap" do
303
+ it "should set the yield_sitemap flag" do
304
+ SitemapGenerator.yield_sitemap = false
305
+ SitemapGenerator.yield_sitemap?.should be_false
306
+ SitemapGenerator.yield_sitemap = true
307
+ SitemapGenerator.yield_sitemap?.should be_true
308
+ SitemapGenerator.yield_sitemap = false
309
+ end
310
+ end
311
+
312
+ describe "create_index" do
313
+ before :each do
314
+ clean_sitemap_files_from_rails_app
315
+ end
316
+
317
+ describe "when true" do
318
+ let(:ls) {
319
+ SitemapGenerator::LinkSet.new(
320
+ :include_root => false,
321
+ :default_host => 'http://example.com',
322
+ :create_index => true)
323
+ }
324
+
325
+ it "should always create index" do
326
+ with_max_links(1) do
327
+ ls.create { add('/one') }
328
+ end
329
+ ls.sitemap_index.link_count.should == 1 # one sitemap
330
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
331
+ file_should_exist(rails_path('public/sitemap1.xml.gz'))
332
+ file_should_not_exist(rails_path('public/sitemap2.xml.gz'))
333
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
334
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap1.xml.gz'), 'sitemap'
335
+
336
+ # Test that the index url is reported correctly
337
+ ls.search_engines = { :google => 'http://google.com/?url=%s' }
338
+ ls.expects(:open).with("http://google.com/?url=#{CGI.escape('http://example.com/sitemap.xml.gz')}")
339
+ ls.ping_search_engines
340
+ end
341
+
342
+ it "should always create index" do
343
+ with_max_links(1) do
344
+ ls.create { add('/one'); add('/two') }
345
+ end
346
+ ls.sitemap_index.link_count.should == 2 # two sitemaps
347
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
348
+ file_should_exist(rails_path('public/sitemap1.xml.gz'))
349
+ file_should_exist(rails_path('public/sitemap2.xml.gz'))
350
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
351
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap1.xml.gz'), 'sitemap'
352
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap2.xml.gz'), 'sitemap'
353
+
354
+ # Test that the index url is reported correctly
355
+ ls.search_engines = { :google => 'http://google.com/?url=%s' }
356
+ ls.expects(:open).with("http://google.com/?url=#{CGI.escape('http://example.com/sitemap.xml.gz')}")
357
+ ls.ping_search_engines
358
+ end
359
+ end
360
+
361
+ # Technically when there's no index, the first sitemap is the "index"
362
+ # regardless of how many sitemaps were created, or if create_index is false.
363
+ describe "when false" do
364
+ let(:ls) { SitemapGenerator::LinkSet.new(:include_root => false, :default_host => 'http://example.com', :create_index => false) }
365
+
366
+ it "should never create index" do
367
+ with_max_links(1) do
368
+ ls.create { add('/one') }
369
+ end
370
+ ls.sitemap_index.link_count.should == 1 # one sitemap
371
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
372
+ file_should_not_exist(rails_path('public/sitemap1.xml.gz'))
373
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'sitemap'
374
+
375
+ # Test that the index url is reported correctly
376
+ ls.search_engines = { :google => 'http://google.com/?url=%s' }
377
+ ls.expects(:open).with("http://google.com/?url=#{CGI.escape('http://example.com/sitemap.xml.gz')}")
378
+ ls.ping_search_engines
379
+ end
380
+
381
+ it "should never create index" do
382
+ with_max_links(1) do
383
+ ls.create { add('/one'); add('/two') }
384
+ end
385
+ ls.sitemap_index.link_count.should == 2 # two sitemaps
386
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
387
+ file_should_exist(rails_path('public/sitemap1.xml.gz'))
388
+ file_should_not_exist(rails_path('public/sitemap2.xml.gz'))
389
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'sitemap'
390
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap1.xml.gz'), 'sitemap'
391
+
392
+ # Test that the index url is reported correctly
393
+ ls.search_engines = { :google => 'http://google.com/?url=%s' }
394
+ ls.expects(:open).with("http://google.com/?url=#{CGI.escape('http://example.com/sitemap.xml.gz')}")
395
+ ls.ping_search_engines
396
+ end
397
+ end
398
+
399
+ describe "when :auto" do
400
+ let(:ls) { SitemapGenerator::LinkSet.new(:include_root => false, :default_host => 'http://example.com', :create_index => :auto) }
401
+
402
+ it "should not create index if only one sitemap file" do
403
+ with_max_links(1) do
404
+ ls.create { add('/one') }
405
+ end
406
+ ls.sitemap_index.link_count.should == 1 # one sitemap
407
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
408
+ file_should_not_exist(rails_path('public/sitemap1.xml.gz'))
409
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'sitemap'
410
+
411
+ # Test that the index url is reported correctly
412
+ ls.search_engines = { :google => 'http://google.com/?url=%s' }
413
+ ls.expects(:open).with("http://google.com/?url=#{CGI.escape('http://example.com/sitemap.xml.gz')}")
414
+ ls.ping_search_engines
415
+ end
416
+
417
+ it "should create index if more than one sitemap file" do
418
+ with_max_links(1) do
419
+ ls.create { add('/one'); add('/two') }
420
+ end
421
+ ls.sitemap_index.link_count.should == 2 # two sitemaps
422
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
423
+ file_should_exist(rails_path('public/sitemap1.xml.gz'))
424
+ file_should_exist(rails_path('public/sitemap2.xml.gz'))
425
+ file_should_not_exist(rails_path('public/sitemap3.xml.gz'))
426
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
427
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap1.xml.gz'), 'sitemap'
428
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap2.xml.gz'), 'sitemap'
429
+
430
+ # Test that the index url is reported correctly
431
+ ls.search_engines = { :google => 'http://google.com/?url=%s' }
432
+ ls.expects(:open).with("http://google.com/?url=#{CGI.escape('http://example.com/sitemap.xml.gz')}")
433
+ ls.ping_search_engines
434
+ end
435
+
436
+ it "should create index if more than one group" do
437
+ with_max_links(1) do
438
+ ls.create do
439
+ group(:filename => :group1) { add('/one') };
440
+ group(:filename => :group2) { add('/two') };
441
+ end
442
+ end
443
+ ls.sitemap_index.link_count.should == 2 # two sitemaps
444
+ file_should_exist(rails_path('public/sitemap.xml.gz'))
445
+ file_should_exist(rails_path('public/group1.xml.gz'))
446
+ file_should_exist(rails_path('public/group2.xml.gz'))
447
+ gzipped_xml_file_should_validate_against_schema rails_path('public/sitemap.xml.gz'), 'siteindex'
448
+ gzipped_xml_file_should_validate_against_schema rails_path('public/group1.xml.gz'), 'sitemap'
449
+ gzipped_xml_file_should_validate_against_schema rails_path('public/group2.xml.gz'), 'sitemap'
450
+
451
+ # Test that the index url is reported correctly
452
+ ls.search_engines = { :google => 'http://google.com/?url=%s' }
453
+ ls.expects(:open).with("http://google.com/?url=#{CGI.escape('http://example.com/sitemap.xml.gz')}")
454
+ ls.ping_search_engines
455
+ end
456
+ end
457
+ end
458
+
459
+ describe "compress" do
460
+ let(:ls) { SitemapGenerator::LinkSet.new(:default_host => 'http://test.local', :include_root => false) }
461
+
462
+ before :each do
463
+ clean_sitemap_files_from_rails_app
464
+ end
465
+
466
+ describe "when false" do
467
+ before :each do
468
+ ls.compress = false
469
+ end
470
+
471
+ it "should not compress files" do
472
+ with_max_links(1) do
473
+ ls.create do
474
+ add('/one')
475
+ add('/two')
476
+ group(:filename => :group) {
477
+ add('/group1')
478
+ add('/group2')
479
+ }
480
+ end
481
+ end
482
+ file_should_exist(rails_path('public/sitemap.xml'))
483
+ file_should_exist(rails_path('public/sitemap1.xml'))
484
+ file_should_exist(rails_path('public/group.xml'))
485
+ file_should_exist(rails_path('public/group1.xml'))
486
+ end
487
+ end
488
+
489
+ describe "when :all_but_first" do
490
+ before :each do
491
+ ls.compress = :all_but_first
492
+ end
493
+
494
+ it "should not compress first file" do
495
+ with_max_links(1) do
496
+ ls.create do
497
+ add('/one')
498
+ add('/two')
499
+ add('/three')
500
+ group(:filename => :group) {
501
+ add('/group1')
502
+ add('/group2')
503
+ }
504
+ group(:filename => :group2, :compress => true) {
505
+ add('/group1')
506
+ add('/group2')
507
+ }
508
+ group(:filename => :group2, :compress => false) {
509
+ add('/group1')
510
+ add('/group2')
511
+ }
512
+ end
513
+ end
514
+ file_should_exist(rails_path('public/sitemap.xml'))
515
+ file_should_exist(rails_path('public/sitemap1.xml.gz'))
516
+ file_should_exist(rails_path('public/sitemap2.xml.gz'))
517
+ file_should_exist(rails_path('public/group.xml'))
518
+ file_should_exist(rails_path('public/group1.xml.gz'))
519
+ file_should_exist(rails_path('public/group2.xml.gz'))
520
+ file_should_exist(rails_path('public/group21.xml.gz'))
521
+ end
522
+ end
523
+
524
+ describe "in groups" do
525
+ it "should respect passed in compress option" do
526
+ with_max_links(1) do
527
+ ls.create do
528
+ group(:filename => :group1, :compress => :all_but_first) {
529
+ add('/group1')
530
+ add('/group2')
531
+ }
532
+ group(:filename => :group2, :compress => true) {
533
+ add('/group1')
534
+ add('/group2')
535
+ }
536
+ group(:filename => :group3, :compress => false) {
537
+ add('/group1')
538
+ add('/group2')
539
+ }
540
+ end
541
+ end
542
+ file_should_exist(rails_path('public/group1.xml'))
543
+ file_should_exist(rails_path('public/group11.xml.gz'))
544
+ file_should_exist(rails_path('public/group2.xml.gz'))
545
+ file_should_exist(rails_path('public/group21.xml.gz'))
546
+ file_should_exist(rails_path('public/group3.xml'))
547
+ file_should_exist(rails_path('public/group31.xml'))
548
+ end
549
+ end
550
+ end
551
+
552
+ protected
553
+
554
+ #
555
+ # Helpers
556
+ #
557
+
558
+ def rails_path(file)
559
+ SitemapGenerator.app.root + file
560
+ end
561
+
562
+ def copy_sitemap_file_to_rails_app(extension)
563
+ FileUtils.cp(File.join(SitemapGenerator.root, "spec/files/sitemap.#{extension}.rb"), SitemapGenerator.app.root + 'config/sitemap.rb')
564
+ end
565
+
566
+ def delete_sitemap_file_from_rails_app
567
+ FileUtils.remove(SitemapGenerator.app.root + 'config/sitemap.rb')
568
+ rescue
569
+ nil
570
+ end
571
+
572
+ def clean_sitemap_files_from_rails_app
573
+ FileUtils.rm_rf(rails_path('public/'))
574
+ FileUtils.mkdir_p(rails_path('public/'))
575
+ end
576
+
577
+ # Better would be to just invoke the environment task and use
578
+ # the interpreter.
579
+ def execute_sitemap_config(opts={})
580
+ SitemapGenerator::Interpreter.run(opts)
581
+ end
582
+ end