logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp
changeset 0 4a5361db8937
child 2 7119b73b84d6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp	Tue May 04 12:39:37 2010 +0300
@@ -0,0 +1,687 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+#include "ut_logsmatchesmodel.h"
+#include "logsmodel.h"
+#include "logsmatchesmodel.h"
+#include "logsevent.h"
+#include "logscall.h"
+#include "logscontact.h"
+#include "logsdetailsmodel.h"
+#include "logsmessage.h"
+#include "logseventdata.h"
+#include "qtcontacts_stubs_helper.h"
+#include "logscntfinder.h"
+#include "logsdbconnector_stub_helper.h"
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(LogsEvent *)
+Q_DECLARE_METATYPE(LogsCall *)
+Q_DECLARE_METATYPE(LogsDetailsModel *)
+Q_DECLARE_METATYPE(LogsMessage *)
+Q_DECLARE_METATYPE(LogsContact *)
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::initTestCase()
+{
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::cleanupTestCase()
+{
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::init()
+{
+    mModel = new LogsModel();
+    LogsDbConnectorStubHelper::setPredictiveSearch(1);
+    mMatchesModel = mModel->logsMatchesModel();
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::cleanup()
+{
+    delete mMatchesModel;
+    mMatchesModel = 0;
+    delete mModel;
+    mModel = 0;
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testConstructor()
+{    
+    // Predictive search is on
+    QVERIFY( mMatchesModel );
+    QVERIFY( mMatchesModel->mSearchEnabled );
+    QVERIFY( mMatchesModel->mIconManager );
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    
+    // Predictive search is off
+    delete mMatchesModel;
+    mMatchesModel = 0;
+    LogsDbConnectorStubHelper::setPredictiveSearch(2);
+    mMatchesModel = mModel->logsMatchesModel();
+    QVERIFY( mMatchesModel );
+    QVERIFY( !mMatchesModel->mSearchEnabled );
+    QVERIFY( mMatchesModel->mIconManager );
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    
+    // Predictive search status fetching failure=> assume that search is on
+    delete mMatchesModel;
+    mMatchesModel = 0;
+    LogsDbConnectorStubHelper::setPredictiveSearch(-1);
+    mMatchesModel = mModel->logsMatchesModel();
+    QVERIFY( mMatchesModel );
+    QVERIFY( mMatchesModel->mSearchEnabled );
+    QVERIFY( mMatchesModel->mIconManager );
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    
+    // Predictive search is permanently disabled 
+    delete mMatchesModel;
+    mMatchesModel = 0;
+    LogsDbConnectorStubHelper::setPredictiveSearch(0);
+    mMatchesModel = mModel->logsMatchesModel();
+    QVERIFY( mMatchesModel );
+    QVERIFY( !mMatchesModel->mIconManager );
+    QVERIFY( !mMatchesModel->mLogsCntFinder );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testRowCount()
+{
+    QVERIFY( mMatchesModel->mIconManager );
+    QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 0 );
+    LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer(
+            *mModel, *mMatchesModel->mIconManager, 0); 
+    mMatchesModel->mMatches.append(item);
+    QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 0 );
+    
+    mMatchesModel->mResultCount = 1;
+    QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 1 );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testData()
+{
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    QVERIFY( mMatchesModel->mIconManager );
+    QVERIFY( mModel->data(QModelIndex(), Qt::DisplayRole).isNull() );
+    
+    // Setup search results
+    LogsCntEntry* entry = new LogsCntEntry(*this, 0);
+    entry->setFirstName("Testing");
+    mMatchesModel->mLogsCntFinder->mResults.append(entry);
+    quint32 contactId = 2;
+    entry = new LogsCntEntry(contactId);
+    mMatchesModel->mLogsCntFinder->mResults.append(entry);
+    quint32 contactId2 = 3;
+    entry = new LogsCntEntry(contactId2);
+    mMatchesModel->mLogsCntFinder->mResults.append(entry);
+    
+    LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer(
+            *mModel, *mMatchesModel->mIconManager, 0); 
+    LogsEvent event;
+    event.setRemoteParty( "Testing" );
+    item->setEvent(event);
+    item->mFormattedCallerId = "formattedCallerId";
+    mMatchesModel->mMatches.append(item);
+    
+    QtContactsStubsHelper::setContactId(contactId);
+    LogsMatchesModelItemContainer* item2 = new LogsMatchesModelItemContainer(
+            *mModel, *mMatchesModel->mIconManager, 1); 
+    mMatchesModel->mMatches.append(item2);
+    
+    mMatchesModel->mResultCount = 2;
+     
+    // Display data for event match
+    QVariant displayData = mMatchesModel->data(mMatchesModel->index(0), Qt::DisplayRole);
+    QVERIFY ( displayData.type() == QVariant::StringList );
+    QStringList list = displayData.toStringList();
+    QVERIFY( list.count() == 2 );
+    QVERIFY( list.at(0) == "formattedCallerId" );
+    
+    // Display data for contact match, getting it first time which causes
+    // that data is fetched from contact
+    QtContactsStubsHelper::setContactNames("first", "last");
+    QVERIFY( mMatchesModel->mMatches.at(1)->mContactId == 0 );
+    displayData = mMatchesModel->data(mMatchesModel->index(1), Qt::DisplayRole);
+    QVERIFY ( displayData.type() == QVariant::StringList );
+    list = displayData.toStringList();
+    QVERIFY( list.count() == 2 );
+    QVERIFY( list.at(0).length() > 0 && list.at(0) != "Testing" );
+    QVERIFY( mMatchesModel->mMatches.at(1)->mContactId == contactId );
+    
+    // Data asked again for same item, optimized
+    item2->mContactName = "formattedName";
+    item2->mContactNumber = "formattedNumber";
+    displayData = mMatchesModel->data(mMatchesModel->index(1), Qt::DisplayRole);
+    QVERIFY ( displayData.type() == QVariant::StringList );
+    QStringList list2 = displayData.toStringList();
+    QVERIFY( list2.count() == 2 );
+    QVERIFY( list2.at(0) == "formattedName" );
+    QVERIFY( list2.at(1) == "formattedNumber" );
+    
+    // Decoration data for event match
+    QVariant decorationData = mMatchesModel->data(mMatchesModel->index(0), Qt::DecorationRole);
+    QVERIFY ( decorationData.canConvert< QList<QVariant> >() );
+    
+    //create and save contact
+    QContact c;
+    QVariant ret;	
+    QtContactsStubsHelper::setContactId(contactId2);
+    LogsMatchesModelItemContainer* item3 = new LogsMatchesModelItemContainer(
+                *mModel, *mMatchesModel->mIconManager, 2); 
+    item3->setContact(contactId2);
+    mMatchesModel->mMatches.append(item3);
+    
+    mMatchesModel->mResultCount = 3;
+    
+    ret = mMatchesModel->data(mMatchesModel->index(2), Qt::DecorationRole); 
+    QVERIFY(ret.type() == QVariant::List);
+    
+    //
+    ret = mMatchesModel->data(mMatchesModel->index(2), Qt::DecorationRole); 
+    QVERIFY(ret.type() == QVariant::List);
+    //	
+    ret = mMatchesModel->data(mMatchesModel->index(2), Qt::DecorationRole); 
+    QVERIFY(ret.type() == QVariant::List);
+   
+    ret = mMatchesModel->data(mMatchesModel->index(2), Qt::DecorationRole); 
+    QVERIFY(ret.type() == QVariant::List);
+    
+    // Details model for logs event
+    QVariant details = mMatchesModel->data(mMatchesModel->index(0), LogsMatchesModel::RoleDetailsModel);
+    LogsDetailsModel *detailsModel = qVariantValue<LogsDetailsModel *>( details );
+    QVERIFY( detailsModel );
+    delete detailsModel;
+    detailsModel = 0;
+    
+    //Details model for contact match is null
+    details = mMatchesModel->data(mMatchesModel->index(1), LogsMatchesModel::RoleDetailsModel);
+    detailsModel = qVariantValue<LogsDetailsModel *>( details );
+    QVERIFY( !detailsModel );
+    delete detailsModel;
+    
+    // Data asked first time for event, no result container exist yet -> it will be created
+    qDeleteAll( mMatchesModel->mMatches );
+    mMatchesModel->mMatches.clear();
+    displayData = mMatchesModel->data(mMatchesModel->index(0), Qt::DisplayRole);
+    QVERIFY ( displayData.type() == QVariant::StringList );
+    QCOMPARE( mMatchesModel->mMatches.count(), 1 );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testDataAdded()
+{
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    QVERIFY( mMatchesModel->mIconManager );
+    // One event added
+    LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer(
+            *mModel, *mMatchesModel->mIconManager, 0); 
+    mMatchesModel->mMatches.append(item);
+    LogsEvent* event = new LogsEvent();
+    mModel->mEvents.append(event);
+    mMatchesModel->eventsAdded(QModelIndex(), 0, 0);
+    QVERIFY( mMatchesModel->mSearchEvents.count() == 1 );
+    QVERIFY( mMatchesModel->mMatches.count() == 0 ); // cleared because of new events
+    QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur
+    
+    // Two more sequnetial events added
+    item = new LogsMatchesModelItemContainer(
+            *mModel, *mMatchesModel->mIconManager, 1); 
+    mMatchesModel->mMatches.append(item);
+    LogsEvent* event2 = new LogsEvent();
+    LogsEvent* event3 = new LogsEvent();
+    mModel->mEvents.insert(0, event2);
+    mModel->mEvents.insert(0, event3);
+    mMatchesModel->eventsAdded(QModelIndex(), 0, 1);
+    QVERIFY( mMatchesModel->mSearchEvents.count() == 3 );  
+    QVERIFY( mMatchesModel->mMatches.count() == 0 ); // cleared because of new events
+    QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testDataUpdated()
+{
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    QVERIFY( mMatchesModel->mIconManager );
+    // Nothing to update
+    LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer(
+            *mModel, *mMatchesModel->mIconManager, 0); 
+    mMatchesModel->mMatches.append(item);
+    mMatchesModel->eventsUpdated(mModel->index(0), mModel->index(0));
+    QVERIFY( mMatchesModel->mMatches.count() == 1 ); // not cleared because nothing was updated
+    
+    // Search event to update
+    LogsEvent* event = new LogsEvent();
+    mModel->mEvents.append(event);
+    mMatchesModel->eventsAdded(QModelIndex(), 0, 0);
+    mMatchesModel->eventsUpdated(mModel->index(0), mModel->index(0));
+    QVERIFY( mMatchesModel->mSearchEvents.count() == 1 );  
+    QVERIFY( mMatchesModel->mMatches.count() == 0 ); // cleared because of updated events
+    QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testDataRemoved()
+{
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    QVERIFY( mMatchesModel->mIconManager );
+    // Nothing to remove
+    LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer(
+            *mModel, *mMatchesModel->mIconManager, 1); 
+    mMatchesModel->mMatches.append(item);
+    mMatchesModel->eventsRemoved(QModelIndex(), 0, 0);
+    QVERIFY( mMatchesModel->mMatches.count() == 1 ); // not cleared because nothing was removed
+    
+    // Existing search event removed
+    LogsEvent* event = new LogsEvent();
+    mModel->mEvents.append(event);
+    mMatchesModel->eventsAdded(QModelIndex(), 0, 0);
+    mMatchesModel->eventsRemoved(QModelIndex(), 0, 0);
+    QVERIFY( mMatchesModel->mSearchEvents.count() == 0 ); // cleared because of removed events
+    QVERIFY( mMatchesModel->mMatches.count() == 0 ); // cleared because of removed events
+    QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testLogsMatches()
+{
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    QVERIFY( mMatchesModel->mIconManager );
+    QVERIFY( mMatchesModel->mSearchEnabled );
+    // Query ready when no matching search events
+    QSignalSpy spy(mMatchesModel, SIGNAL(modelReset()));
+    
+    mMatchesModel->logsMatches( "3" );
+    mMatchesModel->doSearchQuery(); // simulate async completion
+    LogsCntEntry* entry = new LogsCntEntry(*this, 0);
+    mMatchesModel->mLogsCntFinder->mResults.append(entry);
+    mMatchesModel->queryReady();
+    QVERIFY( mMatchesModel->mPrevSearchPattern == "3" );
+    QVERIFY( mMatchesModel->mCurrentSearchPattern == "3" );
+    QVERIFY( spy.count() == 1 );
+    QVERIFY( mMatchesModel->mResultCount == 1 );
+    
+    // Query ready when matching search events
+    LogsEvent* event = new LogsEvent();
+    mModel->mEvents.append(event);
+    mMatchesModel->eventsAdded(QModelIndex(), 0, 0); // Causes immediate reset
+    mMatchesModel->logsMatches( "4" );
+    mMatchesModel->doSearchQuery(); // simulate async completion
+    mMatchesModel->mLogsCntFinder->mResults.append(
+            new LogsCntEntry(*mMatchesModel->mLogsCntFinder->mHistoryEvents.at(0)));
+    mMatchesModel->queryReady();
+    QVERIFY( spy.count() == 3 );
+    QVERIFY( mMatchesModel->mMatches.count() == 0 ); // Matches not added until data is asked
+    QVERIFY( mMatchesModel->mResultCount == 1 );
+    
+    // Query ready with both event and contact matches
+    mMatchesModel->logsMatches( "5" );
+    mMatchesModel->doSearchQuery(); // simulate async completion
+    mMatchesModel->mLogsCntFinder->mResults.append(
+            new LogsCntEntry(*mMatchesModel->mLogsCntFinder->mHistoryEvents.at(0)));
+    mMatchesModel->mLogsCntFinder->mResults.append( new LogsCntEntry(2) );
+    mMatchesModel->queryReady();
+    QVERIFY( spy.count() == 4 );
+    QVERIFY( mMatchesModel->mMatches.count() == 0 );  // Matches not added until data is asked
+    QVERIFY( mMatchesModel->mResultCount == 2 );
+    
+    // Query ready without any matches
+    mMatchesModel->logsMatches( "377778877" );
+    mMatchesModel->doSearchQuery(); // simulate async completion
+    qDeleteAll(mMatchesModel->mLogsCntFinder->mResults);
+    mMatchesModel->mLogsCntFinder->mResults.clear();
+    mMatchesModel->queryReady();
+    QVERIFY( spy.count() == 5 );
+    QVERIFY( mMatchesModel->mMatches.count() == 0 );
+    QVERIFY( mMatchesModel->mResultCount == 0 );
+    
+    // Test rapid queries, only last one should be done once async calls complete
+    mMatchesModel->logsMatches( "1" );
+    QVERIFY( mMatchesModel->mCurrentSearchPattern == "1" );
+    QVERIFY( mMatchesModel->mPrevSearchPattern != "1" );
+    mMatchesModel->logsMatches( "12" );
+    QVERIFY( mMatchesModel->mCurrentSearchPattern == "12" );
+    QVERIFY( mMatchesModel->mPrevSearchPattern != "12" );
+    mMatchesModel->logsMatches( "123" );
+    QVERIFY( mMatchesModel->mCurrentSearchPattern == "123" );
+    QVERIFY( mMatchesModel->mPrevSearchPattern != "123" );
+    
+    mMatchesModel->doSearchQuery(); // simulate async completion
+    QVERIFY( mMatchesModel->mPrevSearchPattern == "123" );
+    QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern == "123" );
+    
+    mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern.clear(); // Check that same query is not made many times
+    mMatchesModel->doSearchQuery(); // simulate async completion
+    QVERIFY( mMatchesModel->mPrevSearchPattern == "123" );
+    QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern.isEmpty() );
+    
+    mMatchesModel->doSearchQuery(); // simulate async completion
+    QVERIFY( mMatchesModel->mPrevSearchPattern == "123" );
+    QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern.isEmpty() );
+    
+    // Search is Off, current pattern updated, but no search happens
+    mMatchesModel->mSearchEnabled = false;
+    mMatchesModel->mPrevSearchPattern = "1";
+    mMatchesModel->mCurrentSearchPattern = "2";
+    mMatchesModel->logsMatches( "199" );
+    QVERIFY( mMatchesModel->mPrevSearchPattern == "1" );
+    QVERIFY( mMatchesModel->mCurrentSearchPattern == "199" );
+    QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern.isEmpty() );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testCreateContactWithNumber()
+{
+    LogsContact* contact = 0;
+    contact = mMatchesModel->createContact("123");
+    QVERIFY(contact);
+    QVERIFY(contact->isContactRequestAllowed()); 
+    delete contact;
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testCreateCall()
+{
+    // With event
+    LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0);    
+    LogsEvent event;
+    event.setEventType(LogsEvent::TypeVoiceCall);
+    event.setNumber( "1234" );
+    item.setEvent(event);
+    QVariant var = mMatchesModel->createCall(item);
+    LogsCall *call = qVariantValue<LogsCall *>( var );
+    QVERIFY( call );
+    delete call;
+    
+    // With contact, calling not supported
+    LogsMatchesModelItemContainer item2(*mModel, *mMatchesModel->mIconManager, 1);  
+    var = mMatchesModel->createCall(item2);
+    call = qVariantValue<LogsCall *>( var );
+    QVERIFY( !call );
+    
+    // With contact, calling supported
+    LogsMatchesModelItemContainer item3(*mModel, *mMatchesModel->mIconManager, 2);  
+    item3.setContact(2);
+    var = mMatchesModel->createCall(item3);
+    call = qVariantValue<LogsCall *>( var );
+    QVERIFY( call );
+    delete call;
+    
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testCreateMessage()
+{
+    // With event
+    LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0);    
+    LogsEvent event;
+    event.setNumber( "1234" );
+    item.setEvent(event);
+    QVariant var = mMatchesModel->createMessage(item);
+    LogsMessage *message = qVariantValue<LogsMessage *>( var );
+    QVERIFY( message );
+    delete message;
+    
+    // With contact, messaging not supported
+    LogsMatchesModelItemContainer item2(*mModel, *mMatchesModel->mIconManager, 1);  
+    var = mMatchesModel->createMessage(item2);
+    message = qVariantValue<LogsMessage *>( var );
+    QVERIFY( !message );
+    
+    // With contact, messaging supported
+    LogsMatchesModelItemContainer item3(*mModel, *mMatchesModel->mIconManager, 2);  
+    item3.setContact(2);
+    var = mMatchesModel->createMessage(item3);
+    message = qVariantValue<LogsMessage *>( var );
+    QVERIFY( message );
+    delete message;
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testCreateContact()
+{
+    // With event
+    LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0);    
+    LogsEvent event;
+    event.setEventType(LogsEvent::TypeVoiceCall);
+    event.setNumber( "1234" );
+    item.setEvent(event);
+    QVariant var = mMatchesModel->createContact(item);
+    LogsContact *contact = qVariantValue<LogsContact *>( var );
+    QVERIFY( contact );
+    delete contact;
+    contact = 0;
+    
+    // With contact
+    LogsMatchesModelItemContainer item2(*mModel, *mMatchesModel->mIconManager, 1);  
+    item2.setContact(2);
+    var = mMatchesModel->createContact(item2);
+    contact = qVariantValue<LogsContact *>( var );
+    QVERIFY( contact );
+    delete contact;
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testUpdateSearchEntry()
+{
+    // Remote name exists
+    LogsEvent event1;
+    event1.setRemoteParty("someparty");
+    LogsCntEntry entry1(0);
+    mMatchesModel->updateSearchEntry(entry1, event1);
+    QVERIFY( entry1.firstName().at(0).text() == "someparty" );
+    QVERIFY( entry1.phoneNumber().text() == "" );
+
+    // Only number exists
+    LogsEvent event2;
+    event2.setNumber("55556666");
+    LogsCntEntry entry2(0);
+    mMatchesModel->updateSearchEntry(entry2, event2);
+    QVERIFY( entry2.firstName().at(0).text() == "" );
+    QVERIFY( entry2.phoneNumber().text() == "55556666" );
+
+    // Only number starting with '+' exists
+    LogsEvent event3;
+    event3.setNumber("+77776666");
+    LogsCntEntry entry3(0);
+    mMatchesModel->updateSearchEntry(entry3, event3);
+    QVERIFY( entry3.firstName().at(0).text() == "" );
+    QVERIFY( entry3.phoneNumber().text() == "77776666" );
+
+    // VoIP event with CS compatible url
+    LogsEvent event4;
+    event4.setEventType(LogsEvent::TypeVoIPCall);
+    LogsEventData* eventData1 = new LogsEventData();
+    eventData1->mRemoteUrl = "444222111";
+    event4.setLogsEventData(eventData1);
+    LogsCntEntry entry4(0);
+    mMatchesModel->updateSearchEntry(entry4, event4);
+    QVERIFY( entry4.firstName().at(0).text() == "" );
+    QVERIFY( entry4.phoneNumber().text() == "444222111" );
+
+    // VoIP event without CS compatible url
+    LogsEvent event5;
+    event5.setEventType(LogsEvent::TypeVoIPCall);
+    LogsEventData* eventData2 = new LogsEventData();
+    eventData2->mRemoteUrl = "testing@test.com";
+    event5.setLogsEventData(eventData2);
+    LogsCntEntry entry5(0);
+    mMatchesModel->updateSearchEntry(entry5, event5);
+    QVERIFY( entry5.firstName().at(0).text() == "testing@test.com" );
+    QVERIFY( entry5.phoneNumber().text() == "" );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testGetFormattedCallerId()
+{
+    QVERIFY( mMatchesModel->mIconManager );
+    // Entry is not initialized, caller Id is empty
+    LogsCntEntry entry(0);
+    LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0); 
+    QVERIFY( item.getFormattedCallerId(entry).length() == 0 );
+    
+    // Entry is initialized, firstname is preffered over other data
+    entry.setFirstName("  long firstname");
+    entry.setLastName("verylong lastname");
+    entry.setPhoneNumber(" number");
+    QString callerId = item.getFormattedCallerId(entry);
+    QVERIFY( callerId == "long firstname" );
+    
+    // Firstname is missing, phone number is used
+    entry.setFirstName("");
+    callerId = item.getFormattedCallerId(entry);
+    QVERIFY( callerId == "number" );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testGetFormattedContactInfo()
+{
+    QString name;
+    QString number;
+    QVERIFY( mMatchesModel->mIconManager );
+    
+    // Entry is not initialized, name and number are empty
+    LogsCntEntry entry(0);
+    LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0);
+    item.getFormattedContactInfo(entry, name, number);
+    QVERIFY( name.length() == 0 && number.length() == 0 );
+    
+    // Entry is initialized, name and number are not empty
+    entry.setFirstName("long firstname");
+    entry.setLastName("long lastname");
+    entry.setPhoneNumber("number");
+    item.getFormattedContactInfo(entry, name, number);
+    QVERIFY( name == "long firstname long lastname" );
+    QVERIFY( number == "number" );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testPredictiveSearchStatus()
+{
+    LogsDbConnectorStubHelper::reset();
+    QVERIFY( mMatchesModel->predictiveSearchStatus() == 0 );
+    QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "predictiveSearchStatus" );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void UT_LogsMatchesModel::testSetPredictiveSearch()
+{
+    QVERIFY( mMatchesModel->mLogsCntFinder );
+    QVERIFY( mMatchesModel->mIconManager );
+    QVERIFY( mMatchesModel->mSearchEnabled );
+    // Predictive search is permanently off in cenrep, setting the value fails
+    LogsDbConnectorStubHelper::reset();
+    QVERIFY( mMatchesModel->setPredictiveSearch(false) != 0 );
+    QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "setPredictiveSearch" );
+    QVERIFY( mMatchesModel->mSearchEnabled );
+    
+    // Turning off is ok, search results are reset
+    mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern = "9";
+    LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer(
+            *mModel, *mMatchesModel->mIconManager, 0); 
+    mMatchesModel->mMatches.append(item);
+    mMatchesModel->mPrevSearchPattern = "123";
+    mMatchesModel->mCurrentSearchPattern = "567";
+    LogsDbConnectorStubHelper::setPredictiveSearch(1);
+    QVERIFY( mMatchesModel->setPredictiveSearch(false) == 0 );
+    QVERIFY( !mMatchesModel->mSearchEnabled );
+    QVERIFY( mMatchesModel->mMatches.count() == 0 );
+    QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() );
+    QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern == "9" );
+
+    // Turning search on, search results are updated
+    mMatchesModel->mPrevSearchPattern = "123";
+    mMatchesModel->mCurrentSearchPattern = "567";
+    QVERIFY( mMatchesModel->setPredictiveSearch(true) == 0 );
+    QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() );
+    QVERIFY( mMatchesModel->mSearchEnabled );
+    mMatchesModel->doSearchQuery(); // simulate async completion
+    QVERIFY( mMatchesModel->mPrevSearchPattern == "567" );
+    QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern == "567" );
+    
+    
+    // Turning search on, when it is already on => nothing happens
+    mMatchesModel->mCurrentSearchPattern = "777";
+    QVERIFY( mMatchesModel->setPredictiveSearch(true) == 0 );
+    QVERIFY( mMatchesModel->mSearchEnabled );
+    QVERIFY( mMatchesModel->mPrevSearchPattern == "567" );
+    QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern == "567" );
+}