| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 | <?phpnamespace Tests\tripal_jbrowse_mgmt;use StatonLab\TripalTestSuite\DBTransaction;use StatonLab\TripalTestSuite\TripalTestCase;use Faker\Factory;class ApiTest extends TripalTestCase {  // Uncomment to auto start and rollback db transactions per test method.  use DBTransaction;  /**   * Tests the Settings API.   *   * Specifically tripal_jbrowse_mgmt_save_settings()   * and tripal_jbrowse_mgmt_get_settings().   */  public function testSettings() {    $test_settings = [      'bin_path' => 'test/fake/path',	    'link' => 'test/fake/path',	    'data_dir' => 'test/fake/path',	    'menu_template' => [],    ];    tripal_jbrowse_mgmt_save_settings($test_settings);    $retrieved = tripal_jbrowse_mgmt_get_settings();    // Check that all the expected settings are available.    $expected = ['bin_path', 'link', 'data_dir', 'menu_template'];    foreach ($expected as $expected_key) {      $this->assertArrayHasKey($expected_key, $retrieved,        "Retrieved settings do not contain $expected_key");      // Check that the settings match if provided in test.      if (isset($test_settings[$expected_key])) {        $this->assertEquals(          $test_settings[$expected_key],          $retrieved[$expected_key],          "The retrieved value for $expected_key does not match what we set."        );      }    }  }  /**   * Test Instance Create-Retrieve-Update-Delete.   */  public function testInstanceCRUD() {    putenv("TRIPAL_SUPPRESS_ERRORS=TRUE");    $organism = factory('chado.organism')->create();    // Full Fake Instance Details.    $faker = Factory::create();    $testdata = [      'organism_id' => $organism->organism_id,      'title' => $faker->words(3, TRUE),      'description' => $faker->sentence(25, TRUE),      'created_at' => $faker->unixTime(),      'file' => '/path/to/fake/file',    ];    // Check we cannot create a JBrowse instance without an organism.    $noOrganism = $testdata;    unset($noOrganism['organism_id']);    $id = tripal_jbrowse_mgmt_create_instance($noOrganism);    $this->assertFalse($id,      "Created an instance without an organism_id!?!");    // Now try to create an instance with all the data.    $id = tripal_jbrowse_mgmt_create_instance($testdata);    $this->assertNotFalse($id,      "Unable to create instance.");    // Try to retrieve the instance we just created.    $retrieved_instance = tripal_jbrowse_mgmt_get_instance($id);    $this->assertNotFalse($id, "We did not retrieve an instance?");    $this->assertEquals($id, $retrieved_instance->id,      "We retrieved a different instance then we asked for?");    $this->assertEquals(      $testdata['organism_id'], $retrieved_instance->organism_id,      "Retreived the same instance but the organism is not correct?");    // Change the title and test the instance was updated.    $new_title = $testdata;    $testdata['title'] = 'NEW FAKE TITLE ' . uniqid();    $success = tripal_jbrowse_mgmt_update_instance($id, $new_title);    $this->assertNotFalse($success, 'Unable to update instance title.');    $retrieved_instance = tripal_jbrowse_mgmt_get_instance($id);    $this->assertEquals(      $new_title['title'], $retrieved_instance->title,      "The title was not updated.");    // Finally delete him!    $success = tripal_jbrowse_mgmt_delete_instance($retrieved_instance);    $this->assertNotFalse($success, 'Unable to delete this instance.');    $one_more_time = tripal_jbrowse_mgmt_get_instance($id);    $this->assertFalse($one_more_time);    // and delete with numeric id.    $success = tripal_jbrowse_mgmt_delete_instance($id);    $this->assertNotFalse($success, 'Unable to delete this instance.');    // and catch an exception during delete.    try {      $success = tripal_jbrowse_mgmt_delete_instance('FAKESTRING');      // If we get here without an exception then this test should fail.      $this->assertTrue(FALSE, "Shouldn't be able to extract instance to delete.");    } catch (\Exception $e) {        // Not worried since this is expected!    }    putenv("TRIPAL_SUPPRESS_ERRORS");  }  /**   * Test Track Create-Retrieve-Update-Delete.   */  public function testTrackCRUD() {    // Fake Instance.    $faker = Factory::create();    $organism = factory('chado.organism')->create();    $instance_details = [      'organism_id' => $organism->organism_id,      'title' => $faker->words(3, TRUE),      'description' => $faker->sentence(25, TRUE),      'created_at' => $faker->unixTime(),      'file' => '/path/to/fake/file',    ];    $instance_id = tripal_jbrowse_mgmt_create_instance($instance_details);    $instance = tripal_jbrowse_mgmt_get_instance($instance_id);    $path = tripal_jbrowse_mgmt_get_track_list_file_path($instance);    $this->assertNotFalse($path,      "Unable to retrieve the path to the trackList.json");    // Fake track details.    $testdata = [      'label' => $faker->words(2, TRUE),      'track_type' => 'CanvasFeatures',      'file_type' => 'gff',      'created_at' => $faker->unixTime(),      'file' => '/path/to/fake/file',    ];    // First retrieve when there are no tracks.    $tracks = tripal_jbrowse_mgmt_get_tracks($instance);    $this->assertCount(0, $tracks,      "There should not be tracks as we just created this instance.");    // Create tracks.    $track_id = tripal_jbrowse_mgmt_create_track($instance, $testdata);    $this->assertNotFalse($track_id,      "We should have a track created successfully.");    // Retrieve our newly created track.    $track = tripal_jbrowse_mgmt_get_track($track_id);    $this->assertNotFalse($track, "Unable to create track.");    $this->assertEquals($testdata['label'], $track->label,      "The label of our new track didn't match what we submitted.");    $this->assertEquals($instance->id, $track->instance_id,      "The instance_id of our new track didn't match what we submitted.");    $this->assertEquals($instance->organism_id, $track->organism_id,      "The organism_id of our new track didn't match what we submitted.");    // Retrieve track with a condition.    $tracks = tripal_jbrowse_mgmt_get_tracks($instance, ['label' => $testdata['label']]);    $this->assertCount(1, $tracks, "We were not able to select a track we knew should exist.");    // Now update it.    $new_label = 'NEW LABEL ' . uniqid();    $success = tripal_jbrowse_mgmt_update_track($track, ['label' => $new_label]);    $this->assertNotFalse($success, "Unable to update track label.");    $new_track = tripal_jbrowse_mgmt_get_track($track_id);    $this->assertEquals($new_label, $new_track->label,      "The label of the track was not updated.");    // Finally, delete it.    $success = tripal_jbrowse_mgmt_delete_track($track_id);    $this->assertNotFalse($success, "Unable to delete track.");    $success = tripal_jbrowse_mgmt_delete_track($track_id);    $this->assertEquals(0, $success, "Deleted a track that doesn't exist?");  }  /**   * Test organism-related api functions.   */  public function testOrganismAPI() {    // Fake Organism.    $faker = Factory::create();    $organism = factory('chado.organism')->create();    $organism_list = tripal_jbrowse_mgmt_get_organisms_list();    $this->assertNotCount(0, $organism_list, "There should be at least one organism.");    $this->assertArrayContainsObjectValue($organism_list, 'organism_id', $organism->organism_id);    $organism_name = tripal_jbrowse_mgmt_construct_organism_name($organism);    $this->assertRegexp('/'.$organism->genus.'/', $organism_name,      "The organism name did not contain the genus.");    $this->assertRegexp('/'.$organism->species.'/', $organism_name,      "The organism name did not contain the species.");    $slug = tripal_jbrowse_mgmt_make_slug($organism_name);    $this->assertNotRegexp('/ /', $slug,      "The organism slug should not contain spaces.");  }  /**   * Test Instance Properties Create-Retrieve-Update.   */  public function testInstanceProperyCRU() {    // Fake Instance.    $faker = Factory::create();    $organism = factory('chado.organism')->create();    $instance_details = [      'organism_id' => $organism->organism_id,      'title' => $faker->words(3, TRUE),      'description' => $faker->sentence(25, TRUE),      'created_at' => $faker->unixTime(),      'file' => '/path/to/fake/file',    ];    $instance_id = tripal_jbrowse_mgmt_create_instance($instance_details);    $testdata = [      $faker->word() => $faker->words(3, TRUE),      $faker->word() => $faker->words(2, TRUE),      $faker->word() => $faker->words(10, TRUE),    ];    // Create.    tripal_jbrowse_mgmt_save_instance_properties($instance_id, $testdata);    // Retrieve.    $properties = tripal_jbrowse_mgmt_get_instance_properties($instance_id);    $this->assertIsArray($properties, "Unable to retrieve newly created properties.");    $this->assertCount(3, $properties,      "There was not the expected count of properties.");    // Update single property.    $property_name = key($testdata);    $new_value = 'NEW VALUE '.uniqid();    tripal_jbrowse_mgmt_save_instance_property($instance_id, $property_name, $new_value);    $retrieved_value = tripal_jbrowse_mgmt_get_instance_property($instance_id, $property_name);    $this->assertEquals($new_value, $retrieved_value,      "We were unable to update a single property.");  }  /**   * Test Miscellaneous API functions.   */  public function testMiscAPI() {    $track_types = tripal_jbrowse_mgmt_get_track_types();    $this->assertIsArray($track_types,      "The track types should be an array.");  }  /**   * Provide an assertion to check properties of an array of objects.   *   * For example, if you have an array of organism objects, the following code   * would check that one object in the array has an organism_id of 50.   * @code $this->assertArrayContainsObjectValue($array, 'organism_id', 50);   */  private function assertArrayContainsObjectValue($theArray, $attribute, $value)  {      foreach($theArray as $arrayItem) {          if($arrayItem->$attribute == $value) {              return true;          }      }      return false;  }}
 |