t('FAQ functionality'), 'description' => t('Base class. No tests here.'), 'group' => t('Frequently Asked Questions'), ); } /** * Implementation of setUp(). */ function setUp() { // Install FAQ Module. parent::setUp('taxonomy', 'faq'); // Create and log in user with administer taxonomy permissions. $this->admin_user = $this->drupalCreateUser(array('administer taxonomy', 'administer faq', 'administer faq order', 'administer blocks')); $this->drupalLogin($this->admin_user); $this->faq_user = $this->drupalCreateUser(array('create faq content', 'edit any faq content', 'delete any faq content', 'view faq page', 'access content')); // Set up the vocab and terms. $this->setupTaxonomy(); // Categorize questions. $this->drupalPost('admin/config/content/faq/categories', array('faq_use_categories' => '1'), t('Save configuration')); // Set answer_user as default expert. $roles = $this->faq_user->roles; end($roles); // Set to last role (the unique one) // Start all tests logged out. $this->drupalLogout(); } /** * Tear the whole thing down again */ function tearDown() { // Things to tidy up like vars and stuff parent::tearDown(); } /** * Generates a random string of ASCII numeric characters (values 48 to 57). * * @param $length * Length of random string to generate . * @return * Randomly generated string. */ protected static function randomNumber($length = 8) { $str = ''; for ($i = 0; $i < $length; $i++) { $str .= chr(mt_rand(48, 57)); } return $str; } /** * Verify that current user has no access to page. * * @param $url * URL to verify. */ function faqVerifyNoAccess($url) { // Test that page returns 403 Access Denied $this->drupalGet($url); $this->assertResponse(403); } /** * Set up the taxonomy - all vocabularies and stuff * Values also stored in protected variable $tax */ function setupTaxonomy() { // Create vocabulary. $this->vocabulary = $vocabulary = new stdClass(); $vocabulary->name = $this->randomName(8); $vocabulary->description = $this->randomName(64); $vocabulary->machine_name = drupal_strtolower($this->randomName()); $vocabulary->help = ''; $vocabulary->nodes = array('faq' => 'faq'); $vocabulary->weight = mt_rand(0, 10); taxonomy_vocabulary_save($vocabulary); $field = array( 'field_name' => 'taxonomy_' . $this->vocabulary->machine_name, 'type' => 'taxonomy_term_reference', 'cardinality' => FIELD_CARDINALITY_UNLIMITED, 'settings' => array( 'allowed_values' => array( array( 'vocabulary' => $this->vocabulary->machine_name, 'parent' => 0, ), ), ), ); field_create_field($field); $this->instance = array( 'field_name' => 'taxonomy_' . $this->vocabulary->machine_name, 'bundle' => 'faq', 'entity_type' => 'node', 'widget' => array( 'type' => 'taxonomy_autocomplete', ), 'display' => array( 'default' => array( 'type' => 'taxonomy_term_reference_link', ), ), ); field_create_instance($this->instance); // Add term // Click the last occurrence of the link. $this->term = $term = new stdClass(); $term->name = $this->randomName(8); $term->description = $this->randomName(64); // Use the first available text format. $term->format = db_query_range('SELECT format FROM {filter_format}', 0, 1)->fetchField(); $term->vid = $vocabulary->vid; taxonomy_term_save($term); } /** * Test accessing the FAQ page */ } class FaqAccessTestClass extends FaqTestCase { /** * Implementation of getInfo(). */ public static function getInfo() { return array( 'name' => t('Access to FAQ pages'), 'description' => t('Access to pages by anonymous user and logged in user with rights.'), 'group' => t('Frequently Asked Questions'), ); } function testFaqAccess() { // Verify that anonymous user has no access to the faq page $this->faqVerifyNoAccess('faq-page'); // Create and login user $normal_user = $this->drupalCreateUser(); $this->drupalLogin($normal_user); // Verify that logged in user has no access to the faq page $this->faqVerifyNoAccess('faq-page'); $this->drupalLogout(); $view_faq_user = $this->drupalCreateUser(array('view faq page')); $this->drupalLogin($view_faq_user); // Verify that the faq page is visible and available but empty $this->drupalGet('faq-page'); $this->assertText(t('Frequently Asked Questions'), t('FAQ page is available for view faq page permissions.')); } } class CreateFaqTestCase extends FaqTestCase { /** * Implementation of getInfo(). */ public static function getInfo() { return array( 'name' => t('Create FAQ node'), 'description' => t('Add, edit and delete FAQ nodes when FAQ module is enabled.'), 'group' => t('Frequently Asked Questions'), ); } /** * Test creating a FAQ node * * This test creates a faq with detailed question shown and labeled questions and answers */ function testFaqCreate() { // Create and log in user with create FAQ permissions $this->drupalLogin($this->admin_user); // Show the detailed question $this->drupalGet('admin/config/content/faq/questions'); // Set faq to allow long question text and labeled questions and answers $this->drupalPost('admin/config/content/faq/questions', array('faq_question_long_form' => '1', 'faq_qa_mark' => '1'), t('Save configuration')); $this->drupalPost('admin/config/content/faq/questions', array('faq_question_length' => 'both'), t('Save configuration')); $this->afaq_user = $this->drupalCreateUser(array('create faq content', 'view faq page')); $this->drupalLogin($this->afaq_user); // Verify that the faq page is visible and available but empty $this->drupalGet('faq-page'); $this->assertText(t('Frequently Asked Questions'), t('FAQ page is available for view faq page permissions.')); // Fill in the Create FAQ node 1 form and post it $langcode = LANGUAGE_NONE; $this->faq1 = array(); $this->faq1['title'] = 'faq1_'. $this->randomName(8); $this->faq1[$this->instance['field_name'] . '[' . $langcode .']'] = $this->term->name; $this->faq1["field_detailed_question[$langcode][0][value]"] = $this->randomName(16); $this->faq1["body[$langcode][0][value]"] = $this->randomName(16); $this->drupalPost('node/add/faq', $this->faq1, t('Save')); // Check that new FAQ node has actually been created $this->assertText(t('FAQ @title has been created.', array('@title' => $this->faq1['title']))); // Check that faq is found on the correct taxonomy term page too $this->drupalGet('taxonomy/term/' . $this->term->tid); $this->assertText(t('@title', array('@title' => $this->faq1['title']))); // Fill in the Create FAQ node 2 form and post it $this->faq2 = array(); $this->faq2['title'] = 'faq2_'. $this->randomName(8); $this->faq2[$this->instance['field_name'] . '[' . $langcode .']'] = $this->randomName(8); // Add new term $this->faq2["field_detailed_question[$langcode][0][value]"] = $this->randomName(16); $this->faq2["body[$langcode][0][value]"] = $this->randomName(16); $this->drupalPost('node/add/faq', $this->faq2, t('Save')); // Check that new FAQ node has actually been created $this->assertText(t('FAQ @title has been created.', array('@title' => $this->faq2['title']))); // New user $this->drupalLogout(); // Verify that logged in user has no access to the faq page $this->faqVerifyNoAccess('faq-page'); // Check that the FAQ page is available and that the correct term is listed as grouping for the new FAQ node $view_faq_user = $this->drupalCreateUser(array('view faq page')); $this->drupalLogin($view_faq_user); $this->drupalGet('faq-page'); $this->assertText(t('Frequently Asked Questions'), t('FAQ page is available for view faq page permissions.')); $this->assertText($this->faq1['title'], t('Created FAQ node 1 available on FAQ page.')); $this->assertText($this->faq1[$this->instance['field_name'] . '[' . $langcode .']'], t('Term for node 1 available on FAQ page.')); $this->assertText($this->faq2['title'], t('Created FAQ node 2 available on FAQ page.')); $this->assertText($this->faq2[$this->instance['field_name'] . '[' . $langcode .']'], t('Term for node 2 available on FAQ page.')); // Navigate to FAQ node created on FAQ page $this->clickLink(t($this->faq1['title'])); $this->assertText(t($this->faq1["field_detailed_question[$langcode][0][value]"]), t('Detailed question visible')); // Dependant on the question setting $this->assertText(t($this->faq1["body[$langcode][0][value]"]), t('Answer visible')); // Enable categorisation of FAQ nodes // Create and log in user with create and administer FAQ permissions $this->admin_user = $this->drupalCreateUser(array('create faq content', 'view faq page', 'administer faq')); $this->drupalLogin($this->admin_user); // faq_use_categories $faqcfg = array(); $faqcfg['faq_use_categories'] = '1'; // Enable categorised FAQs $this->drupalPost('admin/config/content/faq/categories', $faqcfg, t('Save configuration')); $this->drupalLogout(); $this->drupalLogin($view_faq_user); $this->drupalGet('faq-page'); $this->assertText(t('Frequently Asked Questions'), t('FAQ page is available for view faq page permissions.')); $this->assertText($this->faq1['title'], t('Created FAQ node 1 available on FAQ page.')); $this->assertText($this->faq1[$this->instance['field_name'] . '[' . $langcode .']'], t('Term for node 1 not available on FAQ page.')); $this->assertText($this->faq2['title'], t('Created FAQ node 2 available on FAQ page.')); $this->assertText($this->faq2[$this->instance['field_name'] . '[' . $langcode .']'], t('Term for node 2 not available on FAQ page.')); // TODO: Add update and Delete of FAQ nodes } } class CRAUDFaqTestCase extends FaqTestCase { /** * Implementation of getInfo(). */ public static function getInfo() { return array( 'name' => t('CRUD Question'), 'description' => t('Create, read, update and delete a question'), 'group' => t('Frequently Asked Questions'), ); } /** * Test creating an FAQ and verify its status */ public function testFaqCreate() { // Verify that logged in user has no access to the faq page $this->faqVerifyNoAccess('faq-page'); // Log in user with create FAQ permissions $this->drupalLogin($this->faq_user); // Create a FAQ node. $edit = array(); $edit['title'] = $this->randomName(8); $edit[$this->instance['field_name'] . '['. LANGUAGE_NONE .']'] = $this->randomName(8); $edit['field_detailed_question['. LANGUAGE_NONE .'][0][value]'] = $this->randomName(64); $edit['body['. LANGUAGE_NONE .'][0][value]'] = $this->randomString(264); $this->drupalPost('node/add/faq', $edit, t('Save')); $this->assertText(t('FAQ @title has been created.', array('@title' => $edit['title']))); // Check status for FAQ node - should be published $node = $this->drupalGetNodeByTitle($edit['title']); $this->assertTrue($node->status); $this->drupalLogout(); // Verify that anonymous user has no access to the unanswered node display // $this->faqVerifyNoAccess('node/' . $node->nid); $this->drupalGet('node/' . $node->nid . '/edit'); // Open edit page with node // $this->assertResponse(200); // Create and log in user with view FAQ permissions $faq_view_user = $this->drupalCreateUser(array('view faq page')); $this->drupalLogin($faq_view_user); // Verify visibility on faq page $this->drupalGet('faq-page'); // Load faq page $this->assertText($edit['title']); // Node should be listed here $this->drupalGet('node/' . $node->nid); // It should also be possible to open the node directly // Update FAQ // Log in user with answer question. Must also have edit any faq content and view faq page permissions. $this->drupalLogin($this->faq_user); $edit2['title'] = 'title-' . $this->randomName(8); $edit2['body['. LANGUAGE_NONE .'][0][value]'] = 'body-' . $this->randomName(64); $this->drupalPost('node/' . $node->nid . '/edit', $edit2, t('Save')); $this->assertText(t('FAQ @title has been updated.', array('@title' => $edit2['title']))); $this->assertText($edit2['title'], 'Title has changed'); $this->assertText($edit2['body['. LANGUAGE_NONE .'][0][value]'], 'Body has changed'); // Delete FAQ // Try deleting faq by edit faq permission $this->drupalPost('node/' . $node->nid . '/edit', array(), t('Delete')); // Log in user with delete FAQ permissions $this->drupalLogin($this->admin_user); $this->drupalPost('node/' . $node->nid . '/edit', array(), t('Delete')); $this->assertText(t('Are you sure you want to delete @title?', array('@title' => $edit2['title']))); $this->drupalPost('node/' . $node->nid . '/delete', array(), t('Delete')); $this->assertText(t('FAQ @title has been deleted.', array('@title' => $edit2['title']))); } }