123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- <?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"] = [];
- }
- }
|