You are here

questions_export.test in Quiz 6.6

File

includes/questions_export/questions_export.test
View source
<?php

/*
 * @file
 * Test suite for Questions Export module
 *
 */
class QuestionsExportTestCase extends DrupalWebTestCase {

  /*
   * The getInfo() method provides information about the test.
   * In order for the test to be run, the getInfo() method needs
   * to be implemented.
   */
  public static function getInfo() {
    return array(
      'name' => t('Question Exporting'),
      'description' => t('Test exporting of questions in various formats.'),
      'group' => t('Quiz'),
    );
  }

  /*
   * Implementing setUp() to enable truefalse module testing
   */
  function setUp() {
    parent::setUp('taxonomy', 'quiz', 'views', 'autoload', 'multichoice', 'quiz_directions', 'quiz_question', 'querypath', 'questions_import', 'short_answer', 'long_answer', 'truefalse', 'matching', 'questions_export');

    // Create and log in our test user. Should be cleaned up as I something
    // was wrong with permissions and I basically kept adding potentially
    // useful ones until it worked.
    // Array of drupal permission.
    $permission = array(
      'administer site configuration',
      'access administration pages',
      'administer quiz',
      'access quiz',
      'administer blocks',
      'import questions',
      'create quiz',
      'administer quiz configuration',
      'use PHP for block visibility',
      'administer blocks',
      'create multichoice',
      'edit any multichoice',
      'administer taxonomy',
      'allow multiple correct answers',
      'allow any number of answers',
      'export questions',
    );

    // create a users with specified set of permissions.
    $user = $this
      ->drupalCreateUser($permission);
    $this
      ->drupalLogin($user);

    // create one quiz, which will be the default in the import form

    /*   $quiz_settings = array();
         $quiz_settings['title'] = "Quiz";
         $quiz_settings['comment'] = "Auto-generated for testing export";
         $quiz_settings['type'] = 'quiz';
         $this->drupalCreateNode($quiz_settings); */
    $quiz_settings = array();
    $quiz_settings['title'] = $this
      ->randomName(64);
    $quiz_settings['body'] = $this
      ->randomName(255);
    $msg = $this
      ->drupalPost('node/add/quiz', $quiz_settings, 'Save');
  }
  function writeImport($input_type, $question) {
    $char = array(
      'A',
      'B',
      'C',
      'D',
      'E',
      'F',
      'G',
      'H',
      'I',
      'J',
    );
    switch ($input_type) {
      case "aiken":
        switch ($question->type) {
          case "multichoice":
            $write = $question->type . "\r\n" . $question->question . "\r\n";
            for ($i = 0; $i < count($question->answers); $i++) {
              $write .= "{$char[$i]}: {$question->answers[$i]}\r\n nil \r\n";
            }
            $write .= "ANSWER: {$char[$question->answer]} \r\n \r\n";
            break;
          case "true_false":
            $write = $question->type . "\r\n" . $question->question . "\r\n" . $question->answer . "\r\n" . $question->feedback . "\r\n \r\n";
            break;
          case "short_answer":
            $write = $question->type . "\r\n" . $question->question . "\r\n" . $question->answer . "\r\n" . $question->value . "\r\n" . $question->shortanswertype . "\r\n \r\n";
            break;
          case "long_answer":
            $write = $question->type . "\r\n" . $question->question . "\r\n" . $question->value . "\r\n \r\n";
            break;
        }
        break;
      case "csv":
        switch ($question->type) {
          case "multichoice":
            $write = $question->type . ', ' . $question->question . ', ';
            for ($i = 0; $i < count($question->answers); $i++) {
              $write .= $question->answers[$i] . ', nil, ';
            }
            $write .= $question->answers[$question->answer] . "\r\n";
            break;
          case "true_false":
            $write = $question->type . ', ' . $question->question . ', ' . $question->answer . ', ' . $question->feedback . "\r\n";
            break;
          case "short_answer":
            $write = $question->type . ', ' . $question->question . ', ' . $question->answer . ', ' . $question->value . ', ' . $question->shortanswertype . "\r\n";
            break;
          case "matching":
            $write = $question->type . ', ' . $question->question . ', ';
            for ($i = 0; $i < count($question->matches); $i++) {
              $write .= $question->matches[$i] . ', ' . ($write .= $question->answers[$i] . ', nil, ');
            }
            $write .= "\r\n";
            break;
          case "long_answer":
            $write = $question->type . ', ' . $question->question . ', ' . $question->value . "\r\n";
            break;
        }
        break;
    }
    return $write;
  }
  function writeExport($export_type, $qid = 1) {
    $export_settings['export_format'] = $export_type;
    $export_settings['quiz_node'] = $qid;
    $this
      ->drupalPost('admin/quiz/questions_export', $export_settings, 'Export');
    $file = file(file_directory_path() . '/Quiz.txt');
    $this
      ->assertNotEqual(0, count($file), '[Export] Checking at least something was put into export file');
  }
  function medlyHelper($import_type) {
    switch ($import_type) {
      case 'aiken':
        $import_settings['import_type'] = 'native_aiken';
        $filetype = '.txt';
        break;
      case 'csv':
        $import_settings['import_type'] = 'native_csv';
        $filetype = '.csv';
        break;
    }
    $import_questions = array();
    $filepath = file_create_filename($import_type . '_medly' . $filetype, file_directory_temp());
    $handle = fopen($filepath, "w+");
    for ($i = 0; $i < 30; $i++) {
      $question_type = mt_rand(0, 2);
      $question = new stdClass();
      switch ($question_type) {
        case 0:
          $question->num_options = mt_rand(1, 10);
          $question->answer = mt_rand(0, $question->num_options - 1);
          $question->question = "Question #{$i}:";
          $question->type = "multichoice";
          $question->answers = array();
          $write = $question->type . "\r\n" . $question->question . "\r\n";
          for ($j = 0; $j < $question->num_options; $j++) {
            $question->answers[$j] = "Option #{$j}";
          }
          break;
        case 1:
          $question->answer = mt_rand(0, 1) == 0 ? "true" : "false";
          $question->question = "Question #{$i}:";
          $question->type = "true_false";
          $question->feedback = "Feedback on question #{$i}";
          break;
        case 2:
          $question->answer = "The answer is {$i}.";
          $question->question = "Question #{$i}:";
          $question->type = "short_answer";
          $question->value = mt_rand(1, 5);
          $question->sat = mt_rand(0, 3);
          switch ($question->sat) {
            case 1:
              $question->shortanswertype = "case insensitive match";
              break;
            case 2:
              $question->shortanswertype = "case sensitive match";
              break;
            case 3:
              $question->shortanswertype = "regular expression match";
              break;
            case 4:
              $question->shortanswertype = "manually score match";
              break;
          }
          break;
      }
      $write = $this
        ->writeImport($import_type, $question);
      fwrite($handle, $write);
      $import_questions[] = $question;
    }
    $import_settings['quiz_node'] = '1';
    $import_settings['field_separator'] = ',';
    $import_settings['files[upload]'] = $filepath;
    $this
      ->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
    $this
      ->assertPattern('/30 questions were imported successfully/', t('Checking import success message'));
  }
  function multichoiceHelper($import_type) {
    $import_questions = array();
    switch ($import_type) {
      case 'aiken':
        $import_settings['import_type'] = 'native_aiken';
        $filetype = '.txt';
        break;
      case 'csv':
        $import_settings['import_type'] = 'native_csv';
        $filetype = '.csv';
        break;
    }
    $filepath = file_create_filename($import_type . '_multichoice' . $filetype, file_directory_temp());
    $handle = fopen($filepath, "w+");
    for ($i = 0; $i < 30; $i++) {
      $question = new stdClass();
      $question->num_options = mt_rand(2, 6);
      $question->answer = mt_rand(0, $question->num_options - 1);
      $question->question = "Question #{$i}:";
      $question->type = "multichoice";
      $question->answers = array();
      for ($j = 0; $j < $question->num_options; $j++) {
        $question->answers[$j] = "Option #{$j}";
      }
      $write = $this
        ->writeImport($import_type, $question);
      fwrite($handle, $write);
      $import_questions[] = $question;
    }
    fclose($handle);
    $import_settings['quiz_node'] = '1';
    $import_settings['field_separator'] = ',';
    $import_settings['files[upload]'] = $filepath;
    $msg = $this
      ->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
    $this
      ->assertPattern('/30 questions were imported successfully/', t('[Multichoice] Checking import success message'));
  }
  function matchingHelper($import_type) {
    $import_questions = array();
    switch ($import_type) {
      case 'aiken':
        $this
          ->assertEqual(0, 1, "Aiken does not support matching import questions");
        return;
        break;
      case 'csv':
        $import_settings['import_type'] = 'native_csv';
        $filetype = '.csv';
        break;
    }
    $filepath = file_create_filename($import_type . '_matching' . $filetype, file_directory_temp());
    $handle = fopen($filepath, "w+");
    for ($i = 0; $i < 30; $i++) {
      $question = new stdClass();
      $question->num_options = mt_rand(1, 10);
      $question->question = "Question #{$i}:";
      $question->type = "matching";
      $question->matches = array();
      $question->answers = array();
      for ($j = 0; $j < $question->num_options; $j++) {
        $question->matches[] = "Match #{$j}";
        $question->answers[] = "Answer #{$j}";
      }
      $write = $this
        ->writeImport($import_type, $question);
      fwrite($handle, $write);
      $import_questions[] = $question;
    }
    fclose($handle);
    $import_settings['quiz_node'] = '1';
    $import_settings['field_separator'] = ',';
    $import_settings['files[upload]'] = $filepath;
    $this
      ->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
    $this
      ->assertPattern('/30 questions were imported successfully/', t('[Matching] Checking import success message'));
  }
  function truefalseHelper($import_type) {
    $import_questions = array();
    switch ($import_type) {
      case 'aiken':
        $import_settings['import_type'] = 'native_aiken';
        $filetype = '.txt';
        break;
      case 'csv':
        $import_settings['import_type'] = 'native_csv';
        $filetype = '.csv';
        break;
    }
    $filepath = file_create_filename($import_type . '_truefalse' . $filetype, file_directory_temp());
    $handle = fopen($filepath, "w+");
    for ($i = 0; $i < 50; $i++) {
      $question = new stdClass();
      $question->answer = mt_rand(0, 1) == 0 ? "true" : "false";
      $question->question = "Question #{$i}:";
      $question->type = "true_false";
      $question->feedback = "Feedback on question #{$i}";
      $write = $this
        ->writeImport($import_type, $question);
      fwrite($handle, $write);
      $import_questions[] = $question;
    }
    fclose($handle);
    $import_settings['quiz_node'] = '1';
    $import_settings['field_separator'] = ',';
    $import_settings['files[upload]'] = $filepath;
    $msg = $this
      ->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
    $this
      ->assertPattern('/50 questions were imported successfully/', t('[True_False] Checking import success message'));
  }
  function shortanswerHelper($import_type) {
    $import_questions = array();
    switch ($import_type) {
      case 'aiken':
        $import_settings['import_type'] = 'native_aiken';
        $filetype = '.txt';
        break;
      case 'csv':
        $import_settings['import_type'] = 'native_csv';
        $filetype = '.csv';
        break;
    }
    $filepath = file_create_filename($import_type . '_shortanswer' . $filetype, file_directory_temp());
    $handle = fopen($filepath, "w+");
    for ($i = 0; $i < 20; $i++) {
      $question = new stdClass();
      $question->answer = "The answer is {$i}.";
      $question->question = "Question #{$i}:";
      $question->type = "short_answer";
      $question->value = mt_rand(1, 5);
      $question->sat = mt_rand(0, 3);
      switch ($question->sat) {
        case 0:
          $question->shortanswertype = "case insensitive match";
          break;
        case 1:
          $question->shortanswertype = "case sensitive match";
          break;
        case 2:
          $question->shortanswertype = "regular expression match";
          break;
        case 3:
          $question->shortanswertype = "manually score match";
          break;
      }
      $write = $this
        ->writeImport($import_type, $question);
      fwrite($handle, $write);
      $import_questions[] = $question;
    }
    fclose($handle);
    $import_settings['quiz_node'] = '1';
    $import_settings['field_separator'] = ',';
    $import_settings['files[upload]'] = $filepath;
    $msg = $this
      ->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
    $this
      ->assertPattern('/20 questions were imported successfully/', t('[Short_Answer] Checking import success message'));
  }
  function multiloadHelper($import_type) {
    $import_settings['quiz_node'] = '1';
    switch ($import_type) {
      case 'aiken':
        $import_settings['import_type'] = 'native_aiken';
        $filetype = '.txt';
        break;
      case 'csv':
        $import_settings['import_type'] = 'native_csv';
        $filetype = '.csv';
        break;
    }
    $import_settings['field_separator'] = ',';
    $import_questions = array();
    for ($i = 0; $i < 6; $i++) {
      $filepath = file_create_filename($import_type . '_multi_' . $i . $filetype, file_directory_temp());
      $handle = fopen($filepath, "w+");
      for ($j = $i * 5; $j < ($i + 1) * 5; $j++) {
        $question = new stdClass();
        $question->num_options = mt_rand(2, 5);
        $question->answer = mt_rand(0, $question->num_options - 1);
        $question->question = "Question #{$j}:";
        $question->type = "multichoice";
        $question->answers = array(
          "true",
          "false",
        );
        for ($k = 0; $k < $question->num_options; $k++) {
          $question->answers[$k] = "Option #{$k}";
        }
        $write = $this
          ->writeImport($import_type, $question);
        fwrite($handle, $write);
        $import_questions[] = $question;
      }
      fclose($handle);
      $import_settings['files[upload]'] = $filepath;
      $this
        ->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
      $this
        ->assertPattern('/5 questions were imported successfully/', t('Checking import success message'));
    }
  }
  function testAikenMedly() {
    $this
      ->medlyHelper('aiken');
    $this
      ->writeExport('native_aiken');
  }
  function testAikenMultichoice() {
    $this
      ->multichoiceHelper('aiken');
    $this
      ->writeExport('native_aiken');
  }
  function testAikenTrueFalse() {
    $this
      ->truefalseHelper('aiken');
    $this
      ->writeExport('native_aiken');
  }
  function testAikenShortAnswer() {
    $this
      ->shortanswerHelper('aiken');
    $this
      ->writeExport('native_aiken');
  }
  function testCsvMedly() {
    $this
      ->medlyHelper('csv');
    $this
      ->writeExport('native_csv');
  }
  function testCsvMultichoice() {
    $this
      ->multichoiceHelper('csv');
    $this
      ->writeExport('native_csv');
  }
  function testCsvMatching() {
    $this
      ->matchingHelper('csv');
    $this
      ->writeExport('native_csv');
  }
  function testCsvTrueFalse() {
    $this
      ->truefalseHelper('csv');
    $this
      ->writeExport('native_csv');
  }
  function testCsvShortAnswer() {
    $this
      ->shortanswerHelper('csv');
    $this
      ->writeExport('native_csv');
  }

}

Classes