require "test_helper" class Rule::ActionTest < ActiveSupport::TestCase include EntriesTestHelper setup do @family = families(:dylan_family) @transaction_rule = rules(:one) @account = @family.accounts.create!(name: "Rule test", balance: 1000, currency: "USD", accountable: Depository.new) @grocery_category = @family.categories.create!(name: "Grocery") @whole_foods_merchant = @family.merchants.create!(name: "Whole Foods", type: "FamilyMerchant") # Some sample transactions to work with @txn1 = create_transaction(date: Date.current, account: @account, amount: 100, name: "Rule test transaction1", merchant: @whole_foods_merchant).transaction @txn2 = create_transaction(date: Date.current, account: @account, amount: -200, name: "Rule test transaction2").transaction @txn3 = create_transaction(date: 1.day.ago.to_date, account: @account, amount: 50, name: "Rule test transaction3").transaction @rule_scope = @account.transactions end test "set_transaction_category" do # Does not modify transactions that are locked (user edited them) @txn1.lock_attr!(:category_id) action = Rule::Action.new( rule: @transaction_rule, action_type: "set_transaction_category", value: @grocery_category.id ) action.apply(@rule_scope) assert_nil @txn1.reload.category [ @txn2, @txn3 ].each do |transaction| assert_equal @grocery_category.id, transaction.reload.category_id end end test "set_transaction_tags" do tag = @family.tags.create!(name: "Rule test tag") # Does not modify transactions that are locked (user edited them) @txn1.lock_attr!(:tag_ids) action = Rule::Action.new( rule: @transaction_rule, action_type: "set_transaction_tags", value: tag.id ) action.apply(@rule_scope) assert_equal [], @txn1.reload.tags [ @txn2, @txn3 ].each do |transaction| assert_equal [ tag ], transaction.reload.tags end end test "set_transaction_merchant" do merchant = @family.merchants.create!(name: "Rule test merchant") # Does not modify transactions that are locked (user edited them) @txn1.lock_attr!(:merchant_id) action = Rule::Action.new( rule: @transaction_rule, action_type: "set_transaction_merchant", value: merchant.id ) action.apply(@rule_scope) assert_not_equal merchant.id, @txn1.reload.merchant_id [ @txn2, @txn3 ].each do |transaction| assert_equal merchant.id, transaction.reload.merchant_id end end test "set_transaction_name" do new_name = "Renamed Transaction" # Does not modify transactions that are locked (user edited them) @txn1.lock_attr!(:name) action = Rule::Action.new( rule: @transaction_rule, action_type: "set_transaction_name", value: new_name ) action.apply(@rule_scope) assert_not_equal new_name, @txn1.reload.entry.name [ @txn2, @txn3 ].each do |transaction| assert_equal new_name, transaction.reload.entry.name end end end