Back to Repositories

Testing Merchant Controller Operations in maybe-finance/maybe

This test suite implements comprehensive unit testing for the Merchants controller in a Ruby on Rails application using Minitest. It validates core CRUD operations and merchant management functionality through integration-style controller tests.

Test Coverage Overview

The test suite provides complete coverage of merchant management operations including listing, creation, updating, and deletion.

Key functionality tested includes:
  • Index action for merchant listing
  • New merchant form rendering
  • Merchant creation with validation
  • Merchant update operations
  • Merchant deletion with database verification
Integration points cover controller responses, database operations, and proper redirect flows.

Implementation Analysis

The testing approach follows Rails controller testing best practices using ActionDispatch::IntegrationTest.

Key patterns include:
  • Setup method for user authentication and fixture loading
  • Database assertion helpers for validating changes
  • Response status and redirect assertions
  • Params structure following Rails conventions

Technical Details

Testing tools and configuration:
  • Minitest as the testing framework
  • Rails fixture system for test data
  • ActionDispatch for integration testing
  • Authentication helpers for user context
  • Database cleaner for test isolation

Best Practices Demonstrated

The test suite demonstrates strong testing practices through focused test cases and proper isolation.

Notable practices include:
  • Proper test setup and teardown
  • Consistent assertion patterns
  • Database state verification
  • Authentication context handling
  • Clear test naming conventions

maybe-finance/maybe

test/controllers/merchants_controller_test.rb

            
require "test_helper"

class MerchantsControllerTest < ActionDispatch::IntegrationTest
  setup do
    sign_in @user = users(:family_admin)
    @merchant = merchants(:netflix)
  end

  test "index" do
    get merchants_path
    assert_response :success
  end

  test "new" do
    get new_merchant_path
    assert_response :success
  end

  test "should create merchant" do
    assert_difference("Merchant.count") do
      post merchants_url, params: { merchant: { name: "new merchant", color: "#000000" } }
    end

    assert_redirected_to merchants_path
  end

  test "should update merchant" do
    patch merchant_url(@merchant), params: { merchant: { name: "new name", color: "#000000" } }
    assert_redirected_to merchants_path
  end

  test "should destroy merchant" do
    assert_difference("Merchant.count", -1) do
      delete merchant_url(@merchant)
    end

    assert_redirected_to merchants_path
  end
end