added test for mass assignment

Added auto test to test MySqlSchemaBuilder::getColumnListing() and
SchemaBuilder::getColumnListing() and also
GuardsAttributes::isGuardableColumn() (not all paths).

 - bugfix for SQLite get column listing
This commit is contained in:
silverqx
2021-05-28 15:25:38 +02:00
parent a642900dcb
commit 0236cc47bb
10 changed files with 61 additions and 17 deletions
@@ -16,6 +16,9 @@ namespace Orm::Query::Processors
public:
MySqlProcessor() = default;
/*! Process the results of a column listing query. */
QStringList processColumnListing(QSqlQuery &query) const override;
};
} // namespace Orm::Query::Processors
+1 -1
View File
@@ -24,7 +24,7 @@ namespace Orm::Query::Processors
inline virtual ~Processor() = default;
/*! Process the results of a column listing query. */
QStringList processColumnListing(QSqlQuery &query) const;
virtual QStringList processColumnListing(QSqlQuery &query) const;
};
} // namespace Orm::Query::Processors
@@ -16,6 +16,9 @@ namespace Orm::Query::Processors
public:
SQLiteProcessor() = default;
/*! Process the results of a column listing query. */
QStringList processColumnListing(QSqlQuery &query) const override;
};
} // namespace Orm::Query::Processors
@@ -1,11 +1,25 @@
#include "orm/query/processors/mysqlprocessor.hpp"
#include <QtSql/QSqlQuery>
#include <QVariant>
#ifdef TINYORM_COMMON_NAMESPACE
namespace TINYORM_COMMON_NAMESPACE
{
#endif
namespace Orm::Query::Processors
{
QStringList MySqlProcessor::processColumnListing(QSqlQuery &query) const
{
QStringList columns;
while (query.next())
columns.append(query.value("column_name").value<QString>());
return columns;
}
} // namespace Orm::Query::Processors
#ifdef TINYORM_COMMON_NAMESPACE
} // namespace TINYORM_COMMON_NAMESPACE
+5 -9
View File
@@ -1,7 +1,7 @@
#include "orm/query/processors/processor.hpp"
#include <QtSql/QSqlQuery>
#include <QVariant>
#include "orm/runtimeerror.hpp"
#include "orm/utils/type.hpp"
#ifdef TINYORM_COMMON_NAMESPACE
namespace TINYORM_COMMON_NAMESPACE
@@ -10,14 +10,10 @@ namespace TINYORM_COMMON_NAMESPACE
namespace Orm::Query::Processors
{
QStringList Processor::processColumnListing(QSqlQuery &query) const
QStringList Processor::processColumnListing(QSqlQuery &) const
{
QStringList columns;
while (query.next())
columns.append(query.value(0).value<QString>());
return columns;
throw RuntimeError(QStringLiteral("Method %1() is not implemented.")
.arg(__tiny_func__));
}
} // namespace Orm::Query::Processors
@@ -1,11 +1,25 @@
#include "orm/query/processors/sqliteprocessor.hpp"
#include <QtSql/QSqlQuery>
#include <QVariant>
#ifdef TINYORM_COMMON_NAMESPACE
namespace TINYORM_COMMON_NAMESPACE
{
#endif
namespace Orm::Query::Processors
{
QStringList SQLiteProcessor::processColumnListing(QSqlQuery &query) const
{
QStringList columns;
while (query.next())
columns.append(query.value("name").value<QString>());
return columns;
}
} // namespace Orm::Query::Processors
#ifdef TINYORM_COMMON_NAMESPACE
} // namespace TINYORM_COMMON_NAMESPACE
-1
View File
@@ -158,7 +158,6 @@ void Builder::truncate()
m_connection.statement(sql, bindings);
}
// CUR try with 'as' - select('name', 'email as user_email') and add tests silverqx
Builder &Builder::select(const QStringList &columns)
{
// FEATURE expression, add Query::Expression overload, find all occurences of Illuminate\Database\Query\Expression in the Eloquent and add support to TinyORM, I will need to add overloads for some methods, for columns and also for values silverqx
@@ -9,7 +9,8 @@ namespace Orm::Schema::Grammars
QString MySqlSchemaGrammar::compileColumnListing(const QString &) const
{
return "select `column_name` from `information_schema`.`columns` "
return "select `column_name` as `column_name` "
"from `information_schema`.`columns` "
"where `table_schema` = ? and `table_name` = ?";
}
@@ -76,7 +76,7 @@ private slots:
void truncate() const;
void massAssignment_NotGuardableColumn() const;
void massAssignment_isGuardableColumn() const;
};
void tst_Model::initTestCase_data() const
@@ -1225,7 +1225,7 @@ void tst_Model::truncate() const
QCOMPARE(Setting::all().size(), 0);
}
void tst_Model::massAssignment_NotGuardableColumn() const
void tst_Model::massAssignment_isGuardableColumn() const
{
/* This test has to be here because it internally calls columns listing against
database, so it is connection-dependent. */
@@ -1233,11 +1233,12 @@ void tst_Model::massAssignment_NotGuardableColumn() const
ConnectionOverride::connection = connection;
Torrent_GuardedAttribute torrent;
Torrent_GuardableColumn torrent;
torrent.fill({{"dummy-NON_EXISTENT", "foo"}});
torrent.fill({{"updated_at", QDateTime::currentDateTime()}});
QCOMPARE(torrent.getAttributes().size(), 0);
QVERIFY(!torrent.exists);
QCOMPARE(torrent.getAttributes().size(), 1);
}
QTEST_MAIN(tst_Model)
@@ -52,4 +52,17 @@ class Torrent_AllowedMassAssignment final :
inline static QStringList u_guarded {}; // disabled
};
class Torrent_GuardableColumn final :
public Model<Torrent_GuardableColumn>
{
friend Model;
using Model::Model;
/*! The table associated with the model. */
QString u_table {"torrents"};
/*! The attributes that aren't mass assignable. */
inline static QStringList u_guarded {"xyz"};
};
#endif // MASSASSIGNMENTMODELS_HPP