jazzarati/csv_piper

View on GitHub
spec/end_to_end_spec.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'spec_helper'

describe 'end to end' do
  let(:required_headers) { ['Input 1','Process','Input 2','Result'] }
  let(:expected_output) do
    [
      { row: 2, equation: '1 + 1 == 2', valid: true },
      { row: 4, equation: '2 * 2 == 4', valid: true },
    ]
  end

  it 'processes a csv file' do
    output_collector = CollectProcessedEquations.new
    error_collector = CsvPiper::Processors::CollectErrors.new

    File.open(File.join(File.dirname(__FILE__),"/data/csv_1.csv")) do |file|

      csv_piper = CsvPiper::Builder.new.from(file)
        .requires_headers(required_headers)
        .with_processors([
          BuildEquation.new, EvaluateEquation.new, output_collector, error_collector
        ])
        .build

      csv_piper.process if csv_piper.has_required_headers?
    end

    output = output_collector.output
    errors = error_collector.errors

    expect(output).to eq(expected_output)
    expect(errors.size).to eq(1)
    expect(errors.keys.first).to eq(3)
    expect(errors[3][:equation]).to eq(['anything * anything == 42 is not valid'])
  end

  class BuildEquation
    def process(source, transformed, errors)
      transformed[:equation] = [ source['Input 1'], source['Process'], source['Input 2'], '==', source['Result'] ].join(' ')
      [transformed, errors]
    end
  end

  class EvaluateEquation
    def process(_source, transformed, errors)
      begin
        transformed[:valid] = eval(transformed[:equation]) == true
      rescue NameError
        errors.add(:equation, transformed[:equation] + ' is not valid')
      end
      [transformed, errors]
    end
  end

  class CollectProcessedEquations
    attr_reader :output
    def initialize
      @output = []
    end

    def process(_source, transformed, errors)
      @output << {row: errors.row_index}.merge(transformed) if errors.empty?
      [transformed, errors]
    end
  end
end