[libgda] DdlModifiable: Adding test for GdaDdlModifiable API
- From: Pavlo Solntsev <psolntsev src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] DdlModifiable: Adding test for GdaDdlModifiable API
- Date: Sun, 12 Jul 2020 03:41:24 +0000 (UTC)
commit 113869f21a7edf8590f233ebe647d2a9d423e2f5
Author: Pavlo Solntsev <p sun fun gmail com>
Date: Thu Jun 4 00:24:40 2020 -0500
DdlModifiable: Adding test for GdaDdlModifiable API
tests/meson.build | 18 ++
tests/test-ddl-modifiable-sqlite.c | 358 +++++++++++++++++++++++++++++++++++++
2 files changed, 376 insertions(+)
---
diff --git a/tests/meson.build b/tests/meson.build
index 9fd23cc93..04ffef1b9 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -62,6 +62,24 @@ test('RawDdlCreator', trddlc,
]
)
+ddlmodifiable_sqlite = executable('test-ddl-modifiable-sqlite',
+ ['test-ddl-modifiable-sqlite.c'],
+ c_args: test_cargs,
+ link_with: libgda,
+ dependencies: [
+ libgda_dep,
+ inc_rooth_dep,
+ inc_sqliteh_dep
+ ],
+ install: false
+ )
+test('DdlModifiableSqlite', ddlmodifiable_sqlite,
+ env: [
+ 'GDA_TOP_SRC_DIR='+gda_top_src,
+ 'GDA_TOP_BUILD_DIR='+gda_top_build
+ ]
+ )
+
tbc = executable('test-bin-converter',
['test-bin-converter.c'] + tests_sources,
c_args: test_cargs,
diff --git a/tests/test-ddl-modifiable-sqlite.c b/tests/test-ddl-modifiable-sqlite.c
new file mode 100644
index 000000000..3b59f7d45
--- /dev/null
+++ b/tests/test-ddl-modifiable-sqlite.c
@@ -0,0 +1,358 @@
+/* check-ddl-modifiable.c
+ *
+ * Copyright (C) 2020 Pavlo Solntsev <p sun fun gmail com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gda-db-column.h"
+#include "gda-db-index.h"
+#include "gda-db-table.h"
+#define PROVIDER_NAME "SQLite"
+#define DB_TEST_BASE "sqlite_ddl_modifiable"
+
+#include <glib/gi18n.h>
+#include <locale.h>
+#include "libgda/libgda.h"
+
+typedef struct
+{
+ GdaConnection *cnc;
+ GdaServerProvider *provider;
+ GdaDbTable *tproject;
+ GdaDbColumn *pid;
+ GdaDbColumn *pname;
+ GdaDbIndex *index;
+} TestObjectFixture;
+
+
+static void
+test_ddl_modifiable_start (TestObjectFixture *fixture,
+ G_GNUC_UNUSED gconstpointer user_data)
+{
+ fixture->cnc = NULL;
+ fixture->provider = NULL;
+ fixture->tproject = NULL;
+ fixture->pid = NULL;
+ fixture->pname = NULL;
+
+ gchar *dbname = g_strdup_printf("DB_DIR=.;DB_NAME=%s_%d", DB_TEST_BASE, g_random_int ());
+
+ fixture->cnc = gda_connection_open_from_string (PROVIDER_NAME,
+ dbname,
+ NULL,
+ GDA_CONNECTION_OPTIONS_NONE,
+ NULL);
+
+ g_assert_nonnull (fixture->cnc);
+
+ g_free (dbname);
+
+ fixture->provider = gda_connection_get_provider (fixture->cnc);
+
+ g_assert_nonnull (fixture->provider);
+
+/* Define table Project */
+ fixture->tproject = gda_db_table_new ();
+ gda_db_base_set_name (GDA_DB_BASE (fixture->tproject), "Project");
+ gda_db_table_set_is_temp (fixture->tproject, FALSE);
+
+ /* Defining column id */
+ fixture->pid = gda_db_column_new ();
+ gda_db_column_set_name (fixture->pid, "id");
+ gda_db_column_set_type (fixture->pid, G_TYPE_INT);
+ gda_db_column_set_nnul (fixture->pid, TRUE);
+ gda_db_column_set_autoinc (fixture->pid, TRUE);
+ gda_db_column_set_unique (fixture->pid, TRUE);
+ gda_db_column_set_pkey (fixture->pid, TRUE);
+
+ gda_db_table_append_column (fixture->tproject, fixture->pid);
+
+ g_object_unref (fixture->pid);
+
+ /* Defining column name */
+ fixture->pname = gda_db_column_new ();
+ gda_db_column_set_name (fixture->pname, "name");
+ gda_db_column_set_type (fixture->pname, G_TYPE_STRING);
+ gda_db_column_set_size (fixture->pname, 50);
+ gda_db_column_set_nnul (fixture->pname, TRUE);
+ gda_db_column_set_autoinc (fixture->pname, FALSE);
+ gda_db_column_set_unique (fixture->pname, TRUE);
+ gda_db_column_set_pkey (fixture->pname, FALSE);
+ gda_db_column_set_default (fixture->pname, "Default_name");
+
+ gda_db_table_append_column (fixture->tproject, fixture->pname);
+
+ /* We don't need to dereference fixture->pname column yet. We will reuse it */
+
+ fixture->index = gda_db_index_new ();
+
+ gda_db_base_set_name (GDA_DB_BASE (fixture->index), "simpleindex");
+
+ GdaDbIndexField *ifield = gda_db_index_field_new ();
+ gda_db_index_field_set_column (ifield, fixture->pname);
+
+ gda_db_index_append_field (fixture->index, ifield);
+ g_object_unref (ifield);
+}
+
+static void
+test_ddl_modifiable_finish (TestObjectFixture *fixture,
+ G_GNUC_UNUSED gconstpointer user_data)
+{
+ g_object_unref (fixture->pname);
+ g_object_unref (fixture->tproject);
+ g_object_unref (fixture->index);
+
+ gboolean res = gda_connection_close (fixture->cnc, NULL);
+
+ g_assert_true (res);
+}
+
+static void
+test_ddl_modifiable_table (TestObjectFixture *fixture,
+ G_GNUC_UNUSED gconstpointer user_data)
+{
+ gboolean res;
+
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (fixture->tproject), fixture->cnc, NULL, NULL);
+
+ g_assert_true (res);
+
+/* CREATE TABLE second time call */
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (fixture->tproject), fixture->cnc, NULL, NULL);
+
+ g_assert_true (res);
+
+/* RENAME TABLE */
+ GdaDbTable *new_table = gda_db_table_new ();
+ gda_db_base_set_name (GDA_DB_BASE (new_table), "NewProject");
+
+ res = gda_ddl_modifiable_rename (GDA_DDL_MODIFIABLE (fixture->tproject), fixture->cnc, new_table, NULL);
+
+ g_assert_true (res);
+
+/* Calling the same operation twice */
+ res = gda_ddl_modifiable_rename (GDA_DDL_MODIFIABLE (fixture->tproject), fixture->cnc, new_table, NULL);
+
+ g_assert_false (res);
+
+ res = gda_ddl_modifiable_drop (GDA_DDL_MODIFIABLE (new_table), fixture->cnc, NULL, NULL);
+
+ g_assert_true (res);
+
+ g_object_unref (new_table);
+}
+
+static void
+test_ddl_modifiable_column (TestObjectFixture *fixture,
+ G_GNUC_UNUSED gconstpointer user_data)
+{
+/* CREATE TABLE */
+ gboolean res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (fixture->tproject), fixture->cnc, NULL,
NULL);
+
+ g_assert_true (res);
+
+ GdaDbColumn *last_name = gda_db_column_new();
+ gda_db_column_set_name (last_name, "LastName");
+ gda_db_column_set_type (last_name, G_TYPE_STRING);
+
+/* table property wasn't set. The operation should fail */
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (last_name), fixture->cnc, NULL, NULL);
+
+ g_assert_false (res);
+
+ g_object_set (last_name, "table", fixture->tproject, NULL);
+
+ GError *error = NULL;
+
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (last_name), fixture->cnc, NULL, &error);
+
+ if (error != NULL) {
+ g_print ("Error: %s", error->message != NULL ? error->message : "No detail");
+ g_clear_error (&error);
+ }
+
+ g_assert_true (res);
+
+ g_object_unref (last_name);
+
+ last_name = gda_db_column_new();
+ gda_db_column_set_name (last_name, "NewLastName");
+ gda_db_column_set_type (last_name, G_TYPE_STRING);
+
+ res = gda_ddl_modifiable_rename (GDA_DDL_MODIFIABLE (fixture->pname), fixture->cnc, last_name, &error);
+
+ if (error != NULL) {
+ g_print ("Error: %s", error->message != NULL ? error->message : "No detail");
+ g_clear_error (&error);
+ }
+
+ g_assert_true (res);
+
+/* Calling the same operation twice. It should fail */
+ res = gda_ddl_modifiable_rename (GDA_DDL_MODIFIABLE (fixture->pname), fixture->cnc, last_name, &error);
+
+ if (error != NULL) {
+ g_print ("Error: %s", error->message != NULL ? error->message : "No detail");
+ g_clear_error (&error);
+ }
+
+ g_assert_false (res);
+
+ res = gda_ddl_modifiable_drop (GDA_DDL_MODIFIABLE (last_name), fixture->cnc, NULL, &error);
+
+ if (error != NULL) {
+ g_print ("Error: %s", error->message != NULL ? error->message : "No detail");
+ g_clear_error (&error);
+ }
+
+ g_assert_false (res);
+
+ g_object_unref (last_name);
+}
+
+static void
+test_ddl_modifiable_index (TestObjectFixture *fixture,
+ G_GNUC_UNUSED gconstpointer user_data)
+{
+ /* CREATE TABLE */
+ gboolean res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (fixture->tproject), fixture->cnc, NULL,
NULL);
+
+ g_assert_true (res);
+
+ GdaDbIndex *newindex = gda_db_index_new ();
+ gda_db_base_set_name (GDA_DB_BASE (newindex), "newindex");
+ GError *error = NULL;
+
+ res = gda_ddl_modifiable_rename (GDA_DDL_MODIFIABLE (fixture->index), fixture->cnc, newindex, &error);
+
+ if (error != NULL) {
+ g_print ("Error: %s\n", error->message != NULL ? error->message : "No detail");
+ g_clear_error (&error);
+ }
+
+ g_assert_false (res); // RENAME INDEX operation is not supported by SQLite3
+
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (fixture->index), fixture->cnc, newindex, &error);
+
+ if (error != NULL) {
+ g_print ("Error: %s\n", error->message != NULL ? error->message : "No detail");
+ g_clear_error (&error);
+ }
+
+ g_assert_false (res); // CREATE INDEX without table should fail.
+
+ g_object_set (fixture->index, "table", fixture->tproject, NULL);
+
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (fixture->index), fixture->cnc, newindex, &error);
+
+ if (error != NULL) {
+ g_print ("Error: %s\n", error->message != NULL ? error->message : "No detail");
+ g_clear_error (&error);
+ }
+
+ g_assert_true (res); // CREATE INDEX with table should succeed.
+
+ res = gda_ddl_modifiable_drop (GDA_DDL_MODIFIABLE (fixture->index), fixture->cnc, NULL, &error);
+
+ if (error != NULL) {
+ g_print ("Error: %s\n", error->message != NULL ? error->message : "No detail");
+ g_clear_error (&error);
+ }
+
+ g_assert_true (res); // DROP INDEX
+
+ g_object_unref (newindex);
+}
+
+static void
+test_ddl_modifiable_view (TestObjectFixture *fixture,
+ G_GNUC_UNUSED gconstpointer user_data)
+{
+ /* CREATE TABLE */
+ gboolean res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (fixture->tproject), fixture->cnc, NULL,
NULL);
+
+ g_assert_true (res);
+
+ GdaDbView *myview = gda_db_view_new ();
+
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (myview), fixture->cnc, NULL, NULL);
+ g_assert_false (res);
+
+ gda_db_base_set_name (GDA_DB_BASE (myview), "MyView");
+
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (myview), fixture->cnc, NULL, NULL);
+ g_assert_false (res);
+
+ gda_db_view_set_defstring (myview, "SELECT id, name FROM Project");
+
+ res = gda_ddl_modifiable_create (GDA_DDL_MODIFIABLE (myview), fixture->cnc, NULL, NULL);
+ g_assert_true (res);
+
+ res = gda_ddl_modifiable_rename (GDA_DDL_MODIFIABLE (myview), fixture->cnc, "NewView", NULL);
+
+ g_assert_false (res); // RENAME VIEW is not implemented for Sqlite3
+
+ /* DROP_VIEW operation. */
+ GdaDbViewRefAction action = GDA_DB_VIEW_RESTRICT;
+
+ res = gda_ddl_modifiable_drop (GDA_DDL_MODIFIABLE (myview), fixture->cnc, &action, NULL);
+
+ g_assert_true (res);
+
+ g_object_unref (myview);
+}
+
+gint
+main(gint argc, gchar *argv[])
+{
+ setlocale (LC_ALL,"");
+
+ g_test_init (&argc,&argv,NULL);
+
+ g_test_add ("/test-ddl-modifiable-sqlite/table",
+ TestObjectFixture,
+ NULL,
+ test_ddl_modifiable_start,
+ test_ddl_modifiable_table,
+ test_ddl_modifiable_finish);
+
+ g_test_add ("/test-ddl-modifiable-sqlite/column",
+ TestObjectFixture,
+ NULL,
+ test_ddl_modifiable_start,
+ test_ddl_modifiable_column,
+ test_ddl_modifiable_finish);
+
+ g_test_add ("/test-ddl-modifiable-sqlite/index",
+ TestObjectFixture,
+ NULL,
+ test_ddl_modifiable_start,
+ test_ddl_modifiable_index,
+ test_ddl_modifiable_finish);
+
+ g_test_add ("/test-ddl-modifiable-sqlite/view",
+ TestObjectFixture,
+ NULL,
+ test_ddl_modifiable_start,
+ test_ddl_modifiable_view,
+ test_ddl_modifiable_finish);
+ return g_test_run();
+}
+
+
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]