diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 084487078..941faf48a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -97,3 +97,4 @@ add_test_file(albumcovermanager_test.cpp true) add_test_file(songplaylistitem_test.cpp false) add_test_file(translations_test.cpp false) add_test_file(playlist_test.cpp true) +add_test_file(scopedtransaction_test.cpp true) diff --git a/tests/scopedtransaction_test.cpp b/tests/scopedtransaction_test.cpp new file mode 100644 index 000000000..6c78ce3a1 --- /dev/null +++ b/tests/scopedtransaction_test.cpp @@ -0,0 +1,92 @@ +/* This file is part of Clementine. + + Clementine 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, either version 3 of the License, or + (at your option) any later version. + + Clementine 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 Clementine. If not, see . +*/ + +#include "test_utils.h" +#include "gtest/gtest.h" + +#include "scopedtransaction.h" + +#include +#include +#include +#include +#include + +namespace { + +class ScopedTransactionTest : public ::testing::Test { + protected: + void SetUp() { + database_ = QSqlDatabase::addDatabase("QSQLITE"); + database_.setDatabaseName(":memory:"); + ASSERT_TRUE(database_.open()); + } + + void TearDown() { + // Make sure Qt does not re-use the connection. + QString name = database_.connectionName(); + database_ = QSqlDatabase(); + QSqlDatabase::removeDatabase(name); + } + + QSqlDatabase database_; +}; + +TEST_F(ScopedTransactionTest, OpensATransaction) { + // False because there is no transaction to roll back + EXPECT_FALSE(database_.rollback()); + + ScopedTransaction t(&database_); + + // There should now be a transaction + EXPECT_TRUE(database_.rollback()); +} + +TEST_F(ScopedTransactionTest, RollbackOnDtor) { + database_.exec("CREATE TABLE foo (bar INTEGER)"); + + { + ScopedTransaction t(&database_); + database_.exec("INSERT INTO foo (bar) VALUES (42)"); + + QSqlQuery q("SELECT * FROM foo", database_); + ASSERT_TRUE(q.exec()); + ASSERT_TRUE(q.next()); + EXPECT_EQ(42, q.value(0).toInt()); + } + + QSqlQuery q("SELECT * FROM foo", database_); + ASSERT_TRUE(q.exec()); + ASSERT_FALSE(q.next()); +} + +TEST_F(ScopedTransactionTest, Commit) { + database_.exec("CREATE TABLE foo (bar INTEGER)"); + + { + ScopedTransaction t(&database_); + database_.exec("INSERT INTO foo (bar) VALUES (42)"); + t.Commit(); + } + + QSqlQuery q("SELECT * FROM foo", database_); + ASSERT_TRUE(q.exec()); + ASSERT_TRUE(q.next()); + EXPECT_EQ(42, q.value(0).toInt()); +} + + +} // namespace