spec/file_spec.rb in ach_builder-0.0.2 vs spec/file_spec.rb in ach_builder-0.2.1

- old
+ new

@@ -1,90 +1,182 @@ require 'spec_helper' describe ACH::File do - before(:each) do - @attributes = { - :company_id => '11-11111', - :company_name => 'MY COMPANY', - :immediate_dest => '123123123', - :immediate_dest_name => 'COMMERCE BANK', - :immediate_origin => '123123123', - :immediate_origin_name => 'MYCOMPANY' } - @invalid_attributes = {:foo => 'bar'} - @file = ACH::File.new(@attributes) - @file_with_batch = ACH::File.new(@attributes) do - batch :entry_class_code => 'WEB' + + context "building the ACH file" do + before(:each) do + @attributes = { + :company_id => '11-11111', + :company_name => 'MY COMPANY', + :immediate_dest => '123123123', + :immediate_dest_name => 'COMMERCE BANK', + :immediate_origin => '123123123', + :immediate_origin_name => 'MYCOMPANY' } + @invalid_attributes = {:foo => 'bar'} + @file = ACH::File.new(@attributes) + @file_with_batch = ACH::File.new(@attributes) do + batch :entry_class_code => 'WEB' + end + @sample_file = ACH::FileFactory.sample_file end - @sample_file = ACH.sample_file - end - - it "should correctly assign attributes" do - @file.company_id.should == '11-11111' - end - - it "should be modified by calling attribute methods in block" do - file = ACH::File.new(@attributes) do - company_name "MINE COMPANY" + + it "should correctly assign attributes" do + @file.company_id.should == '11-11111' end - file.company_name.should == "MINE COMPANY" - end - - it "should fetch and return header" do - head = @file.header - head.should be_instance_of(ACH::File::Header) - head.immediate_dest.should == '123123123' - end - - it "should be able to modify header info in block form" do - file = ACH::File.new(@attributes) do - header(:immediate_dest => '321321321') do - immediate_dest_name 'BANK COMMERCE' + + it "should be modified by calling attribute methods in block" do + file = ACH::File.new(@attributes) do + company_name "MINE COMPANY" end + file.company_name.should == "MINE COMPANY" end - head = file.header - head.immediate_dest.should == '321321321' - head.immediate_dest_name.should == 'BANK COMMERCE' + + it "should fetch and return header" do + head = @file.header + head.should be_instance_of(ACH::File::Header) + head.immediate_dest.should == '123123123' + end + + it "should be able to modify header info in block form" do + file = ACH::File.new(@attributes) do + header(:immediate_dest => '321321321') do + immediate_dest_name 'BANK COMMERCE' + end + end + head = file.header + head.immediate_dest.should == '321321321' + head.immediate_dest_name.should == 'BANK COMMERCE' + end + + it "should raise exception on unknown attribute assignement" do + lambda { + ACH::File.new(@invalid_attributes) + }.should raise_error(ACH::Component::UnknownAttributeError) + end + + it "should be able to create a batch" do + @file_with_batch.batches.should_not be_empty + end + + it "should return a batch when index is passed" do + @file_with_batch.batches[0].should be_instance_of(ACH::Batch) + end + + it "should assign a batch_number to a batch" do + batch = @file_with_batch.batches[0] + batch.batch_number.should == 1 + batch = @file_with_batch.batch(:entry_class_code => 'WEB') + batch.batch_number.should == 2 + end + + it "should assign attributes to a batch" do + batch = @file_with_batch.batches[0] + batch.attributes.should include(@file_with_batch.attributes) + end + + it "should have correct record count" do + @sample_file.record_count.should == 10 + end + + it "should have header and control record with length of 94" do + [:header, :control].each do |record| + @sample_file.send(record).to_s!.length.should == ACH::Constants::RECORD_SIZE + end + end + + it "should have length devisible by 94 (record size)" do + (@sample_file.to_s!.gsub(ACH::Constants::ROWS_DELIMITER, '').length % ACH::Constants::RECORD_SIZE).should be_zero + end + + + describe 'transmission header' do + before(:all) do + @with_transmission_header + attrs = {:remote_id => 'ZYXWVUTS', :application_id => '98765432'} + ach_file = ACH::FileFactory.with_transmission_header(attrs) + @transmission_header = ach_file.to_s!.split(ACH::Constants::ROWS_DELIMITER).first + end + + it "should raise error when defining empty transmission header" do + expect do + Class.new(ACH::File) do + transmission_header + end + end.to raise_error(ACH::File::EmptyTransmissionHeaderError) + end + + it "have_transmission_header? method should return proper value" do + without_header = Class.new(ACH::File) + with_header = Class.new(ACH::File) do + transmission_header do + application_id + end + end + + without_header.have_transmission_header?.should be_false + with_header.have_transmission_header?.should be_true + end + + it "has length of 38" do + @transmission_header.length.should == 38 + end + + it "has specified remote_id" do + @transmission_header[9..16].should == 'ZYXWVUTS' + end + + it "has specified application_id" do + @transmission_header[29..36].should == '98765432' + end + end + + it 'number of records is multiple of 10 (transmission header is ignored)' do + records = ACH::FileFactory.sample_file.to_s!.split(ACH::Constants::ROWS_DELIMITER) + (records.size % 10).should == 0 + + records = ACH::FileFactory.with_transmission_header.to_s!.split(ACH::Constants::ROWS_DELIMITER) + ((records.size - 1) % 10).should == 0 + end + + describe 'inherited class' do + before(:all) do + @custom_file_class = Class.new(ACH::File) do + immediate_dest_name 'CUSTOM VALUE' + customer_name "PETER PARKER" + end + + @custom_file = @custom_file_class.new do + immediate_dest '123123123' + immediate_origin '123123123' + immediate_origin_name 'MYCOMPANY' + batch(:entry_class_code => "WEB", :company_entry_descr => 'TV-TELCOM') do + effective_date Time.now.strftime('%y%m%d') + desc_date Time.now.strftime('%b %d').upcase + origin_dfi_id "00000000" + entry :customer_acct => '61242882282', + :amount => '2501', + :routing_number => '010010101', + :bank_account => '103030030' + end + end + end + + it 'should use default values defined in inherited class' do + header = @custom_file.header + header.immediate_dest_name.should == "CUSTOM VALUE" + entry = @custom_file.batches.first.entries.first + entry.customer_name.should == "PETER PARKER" + end + end + + describe "file control" do + subject { @file.control } + it { should be_an ACH::File::Control } + end end - - it "should raise exception on unknown attribute assignement" do - lambda { - ACH::File.new(@invalid_attributes) - }.should raise_error(ACH::Component::UnknownAttribute) + + context "reading the ACH file" do + before(:each) { @result = ACH::File.read well_fargo_empty_filename } + subject { @result } + it { should be_an ACH::File } end - - it "should be able to create a batch" do - @file_with_batch.batches.should_not be_empty - end - - it "should return a batch when index is passed" do - @file_with_batch.batch(0).should be_instance_of(ACH::Batch) - end - - it "should assign a batch_number to a batch" do - batch = @file_with_batch.batch(0) - batch.batch_number.should == 1 - batch = @file_with_batch.batch(:entry_class_code => 'WEB') - batch.batch_number.should == 2 - end - - it "should assign attributes to a batch" do - batch = @file_with_batch.batch(0) - batch.attributes.should include(@file_with_batch.attributes) - end - - it "should have correct record count" do - @sample_file.record_count.should == 8 - end - - it "should have header record with length of 94" do - @sample_file.header.to_s!.length.should == ACH::Constants::RECORD_SIZE - end - - it "should have control record with length of 94" do - @sample_file.control.to_s!.length.should == ACH::Constants::RECORD_SIZE - end - - it "should have length devisible by 94 (record size)" do - (@sample_file.to_s!.gsub("\r\n", '').length % ACH::Constants::RECORD_SIZE).should be_zero - end end -