flickrmocks 0.8.5

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 (68) hide show
  1. data/.autotest +36 -0
  2. data/.document +5 -0
  3. data/.gitignore +23 -0
  4. data/.rspec +3 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +59 -0
  7. data/Rakefile +76 -0
  8. data/VERSION +1 -0
  9. data/autotest/discover.rb +1 -0
  10. data/flickrmocks.gemspec +155 -0
  11. data/lib/flickr_mocks/api/api.rb +42 -0
  12. data/lib/flickr_mocks/api/flickr.rb +27 -0
  13. data/lib/flickr_mocks/api/helpers.rb +19 -0
  14. data/lib/flickr_mocks/api/options.rb +55 -0
  15. data/lib/flickr_mocks/api/sanitize.rb +29 -0
  16. data/lib/flickr_mocks/fixtures.rb +35 -0
  17. data/lib/flickr_mocks/flickraw/custom_clone.rb +19 -0
  18. data/lib/flickr_mocks/flickraw/custom_compare.rb +25 -0
  19. data/lib/flickr_mocks/flickraw/custom_marshal.rb +39 -0
  20. data/lib/flickr_mocks/flickraw/flickraw.rb +14 -0
  21. data/lib/flickr_mocks/helpers.rb +52 -0
  22. data/lib/flickr_mocks/models/helpers.rb +14 -0
  23. data/lib/flickr_mocks/models/photo.rb +101 -0
  24. data/lib/flickr_mocks/models/photo_details.rb +86 -0
  25. data/lib/flickr_mocks/models/photo_dimensions.rb +103 -0
  26. data/lib/flickr_mocks/models/photo_search.rb +115 -0
  27. data/lib/flickr_mocks/models/photo_size.rb +60 -0
  28. data/lib/flickr_mocks/models/photo_sizes.rb +93 -0
  29. data/lib/flickr_mocks/models/photos.rb +133 -0
  30. data/lib/flickr_mocks/stubs.rb +103 -0
  31. data/lib/flickr_mocks/version.rb +4 -0
  32. data/lib/flickrmocks.rb +27 -0
  33. data/spec/api/api_spec.rb +84 -0
  34. data/spec/api/flickr_spec.rb +48 -0
  35. data/spec/api/helper_spec.rb +37 -0
  36. data/spec/api/options_spec.rb +152 -0
  37. data/spec/api/sanitize_spec.rb +90 -0
  38. data/spec/base/fixtures_spec.rb +89 -0
  39. data/spec/base/flickraw/custom_clone_spec.rb +70 -0
  40. data/spec/base/flickraw/custom_compare_spec.rb +98 -0
  41. data/spec/base/flickraw/custom_marshal_spec.rb +45 -0
  42. data/spec/base/helpers_spec.rb +63 -0
  43. data/spec/base/stubs_spec.rb +180 -0
  44. data/spec/base/version_spec.rb +15 -0
  45. data/spec/fixtures/author_photos.marshal +0 -0
  46. data/spec/fixtures/empty_photos.marshal +0 -0
  47. data/spec/fixtures/expected_methods.marshal +17 -0
  48. data/spec/fixtures/interesting_photos.marshal +0 -0
  49. data/spec/fixtures/photo.marshal +0 -0
  50. data/spec/fixtures/photo_details.marshal +0 -0
  51. data/spec/fixtures/photo_size.marshal +0 -0
  52. data/spec/fixtures/photo_sizes.marshal +0 -0
  53. data/spec/fixtures/photos.marshal +0 -0
  54. data/spec/models/helpers_spec.rb +25 -0
  55. data/spec/models/photo_details_spec.rb +224 -0
  56. data/spec/models/photo_dimensions_spec.rb +208 -0
  57. data/spec/models/photo_search_spec.rb +255 -0
  58. data/spec/models/photo_size_spec.rb +122 -0
  59. data/spec/models/photo_sizes_spec.rb +168 -0
  60. data/spec/models/photo_spec.rb +278 -0
  61. data/spec/models/photos_spec.rb +305 -0
  62. data/spec/shared_examples/array_accessor.rb +157 -0
  63. data/spec/shared_examples/collection.rb +49 -0
  64. data/spec/shared_examples/image_url_helpers.rb +56 -0
  65. data/spec/shared_examples/size_accessor.rb +13 -0
  66. data/spec/spec_helper.rb +24 -0
  67. data/tasks/fixtures.rb +164 -0
  68. metadata +259 -0
