isbndb 1.5.5 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/.rvmrc +48 -0
- data/.travis.yml +6 -0
- data/Gemfile +2 -14
- data/Gemfile.lock +41 -21
- data/README.markdown +118 -102
- data/Rakefile +6 -46
- data/config/isbndb.example.yml +3 -0
- data/isbndb.gemspec +19 -73
- data/lib/core_extensions/nil.rb +5 -0
- data/lib/core_extensions/string.rb +49 -0
- data/lib/isbndb.rb +9 -113
- data/lib/isbndb/access_key_set.rb +31 -20
- data/lib/isbndb/exceptions.rb +1 -2
- data/lib/isbndb/query.rb +78 -0
- data/lib/isbndb/result.rb +38 -39
- data/lib/isbndb/result_set.rb +32 -33
- data/spec/responses/access_key_error.xml +5 -0
- data/spec/responses/authors_seth.xml +46 -0
- data/spec/responses/books_hello.xml +76 -0
- data/spec/responses/categories_fiction.xml +46 -0
- data/spec/responses/keystats.xml +6 -0
- data/spec/responses/publishers_francis.xml +46 -0
- data/spec/responses/search.xml +76 -0
- data/spec/responses/subjects_ruby.xml +36 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/support/helpers.rb +8 -0
- data/spec/units/access_key_set_spec.rb +98 -0
- data/spec/units/nil_spec.rb +9 -0
- data/spec/units/query_spec.rb +179 -0
- data/spec/units/result_set_spec.rb +89 -0
- data/spec/units/result_spec.rb +105 -0
- data/spec/units/string_spec.rb +118 -0
- metadata +110 -81
- data/.document +0 -5
- data/ACKNOWLEDGEMENTS +0 -3
- data/LICENSE.txt +0 -20
- data/VERSION +0 -1
- data/test/helper.rb +0 -23
- data/test/test_isbndb.rb +0 -77
@@ -0,0 +1,76 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<ISBNdb server_time="2012-06-16T19:10:15Z">
|
4
|
+
<BookList total_results="5811" page_size="10" page_number="1" shown_results="10">
|
5
|
+
<BookData book_id="1000s_of_amazing_uses_for_everyday_products" isbn="1605533408" isbn13="9781605533407">
|
6
|
+
<Title>1000s of Amazing Uses for Everyday Products</Title>
|
7
|
+
<TitleLong></TitleLong>
|
8
|
+
<AuthorsText>Betsy Rossen Elliot, </AuthorsText>
|
9
|
+
<PublisherText publisher_id="publications_international_ltd">Publications International, Ltd.</PublisherText>
|
10
|
+
<Details change_time="2011-02-15T19:26:11Z" price_time="2011-12-03T20:38:20Z" edition_info="Hardcover; 2010-01-15" language="" physical_description_text="6.9"x9.1"x1.5"; 2.8 lb; 448 pages" lcc_number="" dewey_decimal_normalized="" dewey_decimal="" />
|
11
|
+
</BookData>
|
12
|
+
<BookData book_id="1000_more_amazing_facts_for_kids" isbn="0706364333" isbn13="9780706364330">
|
13
|
+
<Title>1000 more amazing facts for kids</Title>
|
14
|
+
<TitleLong></TitleLong>
|
15
|
+
<AuthorsText>Keith Smithcartoons by David Mostyn</AuthorsText>
|
16
|
+
<PublisherText publisher_id="ward_lock">London Ward Lock c1986</PublisherText>
|
17
|
+
<Details change_time="2006-05-11T22:47:47Z" price_time="2012-06-16T10:52:07Z" edition_info="" language="eng" physical_description_text="112p ill 32x13cm pbk" lcc_number="AG243" dewey_decimal_normalized="32.02" dewey_decimal="032/.02" />
|
18
|
+
</BookData>
|
19
|
+
<BookData book_id="1001_amazing_animal_facts" isbn="1848372299" isbn13="9781848372290">
|
20
|
+
<Title>1001 Amazing Animal Facts</Title>
|
21
|
+
<TitleLong></TitleLong>
|
22
|
+
<AuthorsText>Marc Powell, </AuthorsText>
|
23
|
+
<PublisherText publisher_id="arcturus_publishing_ltd">Arcturus Publishing Ltd</PublisherText>
|
24
|
+
<Details change_time="2009-11-13T06:24:54Z" price_time="2011-06-09T06:39:01Z" edition_info="Paperback; 2009-06-01" language="" physical_description_text="8.2"x9.9"x0.6"; 1.2 lb; 208 pages" lcc_number="" dewey_decimal_normalized="" dewey_decimal="" />
|
25
|
+
</BookData>
|
26
|
+
<BookData book_id="1001_amazing_facts" isbn="0603552714" isbn13="9780603552717">
|
27
|
+
<Title>1001 Amazing Facts</Title>
|
28
|
+
<TitleLong></TitleLong>
|
29
|
+
<AuthorsText></AuthorsText>
|
30
|
+
<PublisherText publisher_id="egmont_childrens_books">Egmont Childrens Books</PublisherText>
|
31
|
+
<Details change_time="2006-03-08T07:05:13Z" price_time="2011-04-02T10:36:53Z" edition_info="Paperback; 1994-07-14" language="" physical_description_text="" lcc_number="" dewey_decimal_normalized="" dewey_decimal="" />
|
32
|
+
</BookData>
|
33
|
+
<BookData book_id="1001_stupid_sports_quotes" isbn="1599210126" isbn13="9781599210124">
|
34
|
+
<Title>1001 Stupid Sports Quotes</Title>
|
35
|
+
<TitleLong>1001 Stupid Sports Quotes: Jaw-Dropping, Stupefying, and Amazing Expressions from the World's Best Athletes</TitleLong>
|
36
|
+
<AuthorsText>Randy Howe (Editor)</AuthorsText>
|
37
|
+
<PublisherText publisher_id="the_lyons_press">The Lyons Press</PublisherText>
|
38
|
+
<Details change_time="2010-04-06T17:19:18Z" price_time="2012-05-26T18:31:10Z" edition_info="Hardcover; 2007-06-01" language="" physical_description_text="5.7"x7.0"x1.3"; 1.1 lb; 352 pages" lcc_number="" dewey_decimal_normalized="818.602080357" dewey_decimal="818.602080357" />
|
39
|
+
</BookData>
|
40
|
+
<BookData book_id="100_amazing_americans" isbn="0440842638" isbn13="9780440842637">
|
41
|
+
<Title>100 Amazing Americans</Title>
|
42
|
+
<TitleLong></TitleLong>
|
43
|
+
<AuthorsText></AuthorsText>
|
44
|
+
<PublisherText publisher_id="the_trumpet_club">The Trumpet Club</PublisherText>
|
45
|
+
<Details change_time="2007-10-09T14:45:31Z" price_time="2011-06-26T13:55:19Z" edition_info="Paperback; 1990" language="" physical_description_text="" lcc_number="" dewey_decimal_normalized="" dewey_decimal="" />
|
46
|
+
</BookData>
|
47
|
+
<BookData book_id="100_amazing_answers_to_prayer" isbn="0800758315" isbn13="9780800758318">
|
48
|
+
<Title>100 amazing answers to prayer</Title>
|
49
|
+
<TitleLong></TitleLong>
|
50
|
+
<AuthorsText>William J. Petersen and Randy Petersen</AuthorsText>
|
51
|
+
<PublisherText publisher_id="f_h_revell">Grand Rapids, MI : F.H. Revell, c2003.</PublisherText>
|
52
|
+
<Details change_time="2009-06-02T07:33:42Z" price_time="2012-05-03T17:23:32Z" edition_info="" language="eng" physical_description_text="224 p. ; 23 cm." lcc_number="BV220" dewey_decimal_normalized="248.32" dewey_decimal="248.3/2" />
|
53
|
+
</BookData>
|
54
|
+
<BookData book_id="100_amazing_answers_to_prayer_a01" isbn="0800787684" isbn13="9780800787684">
|
55
|
+
<Title>100 Amazing Answers to Prayer</Title>
|
56
|
+
<TitleLong></TitleLong>
|
57
|
+
<AuthorsText>William J. Petersen, Randy Petersen, </AuthorsText>
|
58
|
+
<PublisherText publisher_id="revell">Revell</PublisherText>
|
59
|
+
<Details change_time="2009-07-29T13:09:42Z" price_time="2011-03-06T01:11:29Z" edition_info="Mass Market Paperback; 2009-02-01" language="" physical_description_text="4.2"x6.8"x0.9"; 0.5 lb; 256 pages" lcc_number="" dewey_decimal_normalized="248" dewey_decimal="248" />
|
60
|
+
</BookData>
|
61
|
+
<BookData book_id="100_amazing_award_winning_science_fair_projects" isbn="1402719108" isbn13="9781402719103">
|
62
|
+
<Title>100 Amazing Award-Winning Science Fair Projects</Title>
|
63
|
+
<TitleLong></TitleLong>
|
64
|
+
<AuthorsText>Glen Vecchione, </AuthorsText>
|
65
|
+
<PublisherText publisher_id="sterling">Sterling</PublisherText>
|
66
|
+
<Details change_time="2007-01-10T02:57:39Z" price_time="2012-05-31T20:22:37Z" edition_info="Paperback; 2005-02-01" language="" physical_description_text="208 pages" lcc_number="" dewey_decimal_normalized="507.8" dewey_decimal="507.8" />
|
67
|
+
</BookData>
|
68
|
+
<BookData book_id="100_amazing_crosswords" isbn="1402712391" isbn13="9781402712395">
|
69
|
+
<Title>100 Amazing Crosswords</Title>
|
70
|
+
<TitleLong></TitleLong>
|
71
|
+
<AuthorsText>Thomas Joseph, </AuthorsText>
|
72
|
+
<PublisherText publisher_id="puzzlewright">Puzzlewright</PublisherText>
|
73
|
+
<Details change_time="2009-12-22T22:37:49Z" price_time="2012-05-03T19:37:58Z" edition_info="Paperback; 2004-03-28" language="" physical_description_text="6.2"x9.4"x0.4"; 0.3 lb; 128 pages" lcc_number="" dewey_decimal_normalized="793" dewey_decimal="793" />
|
74
|
+
</BookData>
|
75
|
+
</BookList>
|
76
|
+
</ISBNdb>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<ISBNdb server_time="2012-06-16T20:30:57Z">
|
4
|
+
<SubjectList total_results="58" page_size="10" page_number="1" shown_results="10">
|
5
|
+
<SubjectData subject_id="ruby_napdowe_eksploatacja_podrcznik_akademicki" book_count="1" marc_field="650" marc_indicator_1=" " marc_indicator_2="9">
|
6
|
+
<Name>ruby akademicki</Name>
|
7
|
+
</SubjectData>
|
8
|
+
<SubjectData subject_id="bell_ruby" book_count="2" marc_field="600" marc_indicator_1="1" marc_indicator_2="0">
|
9
|
+
<Name>Bell, Ruby</Name>
|
10
|
+
</SubjectData>
|
11
|
+
<SubjectData subject_id="bell_ruby_1942" book_count="2" marc_field="600" marc_indicator_1="1" marc_indicator_2="0">
|
12
|
+
<Name>Bell, Ruby,1942</Name>
|
13
|
+
</SubjectData>
|
14
|
+
<SubjectData subject_id="braff_ruby_1927_2003" book_count="1" marc_field="600" marc_indicator_1="1" marc_indicator_2="0">
|
15
|
+
<Name>Braff, Ruby,1927-2003</Name>
|
16
|
+
</SubjectData>
|
17
|
+
<SubjectData subject_id="bridges_ruby" book_count="4" marc_field="600" marc_indicator_1="1" marc_indicator_2="1">
|
18
|
+
<Name>Bridges, Ruby</Name>
|
19
|
+
</SubjectData>
|
20
|
+
<SubjectData subject_id="bridges_ruby_comic_books_strips_etc" book_count="2" marc_field="600" marc_indicator_1="0" marc_indicator_2="0">
|
21
|
+
<Name>Bridges, Ruby -- Comic books, strips, etc</Name>
|
22
|
+
</SubjectData>
|
23
|
+
<SubjectData subject_id="crane_ruby_fictitious_character_fiction" book_count="1" marc_field="650" marc_indicator_1=" " marc_indicator_2="0">
|
24
|
+
<Name>Crane, Ruby (Fictitious character) -- Fiction</Name>
|
25
|
+
</SubjectData>
|
26
|
+
<SubjectData subject_id="cress_ruby_1911_correspondence" book_count="2" marc_field="600" marc_indicator_1="1" marc_indicator_2="0">
|
27
|
+
<Name>Cress, Ruby,1911-Correspondence</Name>
|
28
|
+
</SubjectData>
|
29
|
+
<SubjectData subject_id="dee_ruby" book_count="7" marc_field="600" marc_indicator_1="1" marc_indicator_2="0">
|
30
|
+
<Name>Dee, Ruby</Name>
|
31
|
+
</SubjectData>
|
32
|
+
<SubjectData subject_id="duncan_ruby" book_count="2" marc_field="600" marc_indicator_1="1" marc_indicator_2="0">
|
33
|
+
<Name>Duncan, Ruby</Name>
|
34
|
+
</SubjectData>
|
35
|
+
</SubjectList>
|
36
|
+
</ISBNdb>
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
4
|
+
require 'rspec'
|
5
|
+
require 'shoulda'
|
6
|
+
require 'webmock/rspec'
|
7
|
+
|
8
|
+
Dir[File.expand_path('spec/support/**/*.rb')].each { |f| require f }
|
9
|
+
|
10
|
+
require 'isbndb'
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.include Helpers
|
14
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ISBNdb::AccessKeySet do
|
4
|
+
before do
|
5
|
+
stub_access_keys('ABC123', 'DEF456', 'GHI789')
|
6
|
+
@access_key_set = ISBNdb::AccessKeySet.new
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'size' do
|
10
|
+
it 'should return 0 if there are no keys' do
|
11
|
+
stub_access_keys
|
12
|
+
ISBNdb::AccessKeySet.new.size.should == 0
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should return the number of access keys' do
|
16
|
+
@access_key_set.size.should == 3
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'current_index' do
|
21
|
+
it 'should return the current index' do
|
22
|
+
@access_key_set.current_index.should == 0
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'current_key' do
|
27
|
+
it 'should return the current key' do
|
28
|
+
@access_key_set.current_key.should == 'ABC123'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'next_key!' do
|
33
|
+
it 'should advance to the next key' do
|
34
|
+
expect{ @access_key_set.next_key! }.to change{ @access_key_set.current_key }.from('ABC123').to('DEF456')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should return the new key' do
|
38
|
+
@access_key_set.next_key!.should == 'DEF456'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'next_key' do
|
43
|
+
it 'should return the next key' do
|
44
|
+
@access_key_set.next_key.should == 'DEF456'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'prev_key!' do
|
49
|
+
before do
|
50
|
+
@access_key_set.instance_variable_set('@current_index', 1)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should de-advance to the prev key' do
|
54
|
+
expect{ @access_key_set.prev_key! }.to change{ @access_key_set.current_key }.from('DEF456').to('ABC123')
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should return the new key' do
|
58
|
+
@access_key_set.prev_key!.should == 'ABC123'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'prev_key' do
|
63
|
+
before do
|
64
|
+
@access_key_set.instance_variable_set('@current_index', 1)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should return the prev key' do
|
68
|
+
@access_key_set.prev_key.should == 'ABC123'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'use_key' do
|
73
|
+
it 'should use an existing key' do
|
74
|
+
@access_key_set.use_key('GHI789').should == 'GHI789'
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should create a new key if it does not already exist' do
|
78
|
+
@access_key_set.use_key('NEW_KEY').should == 'NEW_KEY'
|
79
|
+
@access_key_set.instance_variable_get('@access_keys').should include('NEW_KEY')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'remove_key' do
|
84
|
+
it 'should do nothing if the key does not exist' do
|
85
|
+
expect{ @access_key_set.remove_key('NOPE') }.not_to change{ @access_key_set.instance_variable_get('@access_keys') }
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should remove the key if it exists' do
|
89
|
+
expect{ @access_key_set.remove_key('ABC123') }.to change{ @access_key_set.instance_variable_get('@access_keys') }.from(['ABC123', 'DEF456', 'GHI789']).to(['DEF456', 'GHI789'])
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'to_s' do
|
94
|
+
it 'should return the correct string' do
|
95
|
+
@access_key_set.to_s.should == '#<AccessKeySet @keys=["ABC123", "DEF456", "GHI789"]>'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ISBNdb::Query do
|
4
|
+
before do
|
5
|
+
stub_access_keys('ABC123')
|
6
|
+
end
|
7
|
+
|
8
|
+
context 'find' do
|
9
|
+
context 'without params[:where]' do
|
10
|
+
it 'should throw an exception' do
|
11
|
+
lambda{ ISBNdb::Query.find }.should raise_error, 'No parameters specified! You must specify at least one parameter!'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'with params[:where]' do
|
16
|
+
context 'as a string' do
|
17
|
+
it 'should throw an exception' do
|
18
|
+
lambda{ ISBNdb::Query.find(:where => 'anything') }.should raise_error, 'params[:where] cannot be a String! It must be a Hash!'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'as an array' do
|
23
|
+
it 'should throw an exception' do
|
24
|
+
lambda{ ISBNdb::Query.find(:where => ['anything', 'else']) }.should raise_error, 'params[:where] cannot be an Array! It must be a Hash!'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'as a hash' do
|
29
|
+
before do
|
30
|
+
stub_request(:get, "http://isbndb.com/api/books.xml?access_key=ABC123&index1=title&results=details&value1=amazing").
|
31
|
+
to_return(:body => File.new('spec/responses/search.xml'), :headers => {'Content-Type'=>'text/xml'})
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should not throw an exception' do
|
35
|
+
lambda{ ISBNdb::Query.find(:where => {:title => 'amazing'} ) }.should_not raise_error
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should return an ISBNdb::ResultSet' do
|
39
|
+
ISBNdb::Query.find(:where => {:title => 'amazing'}).should be_a(ISBNdb::ResultSet)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with an access key error' do
|
44
|
+
before do
|
45
|
+
stub_request(:get, "http://isbndb.com/api/books.xml?access_key=ABC123&index1=title&results=details&value1=amazing").to_return(:body => File.new('spec/responses/access_key_error.xml'), :headers => {'Content-Type'=>'text/xml'})
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should raise an exception' do
|
49
|
+
lambda{ ISBNdb::Query.find(:where => {:title => 'amazing'}) }.should raise_error ISBNdb::AccessKeyError
|
50
|
+
end
|
51
|
+
|
52
|
+
after do
|
53
|
+
ISBNdb::Query.access_key_set.prev_key!
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'keystats' do
|
60
|
+
before do
|
61
|
+
stub_request(:get, 'http://isbndb.com/api/books.xml?access_key=ABC123&results=keystats').to_return(:body => File.new('spec/responses/keystats.xml'), :headers => { 'Content-Type' => 'text/xml' })
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should return an Hash' do
|
65
|
+
ISBNdb::Query.keystats.should be_a(Hash)
|
66
|
+
end
|
67
|
+
|
68
|
+
it('should return the number of granted requests'){ ISBNdb::Query.keystats['granted'].should == '2' }
|
69
|
+
it('should return the access key'){ ISBNdb::Query.keystats['access_key'].should == 'ABC123' }
|
70
|
+
it('should return the number of requests made'){ ISBNdb::Query.keystats['requests'].should == '5' }
|
71
|
+
it('should return the account limit'){ ISBNdb::Query.keystats['limit'].should == '0' }
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'to_s' do
|
75
|
+
it 'the properly formatted string' do
|
76
|
+
ISBNdb::Query.to_s.should =='#<ISBNdb::Query, @access_key=ABC123>'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'method_missing' do
|
81
|
+
context 'for a valid method it can handle' do
|
82
|
+
it 'should work for books' do
|
83
|
+
stub_request(:get, "http://isbndb.com/api/books.xml?access_key=ABC123&index1=title&results=details&value1=hello").to_return(:body => File.new('spec/responses/books_hello.xml'), :headers => {'Content-Type'=>'text/xml'})
|
84
|
+
|
85
|
+
lambda{ ISBNdb::Query.find_book_by_title('hello') }.should_not raise_error
|
86
|
+
lambda{ ISBNdb::Query.find_books_by_title('hello') }.should_not raise_error
|
87
|
+
|
88
|
+
@books = ISBNdb::Query.find_books_by_title('hello')
|
89
|
+
@books.size.should == 10
|
90
|
+
|
91
|
+
@book = @books.first
|
92
|
+
@book.book_id.should == '100th_day_of_school_a04'
|
93
|
+
@book.isbn.should == '1590543947'
|
94
|
+
@book.isbn13.should == '9781590543948'
|
95
|
+
@book.title.should == '100th Day of School'
|
96
|
+
@book.title_long.should == '100th Day of School (Hello Reader Level 2)'
|
97
|
+
@book.authors_text.should == 'Angela Shelf Medearis, '
|
98
|
+
@book.publisher_text.should be_a(Hash)
|
99
|
+
@book.details.should be_a(Hash)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should work for subjects' do
|
103
|
+
stub_request(:get, "http://isbndb.com/api/subjects.xml?access_key=ABC123&index1=name&results=details&value1=Ruby").to_return(:body => File.new('spec/responses/subjects_ruby.xml'), :headers => {'Content-Type'=>'text/xml'})
|
104
|
+
|
105
|
+
lambda{ ISBNdb::Query.find_subject_by_name('Ruby') }.should_not raise_error
|
106
|
+
lambda{ ISBNdb::Query.find_subjects_by_name('Ruby') }.should_not raise_error
|
107
|
+
|
108
|
+
@subjects = ISBNdb::Query.find_subjects_by_name('Ruby')
|
109
|
+
@subjects.size.should == 10
|
110
|
+
|
111
|
+
@subject = @subjects.first
|
112
|
+
@subject.subject_id.should == 'ruby_napdowe_eksploatacja_podrcznik_akademicki'
|
113
|
+
@subject.book_count.should == '1'
|
114
|
+
@subject.marc_field.should == '650'
|
115
|
+
@subject.marc_indicator_1.should be_nil
|
116
|
+
@subject.marc_indicator_2.should == '9'
|
117
|
+
@subject.name.should == 'ruby akademicki'
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'should work for categories' do
|
121
|
+
stub_request(:get, "http://isbndb.com/api/categories.xml?access_key=ABC123&index1=name&results=details&value1=fiction").to_return(:body => File.new('spec/responses/categories_fiction.xml'), :headers => {'Content-Type'=>'text/xml'})
|
122
|
+
|
123
|
+
lambda{ ISBNdb::Query.find_category_by_name('fiction') }.should_not raise_error
|
124
|
+
lambda{ ISBNdb::Query.find_categories_by_name('fiction') }.should_not raise_error
|
125
|
+
|
126
|
+
@categories = ISBNdb::Query.find_categories_by_name('fiction')
|
127
|
+
@categories.size.should == 10
|
128
|
+
|
129
|
+
@category = @categories.first
|
130
|
+
@category.category_id.should == 'society.religion.christianity.denominations.catholicism.literature.fiction'
|
131
|
+
@category.parent_id.should == 'society.religion.christianity.denominations.catholicism.literature'
|
132
|
+
@category.name.should == 'Fiction'
|
133
|
+
@category.details.should be_a(Hash)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should work for authors' do
|
137
|
+
stub_request(:get, "http://isbndb.com/api/authors.xml?access_key=ABC123&index1=name&results=details&value1=Seth").to_return(:body => File.new('spec/responses/authors_seth.xml'), :headers => {'Content-Type'=>'text/xml'})
|
138
|
+
|
139
|
+
lambda{ ISBNdb::Query.find_author_by_name('Seth') }.should_not raise_error
|
140
|
+
lambda{ ISBNdb::Query.find_authors_by_name('Seth') }.should_not raise_error
|
141
|
+
|
142
|
+
@authors = ISBNdb::Query.find_authors_by_name('Seth')
|
143
|
+
@authors.size.should == 10
|
144
|
+
|
145
|
+
@author = @authors.first
|
146
|
+
@author.person_id.should == 'abraham_seth'
|
147
|
+
@author.name.should == 'Abraham, Seth'
|
148
|
+
@author.details.should be_a(Hash)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'should work for publishers' do
|
152
|
+
stub_request(:get, "http://isbndb.com/api/publishers.xml?access_key=ABC123&index1=name&results=details&value1=Francis").to_return(:body => File.new('spec/responses/publishers_francis.xml'), :headers => {'Content-Type'=>'text/xml'})
|
153
|
+
|
154
|
+
lambda{ ISBNdb::Query.find_publisher_by_name('Francis') }.should_not raise_error
|
155
|
+
lambda{ ISBNdb::Query.find_publishers_by_name('Francis') }.should_not raise_error
|
156
|
+
|
157
|
+
@publishers = ISBNdb::Query.find_publishers_by_name('Francis')
|
158
|
+
@publishers.size.should == 10
|
159
|
+
|
160
|
+
@publisher = @publishers.first
|
161
|
+
@publisher.publisher_id.should == 'taylor_francis_a01'
|
162
|
+
@publisher.name.should == ': Taylor & Francis'
|
163
|
+
@publisher.details.should be_a(Hash)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'for an invalid method it can handle' do
|
168
|
+
it 'should throw an exception' do
|
169
|
+
lambda{ ISBNdb::Query.find_foo_by_bar('totes') }.should raise_error
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context 'for a method is can\'t handle' do
|
174
|
+
it 'should throw an exception' do
|
175
|
+
lambda{ ISBNdb::Query.foo_bar }.should raise_error
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ISBNdb::ResultSet do
|
4
|
+
before do
|
5
|
+
stub_request(:get, /http:\/\/isbndb\.com\/api\/books\.xml\?access_key=ABC123&index1=title(&page_number=(.+))?&results=details&value1=hello/).to_return(:body => File.new('spec/responses/books_hello.xml'), :headers => {'Content-Type'=>'text/xml'})
|
6
|
+
@result_set = ISBNdb::ResultSet.new('/books.xml?access_key=ABC123&index1=title&results=details&value1=hello', :books)
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'initialize' do
|
10
|
+
it 'should set all the instance variables' do
|
11
|
+
@result_set.instance_variable_get('@uri').should == '/books.xml?access_key=ABC123&index1=title&results=details&value1=hello'
|
12
|
+
@result_set.instance_variable_get('@collection').should == 'Book'
|
13
|
+
@result_set.instance_variable_get('@current_page').should == 1
|
14
|
+
@result_set.instance_variable_get('@parsed_response').should == {"server_time"=>"2012-06-16T20:10:13Z", "BookList"=>{"total_results"=>"1664", "page_size"=>"10", "page_number"=>"1", "shown_results"=>"10", "BookData"=>[{"book_id"=>"100th_day_of_school_a04", "isbn"=>"1590543947", "isbn13"=>"9781590543948", "Title"=>"100th Day of School", "TitleLong"=>"100th Day of School (Hello Reader Level 2)", "AuthorsText"=>"Angela Shelf Medearis, ", "PublisherText"=>{"publisher_id"=>"fitzgerald_books", "__content__"=>"Fitzgerald Books"}, "Details"=>{"change_time"=>"2011-03-08T18:28:45Z", "price_time"=>"2012-05-29T16:45:46Z", "edition_info"=>"Unknown Binding; 2007-01", "language"=>"", "physical_description_text"=>"6.0\"x9.0\"x0.5\"; 0.4 lb; 32 pages", "lcc_number"=>"", "dewey_decimal_normalized"=>"", "dewey_decimal"=>""}}, {"book_id"=>"100th_day_the", "isbn"=>"0439330173", "isbn13"=>"9780439330176", "Title"=>"100th Day, The", "TitleLong"=>"100th Day, The (level 1) (Hello Reader Level 1)", "AuthorsText"=>"Alayne Pick, Grace Maccarone, Laura Freeman (Illustrator)", "PublisherText"=>{"publisher_id"=>"cartwheel", "__content__"=>"Cartwheel"}, "Details"=>{"change_time"=>"2006-02-27T21:34:15Z", "price_time"=>"2012-05-29T16:46:08Z", "edition_info"=>"Paperback; 2002-12-01", "language"=>"", "physical_description_text"=>"32 pages", "lcc_number"=>"", "dewey_decimal_normalized"=>"", "dewey_decimal"=>""}}, {"book_id"=>"2011_hello_kitty_engagement_calendar", "isbn"=>"1423803558", "isbn13"=>"9781423803553", "Title"=>"2011 Hello Kitty Engagement Calendar", "TitleLong"=>nil, "AuthorsText"=>"Day Dream (Contributor)", "PublisherText"=>{"publisher_id"=>"day_dream", "__content__"=>"Day Dream"}, "Details"=>{"change_time"=>"2010-09-21T21:20:39Z", "price_time"=>"2012-03-24T04:44:44Z", "edition_info"=>"Calendar; 2010-08-01", "language"=>"", "physical_description_text"=>"7.0\"x8.5\"x0.9\"; 1.1 lb", "lcc_number"=>"", "dewey_decimal_normalized"=>"741", "dewey_decimal"=>"741"}}, {"book_id"=>"2011_hello_kitty_wall_calendar", "isbn"=>"1423803981", "isbn13"=>"9781423803980", "Title"=>"2011 Hello Kitty Wall Calendar", "TitleLong"=>nil, "AuthorsText"=>"Day Dream (Contributor)", "PublisherText"=>{"publisher_id"=>"day_dream", "__content__"=>"Day Dream"}, "Details"=>{"change_time"=>"2010-09-21T18:46:02Z", "price_time"=>"2012-04-25T20:26:40Z", "edition_info"=>"Calendar; 2010-08-01", "language"=>"", "physical_description_text"=>"10.8\"x11.8\"x0.2\"; 0.3 lb", "lcc_number"=>"", "dewey_decimal_normalized"=>"", "dewey_decimal"=>""}}, {"book_id"=>"2012_hello_kitty_2_year_pocket_planner_calendar", "isbn"=>"1423809424", "isbn13"=>"9781423809425", "Title"=>"2012 Hello Kitty 2 Year Pocket Planner Calendar", "TitleLong"=>nil, "AuthorsText"=>"Day Dream, ", "PublisherText"=>{"publisher_id"=>"day_dream", "__content__"=>"Day Dream"}, "Details"=>{"change_time"=>"2012-01-17T22:23:43Z", "price_time"=>"2012-03-04T05:32:03Z", "edition_info"=>"Calendar; 2011-07-01", "language"=>"", "physical_description_text"=>"3.5\"x6.2\"x0.0\"; 0.1 lb", "lcc_number"=>"", "dewey_decimal_normalized"=>"636", "dewey_decimal"=>"636"}}, {"book_id"=>"2012_hello_kitty_juvenile_activity_calendar", "isbn"=>"1423811194", "isbn13"=>"9781423811190", "Title"=>"2012 Hello Kitty Juvenile Activity Calendar", "TitleLong"=>nil, "AuthorsText"=>"Day Dream, ", "PublisherText"=>{"publisher_id"=>"day_dream", "__content__"=>"Day Dream"}, "Details"=>{"change_time"=>"2012-05-15T00:52:54Z", "price_time"=>"2012-06-16T20:10:13Z", "edition_info"=>"Calendar; 2011-07-01", "language"=>"", "physical_description_text"=>"11.0\"x12.0\"x0.3\"; 0.8 lb", "lcc_number"=>"", "dewey_decimal_normalized"=>"741", "dewey_decimal"=>"741"}}, {"book_id"=>"2012_hello_kitty_mini_calendar", "isbn"=>"1423809165", "isbn13"=>"9781423809166", "Title"=>"2012 Hello Kitty Mini Calendar", "TitleLong"=>nil, "AuthorsText"=>"Day Dream, ", "PublisherText"=>{"publisher_id"=>"day_dream", "__content__"=>"Day Dream"}, "Details"=>{"change_time"=>"2012-01-17T22:24:12Z", "price_time"=>"2012-02-09T06:11:01Z", "edition_info"=>"Calendar; 2011-07-01", "language"=>"", "physical_description_text"=>"6.2\"x6.9\"x0.2\"; 0.1 lb", "lcc_number"=>"", "dewey_decimal_normalized"=>"741", "dewey_decimal"=>"741"}}, {"book_id"=>"2012_hello_kitty_wall_calendar", "isbn"=>"1423809696", "isbn13"=>"9781423809692", "Title"=>"2012 Hello Kitty Wall Calendar", "TitleLong"=>nil, "AuthorsText"=>"Day Dream, ", "PublisherText"=>{"publisher_id"=>"day_dream", "__content__"=>"Day Dream"}, "Details"=>{"change_time"=>"2012-01-17T22:14:27Z", "price_time"=>"2012-02-09T06:02:14Z", "edition_info"=>"Calendar; 2011-07-01", "language"=>"", "physical_description_text"=>"10.6\"x11.8\"x0.2\"; 0.5 lb", "lcc_number"=>"", "dewey_decimal_normalized"=>"741", "dewey_decimal"=>"741"}}, {"book_id"=>"2012_hello_kitty_weekly_engagement_calendar", "isbn"=>"1423809092", "isbn13"=>"9781423809098", "Title"=>"2012 Hello Kitty Weekly Engagement Calendar", "TitleLong"=>nil, "AuthorsText"=>"Day Dream, ", "PublisherText"=>{"publisher_id"=>"day_dream", "__content__"=>"Day Dream"}, "Details"=>{"change_time"=>"2012-01-17T22:14:34Z", "price_time"=>"2012-02-08T12:37:05Z", "edition_info"=>"Calendar; 2011-07-01", "language"=>"", "physical_description_text"=>"7.2\"x8.5\"x0.9\"; 1.0 lb", "lcc_number"=>"", "dewey_decimal_normalized"=>"741", "dewey_decimal"=>"741"}}, {"book_id"=>"2_grrrls_hello_gorgeous", "isbn"=>"0439187370", "isbn13"=>"9780439187374", "Title"=>"Hello gorgeous", "TitleLong"=>"Hello gorgeous: a guide to style", "AuthorsText"=>"by Kristen Kemp", "PublisherText"=>{"publisher_id"=>"scholastic", "__content__"=>"New York : Scholastic, c2000."}, "Details"=>{"change_time"=>"2009-09-29T18:09:13Z", "price_time"=>"2011-03-25T22:20:05Z", "edition_info"=>"(pbk.) :$3.99", "language"=>"eng", "physical_description_text"=>"64 p. : ill. (some col.) ; 20 cm.", "lcc_number"=>"", "dewey_decimal_normalized"=>"", "dewey_decimal"=>""}}]}}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'size' do
|
19
|
+
it 'should return the size of @results' do
|
20
|
+
@result_set.size.should == 10
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'each' do
|
25
|
+
it 'should iterate over @results' do
|
26
|
+
@result_set.each_with_index do |result,index|
|
27
|
+
result.should == @result_set.instance_variable_get('@results')[index]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'go_to_page' do
|
33
|
+
it 'should get the total number of pages' do
|
34
|
+
expect{ @result_set.go_to_page(1) }.to change { @result_set.instance_variable_get('@total_pages') }.to(167)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should return if the page is invalid' do
|
38
|
+
@result_set.go_to_page('foo').should be_nil
|
39
|
+
@result_set.go_to_page(-1).should be_nil
|
40
|
+
@result_set.go_to_page(138193289).should be_nil
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should return a new result set' do
|
44
|
+
@result_set.go_to_page(2).should be_a(ISBNdb::ResultSet)
|
45
|
+
@result_set.go_to_page(2).instance_variable_get('@uri').should include('page_number=2')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'next_page' do
|
50
|
+
it 'should go to the next page' do
|
51
|
+
@result_set.next_page.should == @result_set.go_to_page(2)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should return nil when there are no more pages' do
|
55
|
+
@result_set.go_to_page(167).next_page.should be_nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'prev_page' do
|
60
|
+
it 'should go to the previous page' do
|
61
|
+
@result_set.go_to_page(2).prev_page.should == @result_set.go_to_page(1)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should return nil when there is no previous page' do
|
65
|
+
@result_set.go_to_page(1).prev_page.should be_nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'to_s' do
|
70
|
+
it 'should return the correct string' do
|
71
|
+
@result_set.to_s.should == '#<ResultSet::Book :total_results => 10>'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'check_results' do
|
76
|
+
it 'should raise an exception if there is an error message' do
|
77
|
+
stub_request(:get, /http:\/\/isbndb\.com\/api\/books\.xml\?access_key=ABC123&index1=title(&page_number=(.+))?&results=details&value1=hello/).to_return(:body => File.new('spec/responses/access_key_error.xml'), :headers => {'Content-Type'=>'text/xml'})
|
78
|
+
proc = lambda{ ISBNdb::ResultSet.new('/books.xml?access_key=ABC123&index1=title&results=details&value1=hello', :books) }
|
79
|
+
|
80
|
+
proc.should raise_error(ISBNdb::AccessKeyError)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'get_total_pages' do
|
85
|
+
it 'should get the total number of pages' do
|
86
|
+
@result_set.send(:get_total_pages).should == 167
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|