logsui/logsengine/tsrc/ut_logsengine/src/ut_logsdetailsmodel.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 02 Sep 2010 20:27:05 +0300
changeset 16 c5af8598d22c
parent 0 4a5361db8937
child 20 6a40edd41841
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* 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_logsdetailsmodel.h"
#include "logsdetailsmodel.h"
#include "logsevent.h"
#include "logsdbconnector.h"
#include "logscall.h"
#include "logscontact.h"
#include "logsmessage.h"
#include "logseventdata.h"
#include "logsconfigurationparams.h"
#include "qtcontacts_stubs_helper.h"
#include "logsdbconnector_stub_helper.h"
#include "hbstubs_helper.h"
#include <hblineedit.h>
#include <hbglobal.h>
#include <hbextendedlocale.h>
#include <QtTest/QtTest>

Q_DECLARE_METATYPE(LogsCall *)
Q_DECLARE_METATYPE(LogsMessage *)
Q_DECLARE_METATYPE(LogsContact *)

const QString testEmpty = "";
const QString testDetailsRemoteParty = "Remoteman";
const QString testDetailsRemoteNum = "12345566";
const QString testDetailsRemoteInfo = "Remoteman";
QDateTime testDetailsDateAndTime;
const LogsEvent::LogsDirection testDetailsDirection = LogsEvent::DirIn;
const LogsEvent::LogsEventType testDetailsEventType = LogsEvent::TypeVoiceCall;
const int testDetailsDuration = 2000;
const QString testDetailsNumber = "+4152800";

void UT_LogsDetailsModel::initTestCase()
{
    
    mDbConnector = new LogsDbConnector(mEvents);
}

void UT_LogsDetailsModel::cleanupTestCase()
{
    delete mDbConnector;
}


void UT_LogsDetailsModel::init()
{
    HbStubHelper::reset();
    testDetailsDateAndTime.setTime_t( 3000 );
    
    LogsEvent event;
    event.setRemoteParty( testDetailsRemoteParty );
    event.setNumber( testDetailsRemoteNum );
    event.setTime( testDetailsDateAndTime );
    event.setDirection( testDetailsDirection );
    event.setEventType( testDetailsEventType );
    event.setDuration( testDetailsDuration );
    mModel = new LogsDetailsModel(*mDbConnector, event);
}

void UT_LogsDetailsModel::cleanup()
{
    delete mModel;
    mModel = 0;
}

void UT_LogsDetailsModel::testConstructor()
{
    QVERIFY( mModel );
}

void UT_LogsDetailsModel::testRowCount()
{
    QVERIFY( mModel->rowCount(QModelIndex()) == 5 );
}

void UT_LogsDetailsModel::testgetNumberToClipboard()
{
    HbLineEdit *cliptmp2 = new HbLineEdit(" ");
    
    cliptmp2->setText(" ");
    cliptmp2->selectAll();
    cliptmp2->copy();
    
    // Make sure that number is converted to current locale
    HbStubHelper::stringUtilDigitConversion(true);
    mModel->getNumberToClipboard();
    
    cliptmp2->setText(" ");
    cliptmp2->paste();   
    QCOMPARE( cliptmp2->text(), "conv" + testDetailsRemoteNum  );

    
    // VoIP uri is not converted
    mModel->mEvent->mNumber.clear();
    LogsEventData* eventData = new LogsEventData;
    eventData->mRemoteUrl = "test@1.2.3.4";
    mModel->mEvent->setLogsEventData( eventData );
    mModel->mEvent->mEventType = LogsEvent::TypeVoIPCall;
    mModel->getNumberToClipboard();
    cliptmp2->setText(" ");
    cliptmp2->paste();   
    QCOMPARE( cliptmp2->text(), eventData->mRemoteUrl  );
    
    delete cliptmp2;
}

