summaryrefslogtreecommitdiffstats
path: root/libtdepim/tests/testdistrlist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libtdepim/tests/testdistrlist.cpp')
-rw-r--r--libtdepim/tests/testdistrlist.cpp332
1 files changed, 332 insertions, 0 deletions
diff --git a/libtdepim/tests/testdistrlist.cpp b/libtdepim/tests/testdistrlist.cpp
new file mode 100644
index 000000000..f588f9a93
--- /dev/null
+++ b/libtdepim/tests/testdistrlist.cpp
@@ -0,0 +1,332 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 David Faure <faure@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "testdistrlist.h"
+
+#include <distributionlist.h>
+using KPIM::DistributionList;
+
+#include <config.h>
+
+#include <kabc/stdaddressbook.h>
+#include <kurl.h>
+#include <kapplication.h>
+#include <kio/netaccess.h>
+#include <kio/job.h>
+#include <kdebug.h>
+#include <kcmdlineargs.h>
+
+#include <tqdir.h>
+#include <tqfileinfo.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+
+int main(int argc, char *argv[])
+{
+ // Use another directory than the real one, just to keep things clean
+ // KDEHOME needs to be writable though, for a ksycoca database
+ setenv( "KDEHOME", TQFile::encodeName( TQDir::homeDirPath() + "/.kde-testdistrlist" ), true );
+ setenv( "KDE_FORK_SLAVES", "yes", true ); // simpler, for the final cleanup
+
+ KApplication::disableAutoDcopRegistration();
+ KCmdLineArgs::init(argc,argv,"testdistrlist", 0, 0, 0, 0);
+ KApplication app( false, false );
+
+ TestDistrList test;
+ test.setup();
+ test.runAll();
+ test.cleanup();
+ kdDebug() << "All tests OK." << endl;
+ return 0;
+}
+
+void TestDistrList::setup()
+{
+ // We need a std addressbook
+ KABC::AddressBook *ab = KABC::StdAddressBook::self();
+ KABC::StdAddressBook::setAutomaticSave( false );
+
+ // and two contacts
+ KABC::Addressee addr1;
+ addr1.setName( "addr1" );
+ addr1.setFormattedName( "addr1" );
+ addr1.insertEmail( "addr1@kde.org", true );
+ addr1.insertEmail( "addr1-alternate@kde.org" );
+ ab->insertAddressee( addr1 );
+ assert( addr1.emails().count() == 2 );
+
+ KABC::Addressee addr2;
+ addr2.setName( "addr2" );
+ addr2.insertEmail( "addr2@kde.org", true );
+ addr2.insertEmail( "addr2-alternate@kde.org" );
+ ab->insertAddressee( addr2 );
+ assert( addr2.emails().count() == 2 );
+
+ assert( !ab->findByName( "addr1" ).isEmpty() );
+ assert( !ab->findByName( "addr2" ).isEmpty() );
+}
+
+void TestDistrList::runAll()
+{
+ testEmpty();
+ testNewList();
+ testInsertEntry();
+ testRemoveEntry();
+ testDuplicate();
+ testDeleteList();
+}
+
+bool TestDistrList::check(const TQString& txt, TQString a, TQString b)
+{
+ if (a.isEmpty())
+ a = TQString();
+ if (b.isEmpty())
+ b = TQString();
+ if (a == b) {
+ kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl;
+ }
+ else {
+ kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl;
+ cleanup();
+ exit(1);
+ }
+ return true;
+}
+
+// taken from KMail
+#include <sys/types.h>
+#include <dirent.h>
+static bool removeDirAndContentsRecursively( const TQString & path )
+{
+ kdDebug() << k_funcinfo << path << endl;
+ bool success = true;
+
+ TQDir d;
+ d.setPath( path );
+ d.setFilter( TQDir::Files | TQDir::Dirs | TQDir::Hidden );
+
+ const TQFileInfoList *list = d.entryInfoList();
+ TQFileInfoListIterator it( *list );
+ TQFileInfo *fi;
+
+ while ( (fi = it.current()) != 0 ) {
+ if( fi->isDir() && !fi->isSymLink() ) {
+ if ( fi->fileName() != "." && fi->fileName() != ".." )
+ success = success && removeDirAndContentsRecursively( fi->absFilePath() );
+ } else {
+ success = success && d.remove( fi->absFilePath() );
+ }
+ ++it;
+ }
+
+ if ( success ) {
+ success = success && d.rmdir( path ); // nuke ourselves, we should be empty now
+ }
+ return success;
+}
+
+void TestDistrList::cleanup()
+{
+ kdDebug() << k_funcinfo << endl;
+ KABC::AddressBook *ab = KABC::StdAddressBook::self();
+ ab->clear();
+ KABC::StdAddressBook::close();
+
+ TQString kdehome = TQFile::decodeName( getenv("KDEHOME") );
+ KURL urlkdehome; urlkdehome.setPath( kdehome );
+ // don't use KIO::NetAccess here since it needs X
+ // KIO::NetAccess::del( urlkdehome, 0 )i;
+ assert( removeDirAndContentsRecursively( kdehome ) );
+}
+
+void TestDistrList::testEmpty()
+{
+ kdDebug() << k_funcinfo << endl;
+ DistributionList dl;
+ assert( dl.isEmpty() );
+}
+
+void TestDistrList::testNewList()
+{
+ kdDebug() << k_funcinfo << endl;
+ DistributionList dl;
+ dl.setName( "foo" );
+ assert( !dl.isEmpty() );
+ check( "name set", dl.formattedName(), "foo" );
+ assert( DistributionList::isDistributionList( dl ) );
+
+ KABC::AddressBook *ab = KABC::StdAddressBook::self();
+ ab->insertAddressee( dl );
+#if 0 // can't do that until we have KABC::AddressBook::findByFormattedName, or we use setName()
+ KABC::Addressee::List addrList = ab->findByName( "foo" );
+ assert( addrList.count() == 1 );
+ KABC::Addressee addr = addrList.first();
+ assert( !addr.isEmpty() );
+ check( "correct name", addr.name(), "foo" );
+ assert( DistributionList::isDistributionList( addr ) );
+#else
+ KABC::Addressee addr = dl;
+#endif
+
+ DistributionList dl2 = DistributionList::findByName( ab, "foo" );
+ assert( !dl2.isEmpty() );
+ check( "correct name", dl2.formattedName(), "foo" );
+ assert( DistributionList::isDistributionList( dl2 ) );
+
+ // Test the ctor that takes an addressee
+ DistributionList dl3( addr );
+ assert( !dl3.isEmpty() );
+ assert( DistributionList::isDistributionList( dl3 ) );
+ check( "correct name", dl3.formattedName(), "foo" );
+}
+
+void TestDistrList::testInsertEntry()
+{
+ kdDebug() << k_funcinfo << endl;
+ KABC::AddressBook *ab = KABC::StdAddressBook::self();
+ DistributionList dl = DistributionList::findByName( ab, "foo" );
+ assert( !dl.isEmpty() );
+
+#if 0 // the usual method
+ KABC::Addressee addr1 = ab->findByName( "addr1" ).first();
+ assert( !addr1.isEmpty() );
+ dl.insertEntry( addr1 );
+#else // the kolab-resource method
+ dl.insertEntry( "addr1" );
+#endif
+
+ KABC::Addressee addr2 = ab->findByName( "addr2" ).first();
+ assert( !addr2.isEmpty() );
+ dl.insertEntry( addr2, "addr2-alternate@kde.org" );
+
+ // Try inserting it again, should do nothing
+ dl.insertEntry( addr2, "addr2-alternate@kde.org" );
+
+ // And insert it with another email address
+ dl.insertEntry( addr2, "addr2@kde.org" );
+
+ // Test entries()
+ DistributionList::Entry::List entries = dl.entries( ab );
+ check( "entries count", TQString::number( entries.count() ), "3" );
+ check( "first entry", entries[0].addressee.name(), "addr1" );
+ check( "first entry", entries[0].email, TQString() );
+ check( "second entry", entries[1].addressee.name(), "addr2" );
+ check( "second entry", entries[1].email, "addr2-alternate@kde.org" );
+ check( "third entry", entries[2].addressee.name(), "addr2" );
+ check( "third entry", entries[2].email, "addr2@kde.org" );
+
+ // Test emails()
+ TQStringList emails = dl.emails( ab );
+ kdDebug() << emails << endl;
+ assert( emails.count() == 3 );
+ check( "first email", emails[0], "addr1 <addr1@kde.org>" );
+ check( "second email", emails[1], "addr2 <addr2-alternate@kde.org>" );
+ check( "third email", emails[2], "addr2 <addr2@kde.org>" );
+
+ // Commit changes to the addressbook !!
+ ab->insertAddressee( dl );
+}
+
+void TestDistrList::testRemoveEntry()
+{
+ kdDebug() << k_funcinfo << endl;
+ KABC::AddressBook *ab = KABC::StdAddressBook::self();
+ DistributionList dl = DistributionList::findByName( ab, "foo" );
+ assert( !dl.isEmpty() );
+ DistributionList::Entry::List entries = dl.entries( ab );
+ check( "entries count before removeEntry", TQString::number( entries.count() ), "3" );
+
+ // Removing an empty entry shouldn't do anything
+ dl.removeEntry( KABC::Addressee() );
+ check( "entries count after removing empty entry", TQString::number( dl.entries(ab).count() ), "3" );
+
+ KABC::Addressee addr1 = ab->findByName( "addr1" ).first();
+ assert( !addr1.isEmpty() );
+ // Removing an entry with the wrong email passed, shouldn't do anything
+ dl.removeEntry( addr1, "foo@foobar.com" );
+ check( "entries count after removing entry with invalid email", TQString::number( dl.entries(ab).count() ), "3" );
+
+ // Now remove entry correctly
+ dl.removeEntry( addr1 );
+ check( "removeEntry(addr1) worked", TQString::number( dl.entries(ab).count() ), "2" );
+ TQStringList emails = dl.emails( ab );
+ assert( emails.count() == 2 );
+ check( "first email", emails[0], "addr2 <addr2-alternate@kde.org>" );
+
+ // Now move on to addr2. First remove with no or a wrong email (nothing should happen)
+ KABC::Addressee addr2 = ab->findByName( "addr2" ).first();
+ assert( !addr2.isEmpty() );
+ dl.removeEntry( addr2 );
+ check( "entries count after removing entry with no email", TQString::number( dl.entries(ab).count() ), "2" );
+
+ // Now remove addr2 correctly
+ dl.removeEntry( addr2, "addr2@kde.org" );
+ check( "entries count after removing addr2", TQString::number( dl.entries(ab).count() ), "1" );
+ dl.removeEntry( addr2, "addr2-alternate@kde.org" );
+ check( "entries count after removing alternate addr2", TQString::number( dl.entries(ab).count() ), "0" );
+ assert( dl.entries(ab).isEmpty() );
+ assert( dl.emails(ab).isEmpty() );
+ assert( DistributionList::isDistributionList( dl ) );
+
+ ab->insertAddressee( dl );
+}
+
+void TestDistrList::testDuplicate()
+{
+ kdDebug() << k_funcinfo << endl;
+ // This is a special test for the case where we have a contact and a distr list with the same name
+ KABC::AddressBook *ab = KABC::StdAddressBook::self();
+ KABC::Addressee addr;
+ addr.setName( "foo" );
+ addr.insertEmail( "foo@kde.org", true );
+ ab->insertAddressee( addr );
+
+#if 0 // we need a findByFormattedName
+ KABC::Addressee::List addrList = ab->findByName( "foo" );
+ assert( addrList.count() == 2 );
+
+ bool a = DistributionList::isDistributionList( addrList.first() );
+ bool b = DistributionList::isDistributionList( addrList.last() );
+ // one is a distr list, but not both
+ assert( a || b );
+ //
+ assert( ! ( a && b ) );
+#endif
+
+ DistributionList dl = DistributionList::findByName( ab, "foo" );
+ assert( !dl.isEmpty() );
+ assert( DistributionList::isDistributionList( dl ) );
+ assert( dl.formattedName() == "foo" );
+}
+
+void TestDistrList::testDeleteList()
+{
+ kdDebug() << k_funcinfo << endl;
+
+ KABC::AddressBook *ab = KABC::StdAddressBook::self();
+ DistributionList dl = DistributionList::findByName( ab, "foo" );
+ assert( !dl.isEmpty() );
+ ab->removeAddressee( dl );
+ dl = DistributionList::findByName( ab, "foo" );
+ assert( dl.isEmpty() );
+}
+
+#include "testdistrlist.moc"