rbook 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. data/COPYING +340 -0
  2. data/LICENSE +13 -0
  3. data/README +16 -0
  4. data/Rakefile +206 -0
  5. data/examples/titlepage.rb +14 -0
  6. data/examples/www/find_all.rb +23 -0
  7. data/examples/www/find_cover_from_amazon.rb +12 -0
  8. data/examples/www/find_url_from_rainbow.rb +12 -0
  9. data/examples/www/list.rb +13 -0
  10. data/lib/rbook/bisac.rb +175 -0
  11. data/lib/rbook/errors.rb +7 -0
  12. data/lib/rbook/isbn.rb +249 -0
  13. data/lib/rbook/onix.rb +68 -0
  14. data/lib/rbook/onix/contributor.rb +60 -0
  15. data/lib/rbook/onix/lists.rb +2 -0
  16. data/lib/rbook/onix/lists/contributor_role.rb +10 -0
  17. data/lib/rbook/onix/lists/product_form.rb +100 -0
  18. data/lib/rbook/onix/message.rb +101 -0
  19. data/lib/rbook/onix/product.rb +188 -0
  20. data/lib/rbook/onix/sales_restriction.rb +51 -0
  21. data/lib/rbook/onix/supply_detail.rb +68 -0
  22. data/lib/rbook/onix/xchar.rb +98 -0
  23. data/lib/rbook/titlepage.rb +96 -0
  24. data/lib/rbook/titlepage/TitleQueryClient.rb +62 -0
  25. data/lib/rbook/titlepage/titlepage_driver.rb +134 -0
  26. data/lib/rbook/titlepage/titlepage_utils.rb +374 -0
  27. data/lib/rbook/www.rb +172 -0
  28. data/lib/rbook/www/aau_scraper.rb +76 -0
  29. data/lib/rbook/www/amazon_uk_scraper.rb +44 -0
  30. data/lib/rbook/www/base.rb +87 -0
  31. data/lib/rbook/www/harper_au_scraper.rb +56 -0
  32. data/lib/rbook/www/harper_us_scraper.rb +55 -0
  33. data/lib/rbook/www/hha_scraper.rb +50 -0
  34. data/lib/rbook/www/macmillan_scraper.rb +62 -0
  35. data/lib/rbook/www/orbis_scraper.rb +48 -0
  36. data/lib/rbook/www/oup_scraper.rb +64 -0
  37. data/lib/rbook/www/paulist_scraper.rb +53 -0
  38. data/lib/rbook/www/pearson_au_scraper.rb +52 -0
  39. data/lib/rbook/www/penguin_scraper.rb +45 -0
  40. data/lib/rbook/www/random_au_scraper.rb +90 -0
  41. data/lib/rbook/www/random_us_scraper.rb +59 -0
  42. data/lib/rbook/www/sas_scraper.rb +54 -0
  43. data/lib/rbook/www/unireps_scraper.rb +58 -0
  44. data/lib/rbook/www/wiley_us_scraper.rb +54 -0
  45. data/test/data/abingdon.xml +38931 -0
  46. data/test/data/augsburg.xml +39009 -0
  47. data/test/data/chalice.xml +10851 -0
  48. data/test/data/eerdsman.xml +36942 -0
  49. data/test/data/invalid_no_product.xml +9 -0
  50. data/test/data/not_xml.csv +1 -0
  51. data/test/data/single_product.xml +50 -0
  52. data/test/data/xml_not_onix.xml +7 -0
  53. data/test/mocks/titlepage_driver.rb +107 -0
  54. data/test/unit/bisac_test.rb +57 -0
  55. data/test/unit/isbn_test.rb +149 -0
  56. data/test/unit/onix/contributor_test.rb +50 -0
  57. data/test/unit/onix/message_test.rb +119 -0
  58. data/test/unit/onix/product_test.rb +101 -0
  59. data/test/unit/onix/sales_restriction_test.rb +48 -0
  60. data/test/unit/onix/supply_detail_test.rb +53 -0
  61. data/test/unit/onix/xchar_test.rb +37 -0
  62. data/test/unit/titlepage_test.rb +127 -0
  63. metadata +130 -0
