test/controllers/admin/people_controller_test.rb
# frozen_string_literal: true
require File.expand_path("../../test_helper", __dir__)
module Admin
# :stopdoc:
class PeopleControllerTest < ActionController::TestCase
def setup
super
create_administrator_session
use_ssl
@cyclocross = FactoryBot.create(:cyclocross_discipline)
FactoryBot.create(:discipline, name: "Downhill")
@mountain_bike = FactoryBot.create(:mtb_discipline)
@road = FactoryBot.create(:discipline, name: "Road")
FactoryBot.create(:discipline, name: "Singlespeed")
FactoryBot.create(:discipline, name: "Track")
@association = FactoryBot.create(:number_issuer)
end
test "toggle member" do
molly = FactoryBot.create(:person, first_name: "Molly", last_name: "Cameron")
assert_equal(true, molly.member, "member before update")
post :toggle_member, params: { id: molly.to_param }
assert_response :success
assert_template("shared/_member")
molly.reload
assert_equal(false, molly.member, "member after update")
post :toggle_member, params: { id: molly.to_param }
assert_response :success
assert_template("shared/_member")
molly.reload
assert_equal(true, molly.member, "member after second update")
end
test "new" do
get(:new)
assert_response :success
end
test "edit" do
alice = FactoryBot.create(:person)
get :edit, params: { id: alice.to_param }
assert_response :success
assert_nil(assigns["event"], "Should not assign 'event'")
end
test "edit created by import file" do
alice = FactoryBot.create(:person)
alice.updater = ImportFile.create!(name: "some_very_long_import_file_name.xls")
alice.save!
get :edit, params: { id: alice.to_param }
assert_response :success
assert_template("admin/people/edit")
assert_not_nil(assigns["person"], "Should assign person")
assert_equal(alice, assigns["person"], "Should assign Alice to person")
end
test "create" do
assert_equal([], Person.find_all_by_name("Jon Knowlson"), "Knowlson should not be in database")
post :create,
params: {
"person" => {
"member_from(1i)" => "", "member_from(2i)" => "", "member_from(3i)" => "",
"member_to(1i)" => "", "member_to(2i)" => "", "member_to(3i)" => "",
"date_of_birth(2i)" => "", "date_of_birth(1i)" => "", "date_of_birth(3i)" => "",
"work_phone" => "", "occupation" => "", "city" => "Brussels", "cell_fax" => "", "zip" => "",
"mtb_category" => "", "dh_category" => "", "member" => "1", "gender" => "", "ccx_category" => "",
"team_name" => "", "road_category" => "", "street" => "", "track_category" => "", "home_phone" => "",
"first_name" => "Jon", "last_name" => "Knowlson",
"email" => "", "state" => ""
},
"commit" => "Save"
}
assert assigns["person"].errors.empty?, assigns["person"].errors.full_messages.join
assert(flash.empty?, "Flash should be empty, but was: #{flash}")
knowlsons = Person.find_all_by_name("Jon Knowlson")
assert_not(knowlsons.empty?, "Knowlson should be created")
assert_redirected_to(edit_admin_person_path(knowlsons.first))
assert_nil(knowlsons.first.member_from, "member_from after update")
assert_nil(knowlsons.first.member_to, "member_to after update")
assert_equal("Candi Murray", knowlsons.first.created_by.name, "created by")
assert_equal(@administrator.id, knowlsons.first.created_by_id, "created_by_id")
assert_equal("Person", knowlsons.first.created_by_type, "created_by_type")
assert_equal(@administrator, knowlsons.first.created_by, "created_by")
end
test "update new number" do
Timecop.freeze(Date.new(2008, 6)) do
molly = FactoryBot.create(:person, first_name: "Molly", last_name: "Cameron", road_number: "202")
assert_equal("202", molly.road_number(true, 2008), "Road number")
assert_equal("202", molly.reload.road_number, "Road number")
molly_road_number = RaceNumber.last
year = Time.zone.today.year.to_s
put :update,
params: {
"commit" => "Save",
"number_year" => year,
"number_issuer_id" => [@association.to_param], "number_value" => ["AZY"],
"discipline_id" => [@mountain_bike.id.to_s],
"person" => {
"work_phone" => "", "date_of_birth(2i)" => "1", "occupation" => "engineer", "city" => "Wilsonville",
"cell_fax" => "", "zip" => "97070",
"date_of_birth(3i)" => "1", "mtb_category" => "Spt", "dh_category" => "",
"member" => "1", "gender" => "M", "notes" => "rm", "ccx_category" => "", "team_name" => "", "road_category" => "5",
"street" => "31153 SW Willamette Hwy W",
"track_category" => "", "home_phone" => "503-582-8823", "first_name" => "Paul", "last_name" => "Formiller",
"date_of_birth(1i)" => "1969",
"member_from(1i)" => "", "member_from(2i)" => "", "member_from(3i)" => "",
"member_to(1i)" => "", "member_to(2i)" => "", "member_to(3i)" => "",
"email" => "paul.formiller@verizon.net", "state" => "OR",
"race_numbers_attributes" => {
"0" => { "number_issuer_id" => @association.id, "discipline_id" => @road.id, "year" => year, "value" => "202", "id" => molly_road_number.to_param },
"1" => { "number_issuer_id" => @association.id, "discipline_id" => @mountain_bike.id, "year" => year, "value" => "AZY" }
}
},
"id" => molly.to_param
}
assert assigns(:person).errors.empty?, assigns(:person).errors.full_messages.join(", ")
assert(flash.empty?, "flash empty? but was: #{flash}")
assert_redirected_to edit_admin_person_path(molly)
molly.reload
assert_equal("202", molly.road_number(true, 2008), "Road number should not be updated")
assert_equal("AZY", molly.xc_number(true, 2008), "MTB number should be updated")
assert_nil(molly.member_from, "member_from after update")
assert_nil(molly.member_to, "member_to after update")
assert_nil(RaceNumber.find(molly_road_number.to_param).updated_by_name, "updated_by_name")
assert_equal("Candi Murray", RaceNumber.find_by(value: "AZY").updated_by_name, "updated_by_name")
end
end
test "create with empty password and no numbers" do
post :create, params: { person: { login: "", password: "", team_name: "",
first_name: "Henry", last_name: "David", license: "" }, number_issuer_id: [{ "1" => nil }] }
assert_not_nil assigns(:person), "@person"
assert assigns(:person).errors.empty?, "Did no expect @person errors: #{assigns(:person).errors.full_messages.join(', ')}"
assert_redirected_to edit_admin_person_path(assigns(:person))
end
test "update" do
vanilla = FactoryBot.create(:team)
molly = FactoryBot.create(:person, first_name: "Molly", last_name: "Cameron", road_number: "2", team: vanilla)
Alias.create!(name: "Mollie Cameron", person: molly)
FactoryBot.create :result, person: molly, team: vanilla
assert_equal 1, molly.versions.size, "versions"
molly_road_number = RaceNumber.first
put :update,
params: {
"commit" => "Save",
"number_year" => Time.zone.today.year.to_s,
"person" => {
"member_from(1i)" => "2004", "member_from(2i)" => "2", "member_from(3i)" => "16",
"member_to(1i)" => "2004", "member_to(2i)" => "12", "member_to(3i)" => "31",
"print_card" => "1", "work_phone" => "", "date_of_birth(2i)" => "1", "occupation" => "engineer", "city" => "Wilsonville",
"cell_fax" => "", "zip" => "97070", "date_of_birth(3i)" => "1", "mtb_category" => "Spt", "dh_category" => "",
"member" => "1", "gender" => "M", "notes" => "rm", "ccx_category" => "", "team_name" => "", "road_category" => "5",
"street" => "31153 SW Willamette Hwy W", "track_category" => "", "home_phone" => "503-582-8823",
"first_name" => "Paul", "last_name" => "Formiller",
"date_of_birth(1i)" => "1969", "email" => "paul.formiller@verizon.net", "state" => "OR", "fabric_road_numbers" => "1",
"official" => "1",
"race_numbers_attributes" => {
"0" => { "value" => "222", "id" => molly_road_number.id },
"1" => { "number_issuer_id" => @association.to_param, "discipline_id" => @cyclocross.id, "year" => Time.zone.today.year.to_s }
}
},
"id" => molly.to_param
}
assert(flash.empty?, "Expected flash.empty? but was: #{flash[:warn]}")
assert_redirected_to edit_admin_person_path(molly)
molly.reload
assert_equal("222", molly.road_number(true, Time.zone.today.year), "Road number should be updated")
assert_equal(true, molly.print_card?, "print_card?")
assert_equal_dates("2004-02-16", molly.member_from, "member_from after update")
assert_equal_dates("2004-12-31", molly.member_to, "member_to after update")
assert_equal(true, molly.fabric_road_numbers?, "fabric_road_numbers?")
assert_equal 2, molly.versions.size, "versions"
version = molly.versions.last
assert_equal @administrator.name, version.terminator, "version user"
changes = version.changeset
assert_equal 25, changes.size, "changes"
change = changes["team_id"]
assert_not_nil change, "Should have change for team ID"
assert_equal vanilla.id, change.first, "Team ID before"
assert_nil change.last, "Team ID after"
assert_equal @administrator.name, molly.updated_by_name, "updated_by_name"
end
test "update bad member from date" do
person = FactoryBot.create(:person)
put :update,
params: {
"commit" => "Save", "person" => {
"member_from(1i)" => "", "member_from(2i)" => "10", "member_from(3i)" => "19",
"member_to(3i)" => "31", "member_to(2i)" => "1", "city" => "Hood River",
"work_phone" => "541-387-8883 x 213", "occupation" => "Sales Territory Manager", "cell_fax" => "541-387-8884",
"date_of_birth(3i)" => "1", "zip" => "97031", "license" => "583", "mtb_category" => "Beg",
"dh_category" => "Beg", "notes" => "interests: 6\r\nr\r\ninterests: 4\r\nr\r\ninterests: 4\r\n", "gender" => "M",
"ccx_category" => "B", "team_name" => "River City Specialized", "print_card" => "1",
"street" => "3541 Avalon Drive", "home_phone" => "503-367-5193", "road_category" => "3",
"track_category" => "5", "first_name" => "Karsten", "last_name" => "Hagen",
"date_of_birth(1i)" => "2008", "date_of_birth(2i)" => "12", "email" => "khagen69@hotmail.com",
"state" => "OR"
},
"id" => person.to_param,
"number_year" => "2008"
}
assert_not_nil(assigns(:person), "@person")
assert(assigns(:person).errors.empty?, "Should not have errors")
assert(assigns(:person).errors[:member_from].empty?, "Should have no errors on 'member_from' but had #{assigns(:person).errors[:member_from]}")
assert_redirected_to edit_admin_person_path(assigns(:person))
end
test "one print card" do
tonkin = FactoryBot.create(:person)
get :card, format: "pdf", params: { id: tonkin.to_param }
assert_response :success
assert_equal(tonkin, assigns["person"], "Should assign person")
tonkin.reload
assert_not(tonkin.print_card?, "Tonkin.print_card? after printing")
end
test "print no cards pending" do
get(:cards, format: "pdf")
assert_redirected_to(no_cards_admin_people_path(format: "html"))
end
test "no cards" do
get(:no_cards)
assert_response :success
assert_template("admin/people/no_cards")
assert_template layout: "admin/application"
end
test "print cards" do
tonkin = FactoryBot.create(:person)
tonkin.print_card = true
tonkin.ccx_category = "Clydesdale"
tonkin.mtb_category = "Beginner"
tonkin.save!
assert_not tonkin.membership_card?, "Tonkin.membership_card? before printing"
get(:cards, format: "pdf")
assert_response :success
assert_template nil
assert_template layout: nil
assert_equal(1, assigns["people"].size, "Should assign people")
tonkin.reload
assert_not(tonkin.print_card?, "Tonkin.print_card? after printing")
assert tonkin.membership_card?, "Tonkin.has_card? after printing"
end
test "many print cards" do
people = []
(1..4).each do |i|
people << Person.create!(first_name: "First Name", last_name: "Last #{i}", print_card: true)
end
get(:cards, format: "pdf")
assert_response :success
assert_template nil, "wrong template"
assert_template layout: nil
assert_equal(4, assigns["people"].size, "Should assign people")
people.each do |person|
person.reload
assert_not(person.print_card?, "Person.print_card? after printing")
assert person.membership_card?, "person.membership_card? after printing"
end
end
test "edit with event" do
kings_valley = FactoryBot.create(:event)
promoter = FactoryBot.create(:person)
get :edit, params: { id: promoter.to_param, event_id: kings_valley.to_param.to_s }
assert_equal(promoter, assigns["person"], "Should assign 'person'")
assert_equal(kings_valley, assigns["event"], "Should Kings Valley assign 'event'")
assert_template("admin/people/edit")
end
test "new with event" do
kings_valley = FactoryBot.create(:event)
get :new, params: { event_id: kings_valley.to_param }
assert_not_nil(assigns["person"], "Should assign 'person'")
assert(assigns["person"].new_record?, "Promoter should be new record")
assert_equal(kings_valley, assigns["event"], "Should Kings Valley assign 'event'")
assert_template("admin/people/edit")
end
test "remember event id on update" do
promoter = FactoryBot.create(:person)
jack_frost = FactoryBot.create(:event)
put :update,
params: {
id: promoter.id,
"person" => { "home_phone" => "(510) 410-2201", "email" => "fred@whatley.net" },
"commit" => "Save",
"event_id" => jack_frost.id
}
assert_nil(flash["warn"], "Should not have flash['warn'], but has: #{flash['warn']}")
promoter.reload
assert_redirected_to(edit_admin_person_path(promoter, event_id: jack_frost))
end
test "remember event id on create" do
jack_frost = FactoryBot.create(:event)
post :create,
params: {
"person" => { "first_name" => "Fred", "last_name" => "Whatley", "home_phone" => "(510) 410-2201", "email" => "fred@whatley.net" },
"commit" => "Save",
"event_id" => jack_frost.id
}
assert_nil(flash["warn"], "Should not have flash['warn'], but has: #{flash['warn']}")
promoter = Person.find_by(name: "Fred Whatley")
assert_redirected_to(edit_admin_person_path(promoter, event_id: jack_frost))
end
test "destroy" do
person = FactoryBot.create(:person)
delete :destroy, params: { id: person.id }
assert_not Person.exists?(person.id)
assert_redirected_to admin_people_path
assert flash.notice.present?
end
test "cannot destroy" do
result = FactoryBot.create(:result)
person = result.person
delete :destroy, params: { id: person.id }
assert Person.exists?(person.id)
assert_response :success
assert flash[:warn].present?
end
end
end