view · edit · sidebar · attach · print · history

20101231-update-vat_rate-ydim

<< | 2010 | Masa.20101230-update-vat_rate-ydim >>


  1. Check the current test-cases
  2. Add new tests suspend
  3. Install and set up Selenium suspend
  4. Update PDF export
  5. Debug vat_rate

Goal
  • Test-cases vat_rate ydim / 100%
Milestones
  1. Check the current test-cases
  2. Correct failures
  3. Commit 10:00
  4. Update the percentage display in an exported PDF
  5. Commit 14:00
  6. Install and set up Selenium
  7. Learn how to use Selenium
  8. Add new test-cases for vat_rate and new methods
Summary
Commits
ToDo Tomorrow
Keep in Mind
  1. swissmedic_followers debug
  2. export_fachinfo test locally (weekend)
  3. backup script (weekend)
  4. On Ice
  5. emerge --sync

Check the current test-cases

test/suite.rb

masa@masa ~/ywesee/ydim $ ruby test/suite.rb 
Loaded suite test/suite
Started
..............................EE.................F.........
Finished in 0.248527 seconds.

  1) Error:
test_send_invoice(YDIM::TestMail):
NoMethodError: undefined method `smtp_port' for <FlexMock:Config>:FlexMock
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:105:in `method_missing'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:191:in `flexmock_wrap'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:98:in `method_missing'
    /home/masa/ywesee/ydim/lib/ydim/mail.rb:41:in `send_invoice'
    /home/masa/ywesee/ydim/test/test_mail.rb:67:in `test_send_invoice'

  2) Error:
test_send_reminder(YDIM::TestMail):
NoMethodError: undefined method `smtp_port' for <FlexMock:Config>:FlexMock
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:105:in `method_missing'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:191:in `flexmock_wrap'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:98:in `method_missing'
    /home/masa/ywesee/ydim/lib/ydim/mail.rb:80:in `send_reminder'
    /home/masa/ywesee/ydim/test/test_mail.rb:91:in `test_send_reminder'

  3) Failure:
test_send_invoice(YDIM::TestRootSession)
    [/usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core_class_methods.rb:64:in `check'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/expectation_director.rb:40:in `call'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:101:in `method_missing'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:191:in `flexmock_wrap'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:98:in `method_missing'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/partial_mock.rb:255:in `send_invoice'
     /home/masa/ywesee/ydim/lib/ydim/root_session.rb:128:in `send_invoice'
     /home/masa/ywesee/ydim/test/test_root_session.rb:317:in `test_send_invoice'
     /home/masa/ywesee/ydim/test/test_root_session.rb:32:in `call'
     /home/masa/ywesee/ydim/test/test_root_session.rb:32:in `assert_logged'
     /home/masa/ywesee/ydim/test/test_root_session.rb:316:in `test_send_invoice']:
in mock 'flexmock(Module)': no matching handler found for send_invoice("cnf", <FlexMock:invoice>, {})

59 tests, 171 assertions, 1 failures, 2 errors

Notes

  • 3 failures
    • 2 failures in test/test_mail.rb
    • 1 failure in test/test_root_session.rb

Resolve one by one

Check test/test_mail.rb

  1) Error:
test_send_invoice(YDIM::TestMail):
NoMethodError: undefined method `smtp_port' for <FlexMock:Config>:FlexMock
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:105:in `method_missing'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:191:in `flexmock_wrap'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:98:in `method_missing'
    /home/masa/ywesee/ydim/lib/ydim/mail.rb:41:in `send_invoice'
    /home/masa/ywesee/ydim/test/test_mail.rb:67:in `test_send_invoice'

test/test_mail#test_send_invoice

    def test_send_invoice
      debitor = flexmock('Debitor')
      debitor.should_receive(:email).and_return('test@ywesee.com')
      debitor.should_receive(:emails_cc).and_return(['test.cc@ywesee.com'])
      debitor.should_receive(:salutation).and_return('Herr')
      debitor.should_receive(:name).and_return('Company-Name')
      debitor.should_receive(:contact).and_return('Contact-Name')
      invoice = flexmock('Invoice')
      invoice.should_receive(:debitor).and_return(debitor)
      invoice.should_receive(:unique_id).and_return(12345)
      invoice.should_receive(:description).and_return('Description')
      invoice.should_receive(:to_pdf).times(1).and_return('pdf-document')
      smtp = flexmock('SMTP')
      flexstub(Net::SMTP).should_receive(:new).and_return(smtp)
      smtp.should_receive(:start).and_return { |block| block.call }
      smtp.should_receive(:sendmail).with(String,
        'smtp@ywesee.com', 'cc@ywesee.com').and_return { assert(true) }
      smtp.should_receive(:sendmail).with(String,
        'smtp@ywesee.com', 'test@ywesee.com').and_return { assert(true) }
      smtp.should_receive(:sendmail).with(String,
        'smtp@ywesee.com', 'test.cc@ywesee.com').and_return { assert(true) }
      Mail.send_invoice(setup_config, invoice)      <= HERE
    end

Update

      config.should_receive(:smtp_port).and_return('123')
      config.should_receive(:smtp_domain).and_return('ywesee.com')
      config.should_receive(:smtp_user).and_return('user')
      config.should_receive(:smtp_pass).and_return('pass')
      config.should_receive(:smtp_authtype).and_return('plain')
...
#      smtp.should_receive(:start).and_return { |block| block.call }
      smtp.should_receive(:start)

Result

masa@masa ~/ywesee/ydim $ ruby test/test_mail.rb 
Loaded suite test/test_mail
Started
..test/test_mail.rb:90: warning: multiple values for a block parameter (5 for 1)
        from /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/expectation.rb:78
E
Finished in 0.004763 seconds.

  1) Error:
