1 /*
2     SPDX-FileCopyrightText: 2012 Volker Krause <vkrause@kde.org>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include <QDebug>
8 #include <QObject>
9 #include <QTest>
10 
11 #include <aktest.h>
12 #include <storage/dbexception.h>
13 #include <storage/dbintrospector.h>
14 
15 #define QL1S(x) QLatin1String(x)
16 
17 using namespace Akonadi::Server;
18 
19 class DbIntrospectorTest : public QObject
20 {
21     Q_OBJECT
22 private Q_SLOTS:
testHasIndexQuery_data()23     void testHasIndexQuery_data()
24     {
25         QTest::addColumn<QString>("driverName");
26         QTest::addColumn<QString>("indexQuery");
27 
28         QTest::newRow("mysql") << "QMYSQL"
29                                << "SHOW INDEXES FROM myTable WHERE `Key_name` = 'myIndex'";
30         QTest::newRow("sqlite") << "QSQLITE"
31                                 << "SELECT * FROM sqlite_master WHERE type='index' AND tbl_name='myTable' AND name='myIndex';";
32         QTest::newRow("psql") << "QPSQL"
33                               << "SELECT indexname FROM pg_catalog.pg_indexes WHERE tablename ilike 'myTable' AND  indexname ilike 'myIndex' UNION SELECT "
34                                  "conname FROM pg_catalog.pg_constraint  WHERE conname ilike 'myIndex'";
35     }
36 
testHasIndexQuery()37     void testHasIndexQuery()
38     {
39         QFETCH(QString, driverName);
40         QFETCH(QString, indexQuery);
41 
42         if (QSqlDatabase::drivers().contains(driverName)) {
43             QSqlDatabase db = QSqlDatabase::addDatabase(driverName, driverName);
44             DbIntrospector::Ptr introspector = DbIntrospector::createInstance(db);
45             QVERIFY(introspector);
46             QCOMPARE(introspector->hasIndexQuery(QL1S("myTable"), QL1S("myIndex")), indexQuery);
47         }
48     }
49 
testHasIndex_data()50     void testHasIndex_data()
51     {
52         QTest::addColumn<QString>("driverName");
53         QTest::addColumn<bool>("shouldThrow");
54 
55         QTest::newRow("mysql") << "QMYSQL" << true;
56         QTest::newRow("sqlite") << "QSQLITE" << true;
57         QTest::newRow("psql") << "QPSQL" << true;
58     }
59 
testHasIndex()60     void testHasIndex()
61     {
62         QFETCH(QString, driverName);
63         QFETCH(bool, shouldThrow);
64 
65         if (QSqlDatabase::drivers().contains(driverName)) {
66             QSqlDatabase db = QSqlDatabase::addDatabase(driverName, driverName + QL1S("hasIndex"));
67             DbIntrospector::Ptr introspector = DbIntrospector::createInstance(db);
68             QVERIFY(introspector);
69 
70             bool didThrow = false;
71             try {
72                 QVERIFY(introspector->hasIndex(QL1S("myTable"), QL1S("myIndex")));
73             } catch (const DbException &e) {
74                 didThrow = true;
75                 qDebug() << Q_FUNC_INFO << e.what();
76             }
77             QCOMPARE(didThrow, shouldThrow);
78         }
79     }
80 };
81 
82 AKTEST_MAIN(DbIntrospectorTest)
83 
84 #include "dbintrospectortest.moc"
85