mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-24 02:42:51 +00:00
685 lines
32 KiB
C++
685 lines
32 KiB
C++
/*
|
|
Copyright (c) 2013 Sérgio Martins <iamsergio@gmail.com>
|
|
|
|
This library is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU Library General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or (at your
|
|
option) any later version.
|
|
|
|
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 "itiphandlertest.h"
|
|
#include "helper.h"
|
|
#include "../mailclient_p.h"
|
|
#include "../fetchjobcalendar.h"
|
|
#include "../utils_p.h"
|
|
|
|
#include <kcalcore/icalformat.h>
|
|
#include <kcalcore/attendee.h>
|
|
#include <akonadi/itemdeletejob.h>
|
|
#include <akonadi/collectionfetchjob.h>
|
|
#include <akonadi/collectionfetchscope.h>
|
|
#include <akonadi/itemfetchscope.h>
|
|
#include <akonadi/qtest_akonadi.h>
|
|
|
|
#include <kcalcore/event.h>
|
|
|
|
#include <QString>
|
|
|
|
using namespace Akonadi;
|
|
using namespace KCalCore;
|
|
|
|
Q_DECLARE_METATYPE(Akonadi::IncidenceChanger::InvitationPolicy)
|
|
Q_DECLARE_METATYPE(QList<Akonadi::IncidenceChanger::ChangeType>)
|
|
Q_DECLARE_METATYPE(Akonadi::ITIPHandler::Result)
|
|
Q_DECLARE_METATYPE(KCalCore::Attendee::PartStat)
|
|
Q_DECLARE_METATYPE(QList<int>)
|
|
|
|
static const char *s_ourEmail = "unittests@dev.nul"; // change also in kdepimlibs/akonadi/calendar/tests/unittestenv/kdehome/share/config
|
|
static const char *s_outEmail2 = "identity2@kde.org";
|
|
|
|
void ITIPHandlerTest::initTestCase()
|
|
{
|
|
AkonadiTest::checkTestIsIsolated();
|
|
m_pendingItipMessageSignal = 0;
|
|
m_pendingIncidenceChangerSignal = 0;
|
|
MailClient::sRunningUnitTests = true;
|
|
m_itipHandler = 0;
|
|
m_cancelExpected = false;
|
|
m_changer = new IncidenceChanger(this);
|
|
m_changer->setHistoryEnabled(false);
|
|
m_changer->setGroupwareCommunication(true);
|
|
m_changer->setInvitationPolicy(IncidenceChanger::InvitationPolicySend); // don't show dialogs
|
|
|
|
connect(m_changer, SIGNAL(createFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
|
|
SLOT(onCreateFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)));
|
|
|
|
connect(m_changer, SIGNAL(deleteFinished(int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)),
|
|
SLOT(onDeleteFinished(int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)));
|
|
|
|
connect(m_changer,SIGNAL(modifyFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
|
|
SLOT(onModifyFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)));
|
|
}
|
|
|
|
void ITIPHandlerTest::testProcessITIPMessage_data()
|
|
{
|
|
QTest::addColumn<QString>("data_filename");
|
|
QTest::addColumn<QString>("action");
|
|
QTest::addColumn<QString>("receiver");
|
|
QTest::addColumn<QString>("incidenceUid"); // uid of incidence in invitation
|
|
QTest::addColumn<Akonadi::ITIPHandler::Result>("expectedResult");
|
|
QTest::addColumn<int>("expectedNumIncidences");
|
|
QTest::addColumn<KCalCore::Attendee::PartStat>("expectedPartStat");
|
|
|
|
QString data_filename;
|
|
QString action = QLatin1String("accepted");
|
|
QString incidenceUid = QString::fromLatin1("uosj936i6arrtl9c2i5r2mfuvg");
|
|
QString receiver = QLatin1String(s_ourEmail);
|
|
Akonadi::ITIPHandler::Result expectedResult;
|
|
int expectedNumIncidences = 0;
|
|
KCalCore::Attendee::PartStat expectedPartStat;
|
|
|
|
//----------------------------------------------------------------------------------------------
|
|
// Someone invited us to an event, and we accept
|
|
expectedResult = ITIPHandler::ResultSuccess;
|
|
data_filename = QLatin1String("invited_us");
|
|
expectedNumIncidences = 1;
|
|
expectedPartStat = KCalCore::Attendee::Accepted;
|
|
action = QLatin1String("accepted");
|
|
QTest::newRow("invited us1") << data_filename << action << receiver << incidenceUid
|
|
<< expectedResult
|
|
<< expectedNumIncidences
|
|
<< expectedPartStat;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Someone invited us to an event, and we accept conditionally
|
|
expectedResult = ITIPHandler::ResultSuccess;
|
|
data_filename = QLatin1String("invited_us");
|
|
expectedNumIncidences = 1;
|
|
expectedPartStat = KCalCore::Attendee::Tentative;
|
|
action = QLatin1String("tentative");
|
|
QTest::newRow("invited us2") << data_filename << action << receiver << incidenceUid
|
|
<< expectedResult
|
|
<< expectedNumIncidences
|
|
<< expectedPartStat;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Someone invited us to an event, we delegate it
|
|
expectedResult = ITIPHandler::ResultSuccess;
|
|
data_filename = QLatin1String("invited_us");
|
|
|
|
// The e-mail to the delegate is sent by kmail's text_calendar.cpp
|
|
expectedNumIncidences = 1;
|
|
expectedPartStat = KCalCore::Attendee::Delegated;
|
|
action = QLatin1String("delegated");
|
|
QTest::newRow("invited us3") << data_filename << action << receiver << incidenceUid
|
|
<< expectedResult
|
|
<< expectedNumIncidences
|
|
<< expectedPartStat;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Process a CANCEL without having the incidence in our calendar.
|
|
// itiphandler should return success and not error
|
|
expectedResult = ITIPHandler::ResultSuccess;
|
|
data_filename = QLatin1String("invited_us");
|
|
expectedNumIncidences = 0;
|
|
action = QLatin1String("cancel");
|
|
QTest::newRow("invited us4") << data_filename << action << receiver << incidenceUid
|
|
<< expectedResult
|
|
<< expectedNumIncidences
|
|
<< expectedPartStat;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Here we're testing an error case, where data is null.
|
|
expectedResult = ITIPHandler::ResultError;
|
|
expectedNumIncidences = 0;
|
|
action = QLatin1String("accepted");
|
|
QTest::newRow("invalid data") << QString() << action << receiver << incidenceUid
|
|
<< expectedResult
|
|
<< expectedNumIncidences
|
|
<< expectedPartStat;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Testing invalid action
|
|
expectedResult = ITIPHandler::ResultError;
|
|
data_filename = QLatin1String("invitation_us");
|
|
expectedNumIncidences = 0;
|
|
action = QLatin1String("accepted");
|
|
QTest::newRow("invalid action") << data_filename << QString() << receiver << incidenceUid
|
|
<< expectedResult
|
|
<< expectedNumIncidences
|
|
<< expectedPartStat;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Test bug 235749
|
|
expectedResult = ITIPHandler::ResultSuccess;
|
|
data_filename = QLatin1String("bug235749");
|
|
expectedNumIncidences = 1;
|
|
expectedPartStat = KCalCore::Attendee::Accepted;
|
|
action = QLatin1String("accepted");
|
|
incidenceUid = QLatin1String("b6f0466a-8877-49d0-a4fc-8ee18ffd8e07"); // Don't change, hardcoded in data file
|
|
QTest::newRow("bug 235749") << data_filename << action << receiver << incidenceUid
|
|
<< expectedResult
|
|
<< expectedNumIncidences
|
|
<< expectedPartStat;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Test counterproposal without a UI delegat set
|
|
expectedResult = ITIPHandler::ResultError;
|
|
data_filename = QLatin1String("invited_us");
|
|
expectedNumIncidences = 0;
|
|
expectedPartStat = KCalCore::Attendee::Accepted;
|
|
action = QLatin1String("counter");
|
|
incidenceUid = QLatin1String("b6f0466a-8877-49d0-a4fc-8ee18ffd8e07");
|
|
QTest::newRow("counter error") << data_filename << action << receiver << incidenceUid
|
|
<< expectedResult
|
|
<< expectedNumIncidences
|
|
<< expectedPartStat;
|
|
//----------------------------------------------------------------------------------------------
|
|
}
|
|
|
|
void ITIPHandlerTest::testProcessITIPMessage()
|
|
{
|
|
QFETCH(QString, data_filename);
|
|
QFETCH(QString, action);
|
|
QFETCH(QString, receiver);
|
|
QFETCH(QString, incidenceUid);
|
|
QFETCH(Akonadi::ITIPHandler::Result, expectedResult);
|
|
QFETCH(int, expectedNumIncidences);
|
|
QFETCH(KCalCore::Attendee::PartStat, expectedPartStat);
|
|
|
|
MailClient::sUnitTestResults.clear();
|
|
createITIPHandler();
|
|
|
|
m_expectedResult = expectedResult;
|
|
|
|
QString iCalData = icalData(data_filename);
|
|
Akonadi::Item::List items;
|
|
processItip(iCalData, receiver, action, expectedNumIncidences, items);
|
|
|
|
if (expectedNumIncidences == 1) {
|
|
KCalCore::Incidence::Ptr incidence = items.first().payload<KCalCore::Incidence::Ptr>();
|
|
QVERIFY(incidence);
|
|
QCOMPARE(incidence->schedulingID(), incidenceUid);
|
|
QVERIFY(incidence->schedulingID() != incidence->uid());
|
|
|
|
KCalCore::Attendee::Ptr me = ourAttendee(incidence);
|
|
QVERIFY(me);
|
|
QCOMPARE(me->status(), expectedPartStat);
|
|
}
|
|
|
|
cleanup();
|
|
}
|
|
|
|
void ITIPHandlerTest::testProcessITIPMessages_data()
|
|
{
|
|
QTest::addColumn<QStringList>("invitation_filenames"); // filename to create incidence (inputs)
|
|
QTest::addColumn<QString>("expected_filename"); // filename with expected data (reference)
|
|
QTest::addColumn<QStringList>("actions"); // we must specify the METHOD. This is an ITipHandler API workaround, not sure why we must pass it as argument since it's already inside the icaldata.
|
|
QStringList invitation_filenames;
|
|
QString expected_filename;
|
|
QStringList actions;
|
|
actions << QLatin1String("accepted") << QLatin1String("accepted");
|
|
|
|
//----------------------------------------------------------------------------------------------
|
|
// Someone invited us to an event, we accept, then organizer changes event, and we record update:
|
|
invitation_filenames.clear();
|
|
invitation_filenames << QLatin1String("invited_us") << QLatin1String("invited_us_update01");
|
|
expected_filename = QLatin1String("expected_data/update1");
|
|
QTest::newRow("accept update") << invitation_filenames << expected_filename << actions;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Someone invited us to an event, we accept, then organizer changes event, and we record update:
|
|
invitation_filenames.clear();
|
|
invitation_filenames << QLatin1String("invited_us") << QLatin1String("invited_us_daily_update01");
|
|
expected_filename = QLatin1String("expected_data/update2");
|
|
QTest::newRow("accept recurringupdate") << invitation_filenames << expected_filename << actions;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We accept a recurring event, then the organizer changes the summary to the second instance (RECID)
|
|
expected_filename = QLatin1String("expected_data/update3");
|
|
invitation_filenames.clear();
|
|
invitation_filenames << QLatin1String("invited_us_daily") << QLatin1String("invited_us_daily_update_recid01");
|
|
QTest::newRow("accept recid update") << invitation_filenames << expected_filename << actions;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We accept a recurring event, then we accept a CANCEL with recuring-id.
|
|
// The result is that a exception with status CANCELLED should be created, and our main incidence
|
|
// should not be touched
|
|
invitation_filenames.clear();
|
|
invitation_filenames << QLatin1String("invited_us_daily") << QLatin1String("invited_us_daily_cancel_recid01");
|
|
expected_filename = QLatin1String("expected_data/cancel1");
|
|
actions << QLatin1String("accepted") << QLatin1String("cancel");
|
|
QTest::newRow("accept recid cancel") << invitation_filenames << expected_filename << actions;
|
|
|
|
//----------------------------------------------------------------------------------------------
|
|
}
|
|
|
|
void ITIPHandlerTest::testProcessITIPMessages()
|
|
{
|
|
QFETCH(QStringList, invitation_filenames);
|
|
QFETCH(QString, expected_filename);
|
|
QFETCH(QStringList, actions);
|
|
|
|
const QString receiver = QLatin1String(s_ourEmail);
|
|
|
|
MailClient::sUnitTestResults.clear();
|
|
createITIPHandler();
|
|
|
|
m_expectedResult = Akonadi::ITIPHandler::ResultSuccess;
|
|
|
|
for (int i=0; i<invitation_filenames.count(); i++) {
|
|
// First accept the invitation that creates the incidence:
|
|
QString iCalData = icalData(invitation_filenames.at(i));
|
|
Item::List items;
|
|
qDebug() << "Processing " << invitation_filenames.at(i);
|
|
processItip(iCalData, receiver, actions.at(i), -1, items);
|
|
}
|
|
|
|
|
|
QString expectedICalData = icalData(expected_filename);
|
|
KCalCore::MemoryCalendar::Ptr expectedCalendar = KCalCore::MemoryCalendar::Ptr(new KCalCore::MemoryCalendar(KDateTime::UTC));
|
|
KCalCore::ICalFormat format;
|
|
format.fromString(expectedCalendar, expectedICalData);
|
|
compareCalendars(expectedCalendar); // Here's where the cool and complex comparations are done
|
|
|
|
cleanup();
|
|
}
|
|
|
|
void ITIPHandlerTest::testProcessITIPMessageCancel_data()
|
|
{
|
|
QTest::addColumn<QString>("creation_data_filename"); // filename to create incidence
|
|
QTest::addColumn<QString>("cancel_data_filename"); // filename with incidence cancelation
|
|
QTest::addColumn<QString>("incidenceUid"); // uid of incidence in invitation
|
|
|
|
|
|
QString creation_data_filename;
|
|
QString cancel_data_filename;
|
|
QString incidenceUid = QString::fromLatin1("uosj936i6arrtl9c2i5r2mfuvg");
|
|
//----------------------------------------------------------------------------------------------
|
|
// Someone invited us to an event, we accept, then organizer cancels event
|
|
creation_data_filename = QLatin1String("invited_us");
|
|
cancel_data_filename = QLatin1String("invited_us_cancel01");
|
|
|
|
QTest::newRow("cancel1") << creation_data_filename << cancel_data_filename
|
|
<< incidenceUid;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Someone invited us to daily event, we accept, then organizer cancels the whole recurrence series
|
|
creation_data_filename = QLatin1String("invited_us_daily");
|
|
cancel_data_filename = QLatin1String("invited_us_daily_cancel01");
|
|
|
|
QTest::newRow("cancel_daily") << creation_data_filename << cancel_data_filename
|
|
<< incidenceUid;
|
|
//----------------------------------------------------------------------------------------------
|
|
}
|
|
|
|
void ITIPHandlerTest::testProcessITIPMessageCancel()
|
|
{
|
|
QFETCH(QString, creation_data_filename);
|
|
QFETCH(QString, cancel_data_filename);
|
|
QFETCH(QString, incidenceUid);
|
|
|
|
const QString receiver = QLatin1String(s_ourEmail);
|
|
MailClient::sUnitTestResults.clear();
|
|
createITIPHandler();
|
|
|
|
m_expectedResult = Akonadi::ITIPHandler::ResultSuccess;
|
|
|
|
// First accept the invitation that creates the incidence:
|
|
QString iCalData = icalData(creation_data_filename);
|
|
Item::List items;
|
|
processItip(iCalData, receiver, QLatin1String("accepted"), 1, items);
|
|
|
|
KCalCore::Incidence::Ptr incidence = items.first().payload<KCalCore::Incidence::Ptr>();
|
|
QVERIFY(incidence);
|
|
|
|
// good, now accept the invitation that has the CANCEL
|
|
iCalData = icalData(cancel_data_filename);
|
|
processItip(iCalData, receiver, QLatin1String("accepted"), 0, items);
|
|
}
|
|
|
|
void ITIPHandlerTest::testOutgoingInvitations_data()
|
|
{
|
|
QTest::addColumn<Akonadi::Item>("item"); // existing incidence that will be target of creation, deletion or modification
|
|
QTest::addColumn<Akonadi::IncidenceChanger::ChangeType>("changeType"); // creation, deletion, modification
|
|
QTest::addColumn<int>("expectedEmailCount");
|
|
QTest::addColumn<IncidenceChanger::InvitationPolicy>("invitationPolicy");
|
|
QTest::addColumn<bool>("userCancels");
|
|
|
|
const bool userDoesntCancel = false;
|
|
const bool userCancels = true;
|
|
|
|
Akonadi::Item item;
|
|
KCalCore::Incidence::Ptr incidence;
|
|
IncidenceChanger::ChangeType changeType;
|
|
const IncidenceChanger::InvitationPolicy invitationPolicyAsk = IncidenceChanger::InvitationPolicyAsk;
|
|
const IncidenceChanger::InvitationPolicy invitationPolicySend = IncidenceChanger::InvitationPolicySend;
|
|
const IncidenceChanger::InvitationPolicy invitationPolicyDontSend = IncidenceChanger::InvitationPolicyDontSend;
|
|
int expectedEmailCount = 0;
|
|
Q_UNUSED(invitationPolicyAsk);
|
|
|
|
const QString ourEmail = QLatin1String(s_ourEmail);
|
|
const Attendee::Ptr us = Attendee::Ptr(new Attendee(QString(), ourEmail));
|
|
const Attendee::Ptr mia = Attendee::Ptr(new Attendee(QLatin1String("Mia Wallace"), QLatin1String("mia@dev.nul")));
|
|
const Attendee::Ptr vincent = Attendee::Ptr(new Attendee(QLatin1String("Vincent"), QLatin1String("vincent@dev.nul")));
|
|
const Attendee::Ptr jules = Attendee::Ptr(new Attendee(QLatin1String("Jules"), QLatin1String("jules@dev.nul")));
|
|
const QString uid = QLatin1String("random-uid-123");
|
|
|
|
//----------------------------------------------------------------------------------------------
|
|
// Creation. We are organizer. We invite another person.
|
|
changeType = IncidenceChanger::ChangeTypeCreate;
|
|
item = generateIncidence(uid, /**organizer=*/ourEmail);
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules);
|
|
expectedEmailCount = 1;
|
|
QTest::newRow("Creation. We organize.") << item << changeType << expectedEmailCount
|
|
<< invitationPolicySend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// Creation. We are organizer. We invite another person. But we choose not to send invitation e-mail.
|
|
changeType = IncidenceChanger::ChangeTypeCreate;
|
|
item = generateIncidence(uid, /**organizer=*/ourEmail);
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules);
|
|
expectedEmailCount = 0;
|
|
QTest::newRow("Creation. We organize.2") << item << changeType << expectedEmailCount << invitationPolicyDontSend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We delete an event that we organized, and has attendees, that will be notified.
|
|
changeType = IncidenceChanger::ChangeTypeDelete;
|
|
item = generateIncidence(uid, /**organizer=*/ourEmail);
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules);
|
|
expectedEmailCount = 1;
|
|
QTest::newRow("Deletion. We organized.") << item << changeType << expectedEmailCount << invitationPolicySend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We delete an event that we organized, and has attendees. We won't send e-mail notifications.
|
|
changeType = IncidenceChanger::ChangeTypeDelete;
|
|
item = generateIncidence(uid, /**organizer=*/ourEmail);
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules);
|
|
expectedEmailCount = 0;
|
|
QTest::newRow("Deletion. We organized.2") << item << changeType << expectedEmailCount << invitationPolicyDontSend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We delete an event that we organized, and has attendees, who will be notified.
|
|
changeType = IncidenceChanger::ChangeTypeModify;
|
|
item = generateIncidence(uid, /**organizer=*/ourEmail);
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules);
|
|
expectedEmailCount = 1;
|
|
QTest::newRow("Modification. We organizd.") << item << changeType << expectedEmailCount << invitationPolicySend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We delete an event that we organized, and has attendees, who wont be notified.
|
|
changeType = IncidenceChanger::ChangeTypeModify;
|
|
item = generateIncidence(uid, /**organizer=*/ourEmail);
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent); // TODO: test that all attendees got the e-mail
|
|
incidence->addAttendee(jules);
|
|
expectedEmailCount = 0;
|
|
QTest::newRow("Modification. We organizd.2") << item << changeType << expectedEmailCount << invitationPolicyDontSend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We delete an event which we're not the organizer of. Organizer gets REPLY with PartState=Declined
|
|
changeType = IncidenceChanger::ChangeTypeDelete;
|
|
item = generateIncidence(uid, /**organizer=*/mia->email());
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules);
|
|
us->setStatus(Attendee::Accepted); // TODO: Test without accepted status
|
|
incidence->addAttendee(us); // TODO: test that attendees didn't receive the REPLY
|
|
expectedEmailCount = 1; // REPLY is always sent, there are no dialogs to control this. Dialogs only control REQUEST and CANCEL. Bug or feature ?
|
|
QTest::newRow("Deletion. We didnt organize.") << item << changeType << expectedEmailCount << invitationPolicyDontSend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We delete an event which we're not the organizer of. Organizer gets REPLY with PartState=Declined
|
|
changeType = IncidenceChanger::ChangeTypeDelete;
|
|
item = generateIncidence(uid, /**organizer=*/mia->email());
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules); // TODO: test that attendees didn't receive the REPLY
|
|
us->setStatus(Attendee::Accepted); // TODO: Test without accepted status
|
|
incidence->addAttendee(us);
|
|
expectedEmailCount = 1;
|
|
QTest::newRow("Deletion. We didnt organize.2") << item << changeType << expectedEmailCount << invitationPolicySend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We modified an event which we're not the organizer of. And, when the "do you really want to modify", we choose "yes".
|
|
changeType = IncidenceChanger::ChangeTypeModify;
|
|
item = generateIncidence(uid, /**organizer=*/mia->email());
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules);
|
|
us->setStatus(Attendee::Accepted);
|
|
incidence->addAttendee(us);
|
|
expectedEmailCount = 0;
|
|
QTest::newRow("Modification. We didnt organize") << item << changeType << expectedEmailCount << invitationPolicySend << userDoesntCancel;
|
|
//----------------------------------------------------------------------------------------------
|
|
// We modified an event which we're not the organizer of. And, when the "do you really want to modify", we choose "no".
|
|
changeType = IncidenceChanger::ChangeTypeModify;
|
|
item = generateIncidence(uid, /**organizer=*/mia->email());
|
|
incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
incidence->addAttendee(vincent);
|
|
incidence->addAttendee(jules);
|
|
us->setStatus(Attendee::Accepted);
|
|
incidence->addAttendee(us);
|
|
expectedEmailCount = 0;
|
|
QTest::newRow("Modification. We didnt organize.2") << item << changeType << expectedEmailCount << invitationPolicyDontSend << userCancels;
|
|
//----------------------------------------------------------------------------------------------
|
|
}
|
|
|
|
void ITIPHandlerTest::testOutgoingInvitations()
|
|
{
|
|
QFETCH(Akonadi::Item, item);
|
|
QFETCH(IncidenceChanger::ChangeType, changeType);
|
|
QFETCH(int, expectedEmailCount);
|
|
QFETCH(IncidenceChanger::InvitationPolicy, invitationPolicy);
|
|
QFETCH(bool, userCancels);
|
|
KCalCore::Incidence::Ptr incidence = item.payload<KCalCore::Incidence::Ptr>();
|
|
|
|
m_pendingIncidenceChangerSignal = 1;
|
|
MailClient::sUnitTestResults.clear();
|
|
m_changer->setInvitationPolicy(invitationPolicy);
|
|
|
|
m_cancelExpected = userCancels;
|
|
|
|
switch (changeType) {
|
|
case IncidenceChanger::ChangeTypeCreate:
|
|
m_changer->createIncidence(incidence, mCollection);
|
|
waitForIt();
|
|
QCOMPARE(MailClient::sUnitTestResults.count(), expectedEmailCount);
|
|
break;
|
|
case IncidenceChanger::ChangeTypeModify: {
|
|
// Create if first, so we have something to modify
|
|
m_changer->setGroupwareCommunication(false); // we disable groupware because creating an incidence which we're not the organizer of is not permitted.
|
|
m_changer->createIncidence(incidence, mCollection);
|
|
waitForIt();
|
|
m_changer->setGroupwareCommunication(true);
|
|
QCOMPARE(MailClient::sUnitTestResults.count(), 0);
|
|
QVERIFY(mLastInsertedItem.isValid());
|
|
|
|
m_pendingIncidenceChangerSignal = 1;
|
|
Incidence::Ptr oldIncidence = Incidence::Ptr(incidence->clone());
|
|
incidence->setSummary(QLatin1String("the-new-summary"));
|
|
int changeId = m_changer->modifyIncidence(mLastInsertedItem, oldIncidence);
|
|
QVERIFY(changeId != 1);
|
|
waitForIt();
|
|
QCOMPARE(MailClient::sUnitTestResults.count(), expectedEmailCount);
|
|
}
|
|
break;
|
|
case IncidenceChanger::ChangeTypeDelete:
|
|
// Create if first, so we have something to delete
|
|
m_changer->setGroupwareCommunication(false);
|
|
m_changer->createIncidence(incidence, mCollection);
|
|
waitForIt();
|
|
m_changer->setGroupwareCommunication(true);
|
|
QCOMPARE(MailClient::sUnitTestResults.count(), 0);
|
|
|
|
QVERIFY(mLastInsertedItem.isValid());
|
|
m_pendingIncidenceChangerSignal = 1;
|
|
m_changer->deleteIncidence(mLastInsertedItem);
|
|
waitForIt();
|
|
QCOMPARE(MailClient::sUnitTestResults.count(), expectedEmailCount);
|
|
break;
|
|
default:
|
|
Q_ASSERT(false);
|
|
}
|
|
|
|
}
|
|
|
|
void ITIPHandlerTest::testIdentity_data()
|
|
{
|
|
QTest::addColumn<QString>("email");
|
|
QTest::addColumn<bool>("expectedResult");
|
|
|
|
const QString myEmail = QLatin1String(s_ourEmail);
|
|
QString myEmail2 = QString::fromLatin1("Some name <%1>").arg(myEmail);
|
|
|
|
const QString myAlias1 = QLatin1String("alias1@kde.org"); // hardcoded in emailidentities, do not change
|
|
const QString myIdentity2 = QLatin1String(s_outEmail2);
|
|
|
|
|
|
QTest::newRow("Me") << myEmail << true;
|
|
QTest::newRow("Also me") << myEmail2 << true;
|
|
QTest::newRow("My identity2") << myIdentity2 << true;
|
|
QTest::newRow("Not me") << QString::fromLatin1("laura.palmer@twinpeaks.com") << false;
|
|
|
|
QTest::newRow("My alias") << myAlias1 << true;
|
|
|
|
}
|
|
|
|
void ITIPHandlerTest::testIdentity()
|
|
{
|
|
QFETCH(QString, email);
|
|
QFETCH(bool, expectedResult);
|
|
|
|
if (CalendarUtils::thatIsMe(email) != expectedResult) {
|
|
qDebug() << email;
|
|
QVERIFY(false);
|
|
}
|
|
}
|
|
|
|
void ITIPHandlerTest::cleanup()
|
|
{
|
|
Akonadi::Item::List items = calendarItems();
|
|
foreach(const Akonadi::Item &item, items) {
|
|
ItemDeleteJob *job = new ItemDeleteJob(item);
|
|
AKVERIFYEXEC(job);
|
|
}
|
|
|
|
delete m_itipHandler;
|
|
m_itipHandler = 0;
|
|
}
|
|
|
|
void ITIPHandlerTest::createITIPHandler()
|
|
{
|
|
m_itipHandler = new Akonadi::ITIPHandler();
|
|
m_itipHandler->setShowDialogsOnError(false);
|
|
connect(m_itipHandler, SIGNAL(iTipMessageProcessed(Akonadi::ITIPHandler::Result,QString)),
|
|
SLOT(oniTipMessageProcessed(Akonadi::ITIPHandler::Result,QString)));
|
|
}
|
|
|
|
QString ITIPHandlerTest::icalData(const QString &data_filename)
|
|
{
|
|
QString absolutePath = QLatin1String(ITIP_DATA_DIR) + QLatin1Char('/') + data_filename;
|
|
return QString::fromLatin1(readFile(absolutePath));
|
|
}
|
|
|
|
void ITIPHandlerTest::processItip(const QString &icaldata, const QString &receiver,
|
|
const QString &action, int expectedNumIncidences,
|
|
Akonadi::Item::List &items)
|
|
{
|
|
items.clear();
|
|
m_pendingItipMessageSignal = 1;
|
|
m_itipHandler->processiTIPMessage(receiver, icaldata, action);
|
|
waitForIt();
|
|
|
|
// 0 e-mails are sent because the status update e-mail is sent by
|
|
// kmail's text_calendar.cpp.
|
|
QCOMPARE(MailClient::sUnitTestResults.count(), 0);
|
|
|
|
items = calendarItems();
|
|
|
|
if (expectedNumIncidences != -1) {
|
|
QCOMPARE(items.count(), expectedNumIncidences);
|
|
}
|
|
}
|
|
|
|
Attendee::Ptr ITIPHandlerTest::ourAttendee(const KCalCore::Incidence::Ptr &incidence) const
|
|
{
|
|
KCalCore::Attendee::List attendees = incidence->attendees();
|
|
KCalCore::Attendee::Ptr me;
|
|
foreach(const KCalCore::Attendee::Ptr &attendee, attendees) {
|
|
if (attendee->email() == QLatin1String(s_ourEmail)) {
|
|
me = attendee;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return me;
|
|
}
|
|
|
|
void ITIPHandlerTest::oniTipMessageProcessed(ITIPHandler::Result result, const QString &errorMessage)
|
|
{
|
|
if (result != ITIPHandler::ResultSuccess && result != m_expectedResult) {
|
|
qDebug() << "ITIPHandlerTest::oniTipMessageProcessed() error = " << errorMessage;
|
|
}
|
|
|
|
m_pendingItipMessageSignal--;
|
|
QVERIFY(m_pendingItipMessageSignal >= 0);
|
|
if (m_pendingItipMessageSignal == 0) {
|
|
stopWaiting();
|
|
}
|
|
|
|
QCOMPARE(m_expectedResult, result);
|
|
}
|
|
|
|
void ITIPHandlerTest::onCreateFinished(int changeId, const Item &item,
|
|
IncidenceChanger::ResultCode resultCode,
|
|
const QString &errorString)
|
|
{
|
|
Q_UNUSED(changeId);
|
|
Q_UNUSED(errorString);
|
|
mLastInsertedItem = item;
|
|
m_pendingIncidenceChangerSignal--;
|
|
QVERIFY(m_pendingIncidenceChangerSignal >= 0);
|
|
if (m_pendingIncidenceChangerSignal == 0) {
|
|
stopWaiting();
|
|
}
|
|
QCOMPARE(resultCode, IncidenceChanger::ResultCodeSuccess);
|
|
}
|
|
|
|
void ITIPHandlerTest::onDeleteFinished(int changeId, const QVector<Entity::Id> &deletedIds,
|
|
IncidenceChanger::ResultCode resultCode,
|
|
const QString &errorString)
|
|
{
|
|
Q_UNUSED(changeId);
|
|
Q_UNUSED(errorString);
|
|
Q_UNUSED(deletedIds);
|
|
|
|
m_pendingIncidenceChangerSignal--;
|
|
QVERIFY(m_pendingIncidenceChangerSignal >= 0);
|
|
if (m_pendingIncidenceChangerSignal == 0) {
|
|
stopWaiting();
|
|
}
|
|
QCOMPARE(resultCode, IncidenceChanger::ResultCodeSuccess);
|
|
}
|
|
|
|
void ITIPHandlerTest::onModifyFinished(int changeId, const Item &item,
|
|
IncidenceChanger::ResultCode resultCode,
|
|
const QString &errorString)
|
|
{
|
|
Q_UNUSED(changeId);
|
|
Q_UNUSED(errorString);
|
|
Q_UNUSED(item);
|
|
|
|
m_pendingIncidenceChangerSignal--;
|
|
QVERIFY(m_pendingIncidenceChangerSignal >= 0);
|
|
if (m_pendingIncidenceChangerSignal == 0) {
|
|
stopWaiting();
|
|
}
|
|
kDebug() << "Got result " << resultCode << m_cancelExpected;
|
|
QCOMPARE(resultCode, m_cancelExpected ? IncidenceChanger::ResultCodeUserCanceled
|
|
: IncidenceChanger::ResultCodeSuccess);
|
|
}
|
|
|
|
|
|
QTEST_AKONADIMAIN(ITIPHandlerTest, GUI)
|