qtorganizer5-eds-0.1.1+16.04.20160317/ 0000755 0000156 0000165 00000000000 12672563136 017273 5 ustar pbuser pbgroup 0000000 0000000 qtorganizer5-eds-0.1.1+16.04.20160317/cmake/ 0000755 0000156 0000165 00000000000 12672563136 020353 5 ustar pbuser pbgroup 0000000 0000000 qtorganizer5-eds-0.1.1+16.04.20160317/cmake/lcov.cmake 0000644 0000156 0000165 00000005020 12672562647 022323 0 ustar pbuser pbgroup 0000000 0000000 # - This module creates a new 'lcov' target which generates
# a coverage analysis html output.
# LCOV is a graphical front-end for GCC's coverage testing tool gcov. Please see
# http://ltp.sourceforge.net/coverage/lcov.php
#
# Usage: you must add an option to your CMakeLists.txt to build your application
# with coverage support. Then you need to include this file to the lcov target.
#
# Example:
# IF(BUILD_WITH_COVERAGE)
# SET(CMAKE_C_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage")
# SET(CMAKE_CXX_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage")
# SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov")
# include(${CMAKE_SOURCE_DIR}/cmake/lcov.cmake)
# ENDIF(BUILD_WITH_COVERAGE)
#=============================================================================
# Copyright 2010 ascolab GmbH
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distributed this file outside of CMake, substitute the full
# License text for the above reference.)
set(REMOVE_PATTERN
q*.h
*.moc
moc_*.cpp
locale_facets.h
new
move.h)
## lcov target
ADD_CUSTOM_TARGET(lcov)
ADD_CUSTOM_COMMAND(TARGET lcov
COMMAND mkdir -p coverage
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
ADD_CUSTOM_COMMAND(TARGET lcov
COMMAND lcov --directory . --zerocounters
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
ADD_CUSTOM_COMMAND(TARGET lcov
COMMAND make test
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
ADD_CUSTOM_COMMAND(TARGET lcov
COMMAND lcov --directory . --capture --output-file ./coverage/stap_all.info --no-checksum --compat-libtool
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
ADD_CUSTOM_COMMAND(TARGET lcov
COMMAND lcov --directory . -r ./coverage/stap_all.info ${REMOVE_PATTERN} --output-file ./coverage/stap.info
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
ADD_CUSTOM_COMMAND(TARGET lcov
COMMAND genhtml -o ./coverage --title "Code Coverage" --legend --show-details --demangle-cpp ./coverage/stap.info
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
ADD_CUSTOM_COMMAND(TARGET lcov
COMMAND echo "Open ${CMAKE_BINARY_DIR}/coverage/index.html to view the coverage analysis results."
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
qtorganizer5-eds-0.1.1+16.04.20160317/cmake/chewieplugin.cmake 0000644 0000156 0000165 00000001777 12672562647 024062 0 ustar pbuser pbgroup 0000000 0000000 # -*- cmake -*-
# Generates a rule to create chewie plugin
#
# Typical use -
#
# SET(SRC_FILES head1.h head2.h head3.h)
# SET(LIBRARIES foolib barlib)
# SET(QT_MODULES Core Qml)
# SET(EXTRA_INCLUDE ${GLIB_INCLUDE_DIRS})
# CREATE_CHEWIE_PLUGIN(fooplugin LIBRARIES QT_MODULES EXTRA_INCLUDE SRC_FILES)
macro(CREATE_CHEWIE_PLUGIN PLUGIN_NAME PLUGIN_LINK_LIBRARIES PLUGIN_QT_MODULES PLUGIN_EXTRA_INCLUDE PLUGIN_SOURCE)
add_library(${PLUGIN_NAME} MODULE
${${PLUGIN_SOURCE}})
set_target_properties(${PLUGIN_NAME}
PROPERTIES PREFIX ""
LIBRARY_OUTPUT_DIRECTORY ${chewieplugins_BINARY_DIR})
target_link_libraries(${PLUGIN_NAME}
${${PLUGIN_LINK_LIBRARIES}})
qt5_use_modules(${PLUGIN_NAME} ${${PLUGIN_QT_MODULES}})
include_directories(
${libchewieui_SOURCE_DIR}
${${PLUGIN_EXTRA_INCLUDE}})
install(TARGETS ${PLUGIN_NAME}
LIBRARY DESTINATION ${CHEWIE_PLUGINS_DIR})
endmacro()
qtorganizer5-eds-0.1.1+16.04.20160317/tests/ 0000755 0000156 0000165 00000000000 12672563136 020435 5 ustar pbuser pbgroup 0000000 0000000 qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/ 0000755 0000156 0000165 00000000000 12672563136 022314 5 ustar pbuser pbgroup 0000000 0000000 qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/filter-test.cpp 0000644 0000156 0000165 00000015457 12672562647 025304 0 ustar pbuser pbgroup 0000000 0000000 /*
* Copyright 2015 Canonical Ltd.
*
* This file is part of qtorganizer5-eds.
*
* contact-service-app is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* contact-service-app 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include "qorganizer-eds-engine.h"
#include "eds-base-test.h"
using namespace QtOrganizer;
class FilterTest : public QObject, public EDSBaseTest
{
Q_OBJECT
private:
QOrganizerEDSEngine *m_engine;
void createCollection(QOrganizerCollection **collection)
{
QtOrganizer::QOrganizerManager::Error error;
*collection = new QOrganizerCollection();
(*collection)->setMetaData(QOrganizerCollection::KeyName,
uniqueCollectionName());
QSignalSpy createdCollection(m_engine,
SIGNAL(collectionsAdded(QList)));
bool saveResult = m_engine->saveCollection(*collection, &error);
QVERIFY(saveResult);
QCOMPARE(error, QtOrganizer::QOrganizerManager::NoError);
QTRY_COMPARE(createdCollection.count(), 1);
}
private Q_SLOTS:
void initTestCase()
{
EDSBaseTest::init();
m_engine = QOrganizerEDSEngine::createEDSEngine(QMap());
}
void cleanupTestCase()
{
delete m_engine;
EDSBaseTest::cleanup();
}
// test functions
void testFilterEventByCollectionId()
{
static QString displayLabelValue = QStringLiteral("Todo test %1 - %2");
static QString descriptionValue = QStringLiteral("Todo description %1 - %2");
QList items;
QDateTime currentDate = QDateTime::currentDateTime();
// create items on default collection
for(int i=0; i < 10; i++) {
QOrganizerEvent ev;
ev.setStartDateTime(currentDate);
ev.setEndDateTime(currentDate.addDays(1));
ev.setDisplayLabel(displayLabelValue.arg(i).arg("default"));
ev.setDescription(descriptionValue.arg(i).arg("default"));
items << ev;
}
// create items on new collection
QOrganizerCollection *collection;
createCollection(&collection);
for(int i=0; i < 10; i++) {
QOrganizerEvent ev;
ev.setCollectionId(collection->id());
ev.setStartDateTime(currentDate);
ev.setEndDateTime(currentDate.addDays(1));
ev.setDisplayLabel(displayLabelValue.arg(i).arg("new"));
ev.setDescription(descriptionValue.arg(i).arg("new"));
items << ev;
}
// save all items
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QtOrganizer::QOrganizerManager::NoError);
QOrganizerItemSortOrder sort;
QOrganizerItemFetchHint hint;
QOrganizerItemCollectionFilter filter;
// filter items from default collection
filter.setCollectionId(m_engine->defaultCollection(0).id());
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 10);
// check returned items
Q_FOREACH(const QOrganizerItem &i, items) {
QVERIFY(static_cast(i).displayLabel().endsWith("default"));
}
// filter items from new collection
filter.setCollectionId(collection->id());
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 10);
// check returned items
Q_FOREACH(const QOrganizerItem &i, items) {
QVERIFY(static_cast(i).displayLabel().endsWith("new"));
}
// filter items from both collections
QSet ids;
ids << m_engine->defaultCollection(0).id()
<< collection->id();
filter.setCollectionIds(ids);
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 20);
// filter using union filter
// filter events from new collection or ends with 'default'
QOrganizerItemUnionFilter uFilter;
filter.setCollectionId(collection->id());
QOrganizerItemDetailFieldFilter dFilter;
dFilter.setDetail(QOrganizerItemDetail::TypeDescription,
QOrganizerItemDescription::FieldDescription);
dFilter.setMatchFlags(QOrganizerItemFilter::MatchEndsWith);
dFilter.setValue("default");
uFilter.append(filter);
uFilter.append(dFilter);
items = m_engine->items(uFilter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 20);
// filter using intersection filter
// filter events from new collection and ends with 'new'
QOrganizerItemIntersectionFilter iFilter;
dFilter.setValue("new");
iFilter.append(filter);
iFilter.append(dFilter);
items = m_engine->items(iFilter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 10);
// check returned items
Q_FOREACH(const QOrganizerItem &i, items) {
QVERIFY(static_cast(i).displayLabel().endsWith("new"));
}
delete collection;
}
};
QTEST_MAIN(FilterTest)
#include "filter-test.moc"
qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/parseitem-test.cpp 0000644 0000156 0000165 00000000000 12672562647 025762 0 ustar pbuser pbgroup 0000000 0000000 qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/eds-base-test.h 0000644 0000156 0000165 00000002362 12672562647 025136 0 ustar pbuser pbgroup 0000000 0000000 /*
* Copyright 2013 Canonical Ltd.
*
* This file is part of ubuntu-pim-service.
*
* contact-service-app is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* contact-service-app 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef __EDS_BASE_TEST__
#define __EDS_BASE_TEST__
#include
#include
#include
class QOrganizerEDSEngine;
class EDSBaseTest
{
public:
EDSBaseTest();
~EDSBaseTest();
protected:
virtual void initTestCase();
virtual void init();
virtual void cleanup();
QString getEventFromEvolution(const QtOrganizer::QOrganizerItemId &id,
const QtOrganizer::QOrganizerCollectionId &collectionId = QtOrganizer::QOrganizerCollectionId());
QString uniqueCollectionName() const;
};
#endif
qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/collections-test.cpp 0000644 0000156 0000165 00000036573 12672562647 026337 0 ustar pbuser pbgroup 0000000 0000000 /*
* Copyright 2013 Canonical Ltd.
*
* This file is part of qtorganizer5-eds.
*
* contact-service-app is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* contact-service-app 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include "qorganizer-eds-engine.h"
#include "qorganizer-eds-source-registry.h"
#include "eds-base-test.h"
using namespace QtOrganizer;
class CollectionTest : public QObject, public EDSBaseTest
{
Q_OBJECT
private:
static const QString collectionTypePropertyName;
static const QString taskListTypeName;
QOrganizerEDSEngine *m_engineWrite;
QOrganizerEDSEngine *m_engineRead;
bool containsCollection(const QList &lst, const QOrganizerCollection &collection )
{
bool found = false;
Q_FOREACH(const QOrganizerCollection &col, lst) {
if (col.id() == collection.id()) {
found = true;
}
}
return found;
}
private Q_SLOTS:
void initTestCase()
{
EDSBaseTest::init();
m_engineWrite = QOrganizerEDSEngine::createEDSEngine(QMap());
m_engineRead = QOrganizerEDSEngine::createEDSEngine(QMap());
}
void cleanupTestCase()
{
delete m_engineRead;
delete m_engineWrite;
m_engineRead = 0;
m_engineWrite = 0;
EDSBaseTest::cleanup();
}
void testCreateTask()
{
static const QString collectionName = uniqueCollectionName();
static QString displayLabelValue = QStringLiteral("Todo test");
static QString descriptionValue = QStringLiteral("Todo description");
QOrganizerCollection collection;
QtOrganizer::QOrganizerManager::Error error;
collection.setMetaData(QOrganizerCollection::KeyName, collectionName);
collection.setExtendedMetaData(collectionTypePropertyName, taskListTypeName);
QSignalSpy createCollection(m_engineRead, SIGNAL(collectionsAdded(QList)));
QVERIFY(m_engineWrite->saveCollection(&collection, &error));
QVERIFY(!collection.id().isNull());
QTRY_COMPARE(createCollection.count(), 1);
QOrganizerTodo todo;
todo.setCollectionId(collection.id());
todo.setStartDateTime(QDateTime::currentDateTime());
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QMap errorMap;
QList items;
QSignalSpy createdItem(m_engineRead, SIGNAL(itemsAdded(QList)));
items << todo;
bool saveResult = m_engineWrite->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
QVERIFY(!items[0].id().isNull());
//verify signal
QTRY_COMPARE(createdItem.count(), 1);
QCOMPARE(createdItem.takeFirst().count(), 1);
// check if the item is listead inside the correct collection
QOrganizerItemSortOrder sort;
QOrganizerItemFetchHint hint;
QOrganizerItemCollectionFilter filter;
filter.setCollectionId(collection.id());
items = m_engineRead->items(filter,
QDateTime(),
QDateTime(),
10,
sort,
hint,
&error);
QCOMPARE(items.count(), 1);
QOrganizerTodo result = static_cast(items[0]);
todo = items[0];
QCOMPARE(result.id(), todo.id());
QCOMPARE(result.startDateTime(), todo.startDateTime());
QCOMPARE(result.displayLabel(), todo.displayLabel());
QCOMPARE(result.description(), todo.description());
// check if the item is listead by id
QList ids;
ids << todo.id();
items = m_engineRead->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
result = static_cast(items[0]);
todo = items[0];
QCOMPARE(result.id(), todo.id());
QCOMPARE(result.startDateTime(), todo.startDateTime());
QCOMPARE(result.displayLabel(), todo.displayLabel());
QCOMPARE(result.description(), todo.description());
}
void testCreateCollection()
{
static const QString collectionName = uniqueCollectionName();
QOrganizerCollection collection;
QtOrganizer::QOrganizerManager::Error error;
collection.setMetaData(QOrganizerCollection::KeyName, collectionName);
collection.setMetaData(QOrganizerCollection::KeyColor, QStringLiteral("red"));
QList collections = m_engineRead->collections(&error);
int initalCollectionCount = collections.count();
QSignalSpy createCollection(m_engineRead, SIGNAL(collectionsAdded(QList)));
QVERIFY(m_engineWrite->saveCollection(&collection, &error));
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(!collection.id().isNull());
QTRY_COMPARE(createCollection.count(), 1);
collections = m_engineWrite->collections(&error);
QCOMPARE(collections.count(), initalCollectionCount + 1);
collections = m_engineRead->collections(&error);
QCOMPARE(collections.count(), initalCollectionCount + 1);
// Check if data was correct saved
QOrganizerCollection newCollection = m_engineRead->collection(collection.id(), &error);
QCOMPARE(error, QOrganizerManager::NoError);
QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyName).toString(), collectionName);
QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyColor).toString(), QStringLiteral("red"));
QCOMPARE(newCollection.extendedMetaData("collection-type").toString(), QStringLiteral("Calendar"));
QCOMPARE(newCollection.extendedMetaData("collection-selected").toBool(), false);
}
void testUpdateCollection()
{
static const QString collectionName = uniqueCollectionName();
QOrganizerCollection collection;
QtOrganizer::QOrganizerManager::Error error;
collection.setMetaData(QOrganizerCollection::KeyName, collectionName);
collection.setMetaData(QOrganizerCollection::KeyColor, QStringLiteral("red"));
collection.setExtendedMetaData(QStringLiteral("collection-selected"), false);
QSignalSpy collectionCreated(m_engineRead, SIGNAL(collectionsAdded(QList)));
QVERIFY(m_engineWrite->saveCollection(&collection, &error));
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(!collection.id().isNull());
QTRY_COMPARE(collectionCreated.count(), 1);
// wait for the collection to became writable
QTRY_COMPARE_WITH_TIMEOUT(collection.extendedMetaData(QStringLiteral(COLLECTION_READONLY_METADATA)).toBool(), true, 10000);
// Check if the collection was stored correct
QOrganizerCollection newCollection = m_engineRead->collection(collection.id(), &error);
QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyName).toString(), collectionName);
QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyColor).toString(), QStringLiteral("red"));
QCOMPARE(newCollection.extendedMetaData(QStringLiteral("collection-selected")).toBool(), false);
// wait collection to became writable
QTRY_VERIFY_WITH_TIMEOUT(!m_engineRead->collection(newCollection.id(), 0).extendedMetaData("collection-readonly").toBool(), 5000);
// update the collection
QSignalSpy updateCollection(m_engineRead, SIGNAL(collectionsChanged(QList)));
collection.setMetaData(QOrganizerCollection::KeyColor, "blue");
collection.setExtendedMetaData("collection-selected", true);
QVERIFY(m_engineWrite->saveCollection(&collection, &error));
QCOMPARE(error, QOrganizerManager::NoError);
QTRY_VERIFY(updateCollection.count() > 0);
QList args = updateCollection.takeFirst();
QCOMPARE(args.count(), 1);
QCOMPARE(args[0].value >().at(0).toString(), collection.id().toString());
// Check if the collection was updated correct
newCollection = m_engineRead->collection(collection.id(), &error);
QCOMPARE(error, QOrganizerManager::NoError);
QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyName).toString(), collectionName);
QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyColor).toString(), QStringLiteral("blue"));
QCOMPARE(newCollection.extendedMetaData("collection-selected").toBool(), true);
}
void testCreateTaskList()
{
static const QString collectionName = uniqueCollectionName() + QStringLiteral("_TASKS") ;
QOrganizerCollection collection;
QtOrganizer::QOrganizerManager::Error error;
collection.setMetaData(QOrganizerCollection::KeyName, collectionName);
collection.setExtendedMetaData(collectionTypePropertyName, taskListTypeName);
QSignalSpy createdCollection(m_engineRead, SIGNAL(collectionsAdded(QList)));
QVERIFY(m_engineWrite->saveCollection(&collection, &error));
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(!collection.id().isNull());
//verify signal
QTRY_COMPARE(createdCollection.count(), 1);
QList args = createdCollection.takeFirst();
QCOMPARE(args.count(), 1);
QVERIFY(containsCollection(m_engineWrite->collections(&error), collection));
QVERIFY(containsCollection(m_engineRead->collections(&error), collection));
}
void testRemoveCollection()
{
static QString removableCollectionName = uniqueCollectionName();
// Create a collection
QOrganizerCollection collection;
QtOrganizer::QOrganizerManager::Error error;
collection.setMetaData(QOrganizerCollection::KeyName, removableCollectionName);
QList collections = m_engineRead->collections(&error);
int initalCollectionCount = collections.count();
QSignalSpy createCollection(m_engineRead, SIGNAL(collectionsAdded(QList)));
QVERIFY(m_engineWrite->saveCollection(&collection, &error));
QTRY_COMPARE(createCollection.count(), 1);
// wait collection to became writable
QTRY_VERIFY_WITH_TIMEOUT(!m_engineRead->collection(collection.id(), 0).extendedMetaData("collection-readonly").toBool(), 5000);
// remove recent created collection
QSignalSpy removeCollection(m_engineRead, SIGNAL(collectionsRemoved(QList)));
QVERIFY(m_engineWrite->removeCollection(collection.id(), &error));
QTRY_COMPARE(removeCollection.count(), 1);
collections = m_engineWrite->collections(&error);
QCOMPARE(collections.count(), initalCollectionCount);
QVERIFY(!containsCollection(collections, collection));
collections = m_engineRead->collections(&error);
QCOMPARE(collections.count(), initalCollectionCount);
QVERIFY(!containsCollection(collections, collection));
}
void testReadOnlyCollection()
{
// check if the anniversaries collection is read-only
static const QString anniversariesCollectionName = QStringLiteral("Birthdays & Anniversaries");
QtOrganizer::QOrganizerManager::Error error;
QList collections = m_engineRead->collections(&error);
Q_FOREACH(const QOrganizerCollection &col, collections) {
if (col.metaData(QOrganizerCollection::KeyName) == anniversariesCollectionName) {
QVERIFY(col.extendedMetaData("collection-readonly").toBool());
}
}
}
void testCreateNewDefaultCollection()
{
static QString newCollection = uniqueCollectionName();
// Create a new default collection
QOrganizerCollection collection;
QtOrganizer::QOrganizerManager::Error error;
collection.setMetaData(QOrganizerCollection::KeyName, newCollection);
collection.setMetaData(QOrganizerCollection::KeyColor, QStringLiteral("red"));
collection.setExtendedMetaData(QStringLiteral("collection-selected"), true);
collection.setExtendedMetaData(QStringLiteral("collection-default"), true);
QSignalSpy createdCollection(m_engineRead, SIGNAL(collectionsAdded(QList)));
QVERIFY(m_engineWrite->saveCollection(&collection, &error));
// create collection
QTRY_COMPARE(createdCollection.count(), 1);
// wait collection to became the default one
QTRY_COMPARE_WITH_TIMEOUT(m_engineRead->defaultCollection(0).id(), collection.id(), 5000);
}
void testUpdateDefaultCollection()
{
static QString newCollectionId = uniqueCollectionName();
// store current default collection
QOrganizerCollection defaultCollection = m_engineRead->defaultCollection(0);
// Create a collection
QOrganizerCollection collection;
QtOrganizer::QOrganizerManager::Error error;
collection.setMetaData(QOrganizerCollection::KeyName, newCollectionId);
QSignalSpy createCollection(m_engineRead, SIGNAL(collectionsAdded(QList)));
QVERIFY(m_engineWrite->saveCollection(&collection, &error));
QTRY_COMPARE(createCollection.count(), 1);
// wait collection to became writable
QTRY_VERIFY_WITH_TIMEOUT(!m_engineRead->collection(collection.id(), 0).extendedMetaData("collection-readonly").toBool(), 5000);
// make sure that the new collection is not default
QOrganizerCollection newCollection = m_engineRead->collection(collection.id(), 0);
QCOMPARE(newCollection.extendedMetaData(QStringLiteral("collection-default")).toBool(), false);
QVERIFY(newCollection.id() != defaultCollection.id());
// mark new collection as default
QSignalSpy changedCollection(m_engineRead, SIGNAL(collectionsChanged(QList)));
newCollection.setExtendedMetaData(QStringLiteral("collection-default"), true);
QVERIFY(m_engineWrite->saveCollection(&newCollection, &error));
// old default collection will change, and the new one
QTRY_COMPARE(changedCollection.count() , 3);
// wait collection to became the default one
QTRY_COMPARE_WITH_TIMEOUT(m_engineRead->defaultCollection(0).id(), newCollection.id(), 5000);
}
};
const QString CollectionTest::collectionTypePropertyName = QStringLiteral("collection-type");
const QString CollectionTest::taskListTypeName = QStringLiteral("Task List");
QTEST_MAIN(CollectionTest)
#include "collections-test.moc"
qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/eds-base-test.cpp 0000644 0000156 0000165 00000006634 12672562647 025477 0 ustar pbuser pbgroup 0000000 0000000 /*
* Copyright 2013 Canonical Ltd.
*
* This file is part of ubuntu-pim-service.
*
* contact-service-app is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* contact-service-app 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "config.h"
#include "eds-base-test.h"
#include "qorganizer-eds-engine.h"
#include
#include
#include
using namespace QtOrganizer;
class GScopedPointerUnref
{
public:
static inline void cleanup(void *pointer)
{
if (pointer) {
g_clear_object(&pointer);
}
}
};
template
class GScopedPointer : public QScopedPointer
{
public:
GScopedPointer(KLASS* obj = 0)
: QScopedPointer(obj)
{}
};
EDSBaseTest::EDSBaseTest()
{
qRegisterMetaType >();
qRegisterMetaType >();
qRegisterMetaType >();
QCoreApplication::addLibraryPath(QORGANIZER_DEV_PATH);
}
EDSBaseTest::~EDSBaseTest()
{
}
void EDSBaseTest::initTestCase()
{
QTest::qWait(1000);
}
void EDSBaseTest::init()
{
}
void EDSBaseTest::cleanup()
{
QTest::qWait(1000);
}
QString EDSBaseTest::getEventFromEvolution(const QOrganizerItemId &id,
const QOrganizerCollectionId &collectionId)
{
QString uid = id.toString().split("/").last();
GError *error = 0;
GScopedPointer sourceRegistry(e_source_registry_new_sync(0, &error));
if (error) {
qWarning() << "Fail to create source registry" << error->message;
g_error_free(error);
return QString();
}
GScopedPointer calendar;
if (collectionId.isNull()) {
calendar.reset(e_source_registry_ref_default_calendar(sourceRegistry.data()));
} else {
calendar.reset(e_source_registry_ref_source(sourceRegistry.data(),
collectionId.toString().toUtf8().data()));
}
GScopedPointer client(E_CAL_CLIENT_CONNECT_SYNC(calendar.data(),
E_CAL_CLIENT_SOURCE_TYPE_EVENTS,
0,
&error));
if (error) {
qWarning() << "Fail to connect to calendar" << error->message;
g_error_free(error);
return QString();
}
icalcomponent *obj = 0;
e_cal_client_get_object_sync(reinterpret_cast(client.data()),
uid.toUtf8().data(), 0, &obj, 0, &error);
if (error) {
qWarning() << "Fail to retrieve object:" << error->message;
g_error_free(error);
}
QString result = QString::fromUtf8(icalcomponent_as_ical_string(obj));
icalcomponent_free (obj);
return result;
}
QString EDSBaseTest::uniqueCollectionName() const
{
return QUuid::createUuid().toString();
}
qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/fetchitem-test.cpp 0000644 0000156 0000165 00000013415 12672562647 025757 0 ustar pbuser pbgroup 0000000 0000000 /*
* Copyright 2013 Canonical Ltd.
*
* This file is part of qtorganizer5-eds.
*
* contact-service-app is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* contact-service-app 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include "qorganizer-eds-engine.h"
#include "qorganizer-eds-requestdata.h"
#include "eds-base-test.h"
using namespace QtOrganizer;
class FetchItemTest : public QObject, public EDSBaseTest
{
Q_OBJECT
private:
QOrganizerEDSEngine *m_engine;
QOrganizerCollection m_collection;
QList m_events;
private Q_SLOTS:
void initTestCase()
{
EDSBaseTest::initTestCase();
const QString collectionName = uniqueCollectionName();
EDSBaseTest::init();
m_engine = QOrganizerEDSEngine::createEDSEngine(QMap());
// create test collection
m_collection = QOrganizerCollection();
QtOrganizer::QOrganizerManager::Error error;
m_collection.setMetaData(QOrganizerCollection::KeyName, collectionName);
QVERIFY(m_engine->saveCollection(&m_collection, &error));
// create test events
static QString displayLabelValue = QStringLiteral("Display Label %1");
static QString descriptionValue = QStringLiteral("Description event %1");
// use this becaue EDS does not store msecs
QTime currentTime = QTime::currentTime();
QDateTime date = QDateTime(QDateTime::currentDateTime().date(), QTime(currentTime.hour(), currentTime.minute(), currentTime.second()));
m_events.clear();
for(int i=0; i<10; i++) {
QOrganizerEvent ev;
ev.setCollectionId(m_collection.id());
ev.setStartDateTime(date);
ev.setEndDateTime(date.addSecs(60*30));
ev.setDisplayLabel(displayLabelValue.arg(i));
ev.setDescription(descriptionValue.arg(i));
QList evs;
evs << ev;
QMap errorMap;
bool saveResult = m_engine->saveItems(&evs,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
m_events << evs[0];
date = date.addDays(1);
}
}
void cleanupTestCase()
{
m_collection = QOrganizerCollection();
m_events.clear();
delete m_engine;
m_engine = 0;
EDSBaseTest::cleanup();
}
void cleanup()
{
QTRY_COMPARE(RequestData::instanceCount(), 0);
}
void testFetchById()
{
QList request;
request << m_events[4].id();
QOrganizerItemFetchByIdRequest req;
req.setIds(request);
m_engine->startRequest(&req);
m_engine->waitForRequestFinished(&req, 0);
QList expected;
expected << m_events[4];
QCOMPARE(expected.size(), req.items().size());
QList dr = req.items()[0].details();
Q_FOREACH(const QOrganizerItemDetail &de, m_events[4].details()) {
Q_FOREACH(const QOrganizerItemDetail &d, dr) {
if (de.type() == d.type()) {
if (de != d) {
qDebug() << "Detail not equal";
qDebug() << "\t" << de;
qDebug() << "\t" << d;
QFAIL("Retrieved item is not equal");
}
}
}
}
}
void testFetchWithInvalidId()
{
// malformated id
QList request;
request << QOrganizerItemId::fromString("qorganizer:eds::invalidcollection/invalidcontact");
QOrganizerItemFetchByIdRequest req;
req.setIds(request);
m_engine->startRequest(&req);
m_engine->waitForRequestFinished(&req, 0);
QCOMPARE(req.items().size(), 0);
QMap errors = req.errorMap();
QCOMPARE(errors.size(), 1);
QCOMPARE(errors[0], QOrganizerManager::DoesNotExistError);
// id does not exists
request.clear();
request << QOrganizerItemId::fromString("qtorganizer:eds::1386099272.14397.0@organizer/20131203T193432Z-14397-1000-14367-9@organizer");
QOrganizerItemFetchByIdRequest reqNotFound;
reqNotFound.setIds(request);
m_engine->startRequest(&reqNotFound);
m_engine->waitForRequestFinished(&reqNotFound, 0);
QCOMPARE(reqNotFound.items().size(), 0);
errors = reqNotFound.errorMap();
QCOMPARE(errors.size(), 1);
QCOMPARE(errors[0], QOrganizerManager::DoesNotExistError);
}
void testFetchWithoutDate()
{
QOrganizerItemFilter filter;
QOrganizerItemFetchHint hint;
QOrganizerManager::Error error;
QList sort;
QList result = m_engine->items(filter, QDateTime(), QDateTime(), 100, sort, hint, &error);
QCOMPARE(result.size(), 10);
}
};
QTEST_MAIN(FetchItemTest)
#include "fetchitem-test.moc"
qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/event-test.cpp 0000644 0000156 0000165 00000151647 12672562647 025142 0 ustar pbuser pbgroup 0000000 0000000 /*
* Copyright 2013 Canonical Ltd.
*
* This file is part of qtorganizer5-eds.
*
* contact-service-app is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* contact-service-app 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include "qorganizer-eds-engine.h"
#include "eds-base-test.h"
using namespace QtOrganizer;
class EventTest : public QObject, public EDSBaseTest
{
Q_OBJECT
private:
static const QString collectionTypePropertyName;
static const QString taskListTypeName;
static int signalIndex;
QDateTime m_itemRemovedTime;
QDateTime m_requestFinishedTime;
QOrganizerEDSEngine *m_engine;
QOrganizerCollection m_collection;
private Q_SLOTS:
void initTestCase()
{
EDSBaseTest::init();
m_engine = QOrganizerEDSEngine::createEDSEngine(QMap());
QtOrganizer::QOrganizerManager::Error error;
m_collection = QOrganizerCollection();
m_collection.setMetaData(QOrganizerCollection::KeyName, uniqueCollectionName());
m_collection.setExtendedMetaData(collectionTypePropertyName, taskListTypeName);
QSignalSpy createdCollection(m_engine, SIGNAL(collectionsAdded(QList)));
bool saveResult = m_engine->saveCollection(&m_collection, &error);
QVERIFY(saveResult);
QCOMPARE(error, QtOrganizer::QOrganizerManager::NoError);
QTRY_COMPARE(createdCollection.count(), 1);
}
void cleanupTestCase()
{
delete m_engine;
EDSBaseTest::cleanup();
}
void init()
{
signalIndex = 0;
m_itemRemovedTime = QDateTime();
m_requestFinishedTime = QDateTime();
}
//helper
void itemRemoved()
{
m_itemRemovedTime = QDateTime::currentDateTime();
// avoid both signals to be fired at the same time
QTest::qSleep(100);
}
void requestFinished(QOrganizerAbstractRequest::State state)
{
if (state == QOrganizerAbstractRequest::FinishedState) {
m_requestFinishedTime = QDateTime::currentDateTime();
// avoid both signals to be fired at the same time
QTest::qSleep(100);
}
}
// test functions
void testCreateEventWithReminder()
{
static QString displayLabelValue = QStringLiteral("Todo test");
static QString descriptionValue = QStringLiteral("Todo description");
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(QDateTime::currentDateTime());
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QOrganizerItemVisualReminder vReminder;
vReminder.setDataUrl(QUrl("http://www.alarms.com"));
vReminder.setMessage("Test visual reminder");
QOrganizerItemAudibleReminder aReminder;
aReminder.setSecondsBeforeStart(10);
aReminder.setRepetition(10, 20);
aReminder.setDataUrl(QUrl("file://home/user/My Musics/play as alarm.wav"));
todo.saveDetail(&aReminder);
todo.saveDetail(&vReminder);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QtOrganizer::QOrganizerManager::NoError);
QOrganizerItemSortOrder sort;
QOrganizerItemFetchHint hint;
QOrganizerItemIdFilter filter;
QList ids;
ids << items[0].id();
filter.setIds(ids);
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
10,
sort,
hint,
&error);
QCOMPARE(items.count(), 1);
// audible
QList reminders = items[0].details(QOrganizerItemDetail::TypeAudibleReminder);
QCOMPARE(reminders.size(), 1);
QOrganizerItemAudibleReminder aReminder2 = reminders[0];
QCOMPARE(aReminder2.secondsBeforeStart(), aReminder.secondsBeforeStart());
QCOMPARE(aReminder2.repetitionCount(), aReminder.repetitionCount());
QCOMPARE(aReminder2.repetitionDelay(), aReminder.repetitionDelay());
QCOMPARE(aReminder2.dataUrl(), aReminder.dataUrl());
//QCOMPARE(aReminder2, aReminder);
// visual
reminders = items[0].details(QOrganizerItemDetail::TypeVisualReminder);
QCOMPARE(reminders.size(), 1);
QOrganizerItemVisualReminder vReminder2 = reminders[0];
//vReminder.setRepetition(1, 0);
QCOMPARE(vReminder2.secondsBeforeStart(), vReminder.secondsBeforeStart());
QCOMPARE(vReminder2.repetitionCount(), vReminder.repetitionCount());
QCOMPARE(vReminder2.repetitionDelay(), vReminder.repetitionDelay());
QCOMPARE(vReminder2.dataUrl(), vReminder.dataUrl());
QCOMPARE(vReminder2.message(), vReminder.message());
}
void testCreateEventWithEmptyReminder()
{
static QString displayLabelValue = QStringLiteral("Todo test with empty reminder");
static QString descriptionValue = QStringLiteral("Todo description with empty reminder");
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(QDateTime::currentDateTime());
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QOrganizerItemVisualReminder vReminder;
vReminder.setDataUrl(QUrl(""));
vReminder.setMessage("reminder message");
QOrganizerItemAudibleReminder aReminder;
aReminder.setSecondsBeforeStart(0);
aReminder.setDataUrl(QString());
todo.saveDetail(&aReminder);
todo.saveDetail(&vReminder);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QtOrganizer::QOrganizerManager::NoError);
QOrganizerItemSortOrder sort;
QOrganizerItemFetchHint hint;
QOrganizerItemIdFilter filter;
QList ids;
ids << items[0].id();
filter.setIds(ids);
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
10,
sort,
hint,
&error);
QCOMPARE(items.count(), 1);
// audible
QList reminders = items[0].details(QOrganizerItemDetail::TypeAudibleReminder);
QCOMPARE(reminders.size(), 1);
QOrganizerItemAudibleReminder aReminder2 = reminders[0];
QCOMPARE(aReminder2.isEmpty(), false);
QCOMPARE(aReminder2.secondsBeforeStart(), 0);
QCOMPARE(aReminder2.repetitionCount(), 0);
QCOMPARE(aReminder2.repetitionDelay(), 0);
QVERIFY(aReminder2.dataUrl().isEmpty());
// visual
reminders = items[0].details(QOrganizerItemDetail::TypeVisualReminder);
QCOMPARE(reminders.size(), 1);
QOrganizerItemVisualReminder vReminder2 = reminders[0];
//vReminder.setRepetition(1, 0);
QCOMPARE(vReminder2.isEmpty(), false);
QCOMPARE(vReminder2.secondsBeforeStart(), vReminder.secondsBeforeStart());
QCOMPARE(vReminder2.repetitionCount(), vReminder.repetitionCount());
QCOMPARE(vReminder2.repetitionDelay(), vReminder.repetitionDelay());
QVERIFY(vReminder2.dataUrl().isEmpty());
QCOMPARE(vReminder2.message(), QString("reminder message"));
}
void testRemoveEvent()
{
static QString displayLabelValue = QStringLiteral("event to be removed");
static QString descriptionValue = QStringLiteral("removable event");
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(QDateTime::currentDateTime());
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QCOMPARE(items.size(), 1);
QVERIFY(errorMap.isEmpty());
QVERIFY(!items[0].id().isNull());
QOrganizerItemRemoveRequest req;
connect(&req, SIGNAL(stateChanged(QOrganizerAbstractRequest::State)),
this, SLOT(requestFinished(QOrganizerAbstractRequest::State)));
connect(m_engine, SIGNAL(itemsRemoved(QList)),
this, SLOT(itemRemoved()));
req.setItem(items[0]);
m_engine->startRequest(&req);
m_engine->waitForRequestFinished(&req, -1);
// check if the signal item removed was fired after the request finish
QTRY_VERIFY(m_requestFinishedTime.isValid());
QTRY_VERIFY(m_itemRemovedTime.isValid());
if (m_itemRemovedTime < m_requestFinishedTime) {
qDebug() << "Item removed before request finish";
qDebug() << "Removed time" << m_itemRemovedTime;
qDebug() << "RequestFinished time" << m_requestFinishedTime;
}
QVERIFY(m_itemRemovedTime >= m_requestFinishedTime);
}
void testRemoveItemById()
{
static QString displayLabelValue = QStringLiteral("event to be removed");
static QString descriptionValue = QStringLiteral("removable event");
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(QDateTime::currentDateTime());
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
QOrganizerItemId id = items[0].id();
QVERIFY(!id.isNull());
QOrganizerItemRemoveByIdRequest req;
connect(&req, SIGNAL(stateChanged(QOrganizerAbstractRequest::State)),
this, SLOT(requestFinished(QOrganizerAbstractRequest::State)));
connect(m_engine, SIGNAL(itemsRemoved(QList)),
this, SLOT(itemRemoved()));
req.setItemId(id);
m_engine->startRequest(&req);
m_engine->waitForRequestFinished(&req, -1);
// check if the signal item removed was fired after the request finish
QTRY_VERIFY(m_requestFinishedTime.isValid());
QTRY_VERIFY(m_itemRemovedTime.isValid());
QVERIFY(m_itemRemovedTime > m_requestFinishedTime);
// check if item was removed
QOrganizerItemSortOrder sort;
QOrganizerItemFetchHint hint;
QOrganizerItemIdFilter filter;
QList ids;
ids << id;
filter.setIds(ids);
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
10,
sort,
hint,
&error);
QCOMPARE(items.count(), 0);
}
void testCreateEventWithoutCollection()
{
static QString displayLabelValue = QStringLiteral("event without collection");
static QString descriptionValue = QStringLiteral("event without collection");
QOrganizerEvent event;
event.setStartDateTime(QDateTime::currentDateTime());
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << event;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
QVERIFY(!items[0].id().isNull());
// check if item was created on the default collection
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, 0, 0);
QCOMPARE(items.count(), 1);
QOrganizerCollection collection = m_engine->defaultCollection(0);
QCOMPARE(items[0].collectionId(), collection.id());
}
void testCreateMultipleItemsWithSameCollection()
{
static QString displayLabelValue = QStringLiteral("Multiple Item:%1");
static QString descriptionValue = QStringLiteral("Multiple Item desc:%1");
QList evs;
for(int i=0; i<10; i++) {
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(QDateTime::currentDateTime());
todo.setDisplayLabel(displayLabelValue.arg(i));
todo.setDescription(descriptionValue.arg(i));
evs << todo;
}
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
bool saveResult = m_engine->saveItems(&evs,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
QCOMPARE(evs.count(), 10);
Q_FOREACH(const QOrganizerItem &i, evs) {
QVERIFY(!i.id().isNull());
}
}
void testCreateMultipleItemsWithDiffCollections()
{
static QString displayLabelValue = QStringLiteral("Multiple Item:%1");
static QString descriptionValue = QStringLiteral("Multiple Item desc:%1");
QList evs;
for(int i=0; i<10; i++) {
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(QDateTime(QDate(2013, 9, 3+1), QTime(0,30,0)));
todo.setDisplayLabel(displayLabelValue.arg(i));
todo.setDescription(descriptionValue.arg(i));
evs << todo;
}
QtOrganizer::QOrganizerManager::Error error;
QOrganizerCollection eventCollection = QOrganizerCollection();
eventCollection.setMetaData(QOrganizerCollection::KeyName, uniqueCollectionName());
bool saveResult = m_engine->saveCollection(&eventCollection, &error);
QVERIFY(saveResult);
for(int i=0; i<10; i++) {
QOrganizerEvent ev;
ev.setCollectionId(eventCollection.id());
ev.setStartDateTime(QDateTime(QDate(2013, 10, 3+1), QTime(0,30,0)));
ev.setDisplayLabel(displayLabelValue.arg(i));
ev.setDescription(descriptionValue.arg(i));
evs << ev;
}
QMap errorMap;
saveResult = m_engine->saveItems(&evs,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
QCOMPARE(evs.count(), 20);
Q_FOREACH(const QOrganizerItem &i, evs) {
QVERIFY(!i.id().isNull());
}
}
void testCauseErrorDuringCreateMultipleItems()
{
static QString displayLabelValue = QStringLiteral("Multiple Item:%1");
static QString descriptionValue = QStringLiteral("Multiple Item desc:%1");
QList evs;
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(QDateTime(QDate(2013, 9, 1), QTime(0,30,0)));
todo.setDisplayLabel(displayLabelValue.arg(1));
todo.setDescription(descriptionValue.arg(1));
evs << todo;
// This item will cause error, because the collection ID is invalid
QOrganizerEvent ev;
QOrganizerEDSCollectionEngineId *edsCollectionId = new QOrganizerEDSCollectionEngineId("XXXXXX");
QOrganizerCollectionId cid(edsCollectionId);
QVERIFY(!cid.isNull());
QCOMPARE(cid.toString(), QStringLiteral("qtorganizer:eds::XXXXXX"));
ev.setCollectionId(cid);
ev.setStartDateTime(QDateTime(QDate(2013, 10, 2), QTime(0,30,0)));
ev.setDisplayLabel(displayLabelValue.arg(2));
ev.setDescription(descriptionValue.arg(2));
evs << ev;
todo.setStartDateTime(QDateTime(QDate(2013, 9, 3), QTime(0,30,0)));
todo.setDisplayLabel(displayLabelValue.arg(3));
todo.setDescription(descriptionValue.arg(3));
evs << todo;
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
bool saveResult = m_engine->saveItems(&evs,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QCOMPARE(evs.count(), 2);
QCOMPARE(errorMap.size(), 1);
QCOMPARE(errorMap[1], QOrganizerManager::InvalidCollectionError);
}
void testCreateAllDayTodo()
{
static QString displayLabelValue = QStringLiteral("All day title");
static QString descriptionValue = QStringLiteral("All day description");
QDateTime eventDateTime = QDateTime(QDate(2013, 9, 3), QTime(0,30,0));
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setAllDay(true);
todo.setStartDateTime(eventDateTime);
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
QOrganizerItemId id = items[0].id();
QVERIFY(!id.isNull());
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
QOrganizerTodo todoResult = static_cast(items[0]);
QCOMPARE(todoResult.isAllDay(), true);
QCOMPARE(todoResult.startDateTime().date(), eventDateTime.date());
QCOMPARE(todoResult.startDateTime().time(), QTime(0, 0, 0));
}
void testCreateAllDayEvent()
{
static QString displayLabelValue = QStringLiteral("All day title");
static QString descriptionValue = QStringLiteral("All day description");
QDateTime eventDateTime = QDateTime(QDate(2013, 9, 3), QTime(0,30,0));
QOrganizerEvent event;
event.setStartDateTime(eventDateTime);
event.setEndDateTime(eventDateTime.addDays(1));
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
event.setAllDay(true);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << event;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
QOrganizerItemId id = items[0].id();
QVERIFY(!id.isNull());
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
QOrganizerEvent eventResult = static_cast(items[0]);
QCOMPARE(eventResult.isAllDay(), true);
QCOMPARE(eventResult.startDateTime().date(), eventDateTime.date());
QCOMPARE(eventResult.startDateTime().time(), QTime(0, 0, 0));
QCOMPARE(eventResult.endDateTime().date(), eventDateTime.date().addDays(1));
QCOMPARE(eventResult.endDateTime().time(), QTime(0, 0, 0));
}
void testModifyAllDayEvent()
{
static QString displayLabelValue = QStringLiteral("All day title");
static QString descriptionValue = QStringLiteral("All day description");
QDateTime eventDateTime = QDateTime(QDate(2013, 9, 3), QTime(0,30,0));
QOrganizerEvent event;
event.setStartDateTime(eventDateTime);
event.setEndDateTime(eventDateTime.addDays(1));
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
event.setAllDay(true);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << event;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QOrganizerEvent eventResult = static_cast(items[0]);
eventResult.setDescription(QStringLiteral("New description"));
items.clear();
items << eventResult;
saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
eventResult = static_cast(items[0]);
QCOMPARE(eventResult.description(), QStringLiteral("New description"));
QCOMPARE(eventResult.isAllDay(), true);
QCOMPARE(eventResult.startDateTime().date(), eventDateTime.date());
QCOMPARE(eventResult.startDateTime().time(), QTime(0, 0, 0));
QCOMPARE(eventResult.endDateTime().date(), eventDateTime.date().addDays(1));
QCOMPARE(eventResult.endDateTime().time(), QTime(0, 0, 0));
}
void testCreateAllDayEventWithInvalidEndDate()
{
static QString displayLabelValue = QStringLiteral("All day title");
static QString descriptionValue = QStringLiteral("All day description");
QDateTime eventDateTime = QDateTime(QDate(2013, 9, 3), QTime(0,30,0));
QOrganizerEvent event;
event.setStartDateTime(eventDateTime);
event.setEndDateTime(eventDateTime.addDays(-10));
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
event.setAllDay(true);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << event;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
QOrganizerItemId id = items[0].id();
QVERIFY(!id.isNull());
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
QOrganizerEvent eventResult = static_cast(items[0]);
QCOMPARE(eventResult.isAllDay(), true);
QCOMPARE(eventResult.startDateTime().date(), eventDateTime.date());
QCOMPARE(eventResult.startDateTime().time(), QTime(0, 0, 0));
QCOMPARE(eventResult.endDateTime().date(), eventDateTime.date().addDays(1));
QCOMPARE(eventResult.endDateTime().time(), QTime(0, 0, 0));
}
void testCreateTodoEventWithStartDate()
{
static QString displayLabelValue = QStringLiteral("Event todo with start date");
static QString descriptionValue = QStringLiteral("Event todo with start date description");
static QDateTime startDateTime = QDateTime(QDate(2013, 9, 3), QTime(0,30,0));
// create a new item
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(startDateTime);
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
// query by the new item
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
// compare start datetime
QOrganizerTodo newTodo = static_cast(items[0]);
QCOMPARE(newTodo.startDateTime(), startDateTime);
}
void testCreateWithDiffTimeZone()
{
static QString displayLabelValue = QStringLiteral("Event with diff timezone");
static QString descriptionValue = QStringLiteral("Event with diff timezone description");
static QDateTime startDateTime = QDateTime(QDate(2013, 9, 3), QTime(0, 30, 0), QTimeZone("Asia/Bangkok"));
// create a new item
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(startDateTime);
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QVERIFY(errorMap.isEmpty());
// query by the new item
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
// compare start datetime
QOrganizerTodo newTodo = static_cast(items[0]);
QDateTime newStartDateTime = newTodo.startDateTime();
QCOMPARE(newStartDateTime.timeSpec(), Qt::TimeZone);
QCOMPARE(newStartDateTime.timeZone(), QTimeZone("Asia/Bangkok"));
QCOMPARE(newTodo.startDateTime(), startDateTime);
}
void testEventWithTags()
{
static QString displayLabelValue = QStringLiteral("event with tag");
static QString descriptionValue = QStringLiteral("event with tag descs");
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
todo.setStartDateTime(QDateTime::currentDateTime());
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
todo.setTags(QStringList() << "Tag0" << "Tag1" << "Tag2");
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
QSignalSpy createdItem(m_engine, SIGNAL(itemsAdded(QList)));
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QCOMPARE(items.size(), 1);
QVERIFY(errorMap.isEmpty());
QVERIFY(!items[0].id().isNull());
QOrganizerTodo newTodo = static_cast(items[0]);
QStringList expectedTags;
expectedTags << "Tag0" << "Tag1" << "Tag2";
Q_FOREACH(QString tag, newTodo.tags()) {
expectedTags.removeAll(tag);
}
QCOMPARE(expectedTags.size(), 0);
// check saved item
QTRY_COMPARE(createdItem.count(), 1);
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
newTodo = static_cast(items[0]);
expectedTags << "Tag0" << "Tag1" << "Tag2";
Q_FOREACH(QString tag, newTodo.tags()) {
expectedTags.removeAll(tag);
}
QCOMPARE(expectedTags.size(), 0);
}
void testFloatingTime()
{
static QString displayLabelValue = QStringLiteral("event with floating time");
static QString descriptionValue = QStringLiteral("event with floating time descs");
QOrganizerTodo todo;
todo.setCollectionId(m_collection.id());
QDateTime startDate = QDateTime::currentDateTime();
startDate = QDateTime(startDate.date(), startDate.time(), QTimeZone());
todo.setStartDateTime(startDate);
todo.setDisplayLabel(displayLabelValue);
todo.setDescription(descriptionValue);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
QSignalSpy createdItem(m_engine, SIGNAL(itemsAdded(QList)));
items << todo;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QCOMPARE(items.size(), 1);
QVERIFY(errorMap.isEmpty());
QVERIFY(!items[0].id().isNull());
// check saved item
QTRY_COMPARE(createdItem.count(), 1);
QOrganizerItemFetchHint hint;
QList ids;
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
QOrganizerTodo newTodo = static_cast(items[0]);
QCOMPARE(newTodo.startDateTime().timeSpec(), todo.startDateTime().timeSpec());
QVERIFY(!newTodo.startDateTime().timeZone().isValid());
QCOMPARE(newTodo.startDateTime().date(), startDate.date());
QCOMPARE(newTodo.startDateTime().time().hour(), startDate.time().hour());
QCOMPARE(newTodo.startDateTime().time().minute(), startDate.time().minute());
// Update floating event
QSignalSpy updateItem(m_engine, SIGNAL(itemsChanged(QList)));
startDate = QDateTime::currentDateTime();
startDate.addSecs(360);
startDate = QDateTime(startDate.date(), startDate.time(), QTimeZone());
items << newTodo;
saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QTRY_COMPARE(updateItem.count(), 1);
ids.clear();
ids << items[0].id();
items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.count(), 1);
newTodo = static_cast(items[0]);
QCOMPARE(newTodo.startDateTime().timeSpec(), todo.startDateTime().timeSpec());
QVERIFY(!newTodo.startDateTime().timeZone().isValid());
QCOMPARE(newTodo.startDateTime().date(), startDate.date());
QCOMPARE(newTodo.startDateTime().time().hour(), startDate.time().hour());
QCOMPARE(newTodo.startDateTime().time().minute(), startDate.time().minute());
// Remove floating event
QOrganizerItemRemoveByIdRequest req;
connect(&req, SIGNAL(stateChanged(QOrganizerAbstractRequest::State)),
this, SLOT(requestFinished(QOrganizerAbstractRequest::State)));
connect(m_engine, SIGNAL(itemsRemoved(QList)),
this, SLOT(itemRemoved()));
req.setItemId(newTodo.id());
m_engine->startRequest(&req);
m_engine->waitForRequestFinished(&req, -1);
// check if the signal item removed was fired after the request finish
QTRY_VERIFY(m_requestFinishedTime.isValid());
QTRY_VERIFY(m_itemRemovedTime.isValid());
QVERIFY(m_itemRemovedTime > m_requestFinishedTime);
// check if item was removed
QOrganizerItemSortOrder sort;
QOrganizerItemIdFilter filter;
ids.clear();
ids << newTodo.id();
filter.setIds(ids);
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
10,
sort,
hint,
&error);
QCOMPARE(items.count(), 0);
}
void testCreateEventWithAttendees()
{
static QString displayLabelValue = QStringLiteral("event with collection attendee");
static QString descriptionValue = QStringLiteral("event without collection");
QOrganizerEvent event;
event.setStartDateTime(QDateTime::currentDateTime());
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
QOrganizerEventAttendee attendee;
attendee.setAttendeeId("Attendee ID");
attendee.setEmailAddress("test@email.com");
attendee.setName("Attendee Name");
attendee.setParticipationRole(QOrganizerEventAttendee::RoleHost);
attendee.setParticipationStatus(QOrganizerEventAttendee::StatusAccepted);
event.saveDetail(&attendee);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
QSignalSpy createdItem(m_engine, SIGNAL(itemsAdded(QList)));
items << event;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QTRY_COMPARE(createdItem.count(), 1);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QCOMPARE(items.size(), 1);
QVERIFY(errorMap.isEmpty());
QVERIFY(!items[0].id().isNull());
QList ids;
QOrganizerItemFetchHint hint;
ids << items[0].id();
QList newItems = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(newItems.size(), 1);
QList atts = newItems[0].details(QOrganizerItemDetail::TypeEventAttendee);
QCOMPARE(atts.size(), 1);
QOrganizerEventAttendee newAttendee = static_cast(atts[0]);
QCOMPARE(newAttendee.attendeeId(), attendee.attendeeId());
QCOMPARE(newAttendee.emailAddress(), attendee.emailAddress());
QCOMPARE(newAttendee.name(), attendee.name());
QCOMPARE(newAttendee.participationRole(), attendee.participationRole());
QCOMPARE(newAttendee.participationStatus(), attendee.participationStatus());
}
// BUG: #1440878
void testReminderOnTime()
{
static QString displayLabelValue = QStringLiteral("event reminder");
static QString descriptionValue = QStringLiteral("event with reminder");
QOrganizerEvent event;
QOrganizerItemAudibleReminder aReminder;
event.setStartDateTime(QDateTime::currentDateTime());
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
aReminder.setSecondsBeforeStart(0);
aReminder.setDataUrl(QString());
event.saveDetail(&aReminder);
QOrganizerEvent event2;
aReminder = QOrganizerItemAudibleReminder();
event2.setStartDateTime(QDateTime::currentDateTime().addDays(2));
event2.setDisplayLabel(displayLabelValue + "_2");
event2.setDescription(descriptionValue);
aReminder.setSecondsBeforeStart(60);
aReminder.setDataUrl(QString());
event2.saveDetail(&aReminder);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
QSignalSpy createdItem(m_engine, SIGNAL(itemsAdded(QList)));
items << event << event2;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QTRY_COMPARE(createdItem.count(), 1);
QVERIFY(saveResult);
QString vcard = getEventFromEvolution(items[0].id());
QVERIFY(vcard.contains("TRIGGER;VALUE=DURATION;RELATED=START:PT0S"));
vcard = getEventFromEvolution(items[1].id());
QVERIFY(vcard.contains("TRIGGER;VALUE=DURATION;RELATED=START:-PT1M"));
}
// BUG: #1445577
void testUTCEvent()
{
static QString displayLabelValue = QStringLiteral("UTC event");
static QString descriptionValue = QStringLiteral("UTC event");
const QDateTime startDate(QDateTime::currentDateTime().toUTC());
QOrganizerEvent event;
event.setStartDateTime(startDate);
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
QSignalSpy createdItem(m_engine, SIGNAL(itemsAdded(QList)));
items << event;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QTRY_COMPARE(createdItem.count(), 1);
QVERIFY(saveResult);
QList ids;
QOrganizerItemFetchHint hint;
ids << items[0].id();
QList newItems = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(newItems.size(), 1);
QOrganizerEvent newEvent = static_cast(newItems[0]);
QCOMPARE(newEvent.startDateTime().timeZoneAbbreviation(), QStringLiteral("UTC"));
QCOMPARE(newEvent.startDateTime().date(), startDate.date());
QCOMPARE(newEvent.startDateTime().time().hour(), startDate.time().hour());
QCOMPARE(newEvent.startDateTime().time().minute(), startDate.time().minute());
QCOMPARE(newEvent.startDateTime().time().second(), startDate.time().second());
}
void testExtendedProperties()
{
static QString displayLabelValue = QStringLiteral("event with extended property");
static QString descriptionValue = QStringLiteral("event with extended property");
QOrganizerItemId itemId;
QDateTime currentTime = QDateTime::currentDateTime();
{
// create a item with X-URL
QOrganizerEvent event;
event.setStartDateTime(currentTime);
event.setEndDateTime(currentTime.addSecs(60 * 30));
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
QOrganizerItemExtendedDetail ex;
ex.setName(QStringLiteral("X-URL"));
ex.setData(QByteArray("http://canonical.com"));
event.saveDetail(&ex);
// save the new item
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
QSignalSpy createdItem(m_engine, SIGNAL(itemsAdded(QList)));
items << event;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QTRY_COMPARE(createdItem.count(), 1);
QVERIFY(saveResult);
QCOMPARE(error, QOrganizerManager::NoError);
QCOMPARE(items.size(), 1);
QVERIFY(errorMap.isEmpty());
QVERIFY(!items[0].id().isNull());
QCOMPARE(items[0].details(QOrganizerItemDetail::TypeExtendedDetail).size(), 1);
itemId = items[0].id();
}
// fetch for the item
{
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList ids;
QOrganizerItemFetchHint hint;
ids << itemId;
QList items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.size(), 1);
QList exs = items[0].details(QOrganizerItemDetail::TypeExtendedDetail);
QCOMPARE(exs.size(), 1);
QCOMPARE(exs[0].value(QOrganizerItemExtendedDetail::FieldName).toString(),
QStringLiteral("X-URL"));
QCOMPARE(exs[0].value(QOrganizerItemExtendedDetail::FieldData).toByteArray(),
QByteArray("http://canonical.com"));
}
}
void testFetchHint()
{
static QString displayLabelValue = QStringLiteral("event for fetch hint test");
static QString descriptionValue = QStringLiteral("event for fetch hint test");
QOrganizerItemId itemId;
{
QOrganizerEvent event;
event.setStartDateTime(QDateTime::currentDateTime());
event.setEndDateTime(QDateTime::currentDateTime().addSecs(60 * 30));
event.setDisplayLabel(displayLabelValue);
event.setDescription(descriptionValue);
// TAGS
event.setTags(QStringList() << "Tag0" << "Tag1" << "Tag2");
// ExtendedDetails
QOrganizerItemExtendedDetail ex;
ex.setName(QStringLiteral("X-URL"));
ex.setData(QByteArray("http://canonical.com"));
event.saveDetail(&ex);
// Reminders
QOrganizerItemVisualReminder vReminder;
vReminder.setDataUrl(QUrl("http://www.alarms.com"));
vReminder.setMessage("Test visual reminder");
event.saveDetail(&vReminder);
QOrganizerItemAudibleReminder aReminder;
aReminder.setSecondsBeforeStart(0);
aReminder.setDataUrl(QUrl("http://www.audible.com"));
event.saveDetail(&aReminder);
// Attendee
QOrganizerEventAttendee attendee;
attendee.setAttendeeId("Attendee ID");
attendee.setEmailAddress("test@email.com");
attendee.setName("Attendee Name");
attendee.setParticipationRole(QOrganizerEventAttendee::RoleHost);
attendee.setParticipationStatus(QOrganizerEventAttendee::StatusAccepted);
event.saveDetail(&attendee);
// save the new item
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList items;
QSignalSpy createdItem(m_engine, SIGNAL(itemsAdded(QList)));
items << event;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QTRY_COMPARE(createdItem.count(), 1);
QVERIFY(saveResult);
itemId = items[0].id();
}
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
QList ids;
QOrganizerItemFetchHint hint;
ids << itemId;
// Fetch ExtendedDetails
{
QList details;
details << QOrganizerItemDetail::TypeExtendedDetail;
hint.setDetailTypesHint(details);
QList items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.size(), 1);
QOrganizerEvent event = items[0];
QList xDetails = event.details(QOrganizerItemDetail::TypeExtendedDetail);
QList vreminders = event.details(QOrganizerItemDetail::TypeVisualReminder);
QList areminders = event.details(QOrganizerItemDetail::TypeAudibleReminder);
QList attendee = event.details(QOrganizerItemDetail::TypeEventAttendee);
QStringList tags = event.tags();
QCOMPARE(xDetails.size(), 1);
QCOMPARE(vreminders.size(), 0);
QCOMPARE(areminders.size(), 0);
QCOMPARE(attendee.size(), 0);
QCOMPARE(tags.size(), 0);
}
// Fetch TAGS, Attendee
{
QList details;
details << QOrganizerItemDetail::TypeTag
<< QOrganizerItemDetail::TypeEventAttendee;
hint.setDetailTypesHint(details);
QList items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.size(), 1);
QOrganizerEvent event = items[0];
QList xDetails = event.details(QOrganizerItemDetail::TypeExtendedDetail);
QList vreminders = event.details(QOrganizerItemDetail::TypeVisualReminder);
QList areminders = event.details(QOrganizerItemDetail::TypeAudibleReminder);
QList attendee = event.details(QOrganizerItemDetail::TypeEventAttendee);
QStringList tags = event.tags();
QCOMPARE(xDetails.size(), 0);
QCOMPARE(vreminders.size(), 0);
QCOMPARE(areminders.size(), 0);
QCOMPARE(attendee.size(), 1);
QCOMPARE(tags.size(), 3);
}
// Fetch TAGS, Reminders, Attendee
{
QList details;
details << QOrganizerItemDetail::TypeTag
<< QOrganizerItemDetail::TypeEventAttendee
<< QOrganizerItemDetail::TypeReminder;
hint.setDetailTypesHint(details);
QList items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.size(), 1);
QOrganizerEvent event = items[0];
QList xDetails = event.details(QOrganizerItemDetail::TypeExtendedDetail);
QList vreminders = event.details(QOrganizerItemDetail::TypeVisualReminder);
QList areminders = event.details(QOrganizerItemDetail::TypeAudibleReminder);
QList attendee = event.details(QOrganizerItemDetail::TypeEventAttendee);
QStringList tags = event.tags();
QCOMPARE(xDetails.size(), 0);
QCOMPARE(vreminders.size(), 1);
QCOMPARE(areminders.size(), 1);
QCOMPARE(attendee.size(), 1);
QCOMPARE(tags.size(), 3);
}
// Fetch VisualReminders
{
QList details;
details << QOrganizerItemDetail::TypeVisualReminder;
hint.setDetailTypesHint(details);
QList items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.size(), 1);
QOrganizerEvent event = items[0];
QList xDetails = event.details(QOrganizerItemDetail::TypeExtendedDetail);
QList vreminders = event.details(QOrganizerItemDetail::TypeVisualReminder);
QList areminders = event.details(QOrganizerItemDetail::TypeAudibleReminder);
QList attendee = event.details(QOrganizerItemDetail::TypeEventAttendee);
QStringList tags = event.tags();
QCOMPARE(xDetails.size(), 0);
QCOMPARE(vreminders.size(), 1);
QCOMPARE(areminders.size(), 0);
QCOMPARE(attendee.size(), 0);
QCOMPARE(tags.size(), 0);
}
// Fetch AudibleReminders
{
QList details;
details << QOrganizerItemDetail::TypeAudibleReminder;
hint.setDetailTypesHint(details);
QList items = m_engine->items(ids, hint, &errorMap, &error);
QCOMPARE(items.size(), 1);
QOrganizerEvent event = items[0];
QList xDetails = event.details(QOrganizerItemDetail::TypeExtendedDetail);
QList vreminders = event.details(QOrganizerItemDetail::TypeVisualReminder);
QList areminders = event.details(QOrganizerItemDetail::TypeAudibleReminder);
QList attendee = event.details(QOrganizerItemDetail::TypeEventAttendee);
QStringList tags = event.tags();
QCOMPARE(xDetails.size(), 0);
QCOMPARE(vreminders.size(), 0);
QCOMPARE(areminders.size(), 1);
QCOMPARE(attendee.size(), 0);
QCOMPARE(tags.size(), 0);
}
}
};
const QString EventTest::collectionTypePropertyName = QStringLiteral("collection-type");
const QString EventTest::taskListTypeName = QStringLiteral("Task List");
int EventTest::signalIndex = 0;
QTEST_MAIN(EventTest)
#include "event-test.moc"
qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/filter-test.cpp.moved 0000644 0000156 0000165 00000015457 12672562647 026415 0 ustar pbuser pbgroup 0000000 0000000 /*
* Copyright 2015 Canonical Ltd.
*
* This file is part of qtorganizer5-eds.
*
* contact-service-app is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* contact-service-app 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include "qorganizer-eds-engine.h"
#include "eds-base-test.h"
using namespace QtOrganizer;
class FilterTest : public QObject, public EDSBaseTest
{
Q_OBJECT
private:
QOrganizerEDSEngine *m_engine;
void createCollection(QOrganizerCollection **collection)
{
QtOrganizer::QOrganizerManager::Error error;
*collection = new QOrganizerCollection();
(*collection)->setMetaData(QOrganizerCollection::KeyName,
uniqueCollectionName());
QSignalSpy createdCollection(m_engine,
SIGNAL(collectionsAdded(QList)));
bool saveResult = m_engine->saveCollection(*collection, &error);
QVERIFY(saveResult);
QCOMPARE(error, QtOrganizer::QOrganizerManager::NoError);
QTRY_COMPARE(createdCollection.count(), 1);
}
private Q_SLOTS:
void initTestCase()
{
EDSBaseTest::init();
m_engine = QOrganizerEDSEngine::createEDSEngine(QMap());
}
void cleanupTestCase()
{
delete m_engine;
EDSBaseTest::cleanup();
}
// test functions
void testFilterEventByCollectionId()
{
static QString displayLabelValue = QStringLiteral("Todo test %1 - %2");
static QString descriptionValue = QStringLiteral("Todo description %1 - %2");
QList items;
QDateTime currentDate = QDateTime::currentDateTime();
// create items on default collection
for(int i=0; i < 10; i++) {
QOrganizerEvent ev;
ev.setStartDateTime(currentDate);
ev.setEndDateTime(currentDate.addDays(1));
ev.setDisplayLabel(displayLabelValue.arg(i).arg("default"));
ev.setDescription(descriptionValue.arg(i).arg("default"));
items << ev;
}
// create items on new collection
QOrganizerCollection *collection;
createCollection(&collection);
for(int i=0; i < 10; i++) {
QOrganizerEvent ev;
ev.setCollectionId(collection->id());
ev.setStartDateTime(currentDate);
ev.setEndDateTime(currentDate.addDays(1));
ev.setDisplayLabel(displayLabelValue.arg(i).arg("new"));
ev.setDescription(descriptionValue.arg(i).arg("new"));
items << ev;
}
// save all items
QtOrganizer::QOrganizerManager::Error error;
QMap errorMap;
bool saveResult = m_engine->saveItems(&items,
QList(),
&errorMap,
&error);
QVERIFY(saveResult);
QCOMPARE(error, QtOrganizer::QOrganizerManager::NoError);
QOrganizerItemSortOrder sort;
QOrganizerItemFetchHint hint;
QOrganizerItemCollectionFilter filter;
// filter items from default collection
filter.setCollectionId(m_engine->defaultCollection(0).id());
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 10);
// check returned items
Q_FOREACH(const QOrganizerItem &i, items) {
QVERIFY(static_cast(i).displayLabel().endsWith("default"));
}
// filter items from new collection
filter.setCollectionId(collection->id());
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 10);
// check returned items
Q_FOREACH(const QOrganizerItem &i, items) {
QVERIFY(static_cast(i).displayLabel().endsWith("new"));
}
// filter items from both collections
QSet ids;
ids << m_engine->defaultCollection(0).id()
<< collection->id();
filter.setCollectionIds(ids);
items = m_engine->items(filter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 20);
// filter using union filter
// filter events from new collection or ends with 'default'
QOrganizerItemUnionFilter uFilter;
filter.setCollectionId(collection->id());
QOrganizerItemDetailFieldFilter dFilter;
dFilter.setDetail(QOrganizerItemDetail::TypeDescription,
QOrganizerItemDescription::FieldDescription);
dFilter.setMatchFlags(QOrganizerItemFilter::MatchEndsWith);
dFilter.setValue("default");
uFilter.append(filter);
uFilter.append(dFilter);
items = m_engine->items(uFilter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 20);
// filter using intersection filter
// filter events from new collection and ends with 'new'
QOrganizerItemIntersectionFilter iFilter;
dFilter.setValue("new");
iFilter.append(filter);
iFilter.append(dFilter);
items = m_engine->items(iFilter,
QDateTime(),
QDateTime(),
100,
sort,
hint,
&error);
QCOMPARE(items.count(), 10);
// check returned items
Q_FOREACH(const QOrganizerItem &i, items) {
QVERIFY(static_cast(i).displayLabel().endsWith("new"));
}
delete collection;
}
};
QTEST_MAIN(FilterTest)
#include "filter-test.moc"
qtorganizer5-eds-0.1.1+16.04.20160317/tests/unittest/parseecal-test.cpp 0000644 0000156 0000165 00000037754 12672562647 025762 0 ustar pbuser pbgroup 0000000 0000000 /*
* Copyright 2013 Canonical Ltd.
*
* This file is part of qtorganizer5-eds.
*
* contact-service-app is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* contact-service-app 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
//ugly hack but this allow us to test the engine without mock EDS
#define private public
#include "qorganizer-eds-engine.h"
#undef private
#include
#include
#include
#include
#include
using namespace QtOrganizer;
class ParseEcalTest : public QObject
{
Q_OBJECT
private:
static const QString vEvent;
QList m_itemsParsed;
public Q_SLOTS:
void onEventAsyncParsed(QList items)
{
m_itemsParsed = items;
}
private Q_SLOTS:
void cleanup()
{
m_itemsParsed.clear();
}
void testParseStartTime()
{
QDateTime startTime = QDateTime::currentDateTime();
QDateTime endTime(startTime);
endTime = endTime.addDays(2);
ECalComponent *comp = e_cal_component_new();
e_cal_component_set_new_vtype(comp, E_CAL_COMPONENT_EVENT);
ECalComponentDateTime dt;
struct icaltimetype itt = icaltime_from_timet(startTime.toTime_t(), FALSE);
dt.value = &itt;
dt.tzid = "";
e_cal_component_set_dtstart(comp, &dt);
QOrganizerEvent item;
QOrganizerEDSEngine::parseStartTime(comp, &item);
QCOMPARE(item.startDateTime().toTime_t(), startTime.toTime_t());
itt = icaltime_from_timet(endTime.toTime_t(), FALSE);
dt.value = &itt;
e_cal_component_set_dtend(comp, &dt);
QOrganizerEDSEngine::parseEndTime(comp, &item);
QCOMPARE(item.endDateTime().toTime_t(), endTime.toTime_t());
}
void testParseRemindersQOrganizerEvent2ECalComponent()
{
QOrganizerEvent event;
QOrganizerItemAudibleReminder aReminder;
// Check audible reminder
aReminder.setRepetition(10, 30);
aReminder.setSecondsBeforeStart(10);
QCOMPARE(aReminder.secondsBeforeStart(), 10);
event.saveDetail(&aReminder);
ECalComponent *comp = e_cal_component_new();
e_cal_component_set_new_vtype(comp, E_CAL_COMPONENT_EVENT);
QOrganizerEDSEngine::parseReminders(event, comp);
GList *aIds = e_cal_component_get_alarm_uids(comp);
QCOMPARE(g_list_length(aIds), (guint) 1);
ECalComponentAlarm *alarm = e_cal_component_get_alarm(comp, (const gchar*)aIds->data);
QVERIFY(alarm);
ECalComponentAlarmAction aAction;
e_cal_component_alarm_get_action(alarm, &aAction);
QCOMPARE(aAction, E_CAL_COMPONENT_ALARM_AUDIO);
ECalComponentAlarmTrigger trigger;
e_cal_component_alarm_get_trigger(alarm, &trigger);
QCOMPARE(trigger.type, E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START);
QCOMPARE(icaldurationtype_as_int(trigger.u.rel_duration) * -1, aReminder.secondsBeforeStart());
ECalComponentAlarmRepeat aRepeat;
e_cal_component_alarm_get_repeat(alarm, &aRepeat);
QCOMPARE(aRepeat.repetitions, aReminder.repetitionCount());
QCOMPARE(icaldurationtype_as_int(aRepeat.duration), aReminder.repetitionDelay());
g_object_unref(comp);
}
void testParseRemindersECalComponent2QOrganizerEvent()
{
ECalComponent *comp = e_cal_component_new();
e_cal_component_set_new_vtype(comp, E_CAL_COMPONENT_EVENT);
ECalComponentAlarm *alarm = e_cal_component_alarm_new();
e_cal_component_alarm_set_action(alarm, E_CAL_COMPONENT_ALARM_DISPLAY);
ECalComponentAlarmTrigger trigger;
trigger.type = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START;
trigger.u.rel_duration = icaldurationtype_from_int(-10);
e_cal_component_alarm_set_trigger(alarm, trigger);
ECalComponentAlarmRepeat aRepeat;
aRepeat.repetitions = 5;
aRepeat.duration = icaldurationtype_from_int(100);
e_cal_component_alarm_set_repeat(alarm, aRepeat);
e_cal_component_add_alarm(comp, alarm);
e_cal_component_alarm_free(alarm);
QOrganizerItem alarmItem;
QOrganizerEDSEngine::parseReminders(comp, &alarmItem);
QOrganizerItemVisualReminder vReminder = alarmItem.detail(QOrganizerItemDetail::TypeVisualReminder);
QCOMPARE(vReminder.repetitionCount(), 5);
QCOMPARE(vReminder.repetitionDelay(), 100);
QCOMPARE(vReminder.secondsBeforeStart(), 10);
g_object_unref(comp);
}
void testParseRecurenceQOrganizerEvent2ECalComponent()
{
// by date
QOrganizerEvent event;
QOrganizerItemRecurrence rec;
QList rDates;
rDates << QDate(2010, 1, 20)
<< QDate(2011, 2, 21)
<< QDate(2012, 3, 22);
rec.setRecurrenceDates(rDates.toSet());
QList rExeptDates;
rExeptDates << QDate(2013, 4, 23)
<< QDate(2014, 5, 24)
<< QDate(2015, 6, 25);
rec.setExceptionDates(rExeptDates.toSet());
QOrganizerRecurrenceRule dailyRule;
QList rrules;
dailyRule.setFrequency(QOrganizerRecurrenceRule::Daily);
dailyRule.setLimit(1000);
rrules << dailyRule;
QOrganizerRecurrenceRule weeklyRule;
weeklyRule.setFrequency(QOrganizerRecurrenceRule::Weekly);
weeklyRule.setLimit(1001);
QList daysOfWeek;
daysOfWeek << Qt::Monday
<< Qt::Tuesday
<< Qt::Wednesday
<< Qt::Thursday
<< Qt::Friday;
weeklyRule.setDaysOfWeek(daysOfWeek.toSet());
weeklyRule.setFirstDayOfWeek(Qt::Sunday);
rrules << weeklyRule;
QOrganizerRecurrenceRule monthlyRule;
monthlyRule.setFrequency(QOrganizerRecurrenceRule::Monthly);
monthlyRule.setLimit(1002);
QList daysOfMonth;
daysOfMonth << 1
<< 15
<< 30;
monthlyRule.setDaysOfMonth(daysOfMonth.toSet());
rrules << monthlyRule;
QOrganizerRecurrenceRule yearlyRule;
yearlyRule.setFrequency(QOrganizerRecurrenceRule::Yearly);
yearlyRule.setLimit(1003);
QList daysOfYear;
daysOfYear << 1
<< 10
<< 20
<< 50
<< 300;
yearlyRule.setDaysOfYear(daysOfYear.toSet());
QList monthsOfYear;
monthsOfYear << QOrganizerRecurrenceRule::January
<< QOrganizerRecurrenceRule::March
<< QOrganizerRecurrenceRule::December;
yearlyRule.setMonthsOfYear(monthsOfYear.toSet());
rrules << yearlyRule;
rec.setRecurrenceRules(rrules.toSet());
// save recurrence
event.saveDetail(&rec);
ECalComponent *comp = e_cal_component_new();
e_cal_component_set_new_vtype(comp, E_CAL_COMPONENT_EVENT);
QOrganizerEDSEngine::parseRecurrence(event, comp);
// recurrence dates
GSList *periodList = 0;
e_cal_component_get_rdate_list(comp, &periodList);
QCOMPARE(g_slist_length(periodList), (guint)3);
for(GSList *pIter = periodList; pIter != 0; pIter = pIter->next) {
ECalComponentPeriod *period = static_cast(pIter->data);
QDate periodDate = QDateTime::fromTime_t(icaltime_as_timet(period->start)).date();
QVERIFY(rDates.contains(periodDate));
}
e_cal_component_free_period_list(periodList);
// exception dates
GSList *exDateList = 0;
e_cal_component_get_exdate_list(comp, &exDateList);
for(GSList *pIter = exDateList; pIter != 0; pIter = pIter->next) {
ECalComponentDateTime *exDate = static_cast(pIter->data);
QDate exDateValue = QDateTime::fromTime_t(icaltime_as_timet(*exDate->value)).date();
QVERIFY(rExeptDates.contains(exDateValue));
}
e_cal_component_free_exdate_list(exDateList);
// rules
GSList *recurList = 0;
e_cal_component_get_rrule_list(comp, &recurList);
QCOMPARE(g_slist_length(recurList), (guint) rrules.count());
for(GSList *recurListIter = recurList; recurListIter != 0; recurListIter = recurListIter->next) {
struct icalrecurrencetype *rule = static_cast