void UT_LogsDetailsModel::testData()
{
    QVERIFY( mModel->data(QModelIndex(), Qt::DisplayRole).isNull() );
    
    // Test remote party info
    QStringList display = mModel->data(mModel->index(0), Qt::DisplayRole).toStringList();
    QVERIFY( display.count() == 2 );
    QVERIFY( display.at(1) == testDetailsRemoteNum );  
    QList<QVariant> decoration = mModel->data(mModel->index(0), Qt::DecorationRole).toList();
    QVERIFY( decoration.count() == 1 );
    
    // Test date and time
    display = mModel->data(mModel->index(1), Qt::DisplayRole).toStringList();
    QVERIFY( display.count() == 2 );
    QDateTime localTime = testDetailsDateAndTime.toTimeSpec(Qt::LocalTime);    
    QVERIFY( display.at(1).startsWith(
                localTime.date().toString(Qt::SystemLocaleShortDate)) );
    
    decoration = mModel->data(mModel->index(1), Qt::DecorationRole).toList();
    QVERIFY( decoration.count() == 1 );
    
    // Test call direction
    display = mModel->data(mModel->index(2), Qt::DisplayRole).toStringList();
    QVERIFY( display.count() == 2 );
    QVERIFY( display.at(1) == mModel->mEvent->directionAsString() );
    decoration = mModel->data(mModel->index(2), Qt::DecorationRole).toList();
    QVERIFY( decoration.count() == 1 );
    
    // Test call type
    display = mModel->data(mModel->index(3), Qt::DisplayRole).toStringList();
    QVERIFY( display.count() == 2 );
    QVERIFY( display.at(1) == mModel->mEvent->typeAsString() );
    decoration = mModel->data(mModel->index(3), Qt::DecorationRole).toList();
    QVERIFY( decoration.count() == 1 );
    
    // Test call duration
    display = mModel->data(mModel->index(4), Qt::DisplayRole).toStringList();
    QVERIFY( display.count() == 2 );
    QTime n(0,0,0);
    QTime t = n.addSecs(testDetailsDuration);
    QChar timeSeparator = HbExtendedLocale::system().timeSeparator(1);
    QString tiemFormat = QString("hh%1mm%2ss").arg(timeSeparator).arg(timeSeparator);
    QCOMPARE( display.at(1), t.toString(tiemFormat));
    decoration = mModel->data(mModel->index(4), Qt::DecorationRole).toList();
    QVERIFY( decoration.count() == 1 );
    
    // Test call, event type supports call
    QVariant callData = mModel->data(mModel->index(0), LogsDetailsModel::RoleCall);
    LogsCall *call = qVariantValue<LogsCall *>( callData );
    QVERIFY( call );
    QVERIFY( call->defaultCallType() != LogsCall::TypeLogsCallNotAvailable );
    delete call;
    
    // Test call, event type does not support call
    mModel->mEvent->setEventType(LogsEvent::TypeUndefined);
    QVariant callData2 = mModel->data(mModel->index(0), LogsDetailsModel::RoleCall);
    LogsCall *call2 = qVariantValue<LogsCall *>( callData2 );
    QVERIFY( call2 );
    QVERIFY( call2->defaultCallType() == LogsCall::TypeLogsCallNotAvailable );
    delete call2;
    
    // Test message
    QVariant messageData = mModel->data(mModel->index(0), LogsDetailsModel::RoleMessage);
    LogsMessage* message = qVariantValue<LogsMessage *>( messageData );
    QVERIFY( message != 0 );
    delete message;
    LogsEventData* eventData = new LogsEventData;
    eventData->mRemoteUrl = "test@1.2.3.4";
    mModel->mEvent->setLogsEventData( eventData );
    QVariant messageData2 = mModel->data(mModel->index(0), LogsDetailsModel::RoleMessage);
    LogsMessage* message2 = qVariantValue<LogsMessage *>( messageData2 );
    QVERIFY( message2 == 0 );
    
    // Contact supported
    QVERIFY( mModel->mEvent->getNumberForCalling().length() > 0 );
    QVariant contactData = mModel->data(mModel->index(0), LogsDetailsModel::RoleContact);
    LogsContact *contact = qVariantValue<LogsContact *>( contactData );
    QVERIFY( contact );
    delete contact;
    
    // Contact not supported
    mModel->mEvent->setNumber("");
    mModel->mEvent->setLogsEventData( 0 );
    contactData = mModel->data(mModel->index(0), LogsModel::RoleContact);
    contact = qVariantValue<LogsContact *>( contactData );
    QVERIFY( !contact );
}

