| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Copyright (C) 2020 The Qt Company Ltd. | 
					
						
							|  |  |  | ** Contact: https://www.qt.io/licensing/
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and The Qt Company. For licensing terms | 
					
						
							|  |  |  | ** and conditions see https://www.qt.io/terms-conditions. For further
 | 
					
						
							|  |  |  | ** information use the contact form at https://www.qt.io/contact-us.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU General Public License Usage | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU | 
					
						
							|  |  |  | ** General Public License version 3 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
					
						
							|  |  |  | ** included in the packaging of this file. Please review the following | 
					
						
							|  |  |  | ** information to ensure the GNU General Public License requirements will | 
					
						
							|  |  |  | ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "googletest.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <sqlitedatabase.h>
 | 
					
						
							|  |  |  | #include <sqlitereadstatement.h>
 | 
					
						
							|  |  |  | #include <sqlitesessionchangeset.h>
 | 
					
						
							|  |  |  | #include <sqlitesessions.h>
 | 
					
						
							|  |  |  | #include <sqlitetransaction.h>
 | 
					
						
							|  |  |  | #include <sqlitewritestatement.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <ostream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 18:12:26 +01:00
										 |  |  | using Sqlite::Operation; | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | using Sqlite::SessionChangeSet; | 
					
						
							|  |  |  | using Sqlite::SessionChangeSets; | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | using Sqlite::SessionChangeSetInternal::ValueViews; | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class DatabaseExecute | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     DatabaseExecute(Utils::SmallStringView sqlStatement, Sqlite::Database &database) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         database.execute(sqlStatement); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Data | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     Data(Sqlite::ValueView name, Sqlite::ValueView number, Sqlite::ValueView value) | 
					
						
							|  |  |  |         : name(name) | 
					
						
							|  |  |  |         , number(number) | 
					
						
							|  |  |  |         , value(value) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Sqlite::Value name; | 
					
						
							|  |  |  |     Sqlite::Value number; | 
					
						
							|  |  |  |     Sqlite::Value value; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::ostream &operator<<(std::ostream &out, const Data &data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return out << "(" << data.name << ", " << data.number << " " << data.value << ")"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATCHER_P3(HasData, | 
					
						
							|  |  |  |            name, | 
					
						
							|  |  |  |            number, | 
					
						
							|  |  |  |            value, | 
					
						
							|  |  |  |            std::string(negation ? "hasn't " : "has ") + PrintToString(name) + ", " | 
					
						
							|  |  |  |                + PrintToString(number) + ", " + PrintToString(value)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const Data &data = arg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return data.name == name && data.number == number && data.value == value; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | MATCHER_P2(HasValues, | 
					
						
							|  |  |  |            newValue, | 
					
						
							|  |  |  |            oldValue, | 
					
						
							|  |  |  |            std::string(negation ? "hasn't " : "has ") + PrintToString(newValue) + ", " | 
					
						
							|  |  |  |                + PrintToString(oldValue)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const ValueViews &values = arg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return values.newValue == newValue && values.oldValue == oldValue; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | class Tag | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     Tag(Sqlite::ValueView name, Sqlite::ValueView tag) | 
					
						
							|  |  |  |         : name(name) | 
					
						
							|  |  |  |         , tag(tag) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Sqlite::Value name; | 
					
						
							|  |  |  |     Sqlite::Value tag; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::ostream &operator<<(std::ostream &out, const Tag &tag) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return out << "(" << tag.name << ", " << tag.tag << ")"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MATCHER_P2(HasTag, | 
					
						
							|  |  |  |            name, | 
					
						
							|  |  |  |            tag, | 
					
						
							|  |  |  |            std::string(negation ? "hasn't " : "has ") + PrintToString(name) + ", " + PrintToString(tag)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const Tag &t = arg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return t.name == name && t.tag == tag; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | class SqliteSessions : public testing::Test | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  |     SqliteSessions() { sessions.setAttachedTables({"data", "tags"}); } | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-24 18:10:55 +01:00
										 |  |  |     std::vector<Data> fetchData() { return selectData.values<Data>(8); } | 
					
						
							|  |  |  |     std::vector<Tag> fetchTags() { return selectTags.values<Tag>(8); } | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  |     Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory}; | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  |     std::lock_guard<Sqlite::Database> lock{database}; | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  |     DatabaseExecute createTable{"CREATE TABLE data(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT " | 
					
						
							|  |  |  |                                 "UNIQUE, number NUMERIC, value NUMERIC)", | 
					
						
							|  |  |  |                                 database}; | 
					
						
							|  |  |  |     DatabaseExecute createTable2{"CREATE TABLE tags(id INTEGER PRIMARY KEY AUTOINCREMENT, dataId " | 
					
						
							|  |  |  |                                  "INTEGER NOT NULL REFERENCES data ON DELETE CASCADE DEFERRABLE " | 
					
						
							|  |  |  |                                  "INITIALLY DEFERRED, tag NUMERIC)", | 
					
						
							|  |  |  |                                  database}; | 
					
						
							|  |  |  |     Sqlite::Sessions sessions{database, "main", "testsessions"}; | 
					
						
							| 
									
										
										
										
											2021-12-07 17:28:38 +01:00
										 |  |  |     Sqlite::WriteStatement<3> insertData{ | 
					
						
							|  |  |  |         "INSERT INTO data(name, number, value) VALUES (?1, ?2, ?3) " | 
					
						
							|  |  |  |         "ON CONFLICT (name) DO UPDATE SET (number, value) = (?2, ?3)", | 
					
						
							|  |  |  |         database}; | 
					
						
							|  |  |  |     Sqlite::WriteStatement<2> insertOneDatum{"INSERT INTO data(value, name) VALUES (?1, ?2) " | 
					
						
							|  |  |  |                                              "ON CONFLICT (name) DO UPDATE SET (value) = (?2)", | 
					
						
							|  |  |  |                                              database}; | 
					
						
							|  |  |  |     Sqlite::WriteStatement<2> updateNumber{"UPDATE data SET number = ?2 WHERE name=?1", database}; | 
					
						
							|  |  |  |     Sqlite::WriteStatement<2> updateValue{"UPDATE data SET value = ?2 WHERE name=?1", database}; | 
					
						
							|  |  |  |     Sqlite::WriteStatement<1> deleteData{"DELETE FROM data WHERE name=?", database}; | 
					
						
							|  |  |  |     Sqlite::WriteStatement<1> deleteTag{ | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  |         "DELETE FROM tags WHERE dataId=(SELECT id FROM data WHERE name=?)", database}; | 
					
						
							| 
									
										
										
										
											2021-12-07 17:28:38 +01:00
										 |  |  |     Sqlite::WriteStatement<2> insertTag{ | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  |         "INSERT INTO tags(dataId, tag) VALUES ((SELECT id FROM data WHERE name=?1), ?2) ", database}; | 
					
						
							| 
									
										
										
										
											2021-03-24 18:10:55 +01:00
										 |  |  |     Sqlite::ReadStatement<3> selectData{"SELECT name, number, value FROM data", database}; | 
					
						
							|  |  |  |     Sqlite::ReadStatement<2> selectTags{ | 
					
						
							|  |  |  |         "SELECT name, tag FROM tags JOIN data ON data.id=tags.dataId", database}; | 
					
						
							|  |  |  |     Sqlite::ReadStatement<1> selectChangeSets{"SELECT changeset FROM testsessions", database}; | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, DontThrowForCommittingWithoutSessionStart) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     ASSERT_NO_THROW(sessions.commit()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, CreateEmptySession) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     ASSERT_THAT(sessions.changeSets(), IsEmpty()); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, CreateSessionWithInsert) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     ASSERT_THAT(sessions.changeSets(), SizeIs(1)); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, CreateSessionWithUpdate) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateNumber.write("foo", "bar"); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     ASSERT_THAT(sessions.changeSets(), SizeIs(1)); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, CreateSessionWithDelete) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     deleteData.write("foo"); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     ASSERT_THAT(sessions.changeSets(), SizeIs(1)); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, CreateSessionWithInsertAndUpdate) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateNumber.write("foo", "bar"); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     ASSERT_THAT(sessions.changeSets(), SizeIs(2)); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, CreateSession) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     ASSERT_THAT(sessions.changeSets(), SizeIs(1)); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, RevertSession) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.revert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), IsEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, RevertSessionToBase) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("bar", "foo", 99); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.revert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("bar", "foo", 99))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, RevertMultipleSession) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateNumber.write("foo", "bar"); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.revert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), IsEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplySession) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", 22, 3.14))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplySessionAfterAddingNewEntries) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     insertData.write("bar", "foo", 99); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), | 
					
						
							|  |  |  |                 UnorderedElementsAre(HasData("foo", 22, 3.14), HasData("bar", "foo", 99))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplyOverridesEntriesWithUniqueConstraint) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", 22, 3.14))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplyDoesNotOverrideDeletedEntries) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", 22, 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     deleteData.write("foo"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), IsEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplyDoesOnlyOverwriteUpdatedValues) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 1234); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     insertData.write("foo", "poo", 891); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "poo", 1234))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideForeignKeyIfReferenceIsDeleted) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo2", "bar", 3.14); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertTag.write("foo2", 4321); | 
					
						
							|  |  |  |     insertTag.write("foo", 1234); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     deleteData.write("foo"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchTags(), ElementsAre(HasTag("foo2", 4321))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideIfConstraintsIsApplied) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     deleteData.write("foo"); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     sessions.revert(); | 
					
						
							|  |  |  |     insertTag.write("foo", 1234); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchTags(), IsEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideForeignKeyIfReferenceIsDeletedDeferred) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  |     database.unlock(); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  |     Sqlite::DeferredTransaction transaction{database}; | 
					
						
							|  |  |  |     insertData.write("foo2", "bar", 3.14); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertTag.write("foo2", 4321); | 
					
						
							|  |  |  |     insertTag.write("foo", 1234); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     deleteData.write("foo"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     transaction.commit(); | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  |     database.lock(); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  |     ASSERT_THAT(fetchTags(), ElementsAre(HasTag("foo2", 4321))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, EndSessionOnRollback) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.rollback(); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateNumber.write("foo", 333); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     updateValue.write("foo", 666); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", 333, 666))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, EndSessionOnCommit) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     updateValue.write("foo", 666); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "bar", 99))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, DeleteSessions) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     sessions.revert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.deleteAll(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "bar", 3.14))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, DeleteAllSessions) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     sessions.revert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.deleteAll(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "bar", 3.14))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplyAndUpdateSessions) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.applyAndUpdateSessions(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     updateValue.write("foo", 22); | 
					
						
							|  |  |  |     sessions.apply(); | 
					
						
							|  |  |  |     ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "bar", 22))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ApplyAndUpdateSessionsHasOnlyOneChangeSet) | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sessions.applyAndUpdateSessions(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     ASSERT_THAT(sessions.changeSets(), SizeIs(1)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ForEmptySessionBeginEqualsEnd) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto begin = changeSets.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(begin, Eq(changeSets.end())); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, IteratorBeginUnequalsEndIfChangeSetHasContent) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(begin, Ne(changeSet.end())); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, NextIteratorUnequalsBeginIfChangeSetHasContent) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto next = std::next(changeSet.begin()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_NE(next, changeSet.begin()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, NextIteratorEqualsEndIfChangeSetHasContent) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto next = std::next(changeSet.begin()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(next, Eq(changeSet.end())); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, NextIteratorNotUnqualsEndIfChangeSetHasContent) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto next = std::next(changeSet.begin()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(next, Not(Ne(changeSet.end()))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, BeginIteratorHasInsertOperation) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(tuple.operation, Eq(Operation::Insert)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, BeginIteratorHasUpdateOperation) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(tuple.operation, Eq(Operation::Update)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, BeginIteratorHasDeleteOperation) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     deleteData.write("foo"); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(tuple.operation, Eq(Operation::Delete)); | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, BeginIteratorHasDataTableName) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(tuple.table, Eq("data")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, ConvertAllValueTypesInChangeSet) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::vector<ValueViews> values{tuple.begin(), tuple.end()}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(values, | 
					
						
							|  |  |  |                 ElementsAre(HasValues(1, nullptr), | 
					
						
							|  |  |  |                             HasValues("foo", nullptr), | 
					
						
							|  |  |  |                             HasValues("bar", nullptr), | 
					
						
							|  |  |  |                             HasValues(3.14, nullptr))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, InsertOneValueChangeSet) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							| 
									
										
										
										
											2021-12-07 17:28:38 +01:00
										 |  |  |     insertOneDatum.write("foo", Sqlite::NullValue{}); | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::vector<ValueViews> values{tuple.begin(), tuple.end()}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(values, | 
					
						
							|  |  |  |                 ElementsAre(HasValues(1, nullptr), | 
					
						
							|  |  |  |                             HasValues(nullptr, nullptr), | 
					
						
							|  |  |  |                             HasValues(nullptr, nullptr), | 
					
						
							|  |  |  |                             HasValues("foo", nullptr))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, UpdateOneValueChangeSet) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::vector<ValueViews> values{tuple.begin(), tuple.end()}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(values, | 
					
						
							|  |  |  |                 ElementsAre(HasValues(nullptr, 1), | 
					
						
							|  |  |  |                             HasValues(nullptr, nullptr), | 
					
						
							|  |  |  |                             HasValues(nullptr, nullptr), | 
					
						
							|  |  |  |                             HasValues(99, 3.14))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, DeleteRowChangeSet) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     deleteData.write("foo"); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::vector<ValueViews> values{tuple.begin(), tuple.end()}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(values, | 
					
						
							|  |  |  |                 ElementsAre(HasValues(nullptr, 1), | 
					
						
							|  |  |  |                             HasValues(nullptr, "foo"), | 
					
						
							|  |  |  |                             HasValues(nullptr, "bar"), | 
					
						
							|  |  |  |                             HasValues(nullptr, 3.14))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, EmptyChangeSet) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(changeSets, ElementsAre()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, AccessInsertOneValueChangeSet) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							| 
									
										
										
										
											2021-12-07 17:28:38 +01:00
										 |  |  |     insertOneDatum.write("foo", Sqlite::NullValue{}); | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ValueViews value = tuple[3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(value, HasValues("foo", nullptr)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, AccessUpdateOneValueChangeSet) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     updateValue.write("foo", 99); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ValueViews value = tuple[3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(value, HasValues(99, 3.14)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 18:02:31 +02:00
										 |  |  | TEST_F(SqliteSessions, AccessDeleteRowChangeSet) | 
					
						
							| 
									
										
										
										
											2020-10-27 15:09:25 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     insertData.write("foo", "bar", 3.14); | 
					
						
							|  |  |  |     sessions.create(); | 
					
						
							|  |  |  |     deleteData.write("foo"); | 
					
						
							|  |  |  |     sessions.commit(); | 
					
						
							|  |  |  |     auto changeSets = sessions.changeSets(); | 
					
						
							|  |  |  |     auto &&changeSet = changeSets.front(); | 
					
						
							|  |  |  |     auto begin = changeSet.begin(); | 
					
						
							|  |  |  |     auto tuple = (*begin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ValueViews value = tuple[0]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(value, HasValues(nullptr, 1)); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-27 23:48:03 +02:00
										 |  |  | } // namespace
 |