mirror of
https://github.com/internetee/registry.git
synced 2025-07-27 21:16:12 +02:00
246 lines
8.7 KiB
Ruby
246 lines
8.7 KiB
Ruby
require 'test_helper'
|
|
|
|
class InvoiceTest < ActiveSupport::TestCase
|
|
include ActionMailer::TestHelper
|
|
|
|
setup do
|
|
@invoice = invoices(:one)
|
|
Spy.on_instance_method(EisBilling::BaseController, :authorized).and_return(true)
|
|
stub_request(:post, 'https://eis_billing_system:3000/api/v1/invoice_generator/invoice_status')
|
|
.to_return(status: :ok, headers: {})
|
|
end
|
|
|
|
def test_fixture_is_valid
|
|
assert @invoice.valid?, proc { @invoice.errors.full_messages }
|
|
end
|
|
|
|
def test_overdue_scope_returns_unpaid_uncancelled_invoices_with_past_due_date
|
|
travel_to Time.zone.parse('2010-07-05')
|
|
@invoice.update!(account_activity: nil, cancelled_at: nil, issue_date: '2010-07-04',
|
|
due_date: '2010-07-04')
|
|
|
|
assert Invoice.overdue.include?(@invoice), 'Should return overdue invoice'
|
|
end
|
|
|
|
def test_overdue_scope_does_not_return_paid_invoices
|
|
assert @invoice.paid?
|
|
assert_not Invoice.overdue.include?(@invoice), 'Should not return paid invoice'
|
|
end
|
|
|
|
def test_overdue_scope_does_not_return_cancelled_invoices
|
|
@invoice.update!(cancelled_at: '2010-07-05')
|
|
assert_not Invoice.overdue.include?(@invoice), 'Should not return cancelled invoice'
|
|
end
|
|
|
|
def test_overdue_scope_does_not_return_invoices_with_due_due_of_today_or_in_the_future
|
|
travel_to Time.zone.parse('2010-07-05')
|
|
@invoice.update!(due_date: '2010-07-05')
|
|
|
|
assert_not Invoice.overdue.include?(@invoice), 'Should not return non-overdue invoice'
|
|
end
|
|
|
|
def test_serializes_and_deserializes_vat_rate
|
|
@invoice.vat_rate = BigDecimal('25.5')
|
|
@invoice.save!
|
|
@invoice.reload
|
|
assert_equal BigDecimal('25.5'), @invoice.vat_rate
|
|
end
|
|
|
|
def test_calculates_vat_amount
|
|
invoice_item = InvoiceItem.new(price: 25, quantity: 2)
|
|
invoice = Invoice.new(vat_rate: 10, items: [invoice_item, invoice_item.dup])
|
|
assert_equal 10, invoice.vat_amount
|
|
end
|
|
|
|
def test_calculates_subtotal
|
|
line_item = InvoiceItem.new(price: BigDecimal('2.5'), quantity: 1)
|
|
invoice = Invoice.new(items: [line_item, line_item.dup])
|
|
assert_equal BigDecimal(5), invoice.subtotal
|
|
end
|
|
|
|
def test_returns_persisted_total
|
|
assert_equal BigDecimal('16.50'), @invoice.total
|
|
end
|
|
|
|
def test_calculates_total
|
|
line_item = InvoiceItem.new(price: BigDecimal('2.5'), quantity: 1)
|
|
invoice = Invoice.new(vat_rate: 10)
|
|
invoice.items = [line_item, line_item.dup]
|
|
assert_equal BigDecimal('5.50'), invoice.total
|
|
end
|
|
|
|
def test_valid_without_buyer_vat_no
|
|
@invoice.buyer_vat_no = ''
|
|
assert @invoice.valid?
|
|
end
|
|
|
|
def test_buyer_vat_no_is_taken_from_registrar_by_default
|
|
invoice_n = Invoice.order(number: :desc).last.number
|
|
response = OpenStruct.new(body: "{\"invoice_number\":\"#{invoice_n + 3}\"}")
|
|
Spy.on(EisBilling::GetInvoiceNumber, :send_invoice).and_return(response)
|
|
|
|
registrar = registrars(:bestnames)
|
|
registrar.vat_no = 'US1234'
|
|
invoice = @invoice.dup
|
|
invoice.buyer_vat_no = nil
|
|
invoice.buyer = registrar
|
|
invoice.items = @invoice.items
|
|
invoice.save!
|
|
assert_equal 'US1234', invoice.buyer_vat_no
|
|
end
|
|
|
|
def test_invalid_without_invoice_items
|
|
@invoice.items.clear
|
|
assert @invoice.invalid?
|
|
end
|
|
|
|
def test_iterates_over_invoice_items
|
|
invoice = Invoice.new(items: [InvoiceItem.new(description: 'test')])
|
|
|
|
iteration_count = 0
|
|
invoice.each do |invoice_item|
|
|
assert_equal 'test', invoice_item.description
|
|
iteration_count += 1
|
|
end
|
|
|
|
assert_equal 1, iteration_count
|
|
end
|
|
|
|
def test_returns_combined_seller_address
|
|
invoice = Invoice.new(seller_street: 'street', seller_city: 'city', seller_state: 'state',
|
|
seller_zip: nil)
|
|
assert_equal 'street, city, state', invoice.seller_address
|
|
end
|
|
|
|
def test_creates_invoice_with_bank_transaction_total
|
|
registrar = registrars(:bestnames)
|
|
transaction = bank_transactions(:one).dup
|
|
transaction.reference_no = registrar.reference_no
|
|
transaction.sum = 250
|
|
|
|
invoice_n = Invoice.order(number: :desc).last.number
|
|
stub_request(:post, 'https://eis_billing_system:3000/api/v1/invoice_generator/invoice_number_generator')
|
|
.to_return(status: 200, body: "{\"invoice_number\":\"#{invoice_n + 3}\"}", headers: {})
|
|
|
|
stub_request(:post, 'https://eis_billing_system:3000/api/v1/invoice_generator/invoice_generator')
|
|
.to_return(status: 200, body: '{"everypay_link":"http://link.test"}', headers: {})
|
|
|
|
stub_request(:put, 'https://registry:3000/eis_billing/e_invoice_response')
|
|
.to_return(status: 200, body: "{\"invoice_number\":\"#{invoice_n + 3}\"}, {\"date\":\"#{Time.zone.now - 10.minutes}\"}", headers: {})
|
|
|
|
stub_request(:post, 'https://eis_billing_system:3000/api/v1/e_invoice/e_invoice')
|
|
.to_return(status: 200, body: '', headers: {})
|
|
|
|
invoice = Invoice.create_from_transaction!(transaction)
|
|
assert_equal 250, invoice.total
|
|
|
|
invoice_n = Invoice.order(number: :desc).last.number
|
|
stub_request(:post, 'https://eis_billing_system:3000/api/v1/invoice_generator/invoice_number_generator')
|
|
.to_return(status: 200, body: "{\"invoice_number\":\"#{invoice_n + 4}\"}", headers: {})
|
|
|
|
transaction.sum = 146.88
|
|
invoice = Invoice.create_from_transaction!(transaction)
|
|
assert_equal 146.88, invoice.total
|
|
|
|
invoice_n = Invoice.order(number: :desc).last.number
|
|
stub_request(:post, 'https://eis_billing_system:3000/api/v1/invoice_generator/invoice_number_generator')
|
|
.to_return(status: 200, body: "{\"invoice_number\":\"#{invoice_n + 5}\"}", headers: {})
|
|
|
|
transaction.sum = 0.99
|
|
invoice = Invoice.create_from_transaction!(transaction)
|
|
assert_equal 0.99, invoice.total
|
|
end
|
|
|
|
def test_emails_invoice_after_creating_topup_invoice
|
|
invoice_n = Invoice.order(number: :desc).last.number
|
|
stub_request(:post, 'https://eis_billing_system:3000/api/v1/invoice_generator/invoice_generator')
|
|
.to_return(status: 200, body: '{"everypay_link":"http://link.test"}', headers: {})
|
|
|
|
stub_request(:put, 'https://registry:3000/eis_billing/e_invoice_response')
|
|
.to_return(status: 200, body: "{\"invoice_number\":\"#{invoice_n + 3}\"}, {\"date\":\"#{Time.zone.now - 10.minutes}\"}", headers: {})
|
|
|
|
stub_request(:post, 'https://eis_billing_system:3000/api/v1/e_invoice/e_invoice')
|
|
.to_return(status: 200, body: '', headers: {})
|
|
|
|
registrar = registrars(:bestnames)
|
|
transaction = bank_transactions(:one).dup
|
|
transaction.reference_no = registrar.reference_no
|
|
transaction.sum = 250
|
|
|
|
response = OpenStruct.new(body: "{\"invoice_number\":\"#{invoice_n + 3}\"}")
|
|
Spy.on(EisBilling::GetInvoiceNumber, :send_invoice).and_return(response)
|
|
|
|
assert_emails 1 do
|
|
Invoice.create_from_transaction!(transaction)
|
|
end
|
|
end
|
|
|
|
def test_create_payment_order
|
|
everypay_response = {
|
|
'some' => 'some'
|
|
}
|
|
@invoice.payment_orders.delete_all
|
|
@invoice.account_activity.delete and @invoice.reload
|
|
assert @invoice.payment_orders.empty?
|
|
assert_nil @invoice.account_activity
|
|
|
|
@invoice.process_payment(payment_type: 'PaymentOrders::EveryPay',
|
|
everypay_response: everypay_response,
|
|
payment_status: 'paid',
|
|
sum: @invoice.total,
|
|
transaction_time: Time.zone.now - 10.minutes - 23.seconds)
|
|
|
|
@invoice.reload
|
|
|
|
assert_equal @invoice.payment_orders.count, 1
|
|
assert @invoice.account_activity.present?
|
|
end
|
|
|
|
def test_should_raise_error_if_bill_already_paid
|
|
everypay_response = {
|
|
'some' => 'some'
|
|
}
|
|
assert @invoice.payment_orders.present?
|
|
|
|
assert_raises(ActiveRecord::RecordInvalid) do
|
|
@invoice.process_payment(payment_type: 'PaymentOrders::EveryPay',
|
|
everypay_response: everypay_response,
|
|
payment_status: 'paid',
|
|
sum: @invoice.total,
|
|
transaction_time: Time.zone.now - 10.minutes - 23.seconds)
|
|
end
|
|
end
|
|
|
|
def test_should_manually_autobin_invoice
|
|
@invoice.payment_orders.destroy_all && @invoice.account_activity.destroy
|
|
@invoice.reload
|
|
|
|
account = @invoice.buyer.accounts.first
|
|
item = @invoice.items.first
|
|
|
|
assert @invoice.payment_orders.empty?
|
|
assert @invoice.account_activity.nil?
|
|
assert_equal account.balance.to_f, 100.0
|
|
assert_equal item.price, 5.0
|
|
|
|
@invoice.autobind_manually
|
|
@invoice.reload
|
|
account.reload
|
|
|
|
assert_equal account.balance.to_f, 105.0
|
|
assert @invoice.payment_orders.present?
|
|
assert @invoice.account_activity.present?
|
|
end
|
|
|
|
def test_cannot_to_increase_balance_already_paid_invoice_by_manually_autobind
|
|
assert @invoice.paid?
|
|
|
|
account = @invoice.buyer.accounts.first
|
|
assert_equal account.balance.to_f, 100.0
|
|
|
|
@invoice.autobind_manually
|
|
@invoice.reload
|
|
|
|
assert_equal account.balance.to_f, 100.0
|
|
end
|
|
end
|