diff --git a/lib/Bracket/Model/DBIC.pm b/lib/Bracket/Model/DBIC.pm index c9cc1e8..e84fae7 100644 --- a/lib/Bracket/Model/DBIC.pm +++ b/lib/Bracket/Model/DBIC.pm @@ -506,10 +506,9 @@ sub count_player_teams_left { from games_played ), games_remaining as ( - select p.game - from pick p - where p.player = 24 - and p.game not in (select game from games_played) + select g.id as game + from game g + where g.id not in (select game from games_played) ), player_teams_remaining as ( select player, pick @@ -529,7 +528,10 @@ sub count_player_teams_left { foreach my $row (@{$result}) { $teams_left_per_player->{$row->[0]} = $row->[1]; } - my $max_left = max map { $teams_left_per_player->{$_} } grep { $_ != 1 } keys %{$teams_left_per_player}; + my @players = grep { $_ != 1 } keys %{$teams_left_per_player}; + my $max_left = @players + ? max(map { $teams_left_per_player->{$_} } @players) + : 0; return $teams_left_per_player, $max_left; } ); @@ -566,10 +568,9 @@ sub count_player_final4_teams_left { from games_played ), games_remaining as ( - select p.game - from pick p - where p.player = 24 - and p.game not in (select game from games_played) + select g.id as game + from game g + where g.id not in (select game from games_played) ), player_teams_remaining as ( select player, pick @@ -594,7 +595,10 @@ sub count_player_final4_teams_left { foreach my $row (@{$result}) { $final4_teams_left_per_player->{$row->[0]} = $row->[1]; } - my $max_left = max map { $final4_teams_left_per_player->{$_} } grep { $_ != 1 } keys %{$final4_teams_left_per_player}; + my @players = grep { $_ != 1 } keys %{$final4_teams_left_per_player}; + my $max_left = @players + ? max(map { $final4_teams_left_per_player->{$_} } @players) + : 0; return $final4_teams_left_per_player, $max_left; } ); diff --git a/t/model_round_based_final4_counts.t b/t/model_round_based_final4_counts.t index 7848c4e..0f3aff2 100644 --- a/t/model_round_based_final4_counts.t +++ b/t/model_round_based_final4_counts.t @@ -28,6 +28,16 @@ my $dbh = $schema->storage->dbh; $dbh->sqlite_create_function('get_loser', 1, sub { return -1; }); $dbh->sqlite_create_function('get_first_round_loser', 1, sub { return -1; }); +# Regression: max_left must be 0 (not an error) when no non-admin players have picks. +{ + my ($tl, $ml) = Bracket::Model::DBIC::count_player_teams_left($model); + is($ml, 0, 'count_player_teams_left: max_left is 0 when no non-admin players have picks'); +} +{ + my ($tl, $ml) = Bracket::Model::DBIC::count_player_final4_teams_left($model); + is($ml, 0, 'count_player_final4_teams_left: max_left is 0 when no non-admin players have picks'); +} + my $player = $schema->resultset('Player')->create({ email => 'round-based-final4@example.com', password => 'secret', @@ -64,21 +74,11 @@ $schema->resultset('Team')->create({ round_out => 7, }); -# Create a player with id 24 to satisfy foreign key constraints on Pick. -$schema->resultset('Player')->create({ - id => 24, - email => 'player-24@example.com', - password => 'secret', - first_name => 'Player', - last_name => 'TwentyFour', -}); - -# player 24 drives games_remaining in count_player_final4_teams_left. -$schema->resultset('Pick')->create({ - player => 24, - game => $round4_game_id, - pick => $round4_team_id, -}); +# Regression: teams-left queries should not rely on a sentinel player id. +ok( + !$schema->resultset('Player')->find(24), + 'test fixture intentionally omits player 24 sentinel', +); $schema->resultset('Pick')->create({ player => $player->id, game => $round4_game_id, @@ -96,4 +96,15 @@ ok( 'count_player_final4_teams_left reports max_left from computed map', ); +my ($all_teams_left, $all_max_left) = Bracket::Model::DBIC::count_player_teams_left($model); +is( + ($all_teams_left->{$player->id} || 0) >= 1, + 1, + 'count_player_teams_left no longer depends on sentinel player rows', +); +ok( + defined $all_max_left && $all_max_left >= 1, + 'count_player_teams_left reports max_left without sentinel player data', +); + done_testing();