1
0
mirror of https://github.com/jcwimer/wrestlingApp synced 2026-04-11 16:01:56 +00:00

New stats page, scoreboard, and live scores pages.

This commit is contained in:
2026-04-10 21:08:03 -04:00
parent 7526148ba5
commit 970f38ed14
60 changed files with 9650 additions and 148 deletions

View File

@@ -1,9 +1,11 @@
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)
@@ -34,6 +36,18 @@ class MatchesControllerTest < ActionController::TestCase
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
@@ -106,11 +120,44 @@ class MatchesControllerTest < ActionController::TestCase
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'
@@ -139,6 +186,202 @@ class MatchesControllerTest < ActionController::TestCase
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