From eb5c3b5fafb01aec442643083731828fa0a37a9e Mon Sep 17 00:00:00 2001 From: Malaber Date: Sun, 29 May 2022 23:54:25 +0200 Subject: [PATCH 01/13] Test huge playoff stage generation --- spec/services/playoff_stage_service_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/services/playoff_stage_service_spec.rb b/spec/services/playoff_stage_service_spec.rb index ee12487..9edf369 100644 --- a/spec/services/playoff_stage_service_spec.rb +++ b/spec/services/playoff_stage_service_spec.rb @@ -64,7 +64,8 @@ RSpec.describe PlayoffStageService do { team_size: 24, expected_amount_of_playoff_stages: 5 }, { team_size: 32, expected_amount_of_playoff_stages: 5 }, { team_size: 64, expected_amount_of_playoff_stages: 6 }, - { team_size: 111, expected_amount_of_playoff_stages: 7 } + { team_size: 111, expected_amount_of_playoff_stages: 7 }, + { team_size: 256, expected_amount_of_playoff_stages: 8 } ].each do |parameters| it "generates playoff stages for #{parameters[:team_size]} teams" do amount_of_teams = parameters[:team_size] From 40edc85562830c73ebb0172f3a4010a820aa2732 Mon Sep 17 00:00:00 2001 From: Malaber Date: Sun, 29 May 2022 23:57:38 +0200 Subject: [PATCH 02/13] Disable bet serialization when matches are requested --- app/serializers/match_serializer.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/serializers/match_serializer.rb b/app/serializers/match_serializer.rb index 6b8d21f..7a5e715 100644 --- a/app/serializers/match_serializer.rb +++ b/app/serializers/match_serializer.rb @@ -7,10 +7,10 @@ class MatchSerializer < ApplicationSerializer ActiveModelSerializers::SerializableResource.new(object.winner).as_json end - def bets - ActiveModelSerializers::SerializableResource.new(object.bets, serializer: BetsSerializer).as_json - end + # def bets + # ActiveModelSerializers::SerializableResource.new(object.bets, serializer: BetsSerializer).as_json + # end has_many :match_scores - has_many :bets + # has_many :bets end From d18efbac96f6c6e1e6edc03262eee1d35ffaa277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=A4dler?= Date: Sun, 12 Jun 2022 21:42:01 +0000 Subject: [PATCH 03/13] Remove bets instead of just commenting --- app/serializers/match_serializer.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/serializers/match_serializer.rb b/app/serializers/match_serializer.rb index 7a5e715..6665355 100644 --- a/app/serializers/match_serializer.rb +++ b/app/serializers/match_serializer.rb @@ -7,10 +7,4 @@ class MatchSerializer < ApplicationSerializer ActiveModelSerializers::SerializableResource.new(object.winner).as_json end - # def bets - # ActiveModelSerializers::SerializableResource.new(object.bets, serializer: BetsSerializer).as_json - # end - has_many :match_scores - # has_many :bets -end From 0518f6691b9d29b1be01a3a0c2f0f5e1f72b003a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=A4dler?= Date: Sun, 12 Jun 2022 21:42:20 +0000 Subject: [PATCH 04/13] Remove expensive tests --- spec/services/playoff_stage_service_spec.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spec/services/playoff_stage_service_spec.rb b/spec/services/playoff_stage_service_spec.rb index 9edf369..2e6e9c3 100644 --- a/spec/services/playoff_stage_service_spec.rb +++ b/spec/services/playoff_stage_service_spec.rb @@ -62,10 +62,6 @@ RSpec.describe PlayoffStageService do { team_size: 10, expected_amount_of_playoff_stages: 4 }, { team_size: 16, expected_amount_of_playoff_stages: 4 }, { team_size: 24, expected_amount_of_playoff_stages: 5 }, - { team_size: 32, expected_amount_of_playoff_stages: 5 }, - { team_size: 64, expected_amount_of_playoff_stages: 6 }, - { team_size: 111, expected_amount_of_playoff_stages: 7 }, - { team_size: 256, expected_amount_of_playoff_stages: 8 } ].each do |parameters| it "generates playoff stages for #{parameters[:team_size]} teams" do amount_of_teams = parameters[:team_size] From 94aaa2d8f4440eca68b4fb6b0328c91e8dbb4730 Mon Sep 17 00:00:00 2001 From: Malaber Date: Sat, 25 Jun 2022 16:57:14 +0200 Subject: [PATCH 05/13] Add missing end of class --- app/serializers/match_serializer.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/serializers/match_serializer.rb b/app/serializers/match_serializer.rb index 6665355..28b7d1a 100644 --- a/app/serializers/match_serializer.rb +++ b/app/serializers/match_serializer.rb @@ -8,3 +8,4 @@ class MatchSerializer < ApplicationSerializer end has_many :match_scores +end From e448f9ccc35a9665a24adb25b5bf2739c483d3c7 Mon Sep 17 00:00:00 2001 From: Malaber Date: Sat, 25 Jun 2022 17:34:43 +0200 Subject: [PATCH 06/13] Remove specific bet specs --- spec/controllers/bets_controller_spec.rb | 91 ------------------------ spec/models/bet_spec.rb | 11 --- 2 files changed, 102 deletions(-) delete mode 100644 spec/controllers/bets_controller_spec.rb delete mode 100644 spec/models/bet_spec.rb diff --git a/spec/controllers/bets_controller_spec.rb b/spec/controllers/bets_controller_spec.rb deleted file mode 100644 index 8587bb2..0000000 --- a/spec/controllers/bets_controller_spec.rb +++ /dev/null @@ -1,91 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe BetsController, type: :controller do - let(:team) do - create(:team) - end - - let(:match) do - match = create(:playoff_match) - match.bets << create(:bet, team: team) - match - end - - let(:params) do - { - match_id: match.to_param - } - end - - describe 'GET #index' do - it 'returns a list of bet counts' do - get :index, params: params - body = deserialize_response response - expect(body.size).to eq(1) - expect(body.first[:team][:id]).to eq(team.id) - expect(body.first[:bets]).to eq(1) - end - end - - describe 'POST #create' do - let(:create_params) do - params.merge(team: team.to_param) - end - - let(:user_service) do - instance_double('UserService') - end - - before do - allow(controller).to receive(:user_service).and_return(user_service) - end - - context 'without authentication headers' do - it 'renders an unauthorized error response' do - post :create, params: params - expect(response).to have_http_status(:unauthorized) - end - end - - context 'with authentication headers' do - before(:each) do - apply_authentication_headers_for create(:user) - end - - it 'returns the created bet' do - bet = create(:bet) - expect(user_service).to receive(:bet!).and_return(bet) - post :create, params: create_params - expect(response).to be_successful - body = deserialize_response(response) - expect(body[:id]).to eq(bet.id) - end - - context 'given a team' do - it 'calls the service' do - expect(user_service).to receive(:bet!).with(match, team) - post :create, params: create_params - end - end - - context 'given no team' do - it 'calls the service' do - expect(user_service).to receive(:bet!).with(match, nil) - post :create, params: params.merge(team: nil) - end - end - - context 'on service exception' do - it 'returns an error response' do - msg = 'an error' - expect(user_service).to receive(:bet!).and_raise(UserServiceError, msg) - post :create, params: create_params - expect(response).to have_http_status(:unprocessable_entity) - expect(deserialize_response(response)[:error]).to eq(msg) - end - end - end - end -end diff --git a/spec/models/bet_spec.rb b/spec/models/bet_spec.rb deleted file mode 100644 index 06e7a78..0000000 --- a/spec/models/bet_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Bet, type: :model do - describe 'association' do - it { should belong_to :user } - it { should belong_to :match } - it { should belong_to(:team).optional } - end -end From bbb8e209df950bc38dfbd2c87c9e82430d110ce1 Mon Sep 17 00:00:00 2001 From: Malaber Date: Sat, 25 Jun 2022 18:20:59 +0200 Subject: [PATCH 07/13] Update groups points at start and end of a match --- app/controllers/matches_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/controllers/matches_controller.rb b/app/controllers/matches_controller.rb index ae1de80..e0813c9 100644 --- a/app/controllers/matches_controller.rb +++ b/app/controllers/matches_controller.rb @@ -49,6 +49,9 @@ class MatchesController < ApplicationController Match.transaction do if @match.update(match_params) handle_match_end if new_state == 'finished' + if @match.group_match? and new_state == "in_progress" + UpdateGroupsGroupScoresAndSave.call(group: @match.group) + end render json: @match else @@ -61,6 +64,7 @@ class MatchesController < ApplicationController private def handle_match_end + UpdateGroupsGroupScoresAndSave.call(group: @match.group) if @match.group_match? return if @match.group_match? if @match.winner.nil? From 385e2554b21c52f07877cd27d6e7a5931c6f4d99 Mon Sep 17 00:00:00 2001 From: Malaber Date: Sat, 25 Jun 2022 21:28:44 +0200 Subject: [PATCH 08/13] Shuffle intermediate stage match position before populating stage below --- app/interactors/advance_teams_in_intermediate_stage.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/interactors/advance_teams_in_intermediate_stage.rb b/app/interactors/advance_teams_in_intermediate_stage.rb index 1eb1bd3..18db320 100644 --- a/app/interactors/advance_teams_in_intermediate_stage.rb +++ b/app/interactors/advance_teams_in_intermediate_stage.rb @@ -7,7 +7,15 @@ class AdvanceTeamsInIntermediateStage intermediate_stage = context.intermediate_stage return if intermediate_stage.nil? - intermediate_stage.matches.select { |m| m.state == 'single_team' } + # shuffle positions of generated matches to spread the instantly advancing teams across the tournament tree + matches = intermediate_stage.matches + matches.shuffle.each_with_index do |m, i| + m.position = i + m.save! + end + + # populate stage below with the "winners" from single team matches + matches.select { |m| m.state == 'single_team' } .each do |match| context.fail! unless PopulateMatchBelowAndSave.call(match: match).success? end From a67ef86dca6124d157a25b8fc4f73d4f5e4a65cf Mon Sep 17 00:00:00 2001 From: Malaber Date: Wed, 29 Jun 2022 22:48:54 +0200 Subject: [PATCH 09/13] Fix upcoming matches not returning for group stage --- app/controllers/matches_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/matches_controller.rb b/app/controllers/matches_controller.rb index e0813c9..ccbfe4b 100644 --- a/app/controllers/matches_controller.rb +++ b/app/controllers/matches_controller.rb @@ -26,6 +26,8 @@ class MatchesController < ApplicationController end end @tournament.stages.find_by(level: next_level).matches + else + upcoming_matches end else @tournament.matches.select do |m| From b6095496595535d8344b40bd54a946b82e0a5f67 Mon Sep 17 00:00:00 2001 From: Malaber Date: Fri, 1 Jul 2022 20:19:57 +0200 Subject: [PATCH 10/13] Add logging if updating group scores fails --- app/controllers/matches_controller.rb | 13 +++++++++++-- config/environment.rb | 3 +++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/controllers/matches_controller.rb b/app/controllers/matches_controller.rb index ccbfe4b..cf24488 100644 --- a/app/controllers/matches_controller.rb +++ b/app/controllers/matches_controller.rb @@ -52,7 +52,10 @@ class MatchesController < ApplicationController if @match.update(match_params) handle_match_end if new_state == 'finished' if @match.group_match? and new_state == "in_progress" - UpdateGroupsGroupScoresAndSave.call(group: @match.group) + group = @match.group + if UpdateGroupsGroupScoresAndSave.call(group: group).success? + Rails.logger.warn "Updating groups group score failed for #{group}" + end end render json: @match @@ -66,7 +69,13 @@ class MatchesController < ApplicationController private def handle_match_end - UpdateGroupsGroupScoresAndSave.call(group: @match.group) if @match.group_match? + if @match.group_match? + group = @match.group + unless UpdateGroupsGroupScoresAndSave.call(group: group).success? + Rails.logger.warn "Updating groups group score failed for #{group}" + end + end + return if @match.group_match? if @match.winner.nil? diff --git a/config/environment.rb b/config/environment.rb index d5abe55..d8d3793 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -5,3 +5,6 @@ require_relative 'application' # Initialize the Rails application. Rails.application.initialize! + +Rails.logger = Logger.new(STDOUT) +config.logger = ActiveSupport::Logger.new("log/#{Rails.env}.log") From 64322963912f4b485980f4ba446f5bb1f5d43463 Mon Sep 17 00:00:00 2001 From: Malaber Date: Fri, 1 Jul 2022 22:21:23 +0200 Subject: [PATCH 11/13] Fix logging --- app/controllers/matches_controller.rb | 6 +++--- config/application.rb | 3 +++ config/environment.rb | 3 --- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/matches_controller.rb b/app/controllers/matches_controller.rb index cf24488..2acf65f 100644 --- a/app/controllers/matches_controller.rb +++ b/app/controllers/matches_controller.rb @@ -53,8 +53,8 @@ class MatchesController < ApplicationController handle_match_end if new_state == 'finished' if @match.group_match? and new_state == "in_progress" group = @match.group - if UpdateGroupsGroupScoresAndSave.call(group: group).success? - Rails.logger.warn "Updating groups group score failed for #{group}" + unless UpdateGroupsGroupScoresAndSave.call(group: group).success? + logger.warn "Updating groups group score failed for #{group}" end end @@ -72,7 +72,7 @@ class MatchesController < ApplicationController if @match.group_match? group = @match.group unless UpdateGroupsGroupScoresAndSave.call(group: group).success? - Rails.logger.warn "Updating groups group score failed for #{group}" + logger.warn "Updating groups group score failed for #{group}" end end diff --git a/config/application.rb b/config/application.rb index ba2e151..7291b92 100644 --- a/config/application.rb +++ b/config/application.rb @@ -50,5 +50,8 @@ module TurniereBackend # Active Record config.active_record.legacy_connection_handling = false + + # Logging + config.logger = Logger.new(STDOUT) end end diff --git a/config/environment.rb b/config/environment.rb index d8d3793..d5abe55 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -5,6 +5,3 @@ require_relative 'application' # Initialize the Rails application. Rails.application.initialize! - -Rails.logger = Logger.new(STDOUT) -config.logger = ActiveSupport::Logger.new("log/#{Rails.env}.log") From cac378ff5c0a5727975d01d2e5fa237735923a2b Mon Sep 17 00:00:00 2001 From: Malaber Date: Fri, 1 Jul 2022 22:30:14 +0200 Subject: [PATCH 12/13] Add file to report test runtimes --- spec/spec_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9e55c9c..74a58f0 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -100,4 +100,5 @@ RSpec.configure do |config| # # test failures related to randomization by passing the same `--seed` value # # as the one that triggered the failure. # Kernel.srand config.seed + config.example_status_persistence_file_path = 'specs_with_runtime.txt' end From e9b18dbc134ffa66fa6a391b61a078f700a2485d Mon Sep 17 00:00:00 2001 From: Malaber Date: Fri, 1 Jul 2022 22:32:21 +0200 Subject: [PATCH 13/13] Upload specs_with_runtime.txt --- .gitlab-ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 69c7276..c5b3204 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,7 +14,7 @@ rails spec: - if: $SKIP_TEST when: never - if: $CI_PIPELINE_SOURCE != "push" - when: never + when: never - changes: - '**/*.rb' - 'Gemfile' @@ -23,3 +23,7 @@ rails spec: - cd /app - bundle exec rails db:migrate - bundle exec rails spec + artifacts: + paths: + - specs_with_runtime.txt + expire_in: 30 days