summaryrefslogtreecommitdiffstats
path: root/akregator/src/librss/testlibrss.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'akregator/src/librss/testlibrss.cpp')
-rw-r--r--akregator/src/librss/testlibrss.cpp259
1 files changed, 230 insertions, 29 deletions
diff --git a/akregator/src/librss/testlibrss.cpp b/akregator/src/librss/testlibrss.cpp
index bef989c6..5e298ea3 100644
--- a/akregator/src/librss/testlibrss.cpp
+++ b/akregator/src/librss/testlibrss.cpp
@@ -1,67 +1,268 @@
#include "testlibrss.h"
-#include "image.h"
+#include <tqdatetime.h>
+#include <tqfile.h>
#include <tdeaboutdata.h>
#include <tdecmdlineargs.h>
#include <tdeapplication.h>
#include <kdebug.h>
+#include <krfcdate.h>
+
+#include "image.h"
+#include "enclosure.h"
+
+#include <cstdlib>
using namespace RSS;
+
+TestRetriever::TestRetriever()
+ : m_errorCode(0)
+{
+}
+
+TestRetriever::~TestRetriever()
+{
+}
+
+void TestRetriever::retrieveData(const KURL &url)
+{
+ // Test files are local paths
+ TQFile file(url.path());
+ if (file.open(IO_ReadOnly))
+ {
+ TQStringList lines;
+ TQTextStream stream(&file);
+
+ while (!stream.atEnd())
+ {
+ lines += stream.readLine();
+ }
+ file.close();
+
+ TQCString content = lines.join("\n").local8Bit();
+ TQByteArray data;
+ data.duplicate(content, content.length());
+ emit dataRetrieved(data, true);
+ }
+ else
+ {
+ kdError() << "Failed to retrieveData: " << file.errorString() << endl;
+ m_errorCode = file.status();
+ emit dataRetrieved(TQByteArray{}, false);
+ }
+}
+
static const TDECmdLineOptions options[] =
{
{ "+url", I18N_NOOP("URL of feed"), 0 },
TDECmdLineLastOption
};
+template<typename ActualType, typename ExpectedType>
+static void assertEquals(const ActualType& actual, const ExpectedType& expected)
+{
+ if (actual != expected)
+ {
+ kdError() << "Assertion failed: actual == expected\n"
+ << " actual: " << actual << "\n"
+ << " expected: " << expected << endl;
+ tdeApp->exit(1);
+ }
+}
+
+static void checkRSS091(const Document& document)
+{
+ assertEquals(document.title(), "WriteTheWeb");
+ assertEquals(document.link().url(), "http://writetheweb.com");
+ assertEquals(document.description(), "News for web users that write back");
+ assertEquals(document.language(), Language::en_us);
+ assertEquals(document.copyright(), "Copyright 2000, WriteTheWeb team.");
+ assertEquals(document.managingEditor(), "editor@writetheweb.com");
+ assertEquals(document.webMaster(), "webmaster@writetheweb.com");
+
+ const Image* image = document.image();
+ if (!image)
+ {
+ kdError() << "Expected an <image> element to be found" << endl;
+ tdeApp->exit(1);
+ }
+
+ assertEquals(image->title(), "WriteTheWeb");
+ assertEquals(image->url().url(), "http://writetheweb.com/images/mynetscape88.gif");
+ assertEquals(image->link().url(), "http://writetheweb.com");
+ assertEquals(image->description(), "News for web users that write back");
+ assertEquals(image->width(), 88);
+ assertEquals(image->height(), 31);
+
+ assertEquals(document.articles().count(), 6);
+
+ Article article = document.articles().first();
+ assertEquals(article.title(), "Giving the world a pluggable Gnutella");
+ assertEquals(article.link().url(), "http://writetheweb.com/read.php?item=24");
+ assertEquals(article.description(), "WorldOS is a framework on which to build programs that work like Freenet or Gnutella -allowing distributed applications using peer-to-peer routing.");
+}
+
+static void checkWFW(const Document& document)
+{
+ assertEquals(document.link().url(), "http://wellformedweb.org/news/");
+ assertEquals(document.description(), "Exploring the limits of XML and HTTP");
+
+ assertEquals(document.articles().count(), 5);
+
+ Article article = document.articles().front();
+ assertEquals(article.title(), "Should you use Content Negotiation in your Web Services?");
+ assertEquals(article.commentsLink().url(), "http://bitworking.org/news/comments/WebServicesAndContentNegotiation");
+}
+
+static void checkDC(const Document& document)
+{
+ // librss will use dc:date if it is provided, otherwise it will use pubDate
+ assertEquals(document.link().url(), "https://www.theguardian.com/us");
+
+ TQDateTime expectedTime;
+ time_t time = KRFCDate::parseDateISO8601("2025-03-13T07:28:39Z");
+ expectedTime.setTime_t(time);
+ assertEquals(document.pubDate(), expectedTime);
+
+ assertEquals(document.articles().count(), 1);
+
+ Article article = document.articles().first();
+ time = KRFCDate::parseDateISO8601("2025-03-13T05:22:00Z");
+ expectedTime.setTime_t(time);
+ assertEquals(article.pubDate(), expectedTime);
+
+ assertEquals(article.author(), "Hugo Lowell in Washington");
+}
+
+static void checkRDF(const Document& document)
+{
+ assertEquals(document.title(), "XML.com");
+ assertEquals(document.link().url(), "http://xml.com/pub");
+
+ assertEquals(document.articles().count(), 2);
+
+ Article article = document.articles().first();
+
+ assertEquals(article.title(), "Processing Inclusions with XSLT");
+ assertEquals(article.link().url(), "http://xml.com/pub/2000/08/09/xslt/xslt.html");
+ assertEquals(article.guid(), "http://xml.com/pub/2000/08/09/xslt/xslt.html");
+ assertEquals(article.guidIsPermaLink(), false);
+}
+
+static void checkAtom10(const Document& document)
+{
+ assertEquals(document.title(), "dive into mark");
+ assertEquals(document.description(), "A <em>lot</em> of effort went into making this effortless");
+ kdWarning() << "Skipping check for Atom \"rights\" (Document::copyright) -- not implemented." << endl;
+ // assertEquals(document.copyright(), "Copyright (c) 2003, Mark Pilgrim");
+ assertEquals(document.language(), Language::en_us);
+
+ // 2005-07-31T12:29:29Z
+ // TQDateTime compTime;
+ // time_t time = KRFCDate::parseDateISO8601("2005-07-31T12:29:29Z");
+ // compTime.setTime_t(time);
+ // assertEquals(document.pubDate(), compTime);
+ kdWarning() << "Skipping check for Atom \"updated\" (Document::pubDate/lastBuildDate) -- not implemented." << endl;
+
+ assertEquals(document.link().url(), "http://example.org/");
+
+ assertEquals(document.articles().count(), 1);
+
+ Article article = document.articles().first();
+
+ assertEquals(article.title(), "Atom draft-07 snapshot");
+ assertEquals(article.link().url(), "http://example.org/2005/04/02/atom");
+
+ if (article.description().isNull())
+ {
+ kdError() << "Empty Atom article description." << endl;
+ tdeApp->exit(1);
+ }
+
+ // Enclosure enclosure = article.enclosure();
+ // assertEquals(enclosure.url(), "http://example.org/audio/ph34r_my_podcast.mp3");
+ // assertEquals(enclosure.length(), 1337);
+ // assertEquals(enclosure.type(), "audio/mpeg");
+ kdWarning() << "Skipping check for Atom \"enclosure\" links -- not implemented." << endl;
+
+ assertEquals(article.guid(), "tag:example.org,2003:3.2397");
+
+ // 2005-07-31T12:29:29Z
+ // Need a little workaround since librss converts the timestamp to local time.
+ // NOTE: Atom provides both 'published' and 'updated'; librss uses 'updated'.
+ TQDateTime articlePublishedDate;
+ time_t publishedTime = KRFCDate::parseDateISO8601("2005-07-31T12:29:29Z");
+ articlePublishedDate.setTime_t(publishedTime);
+ assertEquals(article.pubDate(), articlePublishedDate);
+
+ assertEquals(article.author(), "<a href=\"mailto:f8dy@example.com\">Mark Pilgrim</a>");
+}
void Tester::test( const TQString &url )
{
Loader *loader = Loader::create();
- connect( loader, TQT_SIGNAL( loadingComplete( Loader *, Document, Status ) ),
- this, TQT_SLOT( slotLoadingComplete( Loader *, Document, Status ) ) );
- loader->loadFrom( url, new FileRetriever );
+ connect( loader, TQ_SIGNAL( loadingComplete( Loader *, Document, Status ) ),
+ this, TQ_SLOT( slotLoadingComplete( Loader *, Document, Status ) ) );
+ loader->loadFrom( url, new TestRetriever );
}
void Tester::slotLoadingComplete( Loader *loader, Document doc, Status status )
{
- if ( status == Success )
+ if (status != Success)
{
- kdDebug() << "Successfully retrieved '" << doc.title() << "'" << endl;
- kdDebug() << doc.description() << endl;
-
- if ( doc.image() ) {
- kdDebug() << "Image: ";
- kdDebug() << " Title: " << doc.image()->title() << endl;
- kdDebug() << " URL: " << doc.image()->url() << endl;
- kdDebug() << " Link: " << doc.image()->link() << endl;
- }
-
- kdDebug() << "Articles:" << endl;
-
- Article::List list = doc.articles();
- Article::List::ConstIterator it;
- Article::List::ConstIterator en=list.end();
- for (it = list.begin(); it != en; ++it)
+ kdError() << "Failed to load Document: ec=" << loader->errorCode() << " status=" << status << endl;
+ exit(1);
+ }
+
+ switch (doc.version())
+ {
+ case RSS::v0_91:
{
- kdDebug() << "\tTitle: " << (*it).title() << endl;
- kdDebug() << "\tText: " << (*it).description() << endl;
+ checkRSS091(doc);
+ break;
+ }
+ case RSS::v2_0:
+ {
+ if (doc.title() == "The Well-Formed Web")
+ {
+ checkWFW(doc);
+ break;
+ }
+ else if (doc.title() == "The Guardian")
+ {
+ checkDC(doc);
+ break;
+ }
+ else if (doc.title() == "XML.com")
+ {
+ checkRDF(doc);
+ break;
+ }
+ kdError() << "Unknown RSS 2.0 document '" << doc.title() << "'" << endl;
+ exit(1);
+ }
+ case RSS::vAtom_1_0:
+ {
+ checkAtom10(doc);
+ break;
+ }
+ default:
+ {
+ break;
}
}
- if ( status != Success )
- kdDebug() << "ERROR " << loader->errorCode() << endl;
-
- kapp->quit();
+ exit(0);
}
int main( int argc, char **argv )
{
TDEAboutData aboutData( "testlibrss", "testlibrss", "0.1" );
TDECmdLineArgs::init( argc, argv, &aboutData );
- TDECmdLineArgs::addCmdLineOptions( options );
- TDEApplication app;
+ TDECmdLineArgs::addCmdLineOptions( options );
+ TDEApplication app(false, false);
TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
if ( args->count() != 1 ) args->usage();