phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntlistmodel.cpp
changeset 46 efe85016a067
child 61 d30183af6ca6
equal deleted inserted replaced
40:b46a585f6909 46:efe85016a067
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:
       
    15 *
       
    16 */
       
    17 
       
    18 #include "ut_cntlistmodel.h"
       
    19 #include "cntlistmodel.h"
       
    20 #include "cntlistmodel_p.h"
       
    21 
       
    22 #include <hbnamespace.h>
       
    23 #include <qtcontacts.h>
       
    24 #include <QUrl>
       
    25 
       
    26 void TestCntListModel::initTestCase()
       
    27 {
       
    28     //let's have clean database before running tests 
       
    29     mManager = new QContactManager("symbian");
       
    30     QList<QContactLocalId> ids = mManager->contactIds();
       
    31     QMap<int, QContactManager::Error> errorMapInit;
       
    32     mManager->removeContacts(ids, &errorMapInit);
       
    33     mManager->removeContact(mManager->selfContactId());
       
    34 }
       
    35 
       
    36 void TestCntListModel::contactReady(int startRow, int endRow)
       
    37 {
       
    38     QVERIFY(startRow == endRow);
       
    39     mDataReady = true;
       
    40 }
       
    41 
       
    42 void TestCntListModel::create()
       
    43 {
       
    44     mCntModel = new CntListModel();
       
    45     QVERIFY(mCntModel != NULL);
       
    46     QVERIFY(mCntModel->rowCount() == 1);
       
    47     QVERIFY(mCntModel->d->m_cache);
       
    48     QVERIFY(mCntModel->d->m_ownedContactManager);
       
    49     QVERIFY(mCntModel->d->m_contactManager != NULL);
       
    50     
       
    51     delete mCntModel;
       
    52     mCntModel = NULL;
       
    53     
       
    54     mCntModel = new CntListModel(mManager);
       
    55     QVERIFY(mCntModel != NULL);
       
    56     QCOMPARE(mCntModel->rowCount(), 1);
       
    57     QVERIFY(mCntModel->rowCount() == 1);
       
    58     QVERIFY(mCntModel->d->m_cache);
       
    59     QVERIFY(!mCntModel->d->m_ownedContactManager);
       
    60     QVERIFY(mCntModel->d->m_contactManager != NULL);
       
    61 }
       
    62 
       
    63 void TestCntListModel::data()
       
    64 {
       
    65     mModelListener = new ModelListener(this);
       
    66     mDataReady = false;
       
    67 
       
    68     //create and save contact
       
    69     QContact c;
       
    70     QContactName name;
       
    71     name.setFirstName("firstname");
       
    72     name.setLastName("lastname");
       
    73     c.saveDetail(&name);
       
    74     QContactPhoneNumber number;
       
    75     number.setNumber("1234567");
       
    76     number.setContexts(QContactDetail::ContextHome);
       
    77     number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
       
    78     c.saveDetail(&number);
       
    79     QContactEmailAddress email;
       
    80     email.setEmailAddress("dummyemail");
       
    81     c.saveDetail(&email);
       
    82     QVERIFY(mManager->saveContact(&c));
       
    83     QTest::qWait(1000);
       
    84     
       
    85     //check invalid row and column
       
    86     QVariant ret;
       
    87     ret = mCntModel->data(QModelIndex(), Qt::UserRole);
       
    88     QVERIFY(ret.isNull());
       
    89     
       
    90     //check the saved contact's info
       
    91     QModelIndex modelIndex = mCntModel->indexOfContact(c);
       
    92     int row = modelIndex.row();
       
    93     QContact contactFromModel = mCntModel->contact(modelIndex);
       
    94     QVERIFY(c == contactFromModel);
       
    95     
       
    96     ret = mCntModel->data(modelIndex, Qt::UserRole); 
       
    97     QVERIFY(ret.isNull());
       
    98     
       
    99     ret = mCntModel->data(modelIndex, Qt::DisplayRole); 
       
   100     QVERIFY(ret.type() == QVariant::StringList);
       
   101     QStringList displayContent;
       
   102     displayContent = ret.toStringList();
       
   103     QVERIFY(displayContent.count() == 2);
       
   104     QVERIFY(displayContent.at(0) == "firstname lastname");
       
   105     // second string is only an empty placeholder, e.g. " ", until cache has fetched the value
       
   106 
       
   107     // wait for cache to signal that all contact info is ready
       
   108     while (!mDataReady) { QTest::qWait(200); QApplication::processEvents(); }
       
   109     mDataReady = false;
       
   110     ret = mCntModel->data(modelIndex, Qt::DisplayRole); 
       
   111 
       
   112     QVERIFY(ret.type() == QVariant::StringList);
       
   113     displayContent = ret.toStringList();
       
   114     QVERIFY(displayContent.count() == 2);
       
   115     QVERIFY(displayContent.at(0) == "firstname lastname");
       
   116     QVERIFY(displayContent.at(1) == "1234567");
       
   117    
       
   118     // check backgroundrole
       
   119     ret = mCntModel->data(modelIndex, Qt::BackgroundRole); 
       
   120     QVERIFY(ret.isNull());
       
   121     
       
   122     //check decoration role
       
   123     ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
       
   124     QVERIFY(ret.type() == QVariant::List);
       
   125     
       
   126     ret = mCntModel->data(modelIndex, Hb::IndexFeedbackRole); 
       
   127     QVERIFY(ret.type() == QVariant::String);
       
   128 
       
   129     // add empty avatar and check decoration
       
   130     QContactAvatar avatar;
       
   131     c.saveDetail(&avatar);
       
   132     QVERIFY(mManager->saveContact(&c));
       
   133     QTest::qWait(1000);
       
   134     ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
       
   135     QVERIFY(ret.type() == QVariant::List);
       
   136     
       
   137     // add data to the avatar and check decoration
       
   138     avatar.setImageUrl(QUrl("dummyimagepath"));
       
   139     c.saveDetail(&avatar);
       
   140     QVERIFY(mManager->saveContact(&c));
       
   141     QTest::qWait(1000);
       
   142     modelIndex = mCntModel->indexOfContact(c);
       
   143     ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
       
   144 
       
   145     // wait for cache to signal that all contact info is ready
       
   146     while (!mDataReady) { QTest::qWait(200); QApplication::processEvents(); }
       
   147     mDataReady = false;
       
   148     ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
       
   149     QVERIFY(ret.type() == QVariant::List);
       
   150     
       
   151     // check MyCard info from the model
       
   152     modelIndex = mCntModel->index(0, 0);
       
   153     ret = mCntModel->data(modelIndex, Qt::BackgroundRole);
       
   154     QVERIFY(!ret.isNull());
       
   155     
       
   156     // create and assign empty MyCard
       
   157     QContact myCard;
       
   158     QVERIFY(mManager->saveContact(&myCard));
       
   159     QTest::qWait(1000);
       
   160     mManager->setSelfContactId(myCard.localId());
       
   161     QTest::qWait(1000);
       
   162     
       
   163     // check that MyCard was really saved
       
   164     QCOMPARE(mCntModel->myCardId(), myCard.localId());
       
   165     
       
   166     // check MyCard info from the model
       
   167     myCard = mManager->contact(mManager->selfContactId());
       
   168     modelIndex = mCntModel->indexOfContact(myCard);
       
   169     ret = mCntModel->data(modelIndex, Qt::BackgroundRole);
       
   170     QVERIFY(!ret.isNull());
       
   171     
       
   172     ret = mCntModel->data(modelIndex, Qt::DisplayRole);
       
   173     QVERIFY(ret.type() == QVariant::StringList);
       
   174     displayContent = ret.toStringList();
       
   175     QVERIFY(displayContent.count() == 1); // "Unnamed"
       
   176     
       
   177     // add some content to MyCard
       
   178     myCard.saveDetail(&number);
       
   179     QVERIFY(mManager->saveContact(&myCard));
       
   180     QTest::qWait(1000);
       
   181     ret = mCntModel->data(modelIndex, Qt::DisplayRole);
       
   182     // wait for cache
       
   183     QTest::qWait(1000);
       
   184     ret = mCntModel->data(modelIndex, Qt::DisplayRole);
       
   185     QVERIFY(ret.type() == QVariant::StringList);
       
   186     displayContent = ret.toStringList();
       
   187     QVERIFY(displayContent.contains(hbTrId("txt_phob_list_unnamed")));
       
   188     
       
   189     ret = mCntModel->data(modelIndex, Hb::IndexFeedbackRole); 
       
   190     QVERIFY(ret.isNull());
       
   191 }
       
   192 
       
   193 void TestCntListModel::rowCount()
       
   194 {
       
   195     // we should have 2 contacts in the model saved from the last test case
       
   196     QTest::qWait(5000);
       
   197     QCOMPARE(mCntModel->rowCount(), 2);
       
   198 }
       
   199 
       
   200 void TestCntListModel::contact()
       
   201 {
       
   202     QList<QContactLocalId> ids = mManager->contactIds();
       
   203     QMap<int, QContactManager::Error> errorMapContact;
       
   204     mManager->removeContacts(ids,&errorMapContact);
       
   205     QTest::qWait(1000);
       
   206     
       
   207     QModelIndex modelIndex = mCntModel->index(0, 0);
       
   208     QContact empty = mCntModel->contact(modelIndex);
       
   209     //QVERIFY(empty.isEmpty());
       
   210     
       
   211     //create and save contact
       
   212     QContact c;
       
   213     QContactName name;
       
   214     name.setFirstName("firstname");
       
   215     name.setLastName("lastname");
       
   216     c.saveDetail(&name);
       
   217     QContactPhoneNumber number;
       
   218     number.setNumber("1234567");
       
   219     number.setContexts(QContactDetail::ContextHome);
       
   220     number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
       
   221     c.saveDetail(&number);
       
   222     QContactEmailAddress email;
       
   223     email.setEmailAddress("dummyemail");
       
   224     c.saveDetail(&email);
       
   225     QVERIFY(mManager->saveContact(&c));
       
   226     QTest::qWait(1000);
       
   227     
       
   228     modelIndex = mCntModel->index(10, 0);
       
   229     c = mCntModel->contact(modelIndex);
       
   230     QVERIFY(c.isEmpty());
       
   231     
       
   232     modelIndex = mCntModel->index(1, 0);
       
   233     c = mCntModel->contact(modelIndex);
       
   234     QVERIFY(!c.isEmpty());
       
   235 }
       
   236 
       
   237 void TestCntListModel::indexOfContact()
       
   238 {
       
   239     QModelIndex modelIndex = mCntModel->index(1, 0);
       
   240     QContact c = mCntModel->contact(modelIndex);
       
   241     
       
   242     QVERIFY(mCntModel->indexOfContact(c) == modelIndex);
       
   243 }
       
   244 
       
   245 void TestCntListModel::contactManager()
       
   246 {
       
   247     QVERIFY(mManager == &(mCntModel->contactManager()));
       
   248 }
       
   249 
       
   250 void TestCntListModel::setFilter()
       
   251 {
       
   252     QList<QContactLocalId> ids = mManager->contactIds();
       
   253     QMap<int, QContactManager::Error> errorMap;
       
   254     mManager->removeContacts(ids,&errorMap);
       
   255     QTest::qWait(1000);
       
   256     
       
   257     QContact c;
       
   258     QContactName name;
       
   259     name.setFirstName("firstname");
       
   260     name.setLastName("lastname");
       
   261     c.saveDetail(&name);
       
   262     QVERIFY(mManager->saveContact(&c));
       
   263     
       
   264     QContactUnionFilter unionFilter;
       
   265 
       
   266     QContactDetailFilter landlineFilter;
       
   267     landlineFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
       
   268     landlineFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeLandline));
       
   269     unionFilter << landlineFilter;
       
   270 
       
   271     QContactDetailFilter mobileFilter;
       
   272     mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
       
   273     mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile));
       
   274     unionFilter << mobileFilter;
       
   275     
       
   276     mCntModel->setFilter(unionFilter);
       
   277     
       
   278     QModelIndex modelIndex = mCntModel->indexOfContact(c);
       
   279     QVERIFY(modelIndex.row() < 0);
       
   280     QVERIFY(mCntModel->d->m_filter == unionFilter);
       
   281     QVERIFY(mCntModel->d->m_sortOrders.count() == 3);
       
   282 }
       
   283 
       
   284 void TestCntListModel::myCard()
       
   285 {
       
   286     delete mCntModel;
       
   287     mCntModel = 0;
       
   288     
       
   289     mCntModel = new CntListModel(mManager);
       
   290     
       
   291     QList<QContactLocalId> ids = mManager->contactIds();
       
   292     QMap<int, QContactManager::Error> errorMap;
       
   293     mManager->removeContacts(ids,&errorMap);
       
   294     QTest::qWait(1000);
       
   295     
       
   296     QContact c;
       
   297     QContactName name;
       
   298     name.setFirstName("firstname");
       
   299     name.setLastName("lastname");
       
   300     c.saveDetail(&name);
       
   301     QVERIFY(mManager->saveContact(&c));
       
   302     
       
   303     QSignalSpy spy(mCntModel, SIGNAL(modelReset()));
       
   304     
       
   305     QVERIFY(mCntModel->myCardStatus());
       
   306     
       
   307     mCntModel->showMyCard(false);
       
   308     QVERIFY(!mCntModel->myCardStatus());
       
   309     QCOMPARE(spy.count(), 2);
       
   310     
       
   311     mCntModel->showMyCard(true);
       
   312     QVERIFY(mCntModel->myCardStatus());
       
   313     QCOMPARE(spy.count(), 4);
       
   314     
       
   315     mManager->setSelfContactId(c.localId());
       
   316     QTest::qWait(1000);
       
   317     spy.clear();
       
   318     
       
   319     mCntModel->showMyCard(false);
       
   320     QVERIFY(!mCntModel->myCardStatus());
       
   321     QCOMPARE(spy.count(), 2);
       
   322     
       
   323     mCntModel->showMyCard(true);
       
   324     QVERIFY(mCntModel->myCardStatus());
       
   325     QCOMPARE(spy.count(), 4);
       
   326     mCntModel->showMyCard(true);
       
   327     QVERIFY(mCntModel->myCardStatus());
       
   328     QCOMPARE(spy.count(), 4);
       
   329 }
       
   330 
       
   331 void TestCntListModel::rowId()
       
   332 {
       
   333     QList<QContactLocalId> ids = mManager->contactIds();
       
   334     QMap<int, QContactManager::Error> errorMap;
       
   335     mManager->removeContacts(ids,&errorMap);
       
   336     QTest::qWait(1000);
       
   337     
       
   338     QContact c;
       
   339     QContactName name;
       
   340     name.setFirstName("firstname");
       
   341     name.setLastName("lastname");
       
   342     c.saveDetail(&name);
       
   343     QVERIFY(mManager->saveContact(&c));
       
   344     
       
   345     int row = mCntModel->rowId(c.localId());
       
   346     QVERIFY(row > 0);
       
   347     QVERIFY(mCntModel->validRowId(row));
       
   348     QVERIFY(!mCntModel->validRowId(-100));
       
   349     QVERIFY(!mCntModel->validRowId(100));
       
   350 }
       
   351 
       
   352 void TestCntListModel::dataForDisplayRole()
       
   353 {
       
   354     QList<QContactLocalId> ids = mManager->contactIds();
       
   355     QMap<int, QContactManager::Error> errorMap;
       
   356     mManager->removeContacts(ids,&errorMap);
       
   357     QTest::qWait(1000);
       
   358     
       
   359     QContact c;
       
   360     QContactName name;
       
   361     name.setFirstName("firstname");
       
   362     name.setLastName("lastname");
       
   363     c.saveDetail(&name);
       
   364     QVERIFY(mManager->saveContact(&c));
       
   365     
       
   366     int row = mCntModel->rowId(c.localId());
       
   367     QVariant var = mCntModel->dataForDisplayRole(row);
       
   368     QVERIFY(var.type() == QVariant::StringList);
       
   369     
       
   370     var = mCntModel->dataForDisplayRole(0);
       
   371     QVERIFY(var.type() == QVariant::StringList);
       
   372 }
       
   373 
       
   374 void TestCntListModel::handleAdded()
       
   375 {
       
   376     QList<QContactLocalId> ids = mManager->contactIds();
       
   377     QMap<int, QContactManager::Error> errorMap;
       
   378     mManager->removeContacts(ids,&errorMap);
       
   379     QTest::qWait(1000);
       
   380 
       
   381     QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)));
       
   382     
       
   383     QContact c;
       
   384     QContactName name;
       
   385     name.setFirstName("firstname");
       
   386     name.setLastName("lastname");
       
   387     c.saveDetail(&name);
       
   388     QVERIFY(mManager->saveContact(&c));
       
   389 
       
   390     QCOMPARE(spy.count(), 1);
       
   391     
       
   392     QList<QContactLocalId> emptyList;
       
   393     mCntModel->handleAdded(emptyList);
       
   394     QCOMPARE(spy.count(), 1);
       
   395 }
       
   396 
       
   397 void TestCntListModel::handleChanged()
       
   398 {
       
   399     QList<QContactLocalId> ids = mManager->contactIds();
       
   400     QMap<int, QContactManager::Error> errorMap;
       
   401     mManager->removeContacts(ids,&errorMap);
       
   402     QTest::qWait(1000);
       
   403     
       
   404     QContact c;
       
   405     QContactName name;
       
   406     name.setFirstName("firstname");
       
   407     name.setLastName("lastname");
       
   408     c.saveDetail(&name);
       
   409     QVERIFY(mManager->saveContact(&c));
       
   410     
       
   411     QSignalSpy spy(mCntModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex&)));
       
   412 
       
   413     name.setMiddleName("mid");
       
   414     c.saveDetail(&name);
       
   415     QVERIFY(mManager->saveContact(&c));
       
   416 
       
   417     QCOMPARE(spy.count(), 1);
       
   418     
       
   419     QList<QContactLocalId> emptyList;
       
   420     mCntModel->handleChanged(emptyList);
       
   421     QCOMPARE(spy.count(), 1);
       
   422 }
       
   423 
       
   424 void TestCntListModel::handleRemoved()
       
   425 {
       
   426     QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int, int)));
       
   427     
       
   428     QList<QContactLocalId> ids = mManager->contactIds();
       
   429     QMap<int, QContactManager::Error> errorMap;
       
   430     mManager->removeContacts(ids,&errorMap);
       
   431     QTest::qWait(1000);
       
   432     
       
   433     QCOMPARE(spy.count(), 1);
       
   434     
       
   435     QList<QContactLocalId> emptyList;
       
   436     mCntModel->handleRemoved(emptyList);
       
   437     QCOMPARE(spy.count(), 1);
       
   438 }
       
   439 
       
   440 void TestCntListModel::handleMyCardChanged()
       
   441 {
       
   442     QList<QContactLocalId> ids = mManager->contactIds();
       
   443     QMap<int, QContactManager::Error> errorMap;
       
   444     mManager->removeContacts(ids,&errorMap);
       
   445     QTest::qWait(1000);
       
   446     
       
   447     QContact c;
       
   448     QContactName name;
       
   449     name.setFirstName("firstname");
       
   450     name.setLastName("lastname");
       
   451     c.saveDetail(&name);
       
   452     QVERIFY(mManager->saveContact(&c));
       
   453     
       
   454     mCntModel->handleMyCardChanged(0, c.localId());
       
   455     QVERIFY(mCntModel->d->m_myCardId == c.localId());
       
   456 }
       
   457 
       
   458 void TestCntListModel::cleanupTestCase()
       
   459 {
       
   460     mCntModel->d->m_cache->onShutdown();
       
   461     delete mCntModel;
       
   462     mCntModel = 0;
       
   463     
       
   464     //let's have clean database after running tests
       
   465     QList<QContactLocalId> ids = mManager->contactIds();
       
   466     QMap<int, QContactManager::Error> errorMap;
       
   467     mManager->removeContacts(ids, &errorMap);
       
   468     delete mManager;
       
   469     mManager = 0;
       
   470     delete mModelListener;
       
   471     mModelListener = 0;
       
   472 }
       
   473 
       
   474 
       
   475 ModelListener::ModelListener(TestCntListModel* parent)
       
   476     : mParent(parent)
       
   477 {
       
   478     connect(mParent->mCntModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onDataChanged(QModelIndex,QModelIndex)));
       
   479 }
       
   480 
       
   481 void ModelListener::onDataChanged(QModelIndex start, QModelIndex end)
       
   482 {
       
   483     mParent->contactReady(start.row(), end.row());
       
   484 }
       
   485