@@ -0,0 +1,133 @@
1
+ module FlickrMocks
2
+ class Photos
3
+ attr_reader :current_page,:per_page,:total_entries,:total_pages,:photos
4
+ alias :perpage :per_page
5
+
6
+ @defaults = {
7
+ :max_entries => 4000,
8
+ :per_page => 50
9
+ }
10
+
11
+
12
+ class << self
13
+ attr_accessor :defaults
14
+ end
15
+
16
+ def initialize(data)
17
+ raise ArgumentError, 'Expecting class of FlickRaw::ResponseList' unless data.class == FlickRaw::ResponseList
18
+ self.current_page= data.page
19
+ self.per_page= data.perpage
20
+ self.total_entries= data.total
21
+ self.total_pages = data.pages
22
+ self.photos = data.photo
23
+ end
24
+
25
+ def default(value)
26
+ Photos.defaults[value.to_s.to_sym]
27
+ end
28
+
29
+ def capped_entries
30
+ total_entries > max_entries ? max_entries : total_entries
31
+ end
32
+
33
+ def capped?
34
+ max_entries < total_entries ? true : false
35
+ end
36
+
37
+ def max_entries
38
+ default(:max_entries)
39
+ end
40
+
41
+ def pages
42
+ max_pages = default(:max_entries)/perpage
43
+ total_pages > max_pages ? max_pages : total_pages
44
+ end
45
+
46
+ def usable_photos
47
+ photos.clone.keep_if(&:usable?)
48
+ end
49
+
50
+ def collection(usable=nil)
51
+ case usable
52
+ when true
53
+ usable_photos = photos.clone.keep_if(&:usable?)
54
+ ::WillPaginate::Collection.create(1, per_page, usable_photos.length) do |obj|
55
+ obj.replace(usable_photos)
56
+ end
57
+ else
58
+ ::WillPaginate::Collection.create(current_page, per_page, capped_entries) do |obj|
59
+ obj.replace(photos)
60
+ end
61
+ end
62
+ end
63
+
64
+
65
+ def ==(other)
66
+ return false unless other.class == Photos
67
+ return false unless [:current_page,:per_page,:total_entries,:total_pages].inject(true) do |state,method|
68
+ state && (self.send(method) == other.send(method))
69
+ end
70
+ other.respond_to?(:photos) ? photos == other.photos : false
71
+ end
72
+
73
+
74
+ # metaprogramming methods
75
+ def method_missing(id,*args,&block)
76
+ return photos.send(id,*args,&block) if delegated_instance_methods.include?(id)
77
+ super
78
+ end
79
+
80
+ alias :old_respond_to? :respond_to?
81
+ def respond_to?(method)
82
+ old_respond_to?(method) || delegated_instance_methods.include?(method)
83
+ end
84
+
85
+ alias :old_methods :methods
86
+ def methods
87
+ delegated_instance_methods + old_methods
88
+ end
89
+
90
+ def delegated_instance_methods
91
+ FlickrMocks::Models::Helpers.array_accessor_methods
92
+ end
93
+
94
+ # custom cloning methods
95
+ def initialize_copy(orig)
96
+ super
97
+ @photos = @photos.map do |photo|
98
+ photo.clone
99
+ end
100
+ end
101
+
102
+ private
103
+ def current_page=(value)
104
+ raise ArgumentError,"Expected Fixnum but was #{value.class}" unless value.is_a?(Fixnum) or value.is_a?(String)
105
+ @current_page=value.to_i
106
+ end
107
+
108
+ def per_page=(value)
109
+ raise ArgumentError,"Expected Fixnum but was #{value.class}" unless value.is_a?(Fixnum) or value.is_a?(String)
110
+ @per_page=value.to_i
111
+ end
112
+
113
+ def total_entries=(value)
114
+ raise ArgumentError,"Expected Fixnum but was #{value.class}" unless value.is_a?(Fixnum) or value.is_a?(String)
115
+ @total_entries=value.to_i
116
+ end
117
+
118
+ def total_pages=(value)
119
+ raise ArgumentError,"Expected Fixnum but was #{value.class}" unless value.is_a?(Fixnum) or value.is_a?(String)
120
+ @total_pages=value.to_i
121
+ end
122
+
123
+ def photos=(photos)
124
+ raise ArgumentError,"Expected argument that responds to :each but got class #{photos.class}" unless photos.respond_to?(:each)
125
+ results = []
126
+ photos.each do |photo|
127
+ raise ArgumentError,"Expected FlickRaw::Response but was #{value.class}" unless photo.is_a?(FlickRaw::Response)
128
+ results.push(Photo.new(photo))
129
+ end
130
+ @photos=results
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,103 @@
1
+ module FlickrMocks
2
+ module Stubs
3
+
4
+ def self.stub_flickr
5
+ [:stub_search,:stub_getInfo,:stub_getSizes,:stub_interestingness].each do |method|
6
+ self.send(method)
7
+ end
8
+ end
9
+
10
+
11
+ def self.stub_search
12
+ fixtures = Fixtures.new
13
+ Proc.new { flickr.photos.stub(:search) do |params|
14
+ if !params.is_a?(Hash)
15
+ raise FlickRaw::FailedResponse.new('Parameterless searches have been disabled. Please use flickr.photos.getRecent instead.',
16
+ 'code','flickr.photos.search'
17
+ )
18
+ elsif(params[:tags] == 'garbage' || params[:user_id] == 'garbage')
19
+ fixtures.empty_photos
20
+ elsif(params[:tags] && params[:user_id])
21
+ fixtures.author_photos
22
+ elsif params.has_key?(:tags)
23
+ fixtures.photos
24
+ elsif params.has_key?(:user_id)
25
+ fixtures.author_photos
26
+ else
27
+ raise FlickRaw::FailedResponse.new('Parameterless searches have been disabled. Please use flickr.photos.getRecent instead.',
28
+ 'code','flickr.photos.search'
29
+ )
30
+ end
31
+ end
32
+ }.call
33
+ end
34
+
35
+ def self.stub_getInfo
36
+ Proc.new {
37
+ flickr.photos.stub(:getInfo) do |params|
38
+ if !params.is_a?(Hash)
39
+ raise FlickRaw::FailedResponse.new('Photo not found',
40
+ 'code', 'flickr.photos.getInfo')
41
+ elsif !params.has_key?(:photo_id)
42
+ raise FlickRaw::FailedResponse.new('Photo not found',
43
+ 'code', 'flickr.photos.getInfo')
44
+ elsif params[:photo_id] == 'garbage'
45
+ raise FlickRaw::FailedResponse.new('Photo "%s" not found (invalid ID)' % params[:photo_id],
46
+ 'code','flickr.photos.getInfo')
47
+ else
48
+ Fixtures.new.photo_details
49
+ end
50
+ end
51
+ }.call
52
+ end
53
+
54
+ def self.stub_getSizes
55
+ Proc.new {
56
+ flickr.photos.stub(:getSizes) do |params|
57
+ if !params.is_a?(Hash)
58
+ raise FlickRaw::FailedResponse.new('Photo not found',
59
+ 'code', 'flickr.photos.getSizes')
60
+ elsif !params.has_key?(:photo_id)
61
+ raise FlickRaw::FailedResponse.new('Photo not found',
62
+ 'code', 'flickr.photos.getSizes')
63
+ elsif params[:photo_id] == 'garbage'
64
+ raise FlickRaw::FailedResponse.new('Photo not found',
65
+ 'code','flickr.photos.getSizes')
66
+ else
67
+ Fixtures.new.photo_sizes
68
+ end
69
+ end
70
+ }.call
71
+ end
72
+
73
+ def self.stub_interestingness
74
+ Proc.new {
75
+ flickr.interestingness.stub(:getList) do |params|
76
+ if !params.is_a?(Hash)
77
+ Fixtures.new.interesting_photos
78
+ elsif !params.has_key?(:date)
79
+ Fixtures.new.interesting_photos
80
+ elsif params[:date] == 'garbage'
81
+ raise FlickRaw::FailedResponse.new('Not a valid date string',
82
+ 'code','flickr.interestingness.getList'
83
+ )
84
+ elsif params[:date] == '2000-01-01'
85
+ Fixtures.new.empty_photos
86
+ else
87
+ Fixtures.new.interesting_photos
88
+ end
89
+ end
90
+ }.call
91
+ end
92
+
93
+ end
94
+ end
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
@@ -0,0 +1,4 @@
1
+
2
+ module FlickrMocks
3
+ VERSION = File.read(File.expand_path("../../../VERSION", __FILE__)).strip
4
+ end
@@ -0,0 +1,27 @@
1
+ require 'chronic'
2
+
3
+ require 'find'
4
+ require 'delegate'
5
+ require 'cgi'
6
+
7
+ require 'will_paginate/collection'
8
+
9
+ # Use user specified FlickRaw definition, if not defined use flickraw-cached if
10
+ # available
11
+ begin
12
+ require 'flickraw-cached' unless defined?(FlickRaw)
13
+ rescue LoadError
14
+ require 'flickraw'
15
+ end
16
+
17
+
18
+
19
+ flickrmocks_path = File.expand_path('../flickr_mocks/', __FILE__)
20
+
21
+
22
+ # include all ruby files in the library path
23
+ Find.find(flickrmocks_path) do |file|
24
+ if File.file?(file)
25
+ require file if File.extname(file) == '.rb'
26
+ end
27
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+ require 'ruby-debug'
3
+ describe APP::Api do
4
+ let(:klass) { APP::Api }
5
+
6
+ let(:fixtures) { APP::Fixtures.new }
7
+ let(:photo) {fixtures.photo}
8
+ let(:photos) {fixtures.photos}
9
+ let(:sizes) {fixtures.photo_sizes}
10
+ let(:photo_details) {fixtures.photo_details}
11
+ let(:interesting_photos) {fixtures.interesting_photos}
12
+
13
+
14
+ context "class instance variables" do
15
+ context "@defaults" do
16
+ before(:each) do
17
+ @defaults = klass.defaults.clone
18
+ end
19
+ after(:each) do
20
+ klass.defaults = @defaults
21
+ end
22
+ it "returns has with expected set of keys" do
23
+ klass.defaults.keys.sort.should == [:per_page,:license,:media,:extras,:tag_mode,:flickr_tag_modes].sort
24
+ end
25
+ it "returns object whose elements can be set similar to a hash" do
26
+ expected = "#{Random.srand}"
27
+ klass.defaults.keys.each do |k|
28
+ klass.defaults[k] = expected
29
+ klass.defaults[k].should == expected
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ context "class methods" do
36
+ specify {klass.should respond_to(:photo)}
37
+ context "photo" do
38
+ it "returns expected Photo object" do
39
+ flickr.photos.stub(:getInfo).and_return(photo)
40
+ klass.photo({:photo =>photo.id,
41
+ :secret => photo.secret}).should == APP::Photo.new(photo)
42
+ end
43
+ end
44
+
45
+ specify {klass.should respond_to(:photos)}
46
+ context "photos" do
47
+ it "returns expected PhotoSearch object" do
48
+ flickr.photos.stub(:search).and_return(photos)
49
+ klass.photos({:search_terms => 'iran'}).should ==
50
+ APP::PhotoSearch.new(photos,{:search_terms => 'iran'})
51
+ end
52
+ end
53
+
54
+ specify {klass.should respond_to(:photo_sizes)}
55
+ describe "photo_sizes" do
56
+ it "returns expected PhotoSizes object" do
57
+ expected = APP::PhotoSizes.new(sizes)
58
+ flickr.photos.stub(:getSizes).and_return(sizes)
59
+ klass.photo_sizes(:photo => expected.id,
60
+ :secret => expected.secret).should == expected
61
+ end
62
+ end
63
+
64
+ specify {klass.should respond_to(:photo_details)}
65
+ describe "photo_details" do
66
+ it "returns expected PhotoDetails object" do
67
+ flickr.photos.stub(:getSizes).and_return(sizes)
68
+ flickr.photos.stub(:getInfo).and_return(photo)
69
+ klass.photo_details(:photo => photo.id,
70
+ :secret => photo.secret).should == APP::PhotoDetails.new(photo,sizes)
71
+ end
72
+ end
73
+
74
+ specify {klass.should respond_to(:interesting_photos)}
75
+ describe "interesting_photos" do
76
+ it "returns expected PhotoSearch object" do
77
+ flickr.interestingness.stub(:getList).and_return(interesting_photos)
78
+ klass.interesting_photos({:date => '2010-01-01'}).should ==
79
+ APP::PhotoSearch.new(interesting_photos,{:date => '2010-01-01'})
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe APP::Api do
4
+ let(:klass){APP::Api}
5
+ let(:fixtures){APP::Fixtures.new}
6
+
7
+ context "class methods" do
8
+ specify {klass.should respond_to(:flickr_photos)}
9
+ context "flickr_photos" do
10
+ it "returns list of photos" do
11
+ flickr.photos.stub(:search).and_return(fixtures.photos)
12
+ klass.flickr_photos({}).should == fixtures.photos
13
+ end
14
+ end
15
+
16
+ specify {klass.should respond_to(:flickr_photo)}
17
+ context "flickr_photos" do
18
+ it "returns photo" do
19
+ flickr.photos.stub(:getInfo).and_return(fixtures.photo)
20
+ klass.flickr_photo({}).should == fixtures.photo
21
+ end
22
+ end
23
+
24
+ specify {klass.should respond_to(:flickr_photo_sizes)}
25
+ context "flickr_photo_sizes" do
26
+ it "returns list sizes for a photo" do
27
+ flickr.photos.stub(:getSizes).and_return(fixtures.photo_sizes)
28
+ klass.flickr_photo_sizes({}).should == fixtures.photo_sizes
29
+ end
30
+ end
31
+
32
+ specify {klass.should respond_to(:flickr_interestingness)}
33
+ context "flickr_interestingness" do
34
+ it "returns list of interesting photos" do
35
+ flickr.interestingness.stub(:getList).and_return(fixtures.interesting_photos)
36
+ klass.flickr_interestingness({}).should == fixtures.interesting_photos
37
+ end
38
+ end
39
+
40
+ specify {klass.should respond_to(:flickr_author)}
41
+ context "flickr_author" do
42
+ it "returns list of photos for an author" do
43
+ flickr.photos.stub(:search).and_return(fixtures.author_photos)
44
+ klass.flickr_author({}).should == fixtures.author_photos
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe APP::Api do
4
+
5
+ let(:klass) {APP::Api}
6
+ context "class methods" do
7
+ specify {klass.should respond_to(:default)}
8
+ context "default" do
9
+ it "returns key stored in @defaults class instance variable when symbol specified" do
10
+ klass.default(:per_page).should == klass.defaults[:per_page]
11
+ end
12
+ it "returns key stored in @defaults class instance variable when string specified" do
13
+ klass.default('per_page').should == klass.defaults[:per_page]
14
+ end
15
+ it "returns nil when key that is not in @defaults class instance variable is specified" do
16
+ klass.default('garbage').should == nil
17
+ end
18
+ end
19
+
20
+ specify {klass.should respond_to(:time)}
21
+ context "time" do
22
+ it "returns yesterday when no time is specified" do
23
+ expected = Chronic.parse('yesterday').strftime('%Y-%m-%d')
24
+ klass.time.should == expected
25
+ end
26
+
27
+ it "returns user specified date when proper date given" do
28
+ expected = '2010-12-25'
29
+ klass.time(expected).should == expected
30
+ end
31
+
32
+ it "returns yesterday when garbage date given" do
33
+ klass.time('garbage').should == Chronic.parse('yesterday').strftime('%Y-%m-%d')
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+
3
+ describe APP::Api do
4
+ let(:api) {APP::Api}
5
+ let(:subject) {APP::Api}
6
+ let(:extras){
7
+ { :license => '4,5,6,7',
8
+ :media => 'photos',
9
+ :extras => 'license',
10
+ :tag_mode => 'any'}
11
+ }
12
+ let(:expected){
13
+ { :per_page => '400',
14
+ :user_id => nil,
15
+ :tags => 'iran,shiraz',
16
+ :page => '2'}.merge(extras.clone)
17
+ }
18
+
19
+ let(:options){
20
+ {
21
+ :search_terms => 'iran,shiraz',
22
+ :page => '2'
23
+ }.merge(extras.clone)
24
+ }
25
+
26
+
27
+ describe "search_options" do
28
+ it "should give correct options when all options are specified except :author_id" do
29
+ subject.search_options(options.clone.merge(:per_page =>'400')).should == expected
30
+ end
31
+ it "should return options when fully specified" do
32
+ subject.search_options(:per_page => '400',:owner_id => 'authorid',:page => '2').should ==
33
+ expected.clone.merge(:user_id => 'authorid',:tags => nil)
34
+
35
+ end
36
+ it "should give correct values when :perpage given in lieu of :per_page" do
37
+ subject.search_options(options.clone.merge({:perpage => '400'})).should == expected
38
+ end
39
+ it "should give correct value when no :perpage is specified" do
40
+ subject.search_options(options).should == expected.clone.merge({:per_page => '200'})
41
+ end
42
+ it "should give preference to :per_page to :perpage" do
43
+ subject.search_options(options.clone.merge({:per_page => '500', :perpage => '444'})).should ==
44
+ expected.clone.merge(:per_page => '500')
45
+ end
46
+ it "should be able to set :tag_mode" do
47
+ subject.search_options(options.clone.merge(:per_page => '500', :tag_mode=>'all' )).should ==
48
+ expected.clone.merge({:per_page => '500',:tag_mode => 'all'}
49
+ )
50
+ end
51
+ it "should give default tag_mode when not specified" do
52
+ subject.search_options(options.clone.merge(:per_page => '500')).should ==
53
+ expected.clone.merge({:per_page => '500'}
54
+ )
55
+ end
56
+ it "should give default tag_mode when junk given for tag_mode" do
57
+ subject.search_options(options.clone.merge(:per_page => '500', :tag_mode => 'junk')).should ==
58
+ expected.clone.merge({:per_page => '500'}
59
+ )
60
+ end
61
+ end
62
+
63
+ describe "interesting_options" do
64
+ let(:expected){
65
+ { :date => '2010-02-14',
66
+ :per_page => '2',
67
+ :page => '2'
68
+ }
69
+ }
70
+ it "should return proper date with default options" do
71
+ subject.interesting_options(expected).should == expected.clone.merge(:extras => 'license')
72
+ end
73
+ it "should return proper date when no page given" do
74
+ subject.interesting_options(:date => '2010-02-14', :per_page => '2').should ==
75
+ expected.clone.merge(:page => '1', :extras => 'license')
76
+
77
+ end
78
+ it "should return proper date when not specified" do
79
+ date = Chronic.parse('yesterday').strftime('%Y-%m-%d')
80
+ subject.interesting_options({:date => date})[:date].should == date
81
+ end
82
+ end
83
+
84
+ describe "photo_options" do
85
+ let(:expected) {
86
+ {:photo_id => '20030', :secret => 'abcdef'}
87
+ }
88
+
89
+ it "should extract :photo_id and :secret" do
90
+ subject.photo_options(expected).should == expected
91
+ end
92
+ it "should return photo id when present" do
93
+ subject.photo_options(:id => '20030',:secret => 'abcdef').should == expected
94
+ end
95
+ it "should give preference to :photo_id over :id" do
96
+ subject.photo_options(expected.clone.merge(:id => 'not correct')).should == expected
97
+ end
98
+ it "should give preference to :photo_secret over :secret" do
99
+ subject.photo_options(:photo_secret => 'abcdef', :secret => 'not correct', :id => '20030').should ==
100
+ expected
101
+
102
+ end
103
+ end
104
+
105
+ describe "search_params" do
106
+ let(:expected){
107
+ {
108
+ :search_terms => 'iran,shiraz',
109
+ :owner_id => 'authorid',
110
+ :base_url => 'http://www.happyboy.com/'
111
+ }
112
+ }
113
+ let(:base_url) {'http://www.example.com/'}
114
+
115
+ it "should return properly when all options specified" do
116
+ subject.search_params(expected).should == expected
117
+ end
118
+ it "should filter non-required options" do
119
+ subject.search_params(expected.clone.merge(:date => '2010-10-02',:per_page => '2')).should ==
120
+ expected
121
+
122
+ end
123
+ it "should properly extract :base_url" do
124
+ subject.search_params(expected.clone.merge(:base_url => base_url)).should ==
125
+ expected.clone.merge(:base_url => base_url)
126
+ end
127
+ end
128
+
129
+ describe "interesting_params" do
130
+
131
+ let(:expected) {
132
+ {
133
+ :date => 'iran,shiraz',
134
+ :base_url => 'http://www.happyboy.com/'
135
+ }
136
+ }
137
+ it "should return correct options when all are specified" do
138
+ subject.interesting_params(expected).should == expected
139
+ end
140
+ it "should filter non-required options" do
141
+ subject.interesting_params(expected.clone.merge(:search_terms => 'iran,shiraz',
142
+ :owner_id => 'authorid')).should == expected
143
+ end
144
+ it "should extract base_url options" do
145
+ subject.interesting_params(expected.clone.merge(:base_url => expected[:base_url])).should ==
146
+ expected.clone.merge(:base_url => expected[:base_url])
147
+ end
148
+ end
149
+
150
+ end
151
+
152
+
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe APP::Api do
4
+ let(:klass) {APP::Api}
5
+
6
+
7
+ context "class methods" do
8
+ specify {klass.should respond_to(:sanitize_tags)}
9
+ context "sanitize_tags" do
10
+ it "returns expected tags when specified" do
11
+ klass.sanitize_tags('iran,shiraz').should == 'iran,shiraz'
12
+ end
13
+ it "returns lower cased version of tags when mixed case tag is specified" do
14
+ klass.sanitize_tags('IrAn,ShiRaZ').should == 'iran,shiraz'
15
+ end
16
+ it "returns tags stripped of extraneous spaces between tags" do
17
+ klass.sanitize_tags('iran , shiraz ').should == 'iran,shiraz'
18
+ end
19
+ it "returns tags that preserve spaces within a tag" do
20
+ klass.sanitize_tags('iran , shiraz hafez, isfehan').should == 'iran,shiraz hafez,isfehan'
21
+ end
22
+ end
23
+
24
+ specify {klass.should respond_to(:sanitize_per_page)}
25
+ context "sanitize_per_page" do
26
+ it "returns expected per_page when per_page specified" do
27
+ klass.sanitize_per_page(:per_page => '2').should == '2'
28
+ end
29
+ it "returns default per_page when per_page is not specified" do
30
+ klass.sanitize_per_page({}).should == klass.default(:per_page)
31
+ end
32
+ it "returns expected per_page when perpage specified" do
33
+ klass.sanitize_per_page(:perpage => '33').should == '33'
34
+ end
35
+ it "returns per_page when both :perpage and per_page is specified" do
36
+ klass.sanitize_per_page(:per_page => '222', :perpage => '333').should == '222'
37
+ end
38
+ end
39
+
40
+ specify {klass.should respond_to(:sanitize_page)}
41
+ context "sanitize_page" do
42
+ it "returns specified page number when given" do
43
+ klass.sanitize_page(:page => 2).should == '2'
44
+ end
45
+ it "returns '1' when page number not specified" do
46
+ klass.sanitize_page({}).should == '1'
47
+ end
48
+ it "returns '1' when string '0' specified for page number" do
49
+ klass.sanitize_page(:page => '0').should == '1'
50
+ end
51
+ it "returns '1' when number 0 specified as page number" do
52
+ klass.sanitize_page(:page => 0).should == '1'
53
+ end
54
+ end
55
+
56
+ specify {klass.should respond_to(:sanitize_tag_mode)}
57
+ context "sanitize_tag_mode" do
58
+ it "returns 'any' if specified" do
59
+ klass.sanitize_tag_mode(:tag_mode => 'any').should == 'any'
60
+ end
61
+ it "returns default tag_mode when non-specified" do
62
+ klass.sanitize_tag_mode.should == klass.default(:tag_mode)
63
+ end
64
+ it "returns default tag_mode when garbage specified" do
65
+ klass.sanitize_tag_mode(:tag_mode => 'garbage').should == klass.default(:tag_mode)
66
+ end
67
+ it "returns default tag mode if nil given" do
68
+ klass.sanitize_tag_mode(:tag_mode => nil).should == klass.default(:tag_mode)
69
+ end
70
+ it "returns 'all' if specified" do
71
+ klass.sanitize_tag_mode(:tag_mode => 'all').should == 'all'
72
+ end
73
+ end
74
+
75
+ specify {klass.should respond_to(:sanitize_time)}
76
+ context "sanitize_time" do
77
+ it "returns expected date when format '2010-12-22'" do
78
+ klass.sanitize_time(:date => '2010-12-22').should == '2010-12-22'
79
+ end
80
+ it "returns expected date when format 'Jan 1 2003'" do
81
+ date = Chronic.parse('Jan 1 2003').strftime('%Y-%m-%d')
82
+ klass.sanitize_time(:date => 'Jan 1 2003').should == date
83
+ end
84
+ it "returns yesterday if no date specified" do
85
+ date = Chronic.parse('yesterday').strftime('%Y-%m-%d')
86
+ klass.sanitize_time.should == date
87
+ end
88
+ end
89
+ end
90
+ end