Back to Repositories

Testing Tag Deletion Controller Workflows in Maybe Finance

This test suite validates the tag deletion functionality in a financial management application, focusing on both replacement and non-replacement scenarios for tag management. The tests ensure proper handling of tag deletions and associated transactions.

Test Coverage Overview

The test suite provides comprehensive coverage of tag deletion operations, including both scenarios where tags are replaced and where they are simply removed. Key functionality tested includes:

  • Basic routing and access verification
  • Tag deletion with replacement tag assignment
  • Tag deletion without replacement handling
  • Transaction relationship management

Implementation Analysis

The testing approach utilizes Minitest’s integration testing capabilities with ActionDispatch::IntegrationTest. The implementation employs fixture-based test data setup and assertion-based validation patterns. The tests leverage Ruby’s lambda functions for tracking count changes across multiple models simultaneously.

Technical Details

Testing tools and configuration:

  • Minitest framework
  • ActionDispatch for integration testing
  • Fixtures for test data management
  • Authentication setup via sign_in helper
  • Database transaction tracking

Best Practices Demonstrated

The test suite demonstrates several testing best practices including proper test isolation, comprehensive setup procedures, and explicit state verification. Notable practices include:

  • Clear test case separation
  • Explicit state change verification
  • Multiple assertion combinations
  • Proper authentication handling

maybe-finance/maybe

test/controllers/tag/deletions_controller_test.rb

            
require "test_helper"

class Tag::DeletionsControllerTest < ActionDispatch::IntegrationTest
  setup do
    sign_in @user = users(:family_admin)
    @tag = tags(:one)
  end

  test "should get new" do
    get new_tag_deletion_url(@tag)
    assert_response :success
  end

  test "create with replacement" do
    replacement_tag = tags(:two)

    affected_transaction_count = @tag.transactions.count

    assert affected_transaction_count > 0

    assert_difference -> { Tag.count } => -1, -> { replacement_tag.transactions.count } => affected_transaction_count do
      post tag_deletions_url(@tag), params: { replacement_tag_id: replacement_tag.id }
    end
  end

  test "create without replacement" do
    affected_transactions = @tag.transactions

    assert affected_transactions.count > 0

    assert_difference -> { Tag.count } => -1, -> { Tagging.count } => affected_transactions.count * -1 do
      post tag_deletions_url(@tag)
    end
  end
end