[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdepimlibs/KDE/4.11] akonadi/calendar: Don't modify the event after the user canceling the modifica
From:       Sergio Martins <iamsergio () gmail ! com>
Date:       2013-10-31 23:15:00
Message-ID: E1Vc1S8-0000iB-83 () scm ! kde ! org
[Download RAW message or body]

Git commit 3d610eca1ef7ff88068c0d321197c3ad18228688 by Sergio Martins.
Committed on 31/10/2013 at 23:13.
Pushed by smartins into branch 'KDE/4.11'.

Don't modify the event after the user canceling the modification.

When the user gets asked "You're not the organizer, do you really
want to edit?" we were ignoring the return value and modifying it
anyway.

M  +7    -1    akonadi/calendar/incidencechanger.cpp
M  +36   -13   akonadi/calendar/tests/itiphandlertest.cpp
M  +1    -0    akonadi/calendar/tests/itiphandlertest.h

http://commits.kde.org/kdepimlibs/3d610eca1ef7ff88068c0d321197c3ad18228688

diff --git a/akonadi/calendar/incidencechanger.cpp \
b/akonadi/calendar/incidencechanger.cpp index 47d1f05..d65a60a 100644
--- a/akonadi/calendar/incidencechanger.cpp
+++ b/akonadi/calendar/incidencechanger.cpp
@@ -959,7 +959,13 @@ void IncidenceChanger::Private::performModification( Change::Ptr \
change )  return;
   }
 
-  handleInvitationsBeforeChange( change );
+  const bool userCancelled = !handleInvitationsBeforeChange( change );
+  if ( userCancelled ) {
+    // User got a "You're not the organizer, do you really want to send" dialog, and \
said "no" +    kDebug() << "User cancelled, giving up";
+    emitModifyFinished( q, changeId, newItem, ResultCodeUserCanceled, QString() );
+    return;
+  }
 
   QHash<Akonadi::Item::Id, int> &latestRevisionByItemId =
                                                  \
                ConflictPreventer::self()->mLatestRevisionByItemId;
diff --git a/akonadi/calendar/tests/itiphandlertest.cpp \
b/akonadi/calendar/tests/itiphandlertest.cpp index 4f0cb43..30a6e71 100644
--- a/akonadi/calendar/tests/itiphandlertest.cpp
+++ b/akonadi/calendar/tests/itiphandlertest.cpp
@@ -53,6 +53,7 @@ void ITIPHandlerTest::initTestCase()
     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);
@@ -341,6 +342,10 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     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;
@@ -366,7 +371,8 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     incidence->addAttendee(vincent);
     incidence->addAttendee(jules);
     expectedEmailCount = 1;
-    QTest::newRow("Creation. We organize.") << item << changeType << \
expectedEmailCount << invitationPolicySend; +    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;
@@ -375,7 +381,7 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     incidence->addAttendee(vincent);
     incidence->addAttendee(jules);
     expectedEmailCount = 0;
-    QTest::newRow("Creation. We organize.2") << item << changeType << \
expectedEmailCount << invitationPolicyDontSend; +    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;
@@ -384,7 +390,7 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     incidence->addAttendee(vincent);
     incidence->addAttendee(jules);
     expectedEmailCount = 1;
-    QTest::newRow("Deletion. We organized.") << item << changeType << \
expectedEmailCount << invitationPolicySend; +    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;
@@ -393,7 +399,7 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     incidence->addAttendee(vincent);
     incidence->addAttendee(jules);
     expectedEmailCount = 0;
-    QTest::newRow("Deletion. We organized.2") << item << changeType << \
expectedEmailCount << invitationPolicyDontSend; +    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;
@@ -402,7 +408,7 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     incidence->addAttendee(vincent);
     incidence->addAttendee(jules);
     expectedEmailCount = 1;
-    QTest::newRow("Modification. We organizd.") << item << changeType << \
expectedEmailCount << invitationPolicySend; +    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;
@@ -411,7 +417,7 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     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; +    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;
@@ -422,7 +428,7 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     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; +    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;
@@ -433,9 +439,20 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     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; +    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.
+    // 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>();
@@ -444,7 +461,7 @@ void ITIPHandlerTest::testOutgoingInvitations_data()
     us->setStatus(Attendee::Accepted);
     incidence->addAttendee(us);
     expectedEmailCount = 0;
-    QTest::newRow("Modification. We didnt organize") << item << changeType << \
expectedEmailCount << invitationPolicyAsk; +    QTest::newRow("Modification. We didnt \
organize.2") << item << changeType << expectedEmailCount << invitationPolicyAsk << \
                userCancels;
     //----------------------------------------------------------------------------------------------
  }
 
@@ -454,12 +471,15 @@ void ITIPHandlerTest::testOutgoingInvitations()
     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);
@@ -474,6 +494,7 @@ void ITIPHandlerTest::testOutgoingInvitations()
         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"));
@@ -585,12 +606,12 @@ void ITIPHandlerTest::onCreateFinished(int changeId, const Item \
&item,  Q_UNUSED(changeId);
     Q_UNUSED(errorString);
     mLastInsertedItem = item;
-    QCOMPARE(resultCode, IncidenceChanger::ResultCodeSuccess);
     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, @@ -600,12 +621,13 @@ void ITIPHandlerTest::onDeleteFinished(int \
changeId, const QVector<Entity::Id> &  Q_UNUSED(changeId);
     Q_UNUSED(errorString);
     Q_UNUSED(deletedIds);
-    QCOMPARE(resultCode, IncidenceChanger::ResultCodeSuccess);
+
     m_pendingIncidenceChangerSignal--;
     QVERIFY(m_pendingIncidenceChangerSignal >= 0);
     if (m_pendingIncidenceChangerSignal == 0) {
         stopWaiting();
     }
+    QCOMPARE(resultCode, IncidenceChanger::ResultCodeSuccess);
 }
 
 void ITIPHandlerTest::onModifyFinished(int changeId, const Item &item,
@@ -616,12 +638,13 @@ void ITIPHandlerTest::onModifyFinished(int changeId, const Item \
&item,  Q_UNUSED(errorString);
     Q_UNUSED(item);
 
-    QCOMPARE(resultCode, IncidenceChanger::ResultCodeSuccess);
     m_pendingIncidenceChangerSignal--;
     QVERIFY(m_pendingIncidenceChangerSignal >= 0);
     if (m_pendingIncidenceChangerSignal == 0) {
         stopWaiting();
     }
+    QCOMPARE(resultCode, m_cancelExpected ? IncidenceChanger::ResultCodeUserCanceled
+                                          : IncidenceChanger::ResultCodeSuccess);
 }
 
 QTEST_AKONADIMAIN(ITIPHandlerTest, GUI)
diff --git a/akonadi/calendar/tests/itiphandlertest.h \
b/akonadi/calendar/tests/itiphandlertest.h index df3844c..a9657e1 100644
--- a/akonadi/calendar/tests/itiphandlertest.h
+++ b/akonadi/calendar/tests/itiphandlertest.h
@@ -87,6 +87,7 @@ private:
     Akonadi::ITIPHandler::Result m_expectedResult;
     Akonadi::ITIPHandler *m_itipHandler;
     Akonadi::IncidenceChanger *m_changer;
+    bool m_cancelExpected;
 };
 
 #endif


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic