chourobin
3/3/2014 - 8:17 PM

grouper_interactor_example.rb

class GroupersController < ApplicationController::Base
  def create
    @grouper = Grouper.new(leader: current_member)

    if @grouper.save
      confirm_grouper_via_emails(@grouper)
      enqueue_bar_assignment(@grouper)

      redirect_to home_path
    else
      # No reason to use the flash, that's only for cross-request persistence
      render :new
    end
  end

  private
    def confirm_grouper_via_emails(grouper)
      LeaderMailer.grouper_confirmed(member: grouper.leader.id).deliver
      WingMailer.grouper_confirmed(wings: grouper.wings.pluck(:id)).deliver
      AdminMailer.grouper_confirmed(grouper: grouper.admin.id).deliver
    end
    
    def enqueue_bar_assignment(grouper)
      AssignBarForGrouper.enqueue(grouper.id)
    end
end


class GroupersControllerTest < ActiveSupport::TestCase
  def setup
    sign_in :david # fixture name reference for current_member
  end

  test "successfully created a grouper" do    
    assert_emails 3 do
      post :create
    end

    assert_response :redirect

    Grouper.last.tap do |new_grouper|
      assert_equal members(:david), new_grouper.leader
      assert_equal new_grouper, SomeQueue.last.grouper
    end
  end
  
  test "failed to create a grouper" do
    assert_emails 0 do
      post :create
    end

    assert_response :ok
  end
end