void UT_LogsDetailsModel::testHeaderData()
{
    QCOMPARE(mModel->headerData(0, Qt::Vertical).toString(),
             testDetailsRemoteInfo);
    QVERIFY(mModel->headerData(0, Qt::Vertical, Qt::DecorationRole).isNull());
    
    // Number as header, check that it is converted to current local
    HbStubHelper::stringUtilDigitConversion(true);
    mModel->mEvent->mRemoteParty.clear();
    mModel->initContent();
    QCOMPARE(mModel->headerData(0, Qt::Vertical).toString(),
        "conv" + testDetailsRemoteNum);
}

void UT_LogsDetailsModel::testgetRemoteUri()
{
    LogsEvent event;
    QVERIFY( mModel->getRemoteUri(event) == QString("") );
    LogsEventData* eventData = new LogsEventData;
    eventData->mRemoteUrl = "test@1.2.3.4";
    mModel->mEvent->setLogsEventData( eventData );
    QVERIFY( mModel->getRemoteUri(*mModel->mEvent) == QString("test@1.2.3.4") );
}

void UT_LogsDetailsModel::testInitTextsAndIcons()
{
    //No VoIP call,no remote url or local url and contactname
    testDetailsDateAndTime.setTime_t( 3000 );
    LogsEvent event;
    event.setRemoteParty( testDetailsRemoteParty );
    event.setNumber( testDetailsRemoteNum );
    event.setTime( testDetailsDateAndTime );
    event.setDirection( testDetailsDirection );
    event.setEventType( testDetailsEventType );
    event.setDuration( testDetailsDuration );
    LogsDetailsModel* model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 5);
    QVERIFY(model->mDetailTexts.count() == 5);
    delete model;
    model = 0;
    
    //No VoIP call,no remote url or local url and no contactname
    testDetailsDateAndTime.setTime_t( 3000 );
    event.setRemoteParty( testEmpty );
    event.setNumber( testDetailsRemoteNum );
    event.setTime( testDetailsDateAndTime );
    event.setDirection( testDetailsDirection );
    event.setEventType( testDetailsEventType );
    event.setDuration( testDetailsDuration );
    model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 4);
    QVERIFY(model->mDetailTexts.count() == 4);
    delete model;
    model = 0;
    
    //VoIP call,only remote url,no contact name
    testDetailsDateAndTime.setTime_t( 3000 );
    event.setRemoteParty( testEmpty );
    event.setNumber( testEmpty );
    event.setTime( testDetailsDateAndTime );
    event.setDirection( testDetailsDirection );
    event.setEventType( testDetailsEventType );
    event.setDuration( testDetailsDuration );
    LogsEventData* eventData = new LogsEventData;
    eventData->mRemoteUrl = "tester@100.200.300.400";
    event.setLogsEventData( eventData );
    model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 4);
    QVERIFY(model->mDetailTexts.count() == 4);
    delete model;
    model = 0;
    
    //VoIP call,only remote url, contact name
    testDetailsDateAndTime.setTime_t( 3000 );
    event.setRemoteParty( testDetailsRemoteParty );
    event.setNumber( testEmpty );
    event.setTime( testDetailsDateAndTime );
    event.setDirection( testDetailsDirection );
    event.setEventType( testDetailsEventType );
    event.setDuration( testDetailsDuration );
    eventData = new LogsEventData;
    eventData->mRemoteUrl = "tester@100.200.300.400";
    event.setLogsEventData( eventData );
    model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 5);
    QVERIFY(model->mDetailTexts.count() == 5);
    delete model;
    model = 0;

    //VoIP call,remote uri and local uri, contact name
    testDetailsDateAndTime.setTime_t( 3000 );
    event.setRemoteParty( testDetailsRemoteParty );
    event.setNumber( testEmpty );
    event.setTime( testDetailsDateAndTime );
    event.setDirection( testDetailsDirection );
    event.setEventType( testDetailsEventType );
    event.setDuration( testDetailsDuration );
    eventData = new LogsEventData;
    eventData->mRemoteUrl = "tester@100.200.300.400";
    eventData->mLocalUrl = "caller@100.200.300.400";
    event.setLogsEventData( eventData );
    model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 5);
    QVERIFY(model->mDetailTexts.count() == 5);
    delete model;
    model = 0;
    
    // Missed call, duration is not shown
    // No VoIP call,no remote url or local url and contactname
    event.setRemoteParty( testDetailsRemoteParty );
    event.setNumber( testDetailsRemoteNum );
    event.setTime( testDetailsDateAndTime );
    event.setEventType( testDetailsEventType );
    event.setDirection( LogsEvent::DirMissed );
    model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 4);
    QVERIFY(model->mDetailTexts.count() == 4);
    delete model;
    model = 0;
}