@@ -0,0 +1,9 @@
1
+ <?xml version='1.0'?>
2
+ <!DOCTYPE ONIXMessage SYSTEM "http://www.editeur.org/onix/2.1/reference/onix-international.dtd">
3
+ <ONIXMessage>
4
+ <Header>
5
+ <FromCompany>Schwartz Publishing Pty Ltd</FromCompany>
6
+ <FromPerson>James Healy</FromPerson>
7
+ <SentDate>20060522</SentDate>
8
+ </Header>
9
+ </ONIXMessage>
@@ -0,0 +1 @@
1
+ "this file is not XML","Remind you of 1990?"
@@ -0,0 +1,50 @@
1
+ <?xml version='1.0'?>
2
+ <!DOCTYPE ONIXMessage SYSTEM "http://www.editeur.org/onix/2.1/reference/onix-international.dtd">
3
+ <ONIXMessage>
4
+ <Header>
5
+ <FromCompany>Chalice</FromCompany>
6
+ <FromPerson>James Healy</FromPerson>
7
+ <SentDate>20060521</SentDate>
8
+ </Header>
9
+ <Product>
10
+ <RecordReference>0827200528</RecordReference>
11
+ <NotificationType>03</NotificationType>
12
+ <ProductIdentifier>
13
+ <ProductIDType>02</ProductIDType>
14
+ <IDValue>0827200528</IDValue>
15
+ </ProductIdentifier>
16
+ <ProductForm>BA</ProductForm>
17
+ <NoSeries/>
18
+ <Title>
19
+ <TitleType>01</TitleType>
20
+ <TitleText>And Their Eyes Are Opened</TitleText>
21
+ <Subtitle>Story Sermons Embracing the World</Subtitle>
22
+ </Title>
23
+ <Contributor>
24
+ <SequenceNumber>0</SequenceNumber>
25
+ <ContributorRole>A01</ContributorRole>
26
+ <PersonNameInverted>Healy, James</PersonNameInverted>
27
+ </Contributor>
28
+ <NoEdition/>
29
+ <BICMainSubject>YFH</BICMainSubject>
30
+ <NumberOfPages>0</NumberOfPages>
31
+ <Publisher>
32
+ <PublishingRole>01</PublishingRole>
33
+ <PublisherName>Chalice</PublisherName>
34
+ </Publisher>
35
+ <PublicationDate>20050303</PublicationDate>
36
+ <SalesRestriction>
37
+ <SalesRestrictionType>00</SalesRestrictionType>
38
+ <SalesRestrictionDetail>Unknown</SalesRestrictionDetail>
39
+ </SalesRestriction>
40
+ <SupplyDetail>
41
+ <SupplierName>Chalice</SupplierName>
42
+ <AvailabilityCode>CS</AvailabilityCode>
43
+ <IntermediaryAvailabilityCode>99</IntermediaryAvailabilityCode>
44
+ <Price>
45
+ <PriceTypeCode>02</PriceTypeCode>
46
+ <PriceAmount>29.95</PriceAmount>
47
+ </Price>
48
+ </SupplyDetail>
49
+ </Product>
50
+ </ONIXMessage>
@@ -0,0 +1,7 @@
1
+ <?xml version='1.0'?>
2
+ <root>
3
+ <tag1/>
4
+ <tag2>Some Data</tag2>
5
+ <tag3 attr1="cliche">Hello World</tag3>
6
+ <tag4 attr2="for completeness" />
7
+ </root>
@@ -0,0 +1,107 @@
1
+ require 'digest/md5'
2
+ require 'soap/soap'
3
+
4
+ # A mock object to assist with testing the titlepage API wrapper
5
+ class MockTitlePageDriver
6
+
7
+ def initialize
8
+ @username = "test"
9
+ @password = "apa"
10
+ end
11
+
12
+ def login(username, password)
13
+ if username.eql?(@username) && password.eql?(@password)
14
+ @token = Digest::MD5.hexdigest(Time.now.to_s)
15
+ return @token
16
+ else
17
+ raise SOAP::FaultError, SOAP::SOAPFault.new
18
+ end
19
+ end
20
+
21
+ def logout(token)
22
+ if token.eql?(@token)
23
+ @token = nil
24
+ return true
25
+ end
26
+ end
27
+
28
+ def SearchByEAN(token, isbn)
29
+ if !token.eql?(@token)
30
+ return nil
31
+ elsif isbn.eql?("9780091835132")
32
+ return fight_club
33
+ elsif isbn.eql?("9780672327568")
34
+ return postgresql
35
+ else
36
+ return no_match(isbn)
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def fight_club
43
+ result = SearchResults.new
44
+ result.EAN = "9780091835132"
45
+ product = Product.new
46
+ author = Contributor.new
47
+ author.PersonNameInverted = "PALAHNIUK, CHUCK"
48
+ author.ContributorRole = "A01"
49
+ product.Contributors = [author]
50
+ title = Title.new
51
+ title.TitleType = "01"
52
+ title.TitleText = "Fight Club"
53
+ product.Title = title
54
+ supply = SupplyDetail.new
55
+ supply.ProductAvailability = "20"
56
+ supply.SupplierName = "Random House Australia"
57
+ stock = Stock.new
58
+ stock.OnHand = "In Stock"
59
+ stock.OnOrder = "0"
60
+ supply.Stock = stock
61
+ price = Price.new
62
+ price.PriceAmount = "23.95"
63
+ supply.Price = price
64
+ supply.PackQuantity = "48"
65
+ id = ProductIdentifier.new
66
+ id.ProductIDType = "03"
67
+ id.IDValue = "9780091835132"
68
+ result.Product = product
69
+ return result
70
+ end
71
+
72
+ def no_match(isbn)
73
+ result = SearchResults.new
74
+ result.EAN = isbn
75
+ return result
76
+ end
77
+
78
+ def postgresql
79
+ result = SearchResults.new
80
+ result.EAN = "9780672327568"
81
+ product = Product.new
82
+ author = Contributor.new
83
+ author.PersonNameInverted = "KORRY, DOUGLASS"
84
+ author.ContributorRole = "A01"
85
+ product.Contributors = [author]
86
+ title = Title.new
87
+ title.TitleType = "01"
88
+ title.TitleText = "PostgreSQL"
89
+ product.Title = title
90
+ supply = SupplyDetail.new
91
+ supply.ProductAvailability = "20"
92
+ supply.SupplierName = "United Book Distributors"
93
+ stock = Stock.new
94
+ stock.OnHand = "0"
95
+ stock.OnOrder = "0"
96
+ supply.Stock = stock
97
+ price = Price.new
98
+ price.PriceAmount = "69.95"
99
+ supply.Price = price
100
+ supply.PackQuantity = "48"
101
+ id = ProductIdentifier.new
102
+ id.ProductIDType = "03"
103
+ id.IDValue = "9780672327568"
104
+ result.Product = product
105
+ return result
106
+ end
107
+ end
@@ -0,0 +1,57 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+
3
+ require 'test/unit'
4
+ require 'rbook/bisac'
5
+
6
+ class BISACTest < Test::Unit::TestCase
7
+
8
+ def test_line_length
9
+
10
+ bisac = RBook::Bisac.new("Rainbow","1234567","test","1")
11
+ bisac.add_item(valid_item_1)
12
+ bisac.add_item(valid_item_2)
13
+
14
+ bisac.to_s.split("\n").each do |line|
15
+ assert_equal 259, line.length
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def valid_item_1
22
+ item = {}
23
+ item[:isbn] = "0743285689"
24
+ item[:title] = "Enemy Combatant"
25
+ item[:author] = "Begg, Moazzam"
26
+ item[:price] = "2995"
27
+ item[:pubdate] = "060101"
28
+ item[:publisher] = "Simon and Schuster"
29
+ item[:imprint] = "Free Press"
30
+ item[:volumes] = "1"
31
+ item[:edition] = "1"
32
+ item[:binding] = "PB"
33
+ item[:volume] = "1"
34
+ item[:status] = "O/O"
35
+ return item
36
+ end
37
+
38
+ def valid_item_2
39
+ item = {}
40
+ item[:isbn] = "0975240277"
41
+ item[:title] = "HTML Utopia Designing Without Tables Using CSS"
42
+ item[:author] = "Andrew, Rachel; Shafer, Dan"
43
+ item[:price] = "5995"
44
+ item[:pubdate] = "060401"
45
+ item[:publisher] = "Sitepoint"
46
+ item[:imprint] = "Sitepoint"
47
+ item[:volumes] = "1"
48
+ item[:edition] = "2"
49
+ item[:binding] = "PB"
50
+ item[:volume] = "1"
51
+ item[:status] = "ACT"
52
+ return item
53
+ end
54
+
55
+ end
56
+
57
+
@@ -0,0 +1,149 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+
3
+ require 'test/unit'
4
+ require 'rbook/isbn'
5
+
6
+ class ISBNTest < Test::Unit::TestCase
7
+
8
+ include RBook
9
+
10
+ def test_add_groups
11
+ assert_equal ISBN::add_groups('020161622X'), '0-20161-622-X'
12
+ assert_equal ISBN::add_groups('9780201616224'), '978-0-20161-622-4'
13
+ assert_equal ISBN::add_groups('invalId'), 'invalId'
14
+ end
15
+
16
+ def test_add_groups_destructive
17
+ isbn = '020161622X'
18
+ new_isbn = ISBN::add_groups(isbn)
19
+ assert_equal( isbn, '020161622X')
20
+
21
+ isbn = '978201616224'
22
+ new_isbn = ISBN::add_groups(isbn)
23
+ assert_equal( isbn, '978201616224')
24
+ end
25
+
26
+ def test_add_boundaries
27
+ assert_equal ISBN::add_groups(''), ''
28
+ assert_equal ISBN::add_groups(nil), nil
29
+ end
30
+
31
+ def test_valid_isbn10
32
+ assert_equal ISBN::valid_isbn10?('020161622X'), true
33
+ assert_equal ISBN::valid_isbn10?('020161622'), false
34
+ assert_equal ISBN::valid_isbn10?('023252565X'), true
35
+ assert_equal ISBN::valid_isbn10?('9780764812200'), false
36
+ assert_equal ISBN::valid_isbn10?('12345'), false
37
+ assert_equal ISBN::valid_isbn10?('12345 7890'), false
38
+ assert_equal ISBN::valid_isbn10?('CD-DSE'), false
39
+ end
40
+
41
+ def test_valid_isbn10_boundaries
42
+ assert_equal ISBN::valid_isbn10?(''), false
43
+ assert_equal ISBN::valid_isbn10?('11278217391827398217391723918723918'), false
44
+ assert_equal ISBN::valid_isbn10?(nil), false
45
+ assert_equal ISBN::valid_isbn10?(1234567890), false
46
+ end
47
+
48
+ def test_valid_isbn13
49
+ assert_equal ISBN::valid_isbn13?('9780201616224'), true
50
+ assert_equal ISBN::valid_isbn13?('978020161622'), false
51
+ assert_equal ISBN::valid_isbn13?('9780764812200'), true
52
+ assert_equal ISBN::valid_isbn13?('978076481220'), false
53
+ assert_equal ISBN::valid_isbn13?('978 NCR 4611'), false
54
+ assert_equal ISBN::valid_isbn13?('12345'), false
55
+ assert_equal ISBN::valid_isbn13?('CD-DSE'), false
56
+ assert_equal ISBN::valid_isbn13?('020161622X'), false
57
+ end
58
+
59
+ def test_valid_isbn13_boundaries
60
+ assert_equal ISBN::valid_isbn13?(''), false
61
+ assert_equal ISBN::valid_isbn13?('11278217391827398217391723918723918'), false
62
+ assert_equal ISBN::valid_isbn13?(nil), false
63
+ assert_equal ISBN::valid_isbn13?(9781234567890), false
64
+ end
65
+
66
+ def test_calc_isbn10_check
67
+ assert_equal ISBN::calc_isbn10_check('020161622'), 'X'
68
+ assert_equal ISBN::calc_isbn10_check('055299777'), '3'
69
+ end
70
+
71
+ def test_calc_isbn10_check_boundaries
72
+ assert_equal ISBN::calc_isbn10_check(''), nil
73
+ assert_equal ISBN::calc_isbn10_check(nil), nil
74
+ assert_equal ISBN::calc_isbn10_check(978020161622), nil
75
+ assert_equal ISBN::calc_isbn10_check(' - '), nil
76
+ end
77
+
78
+ def test_calc_isbn13_check
79
+ assert_equal ISBN::calc_isbn13_check('978020161622'), '4'
80
+ assert_equal ISBN::calc_isbn13_check('978055299777'), '5'
81
+ end
82
+
83
+ def test_calc_isbn13_boundaries
84
+ assert_equal ISBN::calc_isbn13_check(''), nil
85
+ assert_equal ISBN::calc_isbn13_check(nil), nil
86
+ assert_equal ISBN::calc_isbn13_check(978020161622), nil
87
+ assert_equal ISBN::calc_isbn13_check(' - '), nil
88
+ end
89
+
90
+ def test_convert_to_isbn10
91
+ #some random titles
92
+ assert_equal ISBN::convert_to_isbn10('9780764812200'), '0764812203'
93
+ assert_equal ISBN::convert_to_isbn10('9781856075336'), '1856075338'
94
+ assert_equal ISBN::convert_to_isbn10('9780232525656'), '023252565X'
95
+ assert_equal ISBN::convert_to_isbn10('9781863951340'), '1863951342'
96
+ assert_equal ISBN::convert_to_isbn10('978 NCR 4611'), nil
97
+
98
+ # a 979 ISBN13 that can't be converted to isbn10
99
+ assert_equal ISBN::convert_to_isbn10('9791863951340'), nil
100
+
101
+ # already isbn10
102
+ assert_equal ISBN::convert_to_isbn10('1856075338'), '1856075338'
103
+
104
+ # valid isbn without a checkdigit
105
+ assert_equal ISBN::convert_to_isbn10('185607533'), nil
106
+
107
+ #non valid isbns
108
+ assert_equal ISBN::convert_to_isbn10('AAAAAAA'), nil
109
+
110
+ end
111
+
112
+ def test_convert_to_isbn10_boundaries
113
+ assert_equal ISBN::convert_to_isbn13(' '), nil
114
+ assert_equal ISBN::convert_to_isbn13(nil), nil
115
+ assert_equal ISBN::convert_to_isbn13(120234203), nil
116
+ assert_equal ISBN::convert_to_isbn13('18273987123987129387192873912820234203'), nil
117
+ end
118
+
119
+ def test_convert_to_isbn13
120
+ #some random titles
121
+ assert_equal ISBN::convert_to_isbn13('0764812203'), '9780764812200'
122
+ assert_equal ISBN::convert_to_isbn13('1856075338'), '9781856075336'
123
+ assert_equal ISBN::convert_to_isbn13('023252565X'), '9780232525656'
124
+ assert_equal ISBN::convert_to_isbn13('1863951342'), '9781863951340'
125
+ assert_equal ISBN::convert_to_isbn13('186-395-134-2'), nil
126
+
127
+ #already isbn13
128
+ assert_equal ISBN::convert_to_isbn13('9781856075336'), '9781856075336'
129
+
130
+ # valid isbn without a check digit
131
+ assert_equal ISBN::convert_to_isbn13('978185607533'), nil
132
+
133
+ #non valid isbns
134
+ assert_equal ISBN::convert_to_isbn13('651887010820'), nil
135
+ assert_equal ISBN::convert_to_isbn13('AAAAAAA'), nil
136
+ assert_equal ISBN::convert_to_isbn13('CX-188'), nil
137
+
138
+ end
139
+
140
+ def test_convert_to_isbn13_boundaries
141
+ assert_equal ISBN::convert_to_isbn13(' '), nil
142
+ assert_equal ISBN::convert_to_isbn13(nil), nil
143
+ assert_equal ISBN::convert_to_isbn13(120234203), nil
144
+ assert_equal ISBN::convert_to_isbn13('18273987123987129387192873912820234203'), nil
145
+ end
146
+
147
+ end
148
+
149
+
@@ -0,0 +1,50 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+
3
+ require 'test/unit'
4
+ require 'rexml/document'
5
+ require 'rbook/onix'
6
+
7
+ class ContributorTest < Test::Unit::TestCase
8
+
9
+ def test_load_from_element
10
+
11
+ file = File.open(File.dirname(__FILE__)+"/../../data/single_product.xml", "r")
12
+ doc = REXML::Document.new(file)
13
+ contributor = RBook::Onix::Contributor.load_from_element(REXML::XPath.first(doc, '/ONIXMessage/Product/Contributor'))
14
+
15
+ file.close
16
+
17
+ assert_equal('0', contributor.sequence_number)
18
+ assert_equal('A01', contributor.role)
19
+ assert_equal('Healy, James', contributor.name_inverted)
20
+ end
21
+
22
+ def test_load_from_element_not_contributor
23
+
24
+ element = REXML::Element.new('NonContributor')
25
+ element.add_element('SequenceNumber').text = 'blah'
26
+
27
+ assert_raise(LoadError) {
28
+ product = RBook::Onix::Contributor.load_from_element(element)
29
+ }
30
+
31
+ end
32
+
33
+ # ensure product information is output to xml correctly
34
+ def test_to_element
35
+
36
+ contributor = RBook::Onix::Contributor.new
37
+ contributor.name_inverted = 'Healy, James'
38
+ contributor.sequence_number = '01'
39
+ contributor.role = 'A01'
40
+
41
+ doc = contributor.to_element
42
+
43
+ assert_not_equal(nil,REXML::XPath.first(doc, '/PersonNameInverted'), 'Person Name Inverted must not be nil')
44
+ assert_equal("Healy, James", REXML::XPath.first(doc, '/PersonNameInverted').text)
45
+ assert_not_equal(nil,REXML::XPath.first(doc, '/ContributorRole'), 'Contributor Role must not be nil')
46
+ assert_equal("A01", REXML::XPath.first(doc, '/ContributorRole').text)
47
+
48
+ end
49
+
50
+ end
@@ -0,0 +1,119 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+
3
+ require 'test/unit'
4
+ require 'rexml/document'
5
+ require 'date'
6
+ require 'rbook/onix'
7
+
8
+ class MessageTest < Test::Unit::TestCase
9
+
10
+ # test loading a valid onix file. Make sure the correct number of products
11
+ # exist, but don't worry about the content. The product unit tests can check them
12
+ def test_load_from_xmldoc
13
+
14
+ file = File.open(File.dirname(__FILE__)+"/../../data/single_product.xml", "r")
15
+ doc = REXML::Document.new(file)
16
+ msg = RBook::Onix::Message.load_from_xmldoc(doc)
17
+
18
+ file.close
19
+
20
+ #check header elements
21
+ assert_equal('Chalice', msg.from_company)
22
+ assert_equal('James Healy', msg.from_person)
23
+ assert Date.civil(2006, 5, 21) === msg.sent_date
24
+
25
+ #check product count
26
+ assert_equal(1, msg.products.size)
27
+
28
+ end
29
+
30
+ # try loading an onix file with no products
31
+ def test_load_from_xmldoc_invalid_no_product
32
+ file = File.open(File.dirname(__FILE__)+"/../../data/invalid_no_product.xml", "r")
33
+ doc = REXML::Document.new(file)
34
+
35
+ assert_raise(LoadError) {
36
+ msg = RBook::Onix::Message.load_from_xmldoc(doc)
37
+ }
38
+ end
39
+
40
+ # test loading an xml file that's not an onix file
41
+ def test_load_from_xmldoc_invalid_not_onix
42
+ file = File.open(File.dirname(__FILE__)+"/../../data/xml_not_onix.xml", "r")
43
+ doc = REXML::Document.new(file)
44
+
45
+ assert_raise(LoadError) {
46
+ msg = RBook::Onix::Message.load_from_xmldoc(doc)
47
+ }
48
+
49
+ end
50
+
51
+ # test loading a non XML file
52
+ def test_load_from_xmldoc_invalid_not_xml
53
+ file = File.open(File.dirname(__FILE__)+"/../../data/not_xml.csv", "r")
54
+ doc = REXML::Document.new(file)
55
+
56
+ assert_raise(LoadError) {
57
+ msg = RBook::Onix::Message.load_from_xmldoc(doc)
58
+ }
59
+
60
+ end
61
+
62
+ # ensure header information is output to xml correctly and that a
63
+ # product is created
64
+ def test_to_xml
65
+ msg = RBook::Onix::Message.new
66
+ msg.from_person = "James Healy"
67
+ msg.from_company = "Healy Inc."
68
+ msg.to_person = "Test::Unit"
69
+
70
+ product = RBook::Onix::Product.new
71
+ product.product_identifier = '0977616606'
72
+ msg.add_product(product)
73
+
74
+ doc = msg.to_xml
75
+
76
+ assert_not_equal(nil,REXML::XPath.first(doc, '/ONIXMessage/Header/FromPerson'))
77
+ assert_equal("James Healy", REXML::XPath.first(doc, '/ONIXMessage/Header/FromPerson').text)
78
+ assert_not_equal(nil,REXML::XPath.first(doc, '/ONIXMessage/Header/FromCompany'))
79
+ assert_equal("Healy Inc.", REXML::XPath.first(doc, '/ONIXMessage/Header/FromCompany').text)
80
+ assert_not_equal(nil,REXML::XPath.first(doc, '/ONIXMessage/Header/ToPerson'))
81
+ assert_equal("Test::Unit", REXML::XPath.first(doc, '/ONIXMessage/Header/ToPerson').text)
82
+ assert_not_equal(nil,REXML::XPath.first(doc, '/ONIXMessage/Product'))
83
+ end
84
+
85
+ # test for an exception when a onixmessage with no products is converted to an xml document
86
+ def test_to_xml_no_product
87
+ msg = RBook::Onix::Message.new
88
+ msg.from_person = "James Healy"
89
+ msg.from_company = "Healy Inc."
90
+ msg.to_person = "Test::Unit"
91
+
92
+ assert_raise(RuntimeError) {
93
+ doc = msg.to_xml
94
+ }
95
+ end
96
+
97
+ def test_to_s_valid_utf8_charset
98
+ msg = RBook::Onix::Message.new
99
+ msg.from_person = "James Healy\x11"
100
+ msg.from_company = "Healy Inc.\x11"
101
+ msg.from_email = "someone@example.com\x11"
102
+ msg.to_person = "Test::Unit\x11"
103
+ msg.to_company = "Sample Company\x11"
104
+ msg.message_note = "This is a sample ONIX message\x11"
105
+
106
+ product = RBook::Onix::Product.new
107
+ product.product_identifier = '0977616606'
108
+ product.title = 'Test Title'
109
+ msg.add_product(product)
110
+
111
+ doc = msg.to_s
112
+
113
+ doc.each_byte do |c|
114
+ n = XChar::CP1252[c] || c
115
+ n = nil unless XChar::VALID.find {|range| range.include? n}
116
+ assert_not_equal nil, n, "Non valid UTF8 char detected (code: #{n.to_s})"
117
+ end
118
+ end
119
+ end