require "test_helper" class TransactionsControllerTest < ActionDispatch::IntegrationTest include EntryableResourceInterfaceTest, EntriesTestHelper setup do sign_in @user = users(:family_admin) @entry = entries(:transaction) end test "creates with transaction details" do assert_difference [ "Entry.count", "Transaction.count" ], 1 do post transactions_url, params: { entry: { account_id: @entry.account_id, name: "New transaction", date: Date.current, currency: "USD", amount: 100, nature: "inflow", entryable_type: @entry.entryable_type, entryable_attributes: { tag_ids: [ Tag.first.id, Tag.second.id ], category_id: Category.first.id, merchant_id: Merchant.first.id } } } end created_entry = Entry.order(:created_at).last assert_redirected_to account_url(created_entry.account) assert_equal "Transaction created", flash[:notice] assert_enqueued_with(job: SyncJob) end test "updates with transaction details" do assert_no_difference [ "Entry.count", "Transaction.count" ] do patch transaction_url(@entry), params: { entry: { name: "Updated name", date: Date.current, currency: "USD", amount: 100, nature: "inflow", entryable_type: @entry.entryable_type, notes: "test notes", excluded: false, entryable_attributes: { id: @entry.entryable_id, tag_ids: [ Tag.first.id, Tag.second.id ], category_id: Category.first.id, merchant_id: Merchant.first.id } } } end @entry.reload assert_equal "Updated name", @entry.name assert_equal Date.current, @entry.date assert_equal "USD", @entry.currency assert_equal -100, @entry.amount assert_equal [ Tag.first.id, Tag.second.id ], @entry.entryable.tag_ids.sort assert_equal Category.first.id, @entry.entryable.category_id assert_equal Merchant.first.id, @entry.entryable.merchant_id assert_equal "test notes", @entry.notes assert_equal false, @entry.excluded assert_equal "Transaction updated", flash[:notice] assert_redirected_to account_url(@entry.account) assert_enqueued_with(job: SyncJob) end test "transaction count represents filtered total" do family = families(:empty) sign_in users(:empty) account = family.accounts.create! name: "Test", balance: 0, currency: "USD", accountable: Depository.new 3.times do create_transaction(account: account) end get transactions_url(per_page: 10) assert_dom "#total-transactions", count: 1, text: family.entries.transactions.size.to_s searchable_transaction = create_transaction(account: account, name: "Unique test name") get transactions_url(q: { search: searchable_transaction.name }) # Only finds 1 transaction that matches filter assert_dom "#" + dom_id(searchable_transaction), count: 1 assert_dom "#total-transactions", count: 1, text: "1" end test "can paginate" do family = families(:empty) sign_in users(:empty) account = family.accounts.create! name: "Test", balance: 0, currency: "USD", accountable: Depository.new 11.times do create_transaction(account: account) end sorted_transactions = family.entries.transactions.reverse_chronological.to_a assert_equal 11, sorted_transactions.count get transactions_url(page: 1, per_page: 10) assert_response :success sorted_transactions.first(10).each do |transaction| assert_dom "#" + dom_id(transaction), count: 1 end get transactions_url(page: 2, per_page: 10) assert_dom "#" + dom_id(sorted_transactions.last), count: 1 get transactions_url(page: 9999999, per_page: 10) # out of range loads last page assert_dom "#" + dom_id(sorted_transactions.last), count: 1 end end