test_send_reminder(YDIM::TestMail):
NoMethodError: undefined method `call' for #<Array:0x7f27f24ffd28>
    test/test_mail.rb:90:in `test_send_reminder'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/expectation.rb:78:in `call'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/expectation.rb:78:in `return_value'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/expectation.rb:59:in `verify_call'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/expectation_director.rb:42:in `call'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:101:in `method_missing'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:191:in `flexmock_wrap'
    /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:98:in `method_missing'
    /usr/lib64/ruby/1.8/net/smtp.rb:315:in `start'
    /home/masa/ywesee/ydim/lib/ydim/mail.rb:80:in `send_reminder'
    test/test_mail.rb:97:in `test_send_reminder'

3 tests, 1 assertions, 0 failures, 1 errors

Check next

test/test_mail.rb#test_send_reminder

    def test_send_reminder
      debitor = flexmock('Debitor')
      debitor.should_receive(:email).and_return('test@ywesee.com')
      debitor.should_receive(:emails_cc).and_return(['test.cc@ywesee.com'])
      debitor.should_receive(:salutation).and_return('Herr')
      debitor.should_receive(:name).and_return('Company-Name')
      debitor.should_receive(:contact).and_return('Contact-Name')
      invoice = flexmock('Invoice')
      invoice.should_receive(:debitor).and_return(debitor)
      invoice.should_receive(:unique_id).and_return(12345)
      invoice.should_receive(:description).and_return('Description')
      invoice.should_receive(:reminder_subject).and_return('Reminder')
      invoice.should_receive(:reminder_body).and_return('Reminder Body')
      smtp = flexmock('SMTP')
      flexstub(Net::SMTP).should_receive(:new).and_return(smtp)
      smtp.should_receive(:start).and_return { |block| block.call }
      smtp.should_receive(:sendmail).with(String,
        'smtp@ywesee.com', 'cc@ywesee.com').and_return { assert(true) }
      smtp.should_receive(:sendmail).with(String,
        'smtp@ywesee.com', 'test@ywesee.com').and_return { assert(true) }
      smtp.should_receive(:sendmail).with(String,
        'smtp@ywesee.com', 'test.cc@ywesee.com').and_return { assert(true) }
      Mail.send_reminder(setup_config, invoice)   <= HERE
    end

Update

test/test_mail.rb#test_send_reminder

      #smtp.should_receive(:start).and_return { |block| block.call }
      smtp.should_receive(:start)

Result

masa@masa ~/ywesee/ydim $ ruby test/test_mail.rb 
Loaded suite test/test_mail
Started
...
Finished in 0.004769 seconds.

3 tests, 1 assertions, 0 failures, 0 errors

Check test/test_root_session.rb

Error

masa@masa ~/ywesee/ydim $ ruby test/test_root_session.rb 
Loaded suite test/test_root_session
Started
.................F..
Finished in 0.021553 seconds.

  1) Failure:
