mercredi 29 juillet 2015

What could be possible test cases for this controller action and how can i handle if else conditions. Using minitest framework in RubyonRails

I am new to writing test cases and I cant figure out the scenarios of writing tests. For example there are too many if else conditions in controller how would I write cases for these conditions. Below is my registration controller. I am using rails minitest framework for rails 3.2.1 version.

def create
    invitation_token = params["invitation_token"]
    #Check if the user exists yet based on their e-mail address.
    user = User.find_by_email(params[:user][:email])
    omni = session[:omniauth] || params[:omniauth]

    theme_id = nil
    theme_layout_id = nil
    theme_style_id = nil

    begin
        omni = JSON.parse omni if omni
    rescue => e
      # if we got here, the omni is invalid!!
      return redirect_to '/login'
    end

     #Did we find a user yet? If not, perform the following.
    if user.nil? && !invitation_token.present?
        client  = Client.find_or_create_by_name(name: params[:user][:username])
        #p client.errors
        if client.present?
            user    = User.new
            app_url = ApplicationUrl.find_by_domain_url(request.host_with_port)

            user.apply_omniauth(omni)
            user.email = params[:user][:email]
            user.username = params[:user][:username]
            user.client_id = client.id

            #Assign the user/client the Free plan by default.
            plan = ClientPlan.find_or_create_by_client_id(client_id: client.id, plan_id: 1, plan_billing_cycle_id: 1, start_date: Date.today, is_paid: 1, isactive: 1)

            #Set the client settings to the defaults for a Free (non business plan) user.
            ClientSetting.create(client_id: client.id, is_billboard_enabled: 0, is_tweetback_enabled: 0, is_conversations_enabled: 0)

            #Set the client environment link.
            ClientsEnvironment.create(environment_id: environment.id, client_id: client.id)

            unless params[:user][:theme_id].nil?
                theme_id = params[:user][:theme_id]
                puts "theme id: " + theme_id.to_s
            end
            unless params[:user][:theme_layout_id].nil?
                theme_layout_id = params[:user][:theme_layout_id]
                puts "theme layout id: " + theme_layout_id.to_s
            end
            unless params[:user][:theme_style_id].nil?
                theme_style_id = params[:user][:theme_style_id]
                puts "theme style id: " + theme_style_id.to_s
            end

            #Create an application for the client.
            Application.find_or_create_by_client_id(
                client_id: client.id,
                name: params[:user][:username],
                callback_url: "#{request.host_with_port}",
                application_url_id: app_url.id
              )

            #Create the default feed for the client.
            Feed.find_or_create_by_client_id(
                client_id: client.id,
                name: 'My Feed',
                token: SecureRandom.uuid,
                theme_id: theme_id,
                theme_style_id: theme_style_id,
                theme_layout_id: theme_layout_id
            )
          if user.save
            #Remember me?
            if params[:remember_me]
              user.remember_me!
            end

          client = user.client
          client.update_attribute(:owner_user_id, user.id)

          schedule_reminder_email(user)

                #Create the users Profile
            Profile.find_or_create_by_user_id(
              user_id: user.id,
              fullname: params[:user][:fullname],
              username: params[:user][:username]
            )
            record_event_profile(user,params[:user][:fullname],params[:remember_me])
          end
        end
    elsif user.nil? && invitation_token.present?
      user = User.new
      invite = Invite.find_by_token(invitation_token)
      if invite.present?
        client  = invite.client
        user.apply_omniauth(omni)
        user.email = params[:user][:email]
        user.username = params[:user][:username]
        user.client_id = client.id
        user.can_curate = false
        user.can_publish = false
        if user.save
          #Remember me?
          if params[:remember_me]
            user.remember_me!
          end

          #Create the users Profile
          Profile.find_or_create_by_user_id(
            user_id: user.id,
            fullname: params[:user][:fullname],
            username: params[:user][:username]
          )
          record_event_profile(user,params[:user][:fullname],params[:remember_me])
          invite.update_attributes({invite_accepted_at: Time.now, name: user.profile.try(:fullname)})
        end
      else
        return redirect_to root_path
      end
    else
      #If a user already exists for the email address then this must just be a new social network account for this user.
      token = omni['credentials']['token']
        token_secret = ""
        user.relatednoise_authentications.create!(
            provider: omni['provider'],
            uid: omni['uid'],
            token: token,
            token_secret: token_secret
        ) if user.present?
    end

    #Create an entry in Socialnetworkaccounts for this user to associate them to their social login/account.
    create_sna(omni, user)
    #SignupNotifier.init_notify(user).deliver
    begin
        ApiConnector.new("#{API_URL}/notify_us/#{user.id}")
    rescue => e
        Airbrake.notify_or_ignore(e, {})
    end

    unless user.new_record?
        session[:omniauth] = nil
        session[:omniauth_auth] = nil
        #reset_invite_token
    end

    session[:user_id] = user.id
    record_event_signup(user)

    back_if_coming_from_wix(params[:wix_appid], user)

    sign_in_and_redirect user if !params[:wix_appid].present?
  end

so far i have written this. Not sure if this is the way to write test cases.

require 'test_helper'

class RegistrationsControllerTest < ActionController::TestCase
  fixtures :users

  def setup
    @params = {"omniauth"=>"{\"provider\":\"twitter\",\"uid\":\"167003011\",\"credentials\":{\"token\":\"167003011-ZqnlBsCZlFjymanQ6gQ2ggD7a2tAESuUVlygw0WN\",\"secret\":\"idVWQgR79HOKmZfuNtVtxvzWzGH5plJlxdEksxyuHgH5S\"}}","user"=>{"fullname"=>"Tommy", "email"=>"Tom@moody.com", "username"=>"tommy", "theme_id"=>"", "theme_style_id"=>"", "theme_layout_id"=>""}}
    @invite = invites(:arvind_invite)
  end

  def test_new
    get :new
    assert_response :success
  end

def test_create_for_client_plan
  assert_difference ->{ ClientPlan.count }, +1 do
    post :create, @params
  end
end

def test_create_for_client_setting
  assert_difference ->{ ClientSetting.count }, +1 do
    post :create, @params
  end
end

def test_create_for_client_environment
  assert_difference -> {ClientsEnvironment.count}, +1 do
    post :create, @params
  end
end

def test_create_for_application
  assert_difference -> {Application.count}, +1 do
    post :create, @params
  end
end

def test_create_for_user
  assert_difference -> {User.count}, +1 do
    post :create, @params
  end
end

def test_create_for_feed
  assert_difference -> {Feed.count}, +1 do
    post :create, @params
  end
end

def test_create_for_profile
  assert_difference -> {Profile.count}, +1 do 
    post :create, @params
  end
end

def test_create_for_sna
  assert_difference -> {Socialnetworkaccount.count}, +1 do
    post :create, @params
  end
end

def test_create_for_user_with_invitation
  assert_difference -> {User.count}, +1 do
    post :create, @params.merge({invitation_token: @invite.token})
  end
end

end

This is my test helper file.

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase
  include Devise::TestHelpers
  # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
  #
  # Note: You'll currently still have to declare fixtures explicitly in integration tests
  # -- they do not yet inherit this setting
  fixtures :all

  def host_with_port
    @request.host_with_port = "localhost:3000"
  end

  # Add more helper methods to be used by all tests here...
end

Aucun commentaire:

Enregistrer un commentaire