1#!/usr/bin/perl -w 2 3use strict; 4use Test; 5use Mail::Freshmeat; 6 7BEGIN { plan test => 7382 } 8 9my $count = -1; 10my @newsletters; 11 12open FM, "t/sample.newsletters" or die $!; 13#open FM, "../fmold" or die $!; 14#open FM, "../fm" or die $!; 15while (<FM>) 16{ 17 $count++ if /^From\s/; 18 push @{$newsletters[$count]}, $_; 19} 20close FM or die $!; 21 22$count = 1; 23for my $newsletter (@newsletters) 24{ 25 my $letter; 26 eval { $letter = Mail::Freshmeat->new($newsletter) }; 27 28 ok(not $@); 29 ok($letter->links_header(), 30 '::: L I N K S F O R T H E D A Y :::'); 31 ok($letter->links(), 32 qr!\d{4}/\d{2}/\d{2}/!); 33 ok($letter->headlines_header(), 34 qr/^::: R E L E A S E H E A D L I N E S \(\d+\) :::$/); 35 ok($letter->headlines(), 36 qr/((?: ^ \[\d+\]\ .* $ \n | ^ [^\)]+ \) $ \n)+)/mx); 37 ok($letter->ad_header(), '::: A D V E R T I S I N G :::') if 38 $letter->ad_header(); 39 ok($letter->articles_header(), 40 qr/^::: A R T I C L E S \(\d+\) :::$/) if $letter->articles_header(); 41 ok($letter->entries_header(), 42 '::: R E L E A S E D E T A I L S :::'); 43 ok($letter->ad(), qr!http://!) if $letter->ad(); 44 my $footer = <<'EOF'; 45The freshmeat daily newsletter 46To unsubscribe, send email to freshmeat-news-request@lists.freshmeat.net 47or visit http://lists.freshmeat.net/mailman/listinfo/freshmeat-news 48 49EOF 50 chomp $footer; 51 chomp $footer; 52 ok($letter->footer(), $footer); 53 ok($letter->entries_total(), qr/^\d+$/); 54 ok($letter->articles_total(), qr/^\d+$/) if $letter->articles_total(); 55 ok($letter->date(), qr/\d+\/\d+\/\d+/); 56 ok(ref $letter->entries(), 'ARRAY'); 57 58 for my $entry ($letter->entries()) 59 { 60 #warn "testing nl #$count, entry#", $entry->position(), "\n"; 61 my $entry_keys = join '', $entry->entry_keys(); 62 ok($entry_keys, '_position_name_and_version_name_version_posted_by_name_posted_by_url_posted_on_trove_about_changes_license_url'); 63 ok($entry->position(), qr/^\d{3}$/); 64 ok($entry->posted_on(), 65 qr/^\w+,\s\w+\s\d{1,2}\w{2}\s\d{4}\s\d{2}:\d{2}$/); 66 ok($entry->license(), 67 qr/license|commercial|domain|free|approved| 68 shareware|gpl|unknown|/ix); 69 ok($entry->url(), qr/^http:\/\//); 70 ok($entry->name_and_version(), qr/${\(quotemeta($entry->name()))}/); 71 ok($entry->short_entry(), qr/${\(quotemeta($entry->name()))}/); 72 ok($entry->posted_by_url(), qr/http:\/\/|/); 73 #ok($entry->about(), qr/^About:\s/); 74 #ok($entry->changes(), qr/^Changes:\s|/); 75 } 76 77 for my $article ($letter->articles()) 78 { 79 my $article_keys = join '', $article->article_keys(); 80 ok($article_keys, '_title_posted_by_name_posted_by_url_posted_on_section_description_url'); 81 ok($article->posted_by_url(), qr/mailto|http|ftp|\@/); 82 ok($article->posted_on(), 83 qr/^\w+,\s\w+\s\d{1,2}\w{2}\s\d{4}\s\d{2}:\d{2}$/); 84 ok($article->url(), qr!http://!); 85 } 86 87 $count++; 88} 89