scottwillson/racing_on_rails

View on GitHub
test/controllers/people/login_test.rb

Summary

Maintainability
C
7 hrs
Test Coverage
# frozen_string_literal: true

require File.expand_path("../../test_helper", __dir__)

# :stopdoc:
class LoginTest < ActionController::TestCase
  tests PeopleController

  test "create login" do
    ActionMailer::Base.deliveries.clear

    use_ssl
    post :create_login,
         params: {
           person: {
             login: "racer@example.com",
             password: "secret",
             email: "racer@example.com",
             license: ""
           },
           return_to: root_path
         }
    assert_redirected_to root_path

    assert_equal 1, ActionMailer::Base.deliveries.size, "Should deliver confirmation email"
    person = Person.last
    assert_equal "racer@example.com", person.created_by_name, "created_by_name"
    assert_equal "Person", person.created_by_type, "created_by_type"
  end

  test "create login with token" do
    ActionMailer::Base.deliveries.clear

    person = FactoryBot.create(:person)
    person.reset_perishable_token!
    use_ssl
    post :create_login,
         params: {
           person: {
             login: "racer@example.com",
             password: "secret",
             email: "racer@example.com"
           },
           id: person.perishable_token
         }
    assert_redirected_to edit_person_path(person)

    assert_equal 1, ActionMailer::Base.deliveries.size, "Should deliver confirmation email"
  end

  test "create login with name" do
    ActionMailer::Base.deliveries.clear

    use_ssl
    post :create_login,
         params: {
           person: {
             login: "racer@example.com",
             name: "Bike Racer",
             password: "secret",
             email: "racer@example.com",
             license: ""
           },
           return_to: root_path
         }
    assert_redirected_to root_path

    assert_equal 1, ActionMailer::Base.deliveries.size, "Should deliver confirmation email"
  end

  test "create login with license and name" do
    ActionMailer::Base.deliveries.clear
    existing_person = Person.create!(license: "123", name: "Speed Racer")

    use_ssl
    post :create_login,
         params: {
           person: { login: "racer@example.com",
                     password: "secret",
                     email: "racer@example.com",
                     license: "123   ",
                     name: "    Speed Racer" },
           return_to: root_path
         }

    assert assigns(:person).errors.empty?, "Should not have errors, but had: #{assigns(:person).errors.full_messages}"
    assert_redirected_to root_path

    assert_equal 1, ActionMailer::Base.deliveries.size, "Should deliver confirmation email"
    assert_equal existing_person, assigns(:person), "Should match existing Person"
  end

  test "create login with license in name field" do
    ActionMailer::Base.deliveries.clear
    Person.create!(license: "123", name: "Speed Racer")

    use_ssl
    post :create_login,
         params: {
           person: { login: "racer@example.com",
                     password: "secret",
                     email: "racer@example.com",
                     license: "Speed Racer",
                     name: "" },
           return_to: root_path
         }

    assert_response :success
    assert assigns(:person).errors[:name].present?, "Should have error on :name"
    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "create login with reversed fields" do
    ActionMailer::Base.deliveries.clear
    Person.create!(license: "123", name: "Speed Racer")

    use_ssl
    post :create_login,
         params: {
           person: { login: "racer@example.com",
                     password: "secret",
                     email: "racer@example.com",
                     license: "Speed Racer",
                     name: "123" },
           return_to: root_path
         }

    assert_response :success
    assert assigns(:person).errors.any?, "Should have errors"
    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "create login blank license" do
    ActionMailer::Base.deliveries.clear
    people_count = Person.count

    use_ssl
    post :create_login,
         params: {
           person: { login: "racer@example.com", email: "racer@example.com", password: "secret", license: "" },
           return_to: root_path
         }
    assert_redirected_to root_path

    assert_equal 1, ActionMailer::Base.deliveries.size, "Should deliver confirmation email"
    assert_equal people_count + 1, Person.count, "People count. Should add one."
  end

  test "create login no email" do
    ActionMailer::Base.deliveries.clear

    Person.create! license: "111", email: "racer@example.com"

    use_ssl
    post :create_login,
         params: {
           person: { login: "racer@example.com",
                     password: "secret",
                     email: "" },
           return_to: root_path
         }

    assert_response :success
    assert assigns(:person).errors[:email].present?, "Should have error on :email"
    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "create dupe login no email" do
    ActionMailer::Base.deliveries.clear

    use_ssl
    post :create_login,
         params: {
           person: { login: "bob.jones", password: "secret" },
           return_to: root_path
         }

    assert_response :success
    assert assigns(:person).errors[:email].present?, "Should have error on :email"
    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "create login bad email" do
    ActionMailer::Base.deliveries.clear

    Person.create! license: "111"

    use_ssl
    post :create_login,
         params: {
           person: {
             login: "racer@example.com",
             email: "http://example.com/",
             password: "secret",
             license: "111"
           },
           return_to: root_path
         }
    assert_response :success

    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "new login" do
    use_ssl
    get :new_login
    assert_response :success
    assert assigns(:person).new_record?, "@person should be a new record"
  end

  test "new login with token" do
    person = FactoryBot.create(:person_with_login)
    person.reset_perishable_token!
    use_ssl
    get :new_login, params: { id: person.perishable_token }
    assert_response :success
    assert_not assigns(:person).new_record?, "@person should not be a new record"
  end

  test "new login with token logged in" do
    person = FactoryBot.create(:person)
    person.reset_perishable_token!
    login_as person
    use_ssl
    get :new_login, params: { id: person.perishable_token }
    assert_response :success
    assert_not assigns(:person).new_record?, "@person should not be a new record"
  end

  test "new login http" do
    get :new_login
    assert_response :success
  end

  test "create login all blank" do
    ActionMailer::Base.deliveries.clear

    Person.create! license: "111"

    use_ssl
    post :create_login,
         params: {
           person: {
             login: "",
             email: "racer@example.com",
             password: "secret",
             license: "",
             name: ""
           },
           return_to: root_path
         }
    assert_response :success
    assert assigns(:person).errors[:login].present?, "Should have error on :email"
    assert assigns(:person).new_record?, "Should be a new_record?"

    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "create login login blank name blank" do
    ActionMailer::Base.deliveries.clear

    Person.create! license: "111"

    use_ssl
    post :create_login,
         params: {
           person: {
             login: "",
             email: "racer@example.com",
             password: "secret"
           },
           return_to: root_path
         }
    assert_response :success
    assert assigns(:person).errors[:login].present?, "Should have error on :email"
    assert assigns(:person).new_record?, "Should be a new_record?"

    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "create login login blank license blank" do
    ActionMailer::Base.deliveries.clear

    Person.create! license: "111", name: "Speed Racer"

    use_ssl
    post :create_login,
         params: {
           person: {
             login: "",
             email: "racer@example.com",
             password: "secret",
             license: "",
             name: ""
           },
           return_to: root_path
         }
    assert_response :success
    assert assigns(:person).errors[:login].present?, "Should have error on :email"
    assert assigns(:person).new_record?, "Should be a new_record?"

    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "create login name blank license blank" do
    ActionMailer::Base.deliveries.clear

    Person.create! license: "111", name: "Speed Racer", email: "racer@example.com"
    person_count = Person.count

    use_ssl
    post :create_login,
         params: {
           person: {
             login: "racer@example.com",
             email: "racer@example.com",
             password: "secret",
             license: "",
             name: ""
           },
           return_to: root_path
         }
    assert_redirected_to root_path

    assert_equal 1, ActionMailer::Base.deliveries.size, "Should deliver confirmation email"
    assert_equal person_count + 1, Person.count, "Person.count"
  end

  test "create login invalid login" do
    ActionMailer::Base.deliveries.clear
    Person.create!(license: "123", name: "Speed Racer")

    use_ssl
    post :create_login,
         params: {
           person: { login: "!@#{$&}*()_+?><",
                     password: "secret",
                     email: "racer@example.com",
                     license: "123",
                     name: "Speed Racer" },
           return_to: root_path
         }

    assert_response :success
    assert assigns(:person).errors[:login].present?, "Should have error on :email"
    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
  end

  test "create login unmatched license" do
    ActionMailer::Base.deliveries.clear
    Person.create!(license: "123", name: "Speed Racer")
    people_count = Person.count

    use_ssl
    post :create_login,
         params: {
           person: { login: "speed_racer",
                     password: "secret",
                     email: "racer@example.com",
                     license: "1727",
                     name: "Speed Racer" },
           return_to: root_path
         }

    assert assigns(:person).errors.any?, "Should errors"
    assert_equal 1, assigns(:person).errors.size, "errors"
    assert_response :success
    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
    assert_equal people_count, Person.count, "People count"
  end

  test "create login unmatched name" do
    ActionMailer::Base.deliveries.clear
    Person.create!(license: "123", name: "Speed Racer")
    people_count = Person.count

    use_ssl
    post :create_login,
         params: {
           person: { login: "speed_racer",
                     password: "secret",
                     email: "racer@example.com",
                     license: "123",
                     name: "Vitesse" },
           return_to: root_path
         }

    assert assigns(:person).errors.any?, "Should errors"
    assert_equal 1, assigns(:person).errors.size, "errors"
    assert_response :success
    assert_equal 0, ActionMailer::Base.deliveries.size, "Should not deliver confirmation email"
    assert_equal people_count, Person.count, "People count"
  end

  test "create login with current race number and name" do
    FactoryBot.create(:number_issuer)
    FactoryBot.create(:discipline)

    ActionMailer::Base.deliveries.clear
    existing_person = Person.create!(license: "123", name: "Speed Racer", road_number: "9871")

    use_ssl
    post :create_login,
         params: {
           person: { login: "racer@example.com",
                     password: "secret",
                     email: "racer@example.com",
                     license: "9871",
                     name: "Speed Racer" },
           return_to: root_path
         }

    assert assigns(:person).errors.empty?, "Should not have errors, but had: #{assigns(:person).errors.full_messages}"
    assert_redirected_to root_path

    assert_equal 1, ActionMailer::Base.deliveries.size, "Should deliver confirmation email"
    assert_equal existing_person, assigns(:person), "Should match existing Person"
  end

  test "create login with return to with params" do
    use_ssl
    post :create_login,
         params: {
           person: {
             login: "racer@example.com",
             password: "secret",
             email: "racer@example.com"
           },
           return_to: "/line_items/create?type=membership"
         }

    assert assigns(:person).errors.empty?, "Should not have errors, but had: #{assigns(:person).errors.full_messages}"
    assert_redirected_to "/line_items/create?type=membership"
  end
end