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