diff --git a/db/migrate/20191024153351_add_invoice_items_quantity_constraint.rb b/db/migrate/20191024153351_add_invoice_items_quantity_constraint.rb new file mode 100644 index 000000000..9f99fa607 --- /dev/null +++ b/db/migrate/20191024153351_add_invoice_items_quantity_constraint.rb @@ -0,0 +1,14 @@ +class AddInvoiceItemsQuantityConstraint < ActiveRecord::Migration + def up + execute <<~SQL + ALTER TABLE invoice_items ADD CONSTRAINT invoice_items_quantity_is_positive + CHECK (quantity > 0); + SQL + end + + def down + execute <<~SQL + ALTER TABLE invoice_items DROP CONSTRAINT invoice_items_quantity_is_positive; + SQL + end +end diff --git a/db/migrate/20191024160038_add_invoices_due_date_constraint.rb b/db/migrate/20191024160038_add_invoices_due_date_constraint.rb new file mode 100644 index 000000000..313f5d276 --- /dev/null +++ b/db/migrate/20191024160038_add_invoices_due_date_constraint.rb @@ -0,0 +1,14 @@ +class AddInvoicesDueDateConstraint < ActiveRecord::Migration + def up + execute <<~SQL + ALTER TABLE invoices ADD CONSTRAINT invoices_due_date_is_not_before_issue_date + CHECK (due_date >= issue_date); + SQL + end + + def down + execute <<~SQL + ALTER TABLE invoices DROP CONSTRAINT invoices_due_date_is_not_before_issue_date; + SQL + end +end diff --git a/db/structure.sql b/db/structure.sql index 3382e9984..c487fbf87 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -899,7 +899,8 @@ CREATE TABLE public.invoice_items ( created_at timestamp without time zone, updated_at timestamp without time zone, creator_str character varying, - updator_str character varying + updator_str character varying, + CONSTRAINT invoice_items_quantity_is_positive CHECK ((quantity > 0)) ); @@ -968,7 +969,8 @@ CREATE TABLE public.invoices ( total numeric(10,2) NOT NULL, in_directo boolean DEFAULT false, buyer_vat_no character varying, - issue_date date NOT NULL + issue_date date NOT NULL, + CONSTRAINT invoices_due_date_is_not_before_issue_date CHECK ((due_date >= issue_date)) ); @@ -4878,3 +4880,7 @@ INSERT INTO schema_migrations (version) VALUES ('20191007123000'); INSERT INTO schema_migrations (version) VALUES ('20191008024334'); +INSERT INTO schema_migrations (version) VALUES ('20191024153351'); + +INSERT INTO schema_migrations (version) VALUES ('20191024160038'); + diff --git a/test/models/invoice_test.rb b/test/models/invoice_test.rb index 6e6971139..9c1c45610 100644 --- a/test/models/invoice_test.rb +++ b/test/models/invoice_test.rb @@ -11,7 +11,8 @@ class InvoiceTest < ActiveSupport::TestCase 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, due_date: '2010-07-04') + @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 @@ -108,4 +109,4 @@ class InvoiceTest < ActiveSupport::TestCase seller_zip: nil) assert_equal 'street, city, state', invoice.seller_address end -end \ No newline at end of file +end diff --git a/test/services/overdue_invoice_canceller_test.rb b/test/services/overdue_invoice_canceller_test.rb index debade3a9..bc3447484 100644 --- a/test/services/overdue_invoice_canceller_test.rb +++ b/test/services/overdue_invoice_canceller_test.rb @@ -2,7 +2,6 @@ require 'test_helper' class OverdueInvoiceCancellerTest < ActiveSupport::TestCase setup do - @invoice = invoices(:one) @original_days_to_keep_overdue_invoices_active = Setting.days_to_keep_overdue_invoices_active end @@ -28,26 +27,24 @@ class OverdueInvoiceCancellerTest < ActiveSupport::TestCase def test_cancels_overdue_invoices travel_to Time.zone.parse('2010-07-05') - @invoice.update!(account_activity: nil, cancelled_at: nil, due_date: '2010-07-03') - assert @invoice.cancellable? + invoice = cancellable_invoice(due_date: '2010-07-03') canceller = OverdueInvoiceCanceller.new(delay: 1.day) canceller.cancel - @invoice.reload + invoice.reload - assert @invoice.cancelled? + assert invoice.cancelled? end def test_yields_cancelled_invoices travel_to Time.zone.parse('2010-07-05') - @invoice.update!(account_activity: nil, cancelled_at: nil, due_date: '2010-07-03') - assert @invoice.cancellable? + invoice = cancellable_invoice(due_date: '2010-07-03') canceller = OverdueInvoiceCanceller.new(delay: 1.day) iteration_count = 0 - canceller.cancel do |invoice| - assert_equal @invoice, invoice + canceller.cancel do |cancelled_invoice| + assert_equal invoice, cancelled_invoice iteration_count += 1 end assert_equal 1, iteration_count @@ -55,13 +52,21 @@ class OverdueInvoiceCancellerTest < ActiveSupport::TestCase def test_keeps_not_overdue_invoices_intact travel_to Time.zone.parse('2010-07-05') - @invoice.update!(account_activity: nil, cancelled_at: nil, due_date: '2010-07-04') - assert @invoice.cancellable? + invoice = cancellable_invoice(due_date: '2010-07-04') canceller = OverdueInvoiceCanceller.new(delay: 1.day) canceller.cancel - @invoice.reload + invoice.reload - assert @invoice.not_cancelled? + assert invoice.not_cancelled? end -end \ No newline at end of file + + private + + def cancellable_invoice(due_date:) + invoice = invoices(:one) + invoice.update!(account_activity: nil, cancelled_at: nil, issue_date: due_date, + due_date: due_date) + invoice + end +end