mirror of
https://github.com/jcwimer/wrestlingApp
synced 2026-04-11 16:01:56 +00:00
505 lines
15 KiB
Ruby
505 lines
15 KiB
Ruby
require 'test_helper'
|
|
require "json"
|
|
|
|
class MatchesControllerTest < ActionController::TestCase
|
|
# Remove Devise helpers since we're no longer using Devise
|
|
# include Devise::Test::ControllerHelpers # Needed to sign in
|
|
include ActionView::Helpers::DateHelper # Needed for time ago in words
|
|
include ActionCable::TestHelper
|
|
|
|
setup do
|
|
@tournament = Tournament.find(1)
|
|
# @tournament.generateMatchups
|
|
@match = Match.where("tournament_id = ? and mat_id = ?",1,1).first
|
|
end
|
|
|
|
def post_update
|
|
patch :update, params: { id: @match.id, match: {tournament_id: 1, mat_id: 1} }
|
|
end
|
|
|
|
def post_update_from_match_edit
|
|
get :edit, params: { id: @match.id }
|
|
patch :update, params: { id: @match.id, match: {tournament_id: 1, mat_id: 1} }
|
|
end
|
|
|
|
def get_edit
|
|
get :edit, params: { id: @match.id }
|
|
end
|
|
|
|
def post_update_from_match_stat
|
|
@request.env["HTTP_REFERER"] = "/tournaments/#{@tournament.id}/matches"
|
|
get :stat, params: { id: @match.id }
|
|
patch :update, params: { id: @match.id, match: {tournament_id: 1, mat_id: 1} }
|
|
end
|
|
|
|
def get_stat
|
|
get :stat, params: { id: @match.id }
|
|
end
|
|
|
|
def get_state
|
|
get :state, params: { id: @match.id }
|
|
end
|
|
|
|
def get_state_with_params(extra_params = {})
|
|
get :state, params: { id: @match.id }.merge(extra_params)
|
|
end
|
|
|
|
def get_spectate(extra_params = {})
|
|
get :spectate, params: { id: @match.id }.merge(extra_params)
|
|
end
|
|
|
|
def get_edit_assignment(extra_params = {})
|
|
get :edit_assignment, params: { id: @match.id }.merge(extra_params)
|
|
end
|
|
|
|
def patch_update_assignment(extra_params = {})
|
|
base = {
|
|
id: @match.id,
|
|
match: {
|
|
mat_id: @match.mat_id,
|
|
queue_position: 2
|
|
}
|
|
}
|
|
patch :update_assignment, params: base.deep_merge(extra_params)
|
|
end
|
|
|
|
def sign_in_owner
|
|
sign_in users(:one)
|
|
end
|
|
|
|
def sign_in_non_owner
|
|
sign_in users(:two)
|
|
end
|
|
|
|
def sign_in_tournament_delegate
|
|
sign_in users(:three)
|
|
end
|
|
|
|
def sign_in_school_delegate
|
|
sign_in users(:four)
|
|
end
|
|
|
|
def success
|
|
assert_response :success
|
|
end
|
|
|
|
def redirect
|
|
assert_response :redirect
|
|
end
|
|
|
|
test "the truth" do
|
|
assert true
|
|
end
|
|
|
|
test "logged in tournament owner should get edit match page" do
|
|
sign_in_owner
|
|
get_edit
|
|
success
|
|
end
|
|
|
|
test "logged in user should not get edit match page if not owner" do
|
|
sign_in_non_owner
|
|
get_edit
|
|
redirect
|
|
end
|
|
|
|
test "logged school delegate should not get edit match page if not owner" do
|
|
sign_in_school_delegate
|
|
get_edit
|
|
redirect
|
|
end
|
|
|
|
test "non logged in user should not get edit match page" do
|
|
get_edit
|
|
redirect
|
|
end
|
|
|
|
test "logged school delegate should not get stat match page if not owner" do
|
|
sign_in_school_delegate
|
|
get_stat
|
|
redirect
|
|
end
|
|
|
|
test "logged in user should not get state match page if not owner" do
|
|
sign_in_non_owner
|
|
get_state
|
|
redirect
|
|
end
|
|
|
|
test "logged school delegate should not get state match page if not owner" do
|
|
sign_in_school_delegate
|
|
get_state
|
|
redirect
|
|
end
|
|
|
|
test "non logged in user should not get stat match page" do
|
|
get_stat
|
|
redirect
|
|
end
|
|
|
|
test "non logged in user should not get state match page" do
|
|
get_state
|
|
redirect
|
|
end
|
|
|
|
test "valid school permission key cannot get state match page" do
|
|
school = @tournament.schools.first
|
|
school.update!(permission_key: "valid-school-key")
|
|
|
|
get_state_with_params(school_permission_key: "valid-school-key")
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
|
|
test "invalid school permission key cannot get state match page" do
|
|
school = @tournament.schools.first
|
|
school.update!(permission_key: "valid-school-key")
|
|
|
|
get_state_with_params(school_permission_key: "invalid-school-key")
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
|
|
test "non logged in user should get post update match" do
|
|
post_update
|
|
assert_redirected_to '/static_pages/not_allowed'
|
|
end
|
|
|
|
test "logged in user should not post update match if not owner" do
|
|
sign_in_non_owner
|
|
post_update
|
|
assert_redirected_to '/static_pages/not_allowed'
|
|
end
|
|
|
|
test "logged school delegate should not post update match if not owner" do
|
|
sign_in_school_delegate
|
|
post_update
|
|
assert_redirected_to '/static_pages/not_allowed'
|
|
end
|
|
|
|
test "logged in tournament delegate should get edit match page" do
|
|
sign_in_tournament_delegate
|
|
get_edit
|
|
success
|
|
end
|
|
|
|
test "logged in tournament delegate should get stat match page" do
|
|
sign_in_tournament_delegate
|
|
get_stat
|
|
success
|
|
end
|
|
|
|
test "logged in tournament owner should get state match page" do
|
|
sign_in_owner
|
|
get_state
|
|
success
|
|
end
|
|
|
|
test "logged in tournament delegate should get state match page" do
|
|
sign_in_tournament_delegate
|
|
get_state
|
|
success
|
|
end
|
|
|
|
test "logged in school delegate cannot get spectate match page when tournament is not public" do
|
|
@tournament.update!(is_public: false)
|
|
sign_in_school_delegate
|
|
get_spectate
|
|
redirect
|
|
end
|
|
|
|
test "logged in user cannot get spectate match page when tournament is not public" do
|
|
@tournament.update!(is_public: false)
|
|
sign_in_non_owner
|
|
get_spectate
|
|
redirect
|
|
end
|
|
|
|
test "logged in tournament delegate can get spectate match page when tournament is not public" do
|
|
@tournament.update!(is_public: false)
|
|
sign_in_tournament_delegate
|
|
get_spectate
|
|
success
|
|
end
|
|
|
|
test "logged in tournament owner can get spectate match page when tournament is not public" do
|
|
@tournament.update!(is_public: false)
|
|
sign_in_owner
|
|
get_spectate
|
|
success
|
|
end
|
|
|
|
test "non logged in user cannot get spectate match page when tournament is not public" do
|
|
@tournament.update!(is_public: false)
|
|
get_spectate
|
|
redirect
|
|
end
|
|
|
|
test "valid school permission key cannot get spectate match page when tournament is not public" do
|
|
@tournament.update!(is_public: false)
|
|
school = @tournament.schools.first
|
|
school.update!(permission_key: "valid-school-key")
|
|
|
|
get_spectate(school_permission_key: "valid-school-key")
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
|
|
test "invalid school permission key cannot get spectate match page when tournament is not public" do
|
|
@tournament.update!(is_public: false)
|
|
school = @tournament.schools.first
|
|
school.update!(permission_key: "valid-school-key")
|
|
|
|
get_spectate(school_permission_key: "invalid-school-key")
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
|
|
test "logged in school delegate can get spectate match page when tournament is public" do
|
|
@tournament.update!(is_public: true)
|
|
sign_in_school_delegate
|
|
get_spectate
|
|
success
|
|
end
|
|
|
|
test "logged in user can get spectate match page when tournament is public" do
|
|
@tournament.update!(is_public: true)
|
|
sign_in_non_owner
|
|
get_spectate
|
|
success
|
|
end
|
|
|
|
test "logged in tournament delegate can get spectate match page when tournament is public" do
|
|
@tournament.update!(is_public: true)
|
|
sign_in_tournament_delegate
|
|
get_spectate
|
|
success
|
|
end
|
|
|
|
test "logged in tournament owner can get spectate match page when tournament is public" do
|
|
@tournament.update!(is_public: true)
|
|
sign_in_owner
|
|
get_spectate
|
|
success
|
|
end
|
|
|
|
test "non logged in user can get spectate match page when tournament is public" do
|
|
@tournament.update!(is_public: true)
|
|
get_spectate
|
|
success
|
|
end
|
|
|
|
test "spectate renders embedded scoreboard when match is unfinished" do
|
|
@tournament.update!(is_public: true)
|
|
@match.update!(finished: nil)
|
|
|
|
get_spectate
|
|
|
|
assert_response :success
|
|
assert_includes response.body, "data-match-spectate-target=\"scoreboardContainer\""
|
|
assert_includes response.body, "data-controller=\"match-scoreboard\""
|
|
assert_includes response.body, "data-match-scoreboard-source-mode-value=\"websocket\""
|
|
assert_includes response.body, "data-match-scoreboard-display-mode-value=\"embedded\""
|
|
assert_includes response.body, "data-match-scoreboard-target=\"greenTimerIndicator\""
|
|
assert_includes response.body, "data-match-scoreboard-target=\"redTimerIndicator\""
|
|
end
|
|
|
|
test "spectate hides embedded scoreboard when match is finished" do
|
|
@tournament.update!(is_public: true)
|
|
@match.update!(finished: 1, winner_id: @match.w1, win_type: "Decision", score: "3-1")
|
|
|
|
get_spectate
|
|
|
|
assert_response :success
|
|
assert_not_includes response.body, "data-match-spectate-target=\"scoreboardContainer\""
|
|
end
|
|
|
|
test "posting a match update from match state redirects to all matches" do
|
|
sign_in_owner
|
|
get :state, params: { id: @match.id }
|
|
patch :update, params: { id: @match.id, match: { score: "3-1", win_type: "Decision", winner_id: @match.w1, finished: 1 } }
|
|
|
|
assert_redirected_to "/tournaments/#{@tournament.id}/matches"
|
|
end
|
|
|
|
test "state page renders hidden stat fields for generated stats submission" do
|
|
sign_in_owner
|
|
get_state
|
|
|
|
assert_response :success
|
|
assert_includes response.body, 'name="match[w1_stat]"'
|
|
assert_includes response.body, 'name="match[w2_stat]"'
|
|
assert_includes response.body, 'data-match-state-target="w1StatField"'
|
|
assert_includes response.body, 'data-match-state-target="w2StatField"'
|
|
end
|
|
|
|
test "posting a match update from match state respects redirect_to param" do
|
|
sign_in_owner
|
|
get :state, params: { id: @match.id, redirect_to: "/mats/#{@match.mat_id}" }
|
|
patch :update, params: {
|
|
id: @match.id,
|
|
redirect_to: "/mats/#{@match.mat_id}",
|
|
match: { score: "3-1", win_type: "Decision", winner_id: @match.w1, finished: 1 }
|
|
}
|
|
|
|
assert_redirected_to "/mats/#{@match.mat_id}"
|
|
end
|
|
|
|
test "posting a match update broadcasts match data and cached scoreboard state" do
|
|
sign_in_owner
|
|
scoreboard_state = {
|
|
"participantScores" => { "w1" => 3, "w2" => 1 },
|
|
"metadata" => { "boutNumber" => @match.bout_number }
|
|
}
|
|
stream = MatchChannel.broadcasting_for(@match)
|
|
ActionCable.server.pubsub.clear
|
|
ActionCable.server.pubsub.broadcasts(stream).clear
|
|
Rails.cache.write(
|
|
"tournament:#{@match.tournament_id}:match:#{@match.id}:scoreboard_state",
|
|
scoreboard_state
|
|
)
|
|
|
|
patch :update, params: {
|
|
id: @match.id,
|
|
match: {
|
|
w1_stat: "T3",
|
|
w2_stat: "E1",
|
|
score: "3-1",
|
|
win_type: "Decision",
|
|
winner_id: @match.w1,
|
|
finished: 1
|
|
}
|
|
}
|
|
|
|
payload = JSON.parse(ActionCable.server.pubsub.broadcasts(stream).last)
|
|
assert_equal(
|
|
{
|
|
"w1_stat" => "T3",
|
|
"w2_stat" => "E1",
|
|
"score" => "3-1",
|
|
"win_type" => "Decision",
|
|
"winner_id" => @match.w1,
|
|
"winner_name" => @match.wrestler1.name,
|
|
"finished" => 1,
|
|
"scoreboard_state" => scoreboard_state
|
|
},
|
|
payload
|
|
)
|
|
end
|
|
|
|
test "logged in tournament delegate should post update match" do
|
|
sign_in_tournament_delegate
|
|
post_update
|
|
assert_redirected_to tournament_path(@tournament.id)
|
|
end
|
|
|
|
test "should redirect to all matches when posting a match update from match edit" do
|
|
sign_in_owner
|
|
post_update_from_match_edit
|
|
assert_redirected_to "/tournaments/#{@tournament.id}/matches"
|
|
end
|
|
|
|
test "should redirect to all matches when posting a match update from match stat" do
|
|
sign_in_owner
|
|
post_update_from_match_stat
|
|
assert_redirected_to "/tournaments/#{@tournament.id}/matches"
|
|
end
|
|
|
|
test "stats page should load if a match does not have finished_at" do
|
|
create_double_elim_tournament_single_weight(14, "Regular Double Elimination 1-8")
|
|
user = users(:one)
|
|
@tournament.user_id = user.id
|
|
@tournament.save
|
|
matches = @tournament.matches.reload
|
|
match = matches.first
|
|
sign_in_owner
|
|
get :stat, params: { id: match.id }
|
|
assert_response :success
|
|
end
|
|
|
|
test "stat page loads with the finished_at time ago in words when a match is already finished" do
|
|
create_double_elim_tournament_single_weight(14, "Regular Double Elimination 1-8")
|
|
user = users(:one)
|
|
@tournament.user_id = user.id
|
|
@tournament.save
|
|
matches = @tournament.matches.reload
|
|
match = matches.first
|
|
match.winner_id = match.w1
|
|
match.finished = 1
|
|
match.win_type = "Pin"
|
|
match.score = "2:03"
|
|
match.save
|
|
|
|
finished_at = match.reload.finished_at
|
|
sign_in_owner
|
|
get :stat, params: { id: match.id }
|
|
# Check that the finished_at value is displayed on the page
|
|
assert_response :success
|
|
assert_includes @response.body, time_ago_in_words(finished_at), "time_ago_in_words(finished_at) should be displayed on the page"
|
|
end
|
|
|
|
test "tournament owner can view edit_assignment and execute update_assignment" do
|
|
sign_in_owner
|
|
get_edit_assignment
|
|
assert_response :success
|
|
|
|
patch_update_assignment
|
|
assert_response :redirect
|
|
assert_not_equal "/static_pages/not_allowed", @response.redirect_url&.sub("http://test.host", "")
|
|
end
|
|
|
|
test "tournament delegate can view edit_assignment and execute update_assignment" do
|
|
sign_in_tournament_delegate
|
|
get_edit_assignment
|
|
assert_response :success
|
|
|
|
patch_update_assignment
|
|
assert_response :redirect
|
|
assert_not_equal "/static_pages/not_allowed", @response.redirect_url&.sub("http://test.host", "")
|
|
end
|
|
|
|
test "school delegate cannot view edit_assignment or execute update_assignment" do
|
|
sign_in_school_delegate
|
|
get_edit_assignment
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
|
|
patch_update_assignment
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
|
|
test "non logged in user cannot view edit_assignment or execute update_assignment" do
|
|
get_edit_assignment
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
|
|
patch_update_assignment
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
|
|
test "logged in user without delegations cannot view edit_assignment or execute update_assignment" do
|
|
sign_in_non_owner
|
|
get_edit_assignment
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
|
|
patch_update_assignment
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
|
|
test "valid school permission key cannot view edit_assignment or execute update_assignment" do
|
|
school = @tournament.schools.first
|
|
school.update!(permission_key: "valid-school-key")
|
|
|
|
get_edit_assignment(school_permission_key: "valid-school-key")
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
|
|
patch_update_assignment(school_permission_key: "valid-school-key")
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
|
|
test "invalid school permission key cannot view edit_assignment or execute update_assignment" do
|
|
school = @tournament.schools.first
|
|
school.update!(permission_key: "valid-school-key")
|
|
|
|
get_edit_assignment(school_permission_key: "invalid-school-key")
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
|
|
patch_update_assignment(school_permission_key: "invalid-school-key")
|
|
assert_redirected_to "/static_pages/not_allowed"
|
|
end
|
|
end
|