test_send_invoice(YDIM::TestRootSession)
    [/usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core_class_methods.rb:64:in `check'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/expectation_director.rb:40:in `call'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:101:in `method_missing'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:191:in `flexmock_wrap'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/core.rb:98:in `method_missing'
     /usr/lib64/ruby/gems/1.8/gems/flexmock-0.8.6/lib/flexmock/partial_mock.rb:255:in `send_invoice'
     /home/masa/ywesee/ydim/lib/ydim/root_session.rb:128:in `send_invoice'
     test/test_root_session.rb:317:in `test_send_invoice'
     test/test_root_session.rb:32:in `call'
     test/test_root_session.rb:32:in `assert_logged'
     test/test_root_session.rb:316:in `test_send_invoice']:
in mock 'flexmock(Module)': no matching handler found for send_invoice("cnf", <FlexMock:invoice>, {})

20 tests, 62 assertions, 1 failures, 0 errors

test/test_root_session.rb#test_send_invoice

    def test_send_invoice
      inv = flexmock('invoice')
      flexstub(Invoice).should_receive(:find_by_unique_id)\
        .with('17').and_return(inv)
      @serv.should_receive(:config).and_return('cnf')
      flexstub(Mail).should_receive(:send_invoice).with('cnf', inv)
      assert_logged(:info, :debug) {     <= HERE
        @session.send_invoice(17)
      }
    end

Update

test/test_root_session.rb#test_send_invoice

#      flexstub(Mail).should_receive(:send_invoice).with('cnf', inv)
      flexstub(Mail).should_receive(:send_invoice).with('cnf', inv, {})

Result

masa@masa ~/ywesee/ydim $ ruby test/test_root_session.rb 
Loaded suite test/test_root_session
Started
....................
Finished in 0.02068 seconds.

20 tests, 62 assertions, 0 failures, 0 errors

Check test/suite.rb

masa@masa ~/ywesee/ydim $ ruby test/suite.rb 
Loaded suite test/suite
Started
...........................................................
Finished in 0.176264 seconds.

59 tests, 171 assertions, 0 failures, 0 errors

Commit

Add new tests

Review modified points

New View classes

lib/ydim/html/view/invoice.rb

class InvoiceTotalComposite_2010 < InvoiceTotalComposite
    COMPONENTS = {
        [0,0]   =>  :total_netto,
        [0,1]   =>  :vat_2010,
        [0,2]   =>  :total_brutto,
    }
end
class InvoiceComposite_2010 < InvoiceComposite
    COMPONENTS = {
        [0,0]   =>  InvoiceInnerComposite,
        [0,1]   =>  :items,
        [0,2]   =>  InvoiceTotalComposite_2010,
        [0,3]   =>  :submit,
        [1,3]   =>  :pdf,
        [2,3]   =>  :send_invoice,
    }
end
class Invoice_2010 < Invoice
  CONTENT = InvoiceComposite_2010
end

New State class

lib/ydim/html/state/invoice.rb

class Invoice_2010 < Invoice
    VIEW = Html::View::Invoice_2010
end

Notes

  • In my opinion, test-cases for these above are not necessary
  • Because these are almost the same as the super classes

The other modifications

lib/ydim/invoice.rb

        sum :vat_2010
...
  class Invoice_2010 < Invoice
  end

lib/ydim/html/util/lookandfeel.rb

            :vat_2010                                               =>  'MwSt. (7.6%)',

lib/ydim/item.rb

        alias :vat_2010 :vat

Note

  • These modifications are too.

lib/ydim/html/state/global.rb#invoice

    def invoice
      inv = nil
      if(id = @session.user_input(:unique_id))
        #   Invoice.new(@session, @session.invoice(id.to_i))
        inv = Invoice.new(@session, @session.invoice(id.to_i))
        rate = YDIM::Server.config.vat_rate
        if(item = inv.model.items[0] and (item.vat_rate - rate).abs > 0.1)
          inv = Invoice_2010.new(@session, @session.invoice(id.to_i))
        end
      end
      return inv
    end

Notes

  • I need a test-case for this.
  • This is in the project, ydim-html
  • I should add a test-case in ydim-html

Check test-cases of ydim-html

masa@masa ~/ywesee/ydim-html $ ruby test/suite.rb 
/home/masa/ywesee/ydim-html/lib/ydim/html.rb:3: warning: already initialized constant VERSION
./test/selenium.rb:172:in `do_command': SeleniumCommandError
        from /usr/lib64/ruby/1.8/timeout.rb:62:in `timeout'
        from /usr/lib64/ruby/1.8/timeout.rb:93:in `timeout'
        from ./test/selenium.rb:158:in `do_command'
        from ./test/selenium.rb:179:in `get_string'
        from ./test/selenium.rb:148:in `start'
        from ./test/selenium/unit.rb:48
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from ./test/selenium/test_invoices.rb:7
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from test/suite.rb:12
        from /usr/lib64/ruby/1.8/find.rb:39:in `find'
        from /usr/lib64/ruby/1.8/find.rb:38:in `catch'
        from /usr/lib64/ruby/1.8/find.rb:38:in `find'
        from test/suite.rb:10

Note

  • I have to set up Selenium first

Update PDF export

Experiment

lib/ydim/invoice#pdf_invoice

    def pdf_invoice(sort_args={})
      config = PdfInvoice.config.dup
      config.formats['quantity'] = "%1.#{@precision}f"
      config.formats['total'] = "#{@currency} %1.2f"
      if(item = @items[0])
        if((item.vat_rate - YDIM::Server.config.vat_rate).abs > 0.1)
          config.texts['tax'] = "MwSt 7.6%"
        end
      end

Result

  • Good
  • If 'vat_rate' == 7.6, the display shows 'MwSt 7.6%' otherwise the default value is shown

Commit

Update on ydim server

~/git/ydim $ git checkout -f

Note

  • Be careful. Not git pull in the case of ydim

Debug vat_rate

I found a kind of bug. It is not a big bug, though.

Problem

  • If I click 'Speichern' or 'Email Senden' in the page of 'Bezahlte Rechnungen', the tax is recalculated with the new 'vat_rate', 8.0%
  • We want to keep the old vat_rate in the old invoices

An invoice in 'Bezahlte Rechnungen'

Note

  • If you click 'Speichern' or 'Email Senden' then it becomes as follows:
view · edit · sidebar · attach · print · history
Page last modified on July 13, 2011, at 12:04 PM