You are here

parser_csv.test in Feeds 7.2

Same filename and directory in other branches
  1. 6 tests/parser_csv.test
  2. 7 tests/parser_csv.test

Tests for ParserCSV library.

File

tests/parser_csv.test
View source
<?php

/**
 * @file
 * Tests for ParserCSV library.
 */

/**
 * Test aggregating a feed as node items.
 *
 * Using DrupalWebTestCase as DrupalUnitTestCase is broken in SimpleTest 2.8.
 * Not inheriting from Feeds base class as ParserCSV should be moved out of
 * Feeds at some time.
 */
class ParserCSVTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  /**
   * {@inheritdoc}
   */
  public static function getInfo() {
    return array(
      'name' => 'CSV Parser unit tests',
      'description' => 'Base level test for Feeds\' built in CSV parser.',
      'group' => 'Feeds',
    );
  }

  /**
   * Test method.
   */
  public function test() {
    drupal_load('module', 'feeds');
    feeds_include_library('ParserCSV.inc', 'ParserCSV');
    $this
      ->_testSimple();
    $this
      ->_testBatching();
    $this
      ->_testEncodingConversion();
    $this
      ->_testEncodingConversionFailure();
  }

  /**
   * Simple test of parsing functionality.
   */
  protected function _testSimple() {

    // Pull in the $control_result array.
    include $this
      ->absolutePath() . '/tests/feeds/nodes.csv.php';
    $delimiters = $this
      ->getDelimiters();
    foreach ($delimiters as $delimiterType => $delimiter) {
      $file = $this
        ->absolutePath() . '/tests/feeds/nodes_' . $delimiterType . '.csv';
      $iterator = new ParserCSVIterator($file);
      $parser = new ParserCSV();
      $parser
        ->setDelimiter($delimiter);
      $rows = $parser
        ->parse($iterator);
      $this
        ->assertFalse($parser
        ->lastLinePos(), t('CSV reports all lines parsed, with delimiter: ') . $delimiterType);
      $this
        ->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), t('Parsed result matches control result.'));
    }
  }

  /**
   * Simple test of encoding conversion prior to parsing.
   */
  protected function _testEncodingConversion() {

    // Pull in the $control_result array.
    include $this
      ->absolutePath() . '/tests/feeds/encoding.csv.php';
    $encodings = $this
      ->getEncodings();
    foreach ($encodings as $encoding) {
      $file = $this
        ->absolutePath() . "/tests/feeds/encoding_{$encoding}.csv";
      $iterator = new ParserCSVIterator($file);
      $parser = new ParserCSV();
      $parser
        ->setDelimiter(',');
      $parser
        ->setEncoding($encoding);
      $rows = $parser
        ->parse($iterator);
      $this
        ->assertFalse($parser
        ->lastLinePos(), format_string('CSV reports all lines parsed, with encoding: %encoding', array(
        '%encoding' => $encoding,
      )));
      $this
        ->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), 'Converted and parsed result matches control result.');
    }
  }

  /**
   * Simple test of failed encoding conversion prior to parsing.
   */
  protected function _testEncodingConversionFailure() {

    // Pull in the $control_result array.
    include $this
      ->absolutePath() . '/tests/feeds/encoding.csv.php';
    $encodings = $this
      ->getEncodings();
    foreach ($encodings as $encoding) {
      $file = $this
        ->absolutePath() . "/tests/feeds/encoding_{$encoding}.csv";
      $iterator = new ParserCSVIterator($file);
      $parser = new ParserCSV();
      $parser
        ->setDelimiter(',');

      // Attempt to read file as UTF-8.
      $parser
        ->setEncoding('UTF-8');
      try {
        $rows = $parser
          ->parse($iterator);
        $this
          ->fail('Incorrect conversion attempt throws exception.');
      } catch (ParserCSVEncodingException $e) {
        $this
          ->assertNotNull($e
          ->getMessage(), 'Incorrect conversion attempt throws exception.');
      }
    }
  }

  /**
   * Test batching.
   */
  protected function _testBatching() {

    // Pull in the $control_result array.
    include $this
      ->absolutePath() . '/tests/feeds/nodes.csv.php';
    $delimiters = $this
      ->getDelimiters();
    foreach ($delimiters as $delimiterType => $delimiter) {
      $file = $this
        ->absolutePath() . '/tests/feeds/nodes_' . $delimiterType . '.csv';

      // Set up parser with 2 lines to parse per call.
      $iterator = new ParserCSVIterator($file);
      $parser = new ParserCSV();
      $parser
        ->setDelimiter($delimiter);
      $parser
        ->setLineLimit(2);
      $rows = array();
      $pos = 0;

      // Call parser until all lines are parsed, then compare to control result.
      do {
        $parser
          ->setStartByte($pos);
        $rows = array_merge($rows, $parser
          ->parse($iterator));
        $pos = $parser
          ->lastLinePos();
        $this
          ->assertTrue($parser
          ->lastLinePos() || count($rows) == 10, t('Parser reports line limit correctly'));
      } while ($pos = $parser
        ->lastLinePos());
      $this
        ->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), t('Batch parsed result matches control result for delimiter: ') . $delimiterType);
    }
  }

  /**
   * Absolute path to feeds.
   */
  public function absolutePath() {
    return DRUPAL_ROOT . '/' . drupal_get_path('module', 'feeds');
  }

  /**
   * {@inheritdoc}
   */
  public static function getDelimiters() {
    return array(
      'comma' => ',',
      'pipe' => '|',
      'semicolon' => ';',
      'plus' => '+',
      'tab' => "\t",
    );
  }

  /**
   * {@inheritdoc}
   */
  public static function getEncodings() {
    return array(
      'SJIS-win',
      'SJIS',
    );
  }

}

Classes

Namesort descending Description
ParserCSVTest Test aggregating a feed as node items.