123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 |
- <?php
- namespace Tests\tripal_chado\fields;
- use StatonLab\TripalTestSuite\DBTransaction;
- use StatonLab\TripalTestSuite\TripalTestCase;
- use StatonLab\TripalTestSuite\Database\Factory;
- class ChadoFieldGetValuesListTest extends TripalTestCase {
-
- use DBTransaction;
-
- private $field_list = NULL;
-
- public function testBaseTableColumns($field_name, $bundle_name, $info) {
- include_once(drupal_get_path('tripal_chado', 'module') . '/includes/TripalFields/ChadoField.inc');
-
-
-
-
-
- $instance = new \ChadoField($info['field_info'], $info['instance_info']);
-
-
- $values = $instance->getValueList(array('limit' => 5));
-
- $this->assertTrue(
- is_array($values),
- t(
- 'No values returned for @field_name (bundle: @bundle_name, bundle base table: @bundle_base_table, chado table: @chado_table, chado column: @chado_column).',
- array(
- '@field_name' => $field_name,
- '@bundle_name' => $bundle_name,
- '@bundle_base_table' => $info['bundle_base_table'],
- '@chado_table' => $info['instance_info']['settings']['chado_table'],
- '@chado_column' => $info['instance_info']['settings']['chado_column'],
- )
- )
- );
-
- $this->assertLessThanOrEqual(5, sizeof($values),
- t('Returned too many results for @field_name.', array('@field_name' => $field_name)));
-
-
-
-
- $fake_value = $this->generateFakeData($info['bundle_base_table'], $info['base_schema'], $info['instance_info']['settings']['chado_column']);
- if ($fake_value !== FALSE) {
-
- $values = $instance->getValueList(array('limit' => 200));
-
-
-
-
-
- if (sizeof($values) < 200) {
- $this->assertContains($fake_value, $values, "\nThe following array should but does not contain our fake value ('$fake_value'): '" . implode("', '", $values) . '.');
- }
- }
- }
-
- public function getBaseFields() {
-
-
- $fields = $this->retrieveFieldList();
- return $fields['field_chado_storage']['base'];
- }
-
- public function testBaseTableForeignKey($field_name, $bundle_name, $info) {
- include_once(drupal_get_path('tripal_chado', 'module') . '/includes/TripalFields/ChadoField.inc');
-
-
-
-
-
- $instance = new \ChadoField($info['field_info'], $info['instance_info']);
-
-
- $values = $instance->getValueList(array('limit' => 5));
-
- $this->assertTrue(
- is_array($values),
- t(
- 'No values returned for @field_name with no label string set (bundle: @bundle_name, bundle base table: @bundle_base_table, chado table: @chado_table, chado column: @chado_column).',
- array(
- '@field_name' => $field_name,
- '@bundle_name' => $bundle_name,
- '@bundle_base_table' => $info['bundle_base_table'],
- '@chado_table' => $info['instance_info']['settings']['chado_table'],
- '@chado_column' => $info['instance_info']['settings']['chado_column'],
- )
- )
- );
-
- $this->assertLessThanOrEqual(5, sizeof($values),
- t('Returned too many results for @field_name.', array('@field_name' => $field_name)));
-
-
-
-
-
- $fake_fk_record = $this->generateFakeData($info['bundle_base_table'], $info['base_schema'], $info['instance_info']['settings']['chado_column'], $info['fk_table']);
- if ($fake_fk_record !== FALSE) {
-
-
- $schema = chado_get_schema($info['fk_table']);
- $fk_table_fields = array_keys($schema['fields']);
- $use_in_label = array_rand($fk_table_fields, 2);
- $column1 = $fk_table_fields[$use_in_label[0]];
- $column2 = $fk_table_fields[$use_in_label[1]];
-
- $label_string = '['.$column2.'] (['.$column1.'])';
-
- $values = $instance->getValueList(array('limit' => 200, 'label_string' => $label_string));
-
-
-
-
-
- if (sizeof($values) < 200) {
- $fixed_key = $fake_fk_record->{$info['fk_table'].'_id'};
- $this->assertArrayHasKey($fixed_key, $values, "\nThe following array should but does not contain our fake record: " . print_r($fake_fk_record, TRUE));
-
-
- $expected_label = $fake_fk_record->{$column2} . ' (' . $fake_fk_record->{$column1} . ')';
- $this->assertEquals($expected_label, $values[$fixed_key], "\nThe label should have been '$label_string' with the column values filled in.");
- }
- }
- }
-
- public function getBaseFkFields() {
-
-
- $fields = $this->retrieveFieldList();
- return $fields['field_chado_storage']['foreign key'];
- }
-
- public function testNonBaseTable($field_name, $bundle_name, $info) {
- include_once(drupal_get_path('tripal_chado', 'module') . '/includes/TripalFields/ChadoField.inc');
-
-
-
-
-
- $instance = new \ChadoField($info['field_info'], $info['instance_info']);
-
- putenv("TRIPAL_SUPPRESS_ERRORS=TRUE");
- ob_start();
- try {
-
-
- $values = $instance->getValueList(array('limit' => 5));
-
-
-
- } catch (Exception $e) {
- $this->fail("Although we don't support values lists for $field_name, it still shouldn't produce an exception!");
- }
-
- ob_end_clean();
- putenv("TRIPAL_SUPPRESS_ERRORS");
- $this->assertFalse($values, "We don't support retrieving values for $field_name since it doesn't store data in the base table.");
- }
-
- public function getNonBaseFields() {
-
-
- $fields = $this->retrieveFieldList();
- return $fields['field_chado_storage']['referring'];
- }
-
- private function retrieveFieldList() {
- if ($this->field_list === NULL) {
- $this->field_list = array();
-
-
-
- $bundles = field_info_instances('TripalEntity');
- foreach($bundles as $bundle_name => $fields) {
-
- $bundle = tripal_load_bundle_entity(array('name'=> $bundle_name));
-
- foreach ($fields as $field_name => $instance_info) {
- $bundle_base_table = $base_schema = NULL;
-
- $field_info = field_info_field($field_name);
-
- $storage = $field_info['storage']['type'];
-
-
- $rel = NULL;
- if ($storage == 'field_chado_storage') {
-
- $bundle_base_table = $bundle->data_table;
-
- $base_schema = chado_get_schema($bundle_base_table);
-
- $field_table = $instance_info['settings']['chado_table'];
- $field_column = $instance_info['settings']['chado_column'];
-
- $rel = 'referring';
- $rel_table = NULL;
-
-
-
- if ($bundle_base_table == $field_table) {
-
- $rel = 'base';
-
- foreach ($base_schema['foreign keys'] as $schema_info) {
- if (isset($schema_info['columns'][ $field_column ])) {
- $rel = 'foreign key';
- $rel_table = $schema_info['table'];
- }
- }
- }
- }
-
- $info = array(
- 'field_name' => $field_name,
- 'bundle_name' => $bundle_name,
- 'bundle' => $bundle,
- 'bundle_base_table' => $bundle_base_table,
- 'base_schema' => $base_schema,
- 'field_info' => $field_info,
- 'instance_info' => $instance_info,
- 'fk_table' => $rel_table,
- );
-
- $key = $bundle_name . '--' . $field_name;
-
-
- if ($rel) {
- $this->field_list[$storage][$rel][$key] = array(
- $field_name,
- $bundle_name,
- $info
- );
- }
- else {
- $this->field_list[$storage][$key] = array(
- $field_name,
- $bundle_name,
- $info
- );
- }
- }
- }
- }
- return $this->field_list;
- }
-
- private function generateFakeData($chado_table, $schema, $fixed_column = FALSE, $fk_table = FALSE) {
- $faker = \Faker\Factory::create();
-
- if (!Factory::exists('chado.'.$chado_table)) {
- return FALSE;
- }
-
- if ($fixed_column === FALSE) {
- factory('chado.'.$chado_table, 50)->create();
- return TRUE;
- }
-
-
-
- $fake_value = NULL;
-
- if ($fk_table === FALSE) {
- $column_type = $schema[$fixed_column]['type'];
- if (($column_type == 'int')) {
- $fake_value = $faker->randomNumber();
- }
- elseif (($column_type == 'varchar') OR ($column_type == 'text')) {
- $fake_value = $faker->words(2,TRUE);
- }
- if ($fake_value !== NULL) {
- factory('chado.'.$chado_table)->create(array(
- $fixed_column => $fake_value,
- ));
- return $fake_value;
- }
- }
-
-
- else {
-
- $fake_table_record = factory('chado.'.$fk_table)->create();
-
- if (!Factory::exists('chado.'.$fk_table)) {
- return FALSE;
- }
-
- if (isset($fake_table_record->{$fk_table.'_id'})) {
- factory('chado.'.$chado_table)->create(array(
- $fixed_column => $fake_table_record->{$fk_table.'_id'},
- ));
- return $fake_table_record;
- }
- }
- return FALSE;
- }
- }
|