void UT_LogsDetailsModel::testInitUnseenMissed()
{
    LogsDbConnectorStubHelper::reset();
    testDetailsDateAndTime.setTime_t( 3000 );
    QString dateAndTimeRowHeading;
    
    // No duplicates
    LogsEvent event;
    event.setRemoteParty( testDetailsRemoteParty );
    event.setNumber( testDetailsRemoteNum );
    event.setTime( testDetailsDateAndTime );
    event.setDirection( LogsEvent::DirMissed );
    event.setEventType( testDetailsEventType );
    event.setDuration( testDetailsDuration );
    LogsDetailsModel* model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 4);
    QVERIFY(model->mDetailTexts.count() == 4);
    QVERIFY(LogsDbConnectorStubHelper::lastCalledFunction().isEmpty());
    dateAndTimeRowHeading = model->mDetailTexts.at(1).at(0);
    delete model;
    model = 0;
    
    // Already read
    event.setIsRead(true);
    model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 4);
    QVERIFY(model->mDetailTexts.count() == 4);
    QVERIFY(LogsDbConnectorStubHelper::lastCalledFunction().isEmpty());
    delete model;
    model = 0;
    
    // Not read and duplicates exist
    event.setIsRead(false);
    event.setDuplicates(3);
    model = new LogsDetailsModel(*mDbConnector, event);
    QVERIFY(model->mDetailIcons.count() == 4);
    QVERIFY(model->mDetailTexts.count() == 4);
    QVERIFY(LogsDbConnectorStubHelper::lastCalledFunction() == "readDuplicates" );
    
    // Reading duplicates completes
    QSignalSpy spy( model, SIGNAL(modelReset()) );
    LogsEvent* dup1 = new LogsEvent;
    model->mDbConnector->mDuplicatedEvents.append(dup1);
    LogsEvent* dup2 = new LogsEvent;
    model->mDbConnector->mDuplicatedEvents.append(dup2);
    model->duplicatesRead();
    QVERIFY(model->mDetailIcons.count() == 6);
    QVERIFY(model->mDetailTexts.count() == 6);
    // When having multiple date and time items, first item has different heading than others
    QVERIFY( model->mDetailTexts.at(1).at(0) != dateAndTimeRowHeading );
    QVERIFY( model->mDetailTexts.at(5).at(0) == dateAndTimeRowHeading );
    delete model;
    model = 0;
    
}

