123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <?php
- namespace Tests\tripal_chado\api;
- use StatonLab\TripalTestSuite\DBTransaction;
- use StatonLab\TripalTestSuite\TripalTestCase;
- module_load_include('inc', 'tripal_chado', 'api/ChadoSchema');
- /**
- * Tests the current Chado Database is compliant with the schema definition
- * used by Tripal
- */
- class ChadoComplianceTest extends TripalTestCase {
- // Uncomment to auto start and rollback db transactions per test method.
- use DBTransaction;
- /**
- * DataProvider, a list of all chado tables.
- *
- * @return array
- */
- public function chadoTableProvider() {
- $chado_schema = new \ChadoSchema();
- $version = $chado_schema->getVersion();
- $dataset = [];
- foreach ($chado_schema->getTableNames() as $table_name) {
- $dataset[] = [$version, $table_name];
- }
- return $dataset;
- }
- /**
- * Tests Compliance for a given table.
- *
- * The following is tested:
- * 1. The table exists in the correct schema.
- * 2. It has all the fields we expect.
- * 3. Each field is the type we expect.
- * 4. It has all the constraints we expect.
- * 5. Each constraint consists of the columns we expect.
- *
- * @dataProvider chadoTableProvider
- *
- * @group api
- * @group chado
- * @group chado-compliance
- */
- public function testTableCompliance($schema_version, $table_name) {
- // Create the ChadoSchema class to aid in testing.
- $chado_schema = new \ChadoSchema();
- $version = $chado_schema->getVersion();
- $schema_name = $chado_schema->getSchemaName();
- // Check #1: The table exists in the correct schema.
- $this->assertTrue(
- $chado_schema->checkTableExists($table_name),
- t('"!table_name" should exist in the "!chado" schema v!version.',
- [
- '!table_name' => $table_name,
- '!chado' => $schema_name,
- '!version' => $version,
- ])
- );
- // Retrieve the schema for this table.
- $table_schema = $chado_schema->getTableSchema($table_name);
- // For each column in this table...
- foreach ($table_schema['fields'] as $column_name => $column_details) {
- // Check #2: The given field exists in the table.
- $this->assertTrue(
- $chado_schema->checkColumnExists($table_name, $column_name),
- t('The column "!column" must exist in "!table" for chado v!version.',
- [
- '!column' => $column_name,
- '!table' => $table_name,
- '!version' => $version,
- ])
- );
- // Check #3: The field is the type we expect.
- $this->assertTrue(
- $chado_schema->checkColumnType($table_name, $column_name, $column_details['type']),
- t('The column "!table.!column" must be of type "!type" for chado v!version.',
- [
- '!column' => $column_name,
- '!table' => $table_name,
- '!version' => $version,
- '!type' => $column_details['type'],
- ])
- );
- }
- // There are three types of constraints:
- // primary key, unique keys, and foreign keys.
- //.......................................
- // For the primary key:
- // Check #4: The constraint exists.
- if (isset($table_schema['primary key'][0]) AND !empty($table_schema['primary key'][0])) {
- $pkey_column = $table_schema['primary key'][0];
- $this->assertTrue(
- $chado_schema->checkPrimaryKey($table_name, $pkey_column),
- t('The column "!table.!column" must be a primary key with an associated sequence and constraint for chado v!version.',
- [
- '!column' => $pkey_column,
- '!table' => $table_name,
- '!version' => $version,
- ])
- );
- }
- // For each unique key:
- foreach ($table_schema['unique keys'] as $constraint_name => $columns) {
- // @debug print "Check '$constraint_name' for '$table_name': ".implode(', ', $columns).".\n";
- // Check #4: The constraint exists.
- $this->assertTrue(
- $chado_schema->checkConstraintExists($table_name, $constraint_name, 'UNIQUE'),
- t('The unique constraint "!name" for "!table" must exist for chado v!version.',
- [
- '!name' => $constraint_name,
- '!table' => $table_name,
- '!version' => $version,
- ])
- );
- // Check #5: The constraint consists of the columns we expect.
- // @todo
- }
- // For each foreign key:
- foreach ($table_schema['foreign keys'] as $fk_table => $details) {
- foreach ($details['columns'] as $base_column => $fk_column) {
- // @debug print "Check '$table_name.$base_column => $fk_table.$fk_column ' foreign key.";
- // Check #4: The constraint exists.
- $constraint_name = $table_name . '_' . $base_column . '_fkey';
- $this->assertTrue(
- $chado_schema->checkFKConstraintExists($table_name, $base_column),
- t('The foreign key constraint "!name" for "!table.!column" => "!fktable.!fkcolumn" must exist for chado v!version.',
- [
- '!name' => $constraint_name,
- '!table' => $table_name,
- '!column' => $base_column,
- '!fktable' => $fk_table,
- '!fkcolumn' => $fk_column,
- '!version' => $version,
- ])
- );
- // Check #5: The constraint consists of the columns we expect.
- // @todo
- }
- }
- }
- }
|