1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-19 05:09:38 +02:00
Maybe/test/system/transactions_test.rb
Zach Gollwitzer c3314e62d1
Account::Entry Delegated Type (namespace updates part 7) (#923)
* Initial entryable models

* Update transfer and tests

* Update transaction controllers and tests

* Update sync process to use new entries model

* Get dashboard working again

* Update transfers, imports, and accounts to use Account::Entry

* Update system tests

* Consolidate transaction management into entries controller

* Add permitted partial key helper

* Move account transactions list to entries controller

* Delegate transaction entries search

* Move transfer relation to entry

* Update bulk transaction management flows to use entries

* Remove test code

* Test fix attempt

* Update demo data script

* Consolidate remaining transaction partials to entries

* Consolidate valuations controller to entries controller

* Lint fix

* Remove unused files, additional cleanup

* Add back valuation creation

* Make migrations fully reversible

* Stale routes cleanup

* Migrations reversible fix

* Move types to entryable concern

* Fix search when no entries found

* Remove more unused code
2024-07-01 10:49:43 -04:00

167 lines
5.1 KiB
Ruby

require "application_system_test_case"
class TransactionsTest < ApplicationSystemTestCase
setup do
sign_in @user = users(:family_admin)
@page_size = 10
@latest_transactions = @user.family.entries
.account_transactions
.without_transfers
.reverse_chronological
.limit(20).to_a
@test_category = @user.family.categories.create! name: "System Test Category"
@test_merchant = @user.family.merchants.create! name: "System Test Merchant"
@target_txn = @user.family.accounts.first.entries.create! \
name: "Oldest transaction",
date: 10.years.ago.to_date,
currency: @user.family.currency,
amount: 100,
entryable: Account::Transaction.new(category: @test_category,
merchant: @test_merchant)
visit transactions_url(per_page: @page_size)
end
test "can search for a transaction" do
assert_selector "h1", text: "Transactions"
within "form#transactions-search" do
fill_in "Search transactions by name", with: @target_txn.name
end
assert_selector "#" + dom_id(@target_txn), count: 1
within "#transaction-search-filters" do
assert_text @target_txn.name
end
end
test "can open filters and apply one or more" do
find("#transaction-filters-button").click
within "#transaction-filters-menu" do
check(@target_txn.account.name)
click_button "Category"
check(@test_category.name)
click_button "Apply"
end
assert_selector "#" + dom_id(@target_txn), count: 1
within "#transaction-search-filters" do
assert_text @target_txn.account.name
assert_text @target_txn.account_transaction.category.name
end
end
test "all filters work and empty state shows if no match" do
find("#transaction-filters-button").click
within "#transaction-filters-menu" do
click_button "Account"
check(@target_txn.account.name)
click_button "Date"
fill_in "q_start_date", with: 10.days.ago.to_date
fill_in "q_end_date", with: Date.current
click_button "Type"
assert_text "Filter by type coming soon..."
click_button "Amount"
assert_text "Filter by amount coming soon..."
click_button "Category"
check(@test_category.name)
click_button "Merchant"
check(@test_merchant.name)
click_button "Apply"
end
assert_text "No entries found"
# Page reload doesn't affect results
visit current_url
assert_text "No entries found"
within "ul#transaction-search-filters" do
find("li", text: @target_txn.account.name).first("a").click
find("li", text: "on or after #{10.days.ago.to_date}").first("a").click
find("li", text: "on or before #{Date.current}").first("a").click
find("li", text: @target_txn.account_transaction.category.name).first("a").click
find("li", text: @target_txn.account_transaction.merchant.name).first("a").click
end
assert_selector "#" + dom_id(@user.family.entries.reverse_chronological.first), count: 1
end
test "can select and deselect entire page of transactions" do
all_transactions_checkbox.check
assert_selection_count(number_of_transactions_on_page)
all_transactions_checkbox.uncheck
assert_selection_count(0)
end
test "can select and deselect groups of transactions" do
date_transactions_checkbox(12.days.ago.to_date).check
assert_selection_count(3)
date_transactions_checkbox(12.days.ago.to_date).uncheck
assert_selection_count(0)
end
test "can select and deselect individual transactions" do
transaction_checkbox(@latest_transactions.first).check
assert_selection_count(1)
transaction_checkbox(@latest_transactions.second).check
assert_selection_count(2)
transaction_checkbox(@latest_transactions.second).uncheck
assert_selection_count(1)
end
test "outermost group always overrides inner selections" do
transaction_checkbox(@latest_transactions.first).check
assert_selection_count(1)
all_transactions_checkbox.check
assert_selection_count(number_of_transactions_on_page)
transaction_checkbox(@latest_transactions.first).uncheck
assert_selection_count(number_of_transactions_on_page - 1)
date_transactions_checkbox(12.days.ago.to_date).uncheck
assert_selection_count(number_of_transactions_on_page - 4)
all_transactions_checkbox.uncheck
assert_selection_count(0)
end
private
def number_of_transactions_on_page
[ @user.family.entries.without_transfers.count, @page_size ].min
end
def all_transactions_checkbox
find("#selection_entry")
end
def date_transactions_checkbox(date)
find("#selection_entry_#{date}")
end
def transaction_checkbox(transaction)
find("#" + dom_id(transaction, "selection"))
end
def assert_selection_count(count)
if count == 0
assert_no_selector("#entry-selection-bar")
else
within "#entry-selection-bar" do
assert_text "#{count} transaction#{count == 1 ? "" : "s"} selected"
end
end
end
end