void UT_LogsDetailsModel::testGetHeaderData()
{
    // No name or number
    LogsEvent event;
    QVERIFY( mModel->getHeaderData(event) == hbTrId("txt_dial_dblist_call_id_val_unknown_number") );

    // No name
    QString num("+12345555");
    event.setNumber(num);
    QVERIFY( mModel->getHeaderData(event) == num );
    
    // No number
    QString remote("Souuu");
    event.setRemoteParty(remote);
    event.setNumber("");
    QVERIFY( mModel->getHeaderData(event) == remote );
    
    // Both
    event.setNumber(num);
    QVERIFY( mModel->getHeaderData(event) == remote );
    
    // Only remote url
    event.setNumber("");
    event.setRemoteParty("");
    LogsEventData* eventData = new LogsEventData;
    eventData->mRemoteUrl = "test@1.2.3.4";
    event.setLogsEventData( eventData );
    QVERIFY( mModel->getHeaderData(event) == eventData->mRemoteUrl );
}


void UT_LogsDetailsModel::testGetCallerId()
{
    // No name or number
    LogsEvent event;
    QVERIFY( mModel->getCallerId(event) == QString("") );

    // No name
    QString num("+12345555");
    event.setNumber(num);
    QVERIFY( mModel->getCallerId(event) == QString("") );
    
    // No number
    QString remote("Souuu");
    event.setRemoteParty(remote);
    event.setNumber("");
    QVERIFY( mModel->getCallerId(event) == QString("") );
    
    // Both, check that number is converted to current local
    HbStubHelper::stringUtilDigitConversion(true);
    event.setNumber(num);
    QCOMPARE( mModel->getCallerId(event), "conv" + num );
    
    //Only number
    event.setRemoteParty("");
    QVERIFY( mModel->getCallerId(event) == QString("") );
    
    // Only remote url
    event.setNumber("");
    event.setRemoteParty("contactname");
    LogsEventData* eventData = new LogsEventData;
    eventData->mRemoteUrl = "test@1.2.3.4";
    event.setLogsEventData( eventData );
    QVERIFY( mModel->getCallerId(event) == eventData->mRemoteUrl );
}

void UT_LogsDetailsModel::testCreateContact()
{
    LogsEvent event;
    LogsModelItemContainer item(&event);
    LogsContact* contact = qVariantValue<LogsContact*>(mModel->createContact(item));
    QVERIFY( !contact );
    
    LogsEvent event2;
    event2.setNumber("2145");
    LogsModelItemContainer item2(&event2);
    contact = qVariantValue<LogsContact*>(mModel->createContact(item2));
    QVERIFY( contact );
    delete contact;
}

void UT_LogsDetailsModel::testContactActionCompleted()
{
    mModel->mDetailTexts.clear();
    mModel->contactActionCompleted(false);
    QVERIFY( mModel->mDetailTexts.count() == 0 );
    
    // No match
    mModel->mEvent->setRemoteParty( "" );
    mModel->mEvent->setNumber( "123445" );
    mModel->contactActionCompleted(true);
    QVERIFY( mModel->mDetailTexts.count() == 0 );
    QVERIFY( mModel->mEvent->remoteParty().length() == 0 );
    
    // Match
    QtContactsStubsHelper::setContactNames("first", "last");
    mModel->mEvent->setRemoteParty( "" );
    mModel->mEvent->setNumber( "11112222" );
    mModel->contactActionCompleted(true);
    QVERIFY( mModel->mDetailTexts.count() > 0 );
    QVERIFY( mModel->mEvent->remoteParty().length() > 0 );
}

void UT_LogsDetailsModel::testUpdateConfiguration()
{
    //Locale not changed, model not updated
    QCOMPARE( mModel->mDetailTexts.count(), 5 );
    LogsConfigurationParams params;
    QVERIFY( mModel->updateConfiguration(params) == 0 );
    QCOMPARE( mModel->mDetailTexts.count(), 5 );

    //Locale changed, model udpated
    params.setLocaleChanged(true);
    mModel->mEvent->setRemoteParty("");
    QVERIFY( mModel->updateConfiguration(params) == 0 );
    QCOMPARE( mModel->mDetailTexts.count(), 4 );
}