80 lines
3.4 KiB
Ruby
80 lines
3.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "test_helper"
|
|
|
|
class EarningsSummaryTest < ActiveSupport::TestCase
|
|
setup do
|
|
@student = create(:student)
|
|
@portfolio = @student.portfolio
|
|
@earnings_summary = EarningsSummary.new(@portfolio)
|
|
end
|
|
|
|
test "should calculate attendance earnings" do
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 500, reason: :attendance_earnings)
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 300, reason: :attendance_earnings)
|
|
|
|
assert_equal 800, @earnings_summary.attendance_earnings_cents
|
|
end
|
|
|
|
test "should calculate reading earnings" do
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 600, reason: :reading_earnings)
|
|
|
|
assert_equal 600, @earnings_summary.reading_earnings_cents
|
|
end
|
|
|
|
test "should calculate math earnings" do
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 400, reason: :math_earnings)
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 100, reason: :math_earnings)
|
|
|
|
assert_equal 500, @earnings_summary.math_earnings_cents
|
|
end
|
|
|
|
test "should calculate awards" do
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 1000, reason: :awards)
|
|
|
|
assert_equal 1000, @earnings_summary.awards_cents
|
|
end
|
|
|
|
test "should calculate total earnings from all sources" do
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 500, reason: :attendance_earnings)
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 600, reason: :reading_earnings)
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 400, reason: :math_earnings)
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 1000, reason: :awards)
|
|
|
|
assert_equal 2500, @earnings_summary.total_earnings_cents
|
|
end
|
|
|
|
test "should calculate transaction fees" do
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 100, reason: :transaction_fees)
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 50, reason: :transaction_fees)
|
|
|
|
assert_equal 150, @earnings_summary.transaction_fees_cents
|
|
end
|
|
|
|
test "should return zero for earnings with no transactions" do
|
|
assert_equal 0, @earnings_summary.attendance_earnings_cents
|
|
assert_equal 0, @earnings_summary.reading_earnings_cents
|
|
assert_equal 0, @earnings_summary.math_earnings_cents
|
|
assert_equal 0, @earnings_summary.awards_cents
|
|
assert_equal 0, @earnings_summary.total_earnings_cents
|
|
assert_equal 0, @earnings_summary.transaction_fees_cents
|
|
end
|
|
|
|
test "should only sum deposits not debits" do
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 500, reason: :math_earnings)
|
|
create(:portfolio_transaction, :debit, portfolio: @portfolio, amount_cents: 200, reason: :math_earnings)
|
|
|
|
assert_equal 500, @earnings_summary.math_earnings_cents
|
|
end
|
|
|
|
test "should only sum transactions for the specific portfolio" do
|
|
other_student = create(:student)
|
|
other_portfolio = other_student.portfolio
|
|
|
|
create(:portfolio_transaction, :deposit, portfolio: @portfolio, amount_cents: 500, reason: :math_earnings)
|
|
create(:portfolio_transaction, :deposit, portfolio: other_portfolio, amount_cents: 1000, reason: :math_earnings)
|
|
|
|
assert_equal 500, @earnings_summary.math_earnings_cents
|
|
end
|
|
end
|