|
@@ -0,0 +1,280 @@
|
|
|
|
+<?php
|
|
|
|
+namespace Tests\tripal_chado\api;
|
|
|
|
+
|
|
|
|
+use StatonLab\TripalTestSuite\DBTransaction;
|
|
|
|
+use StatonLab\TripalTestSuite\TripalTestCase;
|
|
|
|
+
|
|
|
|
+class TripalChadoMViewsAPITest extends TripalTestCase {
|
|
|
|
+
|
|
|
|
+ // Use a transaction to roll back changes after every test.
|
|
|
|
+ use DBTransaction;
|
|
|
|
+
|
|
|
|
+ // This variable holds example materialized views that can be used
|
|
|
|
+ // by the unit tests below.
|
|
|
|
+ private $example_mviews = [
|
|
|
|
+ 'analysis_organism_test' => [
|
|
|
|
+ 'schema' => [
|
|
|
|
+ 'table' => 'analysis_organism_test',
|
|
|
|
+ 'description' => 'This view is for associating an organism (via it\'s associated features) to an analysis.',
|
|
|
|
+ 'fields' => [
|
|
|
|
+ 'analysis_id' => [
|
|
|
|
+ 'size' => 'big',
|
|
|
|
+ 'type' => 'int',
|
|
|
|
+ 'not null' => true,
|
|
|
|
+ ],
|
|
|
|
+ 'organism_id' => [
|
|
|
|
+ 'size' => 'big',
|
|
|
|
+ 'type' => 'int',
|
|
|
|
+ 'not null' => true,
|
|
|
|
+ ],
|
|
|
|
+ ],
|
|
|
|
+ 'indexes' => [
|
|
|
|
+ 'networkmod_qtl_indx0' => [
|
|
|
|
+ 0 => 'analysis_id',
|
|
|
|
+ ],
|
|
|
|
+ 'networkmod_qtl_indx1' => [
|
|
|
|
+ 0 => 'organism_id',
|
|
|
|
+ ],
|
|
|
|
+ ],
|
|
|
|
+ 'foreign keys' => [
|
|
|
|
+ 'analysis' => [
|
|
|
|
+ 'table' => 'analysis',
|
|
|
|
+ 'columns' => [
|
|
|
|
+ 'analysis_id' => 'analysis_id',
|
|
|
|
+ ],
|
|
|
|
+ ],
|
|
|
|
+ 'organism' => [
|
|
|
|
+ 'table' => 'organism',
|
|
|
|
+ 'columns' => [
|
|
|
|
+ 'organism_id' => 'organism_id',
|
|
|
|
+ ],
|
|
|
|
+ ],
|
|
|
|
+ ],
|
|
|
|
+ ],
|
|
|
|
+ 'sql' => "
|
|
|
|
+ SELECT DISTINCT A.analysis_id, O.organism_id
|
|
|
|
+ FROM analysis A
|
|
|
|
+ INNER JOIN analysisfeature AF ON A.analysis_id = AF.analysis_id
|
|
|
|
+ INNER JOIN feature F ON AF.feature_id = F.feature_id
|
|
|
|
+ INNER JOIN organism O ON O.organism_id = F.organism_id
|
|
|
|
+ ",
|
|
|
|
+ 'comment' => 'This view is for associating an organism (via it\'s associated features) to an analysis.',
|
|
|
|
+ 'module' => 'tripal_chado',
|
|
|
|
+ ],
|
|
|
|
+ ];
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Test creation of a new materialized view.
|
|
|
|
+ *
|
|
|
|
+ * @group api
|
|
|
|
+ */
|
|
|
|
+ public function test_chado_add_mview() {
|
|
|
|
+
|
|
|
|
+ // Add the analysis_organism mview.
|
|
|
|
+ $mview_name = 'analysis_organism_test';
|
|
|
|
+ $mview_module = $this->example_mviews[$mview_name]['module'];
|
|
|
|
+ $mview_sql = $this->example_mviews[$mview_name]['sql'];
|
|
|
|
+ $mview_schema = $this->example_mviews[$mview_name]['schema'];
|
|
|
|
+ $mview_comment = $this->example_mviews[$mview_name]['comment'];
|
|
|
|
+ $success = chado_add_mview($mview_name, $mview_module, $mview_schema, $mview_sql, $mview_comment, FALSE);
|
|
|
|
+ $this->assertTrue($success, "Failed to create materialized view: $mview_name");
|
|
|
|
+
|
|
|
|
+ // Make sure that the entry is now there.
|
|
|
|
+ $mview = db_select('tripal_mviews', 'tm')
|
|
|
|
+ ->fields('tm')
|
|
|
|
+ ->condition('name', $mview_name)
|
|
|
|
+ ->execute()
|
|
|
|
+ ->fetchObject();
|
|
|
|
+ $this->assertTrue(is_object($mview),
|
|
|
|
+ "Failed to find the materialized view, $mview_name, in the tripal_mviews table");
|
|
|
|
+
|
|
|
|
+ // Make sure that all of the fields exist and were properly added.
|
|
|
|
+ $this->assertTrue($mview->modulename == $mview_module,
|
|
|
|
+ "Failed to create a proper materialized the modulename field is incorrect: '$mview_module' != '$mview->modulename'");
|
|
|
|
+ $this->assertTrue($mview->mv_table == $mview_name,
|
|
|
|
+ "Failed to create a proper materialized the mv_table field does not match input.");
|
|
|
|
+ $this->assertTrue($mview->query == $mview_sql,
|
|
|
|
+ "Failed to create a proper materialized the query field does not match input.");
|
|
|
|
+ $this->assertTrue($mview->comment == $mview_comment,
|
|
|
|
+ "Failed to create a proper materialized the comment field does not match input.");
|
|
|
|
+ $this->assertNULL($mview->status,
|
|
|
|
+ "Failed to create a proper materialized the status field should be NULL.");
|
|
|
|
+ $this->assertNULL($mview->last_update,
|
|
|
|
+ "Failed to create a proper materialized the last_update field should be NULL.");
|
|
|
|
+
|
|
|
|
+ // Make sure the table exists.
|
|
|
|
+ $this->assertTrue(chado_table_exists($mview_name),
|
|
|
|
+ "Materialized view, $mview_name, was added to the tripal_mviews table but the table was not created.");
|
|
|
|
+
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * Test deletion of a materialized view.
|
|
|
|
+ *
|
|
|
|
+ * @group api
|
|
|
|
+ */
|
|
|
|
+ public function test_chado_delete_mview() {
|
|
|
|
+
|
|
|
|
+ // Make sure the mview is present.
|
|
|
|
+ $mview_name = 'analysis_organism_test';
|
|
|
|
+ $mview_module = $this->example_mviews[$mview_name]['module'];
|
|
|
|
+ $mview_sql = $this->example_mviews[$mview_name]['sql'];
|
|
|
|
+ $mview_schema = $this->example_mviews[$mview_name]['schema'];
|
|
|
|
+ $mview_comment = $this->example_mviews[$mview_name]['comment'];
|
|
|
|
+ $success = chado_add_mview($mview_name, $mview_module, $mview_schema, $mview_sql, $mview_comment, FALSE);
|
|
|
|
+ $this->assertTrue($success, "Failed to create materialized view: $mview_name");
|
|
|
|
+
|
|
|
|
+ // Get the mview_id.
|
|
|
|
+ $mview = db_select('tripal_mviews', 'tm')
|
|
|
|
+ ->fields('tm')
|
|
|
|
+ ->condition('name', $mview_name)
|
|
|
|
+ ->execute()
|
|
|
|
+ ->fetchObject();
|
|
|
|
+ $this->assertTrue(is_object($mview),
|
|
|
|
+ "Failed to find the materialized view, $mview_name, in the tripal_mviews table");
|
|
|
|
+ $mview_id = $mview->mview_id;
|
|
|
|
+
|
|
|
|
+ // Now run the API function to delete it.
|
|
|
|
+ $success = chado_delete_mview($mview_id);
|
|
|
|
+ $this->assertTrue($success,
|
|
|
|
+ "Materialized view, $mview_name, could not be deleted.");
|
|
|
|
+
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+
|
|
|
|
+ // Make sure the table is gone.
|
|
|
|
+ $this->assertFalse(chado_table_exists($mview_name),
|
|
|
|
+ "Materialized view, $mview_name, table failed to be removed after deletion.");
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Test modifications to a materialized view
|
|
|
|
+ *
|
|
|
|
+ * @group api
|
|
|
|
+ */
|
|
|
|
+ public function test_chado_edit_mview() {
|
|
|
|
+
|
|
|
|
+ // TODO: this is currently a stub for a test function that neds
|
|
|
|
+ // implementation. For now it returns true to get past unit testing.
|
|
|
|
+ $this->assertTrue(true);
|
|
|
|
+
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * Test adding a Tripal Job to re-populate a materialized view
|
|
|
|
+ *
|
|
|
|
+ * @group api
|
|
|
|
+ */
|
|
|
|
+ public function test_chado_refresh_mview() {
|
|
|
|
+
|
|
|
|
+ // TODO: this is currently a stub for a test function that neds
|
|
|
|
+ // implementation. For now it returns true to get past unit testing.
|
|
|
|
+ $this->assertTrue(true);
|
|
|
|
+
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * Test re-populating a materialized view.
|
|
|
|
+ *
|
|
|
|
+ * @group api
|
|
|
|
+ */
|
|
|
|
+ public function test_chado_populate_mview() {
|
|
|
|
+
|
|
|
|
+ // TODO: this is currently a stub for a test function that neds
|
|
|
|
+ // implementation. For now it returns true to get past unit testing.
|
|
|
|
+ $this->assertTrue(true);
|
|
|
|
+
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * Test modifications to a materialized view
|
|
|
|
+ *
|
|
|
|
+ * @group api
|
|
|
|
+ */
|
|
|
|
+ public function test_chado_get_mview_id() {
|
|
|
|
+
|
|
|
|
+ // TODO: this is currently a stub for a test function that neds
|
|
|
|
+ // implementation. For now it returns true to get past unit testing.
|
|
|
|
+ $this->assertTrue(true);
|
|
|
|
+
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * Test retrieving names of the materialized views.
|
|
|
|
+ *
|
|
|
|
+ * @group api
|
|
|
|
+ */
|
|
|
|
+ public function test_chado_get_mview_table_names() {
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+
|
|
|
|
+ // TODO: this is currently a stub for a test function that neds
|
|
|
|
+ // implementation. For now it returns true to get past unit testing.
|
|
|
|
+ $this->assertTrue(true);
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * Test retrieving all materialized view objects.
|
|
|
|
+ *
|
|
|
|
+ * @group api
|
|
|
|
+ */
|
|
|
|
+ public function test_chado_get_mviews() {
|
|
|
|
+
|
|
|
|
+ // TODO: this is currently a stub for a test function that neds
|
|
|
|
+ // implementation. For now it returns true to get past unit testing.
|
|
|
|
+ $this->assertTrue(true);
|
|
|
|
+
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Issue 322 reported the problem of re-adding a materialized view after
|
|
|
|
+ * the actual table had been manually removed outside of Tripal. The
|
|
|
|
+ * function reported errors.
|
|
|
|
+ *
|
|
|
|
+ * @ticket 322
|
|
|
|
+ */
|
|
|
|
+ public function test_re_adding_deleted_mview_issue_322() {
|
|
|
|
+
|
|
|
|
+ // Add the analysis_organism mview.
|
|
|
|
+ $mview_name = 'analysis_organism_test';
|
|
|
|
+ $mview_module = $this->example_mviews[$mview_name]['module'];
|
|
|
|
+ $mview_sql = $this->example_mviews[$mview_name]['sql'];
|
|
|
|
+ $mview_schema = $this->example_mviews[$mview_name]['schema'];
|
|
|
|
+ $mview_comment = $this->example_mviews[$mview_name]['comment'];
|
|
|
|
+ $success = chado_add_mview($mview_name, $mview_module, $mview_schema, $mview_sql, $mview_comment, FALSE);
|
|
|
|
+ $this->assertTrue($success, "Failed to create materialized view: $mview_name");
|
|
|
|
+
|
|
|
|
+ // Now simulate manual deletion of the table outside of the API.
|
|
|
|
+ chado_query('DROP TABLE {' . $mview_name . '}');
|
|
|
|
+
|
|
|
|
+ // Make sure the table no longer exists.
|
|
|
|
+ $this->assertFalse(chado_table_exists($mview_name),
|
|
|
|
+ "Failed to manually remove the materialized view, cannot complete the test.");
|
|
|
|
+
|
|
|
|
+ // Now try to read the mview. Previously, the behavior was the the mview
|
|
|
|
+ // table would not be created because Tripal thinks it's already there.
|
|
|
|
+ $success = chado_add_mview($mview_name, $mview_module, $mview_schema, $mview_sql, $mview_comment, FALSE);
|
|
|
|
+ $this->assertTrue($success, "Failed to re-create materialized view: $mview_name");
|
|
|
|
+
|
|
|
|
+ // Now make sure the mview table exists.
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+ $this->assertTrue(chado_table_exists($mview_name),
|
|
|
|
+ "Manually removing a materialized views throws off the chado_add_mview function when the mview is re-added. See Issue #322");
|
|
|
|
+
|
|
|
|
+ $this->reset_tables();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * The chado_table_exists() function mantains a global variable to keep track
|
|
|
|
+ * of which tables exist. If the table exists then it stores that info in
|
|
|
|
+ * the global variable. This is because lots of queries perform a check to
|
|
|
|
+ * see if the tables exist and that can have a major performance hit.
|
|
|
|
+ *
|
|
|
|
+ * Because we are creating and dropping Chado tables in our tests it throws
|
|
|
|
+ * off the array and we need to reset it. Normally this isn't a problem
|
|
|
|
+ * because this would get reset on every page load anyone. For testing it
|
|
|
|
+ * doesn't.
|
|
|
|
+ */
|
|
|
|
+ public function reset_tables() {
|
|
|
|
+ $GLOBALS["chado_tables"] = [];
|
|
|
|
+ }
|
|
|
|
+}
|