1require "rss-testcase" 2 3require "rss/maker" 4 5module RSS 6 class TestMaker20 < TestCase 7 def test_supported? 8 assert(RSS::Maker.supported?("2.0")) 9 assert(RSS::Maker.supported?("rss2.0")) 10 assert(!RSS::Maker.supported?("2.2")) 11 assert(!RSS::Maker.supported?("rss2.2")) 12 end 13 14 def test_find_class 15 assert_equal(RSS::Maker::RSS20, RSS::Maker["2.0"]) 16 assert_equal(RSS::Maker::RSS20, RSS::Maker["rss2.0"]) 17 end 18 19 def test_rss 20 assert_raise(LocalJumpError) do 21 RSS::Maker.make("2.0") 22 end 23 24 rss = RSS::Maker.make("2.0") do |maker| 25 setup_dummy_channel(maker) 26 end 27 assert_equal("2.0", rss.rss_version) 28 29 rss = RSS::Maker.make("2.0") do |maker| 30 setup_dummy_channel(maker) 31 32 maker.encoding = "EUC-JP" 33 end 34 assert_equal("2.0", rss.rss_version) 35 assert_equal("EUC-JP", rss.encoding) 36 37 rss = RSS::Maker.make("2.0") do |maker| 38 setup_dummy_channel(maker) 39 40 maker.standalone = "yes" 41 end 42 assert_equal("2.0", rss.rss_version) 43 assert_equal("yes", rss.standalone) 44 45 rss = RSS::Maker.make("2.0") do |maker| 46 setup_dummy_channel(maker) 47 48 maker.encoding = "EUC-JP" 49 maker.standalone = "yes" 50 end 51 assert_equal("2.0", rss.rss_version) 52 assert_equal("EUC-JP", rss.encoding) 53 assert_equal("yes", rss.standalone) 54 end 55 56 def test_channel 57 title = "fugafuga" 58 link = "http://hoge.com" 59 description = "fugafugafugafuga" 60 language = "ja" 61 copyright = "foo" 62 managingEditor = "bar" 63 webMaster = "web master" 64 rating = '(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))' 65 docs = "http://foo.com/doc" 66 skipDays = [ 67 "Sunday", 68 "Monday", 69 ] 70 skipHours = [ 71 "0", 72 "13", 73 ] 74 pubDate = Time.now 75 lastBuildDate = Time.now 76 categories = [ 77 "Nespapers", 78 "misc", 79 ] 80 generator = "RSS Maker" 81 ttl = "60" 82 83 rss = RSS::Maker.make("2.0") do |maker| 84 maker.channel.title = title 85 maker.channel.link = link 86 maker.channel.description = description 87 maker.channel.language = language 88 maker.channel.copyright = copyright 89 maker.channel.managingEditor = managingEditor 90 maker.channel.webMaster = webMaster 91 maker.channel.rating = rating 92 maker.channel.docs = docs 93 maker.channel.pubDate = pubDate 94 maker.channel.lastBuildDate = lastBuildDate 95 96 skipDays.each do |day| 97 maker.channel.skipDays.new_day do |new_day| 98 new_day.content = day 99 end 100 end 101 skipHours.each do |hour| 102 maker.channel.skipHours.new_hour do |new_hour| 103 new_hour.content = hour 104 end 105 end 106 107 categories.each do |category| 108 maker.channel.categories.new_category do |new_category| 109 new_category.content = category 110 end 111 end 112 113 maker.channel.generator = generator 114 maker.channel.ttl = ttl 115 end 116 channel = rss.channel 117 118 assert_equal(title, channel.title) 119 assert_equal(link, channel.link) 120 assert_equal(description, channel.description) 121 assert_equal(language, channel.language) 122 assert_equal(copyright, channel.copyright) 123 assert_equal(managingEditor, channel.managingEditor) 124 assert_equal(webMaster, channel.webMaster) 125 assert_equal(rating, channel.rating) 126 assert_equal(docs, channel.docs) 127 assert_equal(pubDate, channel.pubDate) 128 assert_equal(pubDate, channel.date) 129 assert_equal(lastBuildDate, channel.lastBuildDate) 130 131 skipDays.each_with_index do |day, i| 132 assert_equal(day, channel.skipDays.days[i].content) 133 end 134 skipHours.each_with_index do |hour, i| 135 assert_equal(hour.to_i, channel.skipHours.hours[i].content) 136 end 137 138 channel.categories.each_with_index do |category, i| 139 assert_equal(categories[i], category.content) 140 end 141 142 assert_equal(generator, channel.generator) 143 assert_equal(ttl.to_i, channel.ttl) 144 145 assert(channel.items.empty?) 146 assert_nil(channel.image) 147 assert_nil(channel.textInput) 148 end 149 150 def test_not_valid_channel 151 title = "fugafuga" 152 link = "http://hoge.com" 153 description = "fugafugafugafuga" 154 language = "ja" 155 156 assert_not_set_error("maker.channel", %w(title)) do 157 RSS::Maker.make("2.0") do |maker| 158 # maker.channel.title = title 159 maker.channel.link = link 160 maker.channel.description = description 161 maker.channel.language = language 162 end 163 end 164 165 assert_not_set_error("maker.channel", %w(link)) do 166 RSS::Maker.make("2.0") do |maker| 167 maker.channel.title = title 168 # maker.channel.link = link 169 maker.channel.description = description 170 maker.channel.language = language 171 end 172 end 173 174 assert_not_set_error("maker.channel", %w(description)) do 175 RSS::Maker.make("2.0") do |maker| 176 maker.channel.title = title 177 maker.channel.link = link 178 # maker.channel.description = description 179 maker.channel.language = language 180 end 181 end 182 183 rss = RSS::Maker.make("2.0") do |maker| 184 maker.channel.title = title 185 maker.channel.link = link 186 maker.channel.description = description 187 # maker.channel.language = language 188 end 189 assert_not_nil(rss) 190 end 191 192 193 def test_cloud 194 domain = "rpc.sys.com" 195 port = "80" 196 path = "/RPC2" 197 registerProcedure = "myCloud.rssPleaseNotify" 198 protocol = "xml-rpc" 199 200 rss = RSS::Maker.make("2.0") do |maker| 201 setup_dummy_channel(maker) 202 203 maker.channel.cloud.domain = domain 204 maker.channel.cloud.port = port 205 maker.channel.cloud.path = path 206 maker.channel.cloud.registerProcedure = registerProcedure 207 maker.channel.cloud.protocol = protocol 208 end 209 cloud = rss.channel.cloud 210 assert_equal(domain, cloud.domain) 211 assert_equal(port.to_i, cloud.port) 212 assert_equal(path, cloud.path) 213 assert_equal(registerProcedure, cloud.registerProcedure) 214 assert_equal(protocol, cloud.protocol) 215 end 216 217 def test_not_valid_cloud 218 domain = "rpc.sys.com" 219 port = "80" 220 path = "/RPC2" 221 registerProcedure = "myCloud.rssPleaseNotify" 222 protocol = "xml-rpc" 223 224 rss = RSS::Maker.make("2.0") do |maker| 225 setup_dummy_channel(maker) 226 227 # maker.channel.cloud.domain = domain 228 maker.channel.cloud.port = port 229 maker.channel.cloud.path = path 230 maker.channel.cloud.registerProcedure = registerProcedure 231 maker.channel.cloud.protocol = protocol 232 end 233 assert_nil(rss.channel.cloud) 234 235 rss = RSS::Maker.make("2.0") do |maker| 236 setup_dummy_channel(maker) 237 238 maker.channel.cloud.domain = domain 239 # maker.channel.cloud.port = port 240 maker.channel.cloud.path = path 241 maker.channel.cloud.registerProcedure = registerProcedure 242 maker.channel.cloud.protocol = protocol 243 end 244 assert_nil(rss.channel.cloud) 245 246 rss = RSS::Maker.make("2.0") do |maker| 247 setup_dummy_channel(maker) 248 249 maker.channel.cloud.domain = domain 250 maker.channel.cloud.port = port 251 # maker.channel.cloud.path = path 252 maker.channel.cloud.registerProcedure = registerProcedure 253 maker.channel.cloud.protocol = protocol 254 end 255 assert_nil(rss.channel.cloud) 256 257 rss = RSS::Maker.make("2.0") do |maker| 258 setup_dummy_channel(maker) 259 260 maker.channel.cloud.domain = domain 261 maker.channel.cloud.port = port 262 maker.channel.cloud.path = path 263 # maker.channel.cloud.registerProcedure = registerProcedure 264 maker.channel.cloud.protocol = protocol 265 end 266 assert_nil(rss.channel.cloud) 267 268 rss = RSS::Maker.make("2.0") do |maker| 269 setup_dummy_channel(maker) 270 271 maker.channel.cloud.domain = domain 272 maker.channel.cloud.port = port 273 maker.channel.cloud.path = path 274 maker.channel.cloud.registerProcedure = registerProcedure 275 # maker.channel.cloud.protocol = protocol 276 end 277 assert_nil(rss.channel.cloud) 278 end 279 280 281 def test_image 282 title = "fugafuga" 283 link = "http://hoge.com" 284 url = "http://hoge.com/hoge.png" 285 width = "144" 286 height = "400" 287 description = "an image" 288 289 rss = RSS::Maker.make("2.0") do |maker| 290 setup_dummy_channel(maker) 291 maker.channel.link = link 292 293 maker.image.title = title 294 maker.image.url = url 295 maker.image.width = width 296 maker.image.height = height 297 maker.image.description = description 298 end 299 image = rss.image 300 assert_equal(title, image.title) 301 assert_equal(link, image.link) 302 assert_equal(url, image.url) 303 assert_equal(width.to_i, image.width) 304 assert_equal(height.to_i, image.height) 305 assert_equal(description, image.description) 306 307 assert_not_set_error("maker.channel", %w(title description)) do 308 RSS::Maker.make("2.0") do |maker| 309 # setup_dummy_channel(maker) 310 maker.channel.link = link 311 312 maker.image.title = title 313 maker.image.url = url 314 maker.image.width = width 315 maker.image.height = height 316 maker.image.description = description 317 end 318 end 319 end 320 321 def test_not_valid_image 322 title = "fugafuga" 323 link = "http://hoge.com" 324 url = "http://hoge.com/hoge.png" 325 width = "144" 326 height = "400" 327 description = "an image" 328 329 rss = RSS::Maker.make("2.0") do |maker| 330 setup_dummy_channel(maker) 331 maker.channel.link = link 332 333 # maker.image.title = title 334 maker.image.url = url 335 maker.image.width = width 336 maker.image.height = height 337 maker.image.description = description 338 end 339 assert_nil(rss.image) 340 341 assert_not_set_error("maker.channel", %w(link)) do 342 RSS::Maker.make("2.0") do |maker| 343 setup_dummy_channel(maker) 344 # maker.channel.link = link 345 maker.channel.link = nil 346 347 maker.image.title = title 348 maker.image.url = url 349 maker.image.width = width 350 maker.image.height = height 351 maker.image.description = description 352 end 353 end 354 355 rss = RSS::Maker.make("2.0") do |maker| 356 setup_dummy_channel(maker) 357 maker.channel.link = link 358 359 maker.image.title = title 360 # maker.image.url = url 361 maker.image.width = width 362 maker.image.height = height 363 maker.image.description = description 364 end 365 assert_nil(rss.image) 366 end 367 368 def test_items(with_convenience_way=true) 369 title = "TITLE" 370 link = "http://hoge.com/" 371 description = "text hoge fuga" 372 author = "oprah@oxygen.net" 373 comments = "http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290" 374 pubDate = Time.now 375 376 rss = RSS::Maker.make("2.0") do |maker| 377 setup_dummy_channel(maker) 378 end 379 assert(rss.channel.items.empty?) 380 381 item_size = 5 382 rss = RSS::Maker.make("2.0") do |maker| 383 setup_dummy_channel(maker) 384 385 item_size.times do |i| 386 maker.items.new_item do |item| 387 item.title = "#{title}#{i}" 388 item.link = "#{link}#{i}" 389 item.description = "#{description}#{i}" 390 item.author = "#{author}#{i}" 391 item.comments = "#{comments}#{i}" 392 item.date = pubDate 393 end 394 end 395 maker.items.do_sort = true 396 end 397 assert_equal(item_size, rss.items.size) 398 rss.channel.items.each_with_index do |item, i| 399 assert_equal("#{title}#{i}", item.title) 400 assert_equal("#{link}#{i}", item.link) 401 assert_equal("#{description}#{i}", item.description) 402 assert_equal("#{author}#{i}", item.author) 403 assert_equal("#{comments}#{i}", item.comments) 404 assert_equal(pubDate, item.pubDate) 405 assert_equal(pubDate, item.date) 406 end 407 408 rss = RSS::Maker.make("2.0") do |maker| 409 setup_dummy_channel(maker) 410 411 item_size.times do |i| 412 maker.items.new_item do |item| 413 item.title = "#{title}#{i}" 414 item.link = "#{link}#{i}" 415 item.description = "#{description}#{i}" 416 item.author = "#{author}#{i}" 417 item.comments = "#{comments}#{i}" 418 item.date = pubDate 419 end 420 end 421 maker.items.do_sort = Proc.new do |x, y| 422 if with_convenience_way 423 y.title[-1] <=> x.title[-1] 424 else 425 y.title {|t| t.content[-1]} <=> x.title {|t| t.content[-1]} 426 end 427 end 428 end 429 assert_equal(item_size, rss.items.size) 430 rss.channel.items.reverse.each_with_index do |item, i| 431 assert_equal("#{title}#{i}", item.title) 432 assert_equal("#{link}#{i}", item.link) 433 assert_equal("#{description}#{i}", item.description) 434 assert_equal("#{author}#{i}", item.author) 435 assert_equal("#{comments}#{i}", item.comments) 436 assert_equal(pubDate, item.pubDate) 437 assert_equal(pubDate, item.date) 438 end 439 end 440 441 def test_items_with_new_api_since_018 442 test_items(false) 443 end 444 445 def test_pubDate_without_description 446 title = "TITLE" 447 link = "http://hoge.com/" 448 # description = "text hoge fuga" 449 author = "oprah@oxygen.net" 450 pubDate = Time.now 451 452 rss = RSS::Maker.make("2.0") do |maker| 453 setup_dummy_channel(maker) 454 455 maker.items.new_item do |item| 456 item.title = title 457 item.link = link 458 # item.description = description 459 item.author = author 460 item.pubDate = pubDate 461 end 462 end 463 assert_equal(1, rss.items.size) 464 rss.channel.items.each_with_index do |item, i| 465 assert_equal(title, item.title) 466 assert_equal(link, item.link) 467 # assert_equal(description, item.description) 468 assert_equal(author, item.author) 469 assert_equal(pubDate, item.pubDate) 470 assert_equal(pubDate, item.date) 471 end 472 end 473 474 def test_guid 475 isPermaLink = "true" 476 content = "http://inessential.com/2002/09/01.php#a2" 477 478 rss = RSS::Maker.make("2.0") do |maker| 479 setup_dummy_channel(maker) 480 setup_dummy_item(maker) 481 482 guid = maker.items.last.guid 483 guid.isPermaLink = isPermaLink 484 guid.content = content 485 end 486 guid = rss.channel.items.last.guid 487 assert_equal(isPermaLink == "true", guid.isPermaLink) 488 assert_equal(content, guid.content) 489 end 490 491 def test_guid_permanent_link 492 content = "http://inessential.com/2002/09/01.php#a2" 493 494 rss = RSS::Maker.make("2.0") do |maker| 495 setup_dummy_channel(maker) 496 setup_dummy_item(maker) 497 498 guid = maker.items.last.guid 499 assert_equal(nil, guid.permanent_link?) 500 assert_equal(guid.isPermaLink, guid.permanent_link?) 501 guid.permanent_link = true 502 assert_equal(true, guid.permanent_link?) 503 assert_equal(guid.isPermaLink, guid.permanent_link?) 504 guid.content = content 505 end 506 guid = rss.channel.items.last.guid 507 assert_equal(true, guid.isPermaLink) 508 assert_equal(content, guid.content) 509 end 510 511 def test_guid_permanent_link_false 512 content = "http://inessential.com/2002/09/01.php#a2" 513 514 rss = RSS::Maker.make("2.0") do |maker| 515 setup_dummy_channel(maker) 516 setup_dummy_item(maker) 517 518 guid = maker.items.last.guid 519 assert_equal(nil, guid.permanent_link?) 520 assert_equal(guid.isPermaLink, guid.permanent_link?) 521 guid.permanent_link = false 522 assert_equal(false, guid.permanent_link?) 523 assert_equal(guid.isPermaLink, guid.permanent_link?) 524 guid.content = content 525 end 526 guid = rss.channel.items.last.guid 527 assert_equal(false, guid.isPermaLink) 528 assert_equal(content, guid.content) 529 end 530 531 def test_not_valid_guid 532 # content = "http://inessential.com/2002/09/01.php#a2" 533 534 rss = RSS::Maker.make("2.0") do |maker| 535 setup_dummy_channel(maker) 536 setup_dummy_item(maker) 537 538 # guid = maker.items.last.guid 539 # guid.content = content 540 end 541 assert_nil(rss.channel.items.last.guid) 542 end 543 544 def test_enclosure 545 url = "http://www.scripting.com/mp3s/weatherReportSuite.mp3" 546 length = "12216320" 547 type = "audio/mpeg" 548 549 rss = RSS::Maker.make("2.0") do |maker| 550 setup_dummy_channel(maker) 551 setup_dummy_item(maker) 552 553 enclosure = maker.items.last.enclosure 554 enclosure.url = url 555 enclosure.length = length 556 enclosure.type = type 557 end 558 enclosure = rss.channel.items.last.enclosure 559 assert_equal(url, enclosure.url) 560 assert_equal(length.to_i, enclosure.length) 561 assert_equal(type, enclosure.type) 562 end 563 564 def test_not_valid_enclosure 565 url = "http://www.scripting.com/mp3s/weatherReportSuite.mp3" 566 length = "12216320" 567 type = "audio/mpeg" 568 569 rss = RSS::Maker.make("2.0") do |maker| 570 setup_dummy_channel(maker) 571 setup_dummy_item(maker) 572 573 enclosure = maker.items.last.enclosure 574 # enclosure.url = url 575 enclosure.length = length 576 enclosure.type = type 577 end 578 assert_nil(rss.channel.items.last.enclosure) 579 580 rss = RSS::Maker.make("2.0") do |maker| 581 setup_dummy_channel(maker) 582 setup_dummy_item(maker) 583 584 enclosure = maker.items.last.enclosure 585 enclosure.url = url 586 # enclosure.length = length 587 enclosure.type = type 588 end 589 assert_nil(rss.channel.items.last.enclosure) 590 591 rss = RSS::Maker.make("2.0") do |maker| 592 setup_dummy_channel(maker) 593 setup_dummy_item(maker) 594 595 enclosure = maker.items.last.enclosure 596 enclosure.url = url 597 enclosure.length = length 598 # enclosure.type = type 599 end 600 assert_nil(rss.channel.items.last.enclosure) 601 end 602 603 604 def test_source 605 url = "http://static.userland.com/tomalak/links2.xml" 606 content = "Tomalak's Realm" 607 608 rss = RSS::Maker.make("2.0") do |maker| 609 setup_dummy_channel(maker) 610 setup_dummy_item(maker) 611 612 source = maker.items.last.source 613 source.url = url 614 source.content = content 615 end 616 source = rss.channel.items.last.source 617 assert_equal(url, source.url) 618 assert_equal(content, source.content) 619 end 620 621 def test_not_valid_source 622 url = "http://static.userland.com/tomalak/links2.xml" 623 content = "Tomalak's Realm" 624 625 rss = RSS::Maker.make("2.0") do |maker| 626 setup_dummy_channel(maker) 627 setup_dummy_item(maker) 628 629 source = maker.items.last.source 630 # source.url = url 631 source.content = content 632 end 633 assert_nil(rss.channel.items.last.source) 634 635 rss = RSS::Maker.make("2.0") do |maker| 636 setup_dummy_channel(maker) 637 setup_dummy_item(maker) 638 639 source = maker.items.last.source 640 source.url = url 641 # source.content = content 642 end 643 assert_nil(rss.channel.items.last.source) 644 end 645 646 def test_category 647 domain = "http://www.fool.com/cusips" 648 content = "MSFT" 649 650 rss = RSS::Maker.make("2.0") do |maker| 651 setup_dummy_channel(maker) 652 setup_dummy_item(maker) 653 654 maker.items.last.categories.new_category do |category| 655 category.domain = domain 656 category.content = content 657 end 658 end 659 category = rss.channel.items.last.categories.last 660 assert_equal(domain, category.domain) 661 assert_equal(content, category.content) 662 end 663 664 def test_not_valid_category 665 # content = "Grateful Dead" 666 667 rss = RSS::Maker.make("2.0") do |maker| 668 setup_dummy_channel(maker) 669 setup_dummy_item(maker) 670 671 maker.items.last.categories.new_category do |category| 672 # category.content = content 673 end 674 end 675 assert(rss.channel.items.last.categories.empty?) 676 end 677 678 def test_textInput 679 title = "fugafuga" 680 description = "text hoge fuga" 681 name = "hoge" 682 link = "http://hoge.com" 683 684 rss = RSS::Maker.make("2.0") do |maker| 685 setup_dummy_channel(maker) 686 687 maker.textinput.title = title 688 maker.textinput.description = description 689 maker.textinput.name = name 690 maker.textinput.link = link 691 end 692 textInput = rss.channel.textInput 693 assert_equal(title, textInput.title) 694 assert_equal(description, textInput.description) 695 assert_equal(name, textInput.name) 696 assert_equal(link, textInput.link) 697 698 assert_not_set_error("maker.channel", %w(link description title)) do 699 RSS::Maker.make("2.0") do |maker| 700 # setup_dummy_channel(maker) 701 702 maker.textinput.title = title 703 maker.textinput.description = description 704 maker.textinput.name = name 705 maker.textinput.link = link 706 end 707 end 708 end 709 710 def test_not_valid_textInput 711 title = "fugafuga" 712 description = "text hoge fuga" 713 name = "hoge" 714 link = "http://hoge.com" 715 716 rss = RSS::Maker.make("2.0") do |maker| 717 setup_dummy_channel(maker) 718 719 # maker.textinput.title = title 720 maker.textinput.description = description 721 maker.textinput.name = name 722 maker.textinput.link = link 723 end 724 assert_nil(rss.channel.textInput) 725 726 rss = RSS::Maker.make("2.0") do |maker| 727 setup_dummy_channel(maker) 728 729 maker.textinput.title = title 730 # maker.textinput.description = description 731 maker.textinput.name = name 732 maker.textinput.link = link 733 end 734 assert_nil(rss.channel.textInput) 735 736 rss = RSS::Maker.make("2.0") do |maker| 737 setup_dummy_channel(maker) 738 739 maker.textinput.title = title 740 maker.textinput.description = description 741 # maker.textinput.name = name 742 maker.textinput.link = link 743 end 744 assert_nil(rss.channel.textInput) 745 746 rss = RSS::Maker.make("2.0") do |maker| 747 setup_dummy_channel(maker) 748 749 maker.textinput.title = title 750 maker.textinput.description = description 751 maker.textinput.name = name 752 # maker.textinput.link = link 753 end 754 assert_nil(rss.channel.textInput) 755 end 756 end 757end 758