flickrmocks 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
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