|  | @@ -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"] = [];
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}
 |