From f3431e844287b254b786853c4bb2e7fbe8cab1c1 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Sun, 9 Jun 2019 20:43:28 +0200 Subject: [PATCH 01/14] Add bet model * has_many relations in all belonging models * specs for relations in existing models * association specs for bet model --- app/models/bet.rb | 7 +++++++ app/models/match.rb | 2 ++ app/models/team.rb | 1 + app/models/user.rb | 1 + db/migrate/0001_create_bets.rb | 13 +++++++++++++ spec/models/bet_spec.rb | 11 +++++++++++ spec/models/match_spec.rb | 1 + spec/models/team_spec.rb | 1 + spec/models/user_spec.rb | 1 + 9 files changed, 38 insertions(+) create mode 100644 app/models/bet.rb create mode 100644 db/migrate/0001_create_bets.rb create mode 100644 spec/models/bet_spec.rb diff --git a/app/models/bet.rb b/app/models/bet.rb new file mode 100644 index 0000000..d9a736d --- /dev/null +++ b/app/models/bet.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Bet < ApplicationRecord + belongs_to :user + belongs_to :match + belongs_to :team, optional: true +end diff --git a/app/models/match.rb b/app/models/match.rb index bc80977..7891276 100644 --- a/app/models/match.rb +++ b/app/models/match.rb @@ -5,7 +5,9 @@ class Match < ApplicationRecord belongs_to :stage, optional: true belongs_to :group, optional: true + has_many :match_scores, dependent: :destroy + has_many :bets, dependent: :destroy validates :match_scores, length: { maximum: 2 } diff --git a/app/models/team.rb b/app/models/team.rb index f266f9c..d81563e 100644 --- a/app/models/team.rb +++ b/app/models/team.rb @@ -4,6 +4,7 @@ class Team < ApplicationRecord belongs_to :tournament, optional: true has_many :group_scores, dependent: :destroy has_many :match_scores, dependent: :destroy + has_many :bets, dependent: :destroy validates :name, presence: true diff --git a/app/models/user.rb b/app/models/user.rb index a45995e..c21ab22 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -11,4 +11,5 @@ class User < ApplicationRecord validates :username, presence: true, uniqueness: { case_sensitive: false } has_many :tournaments, dependent: :destroy + has_many :bets, dependent: :destroy end diff --git a/db/migrate/0001_create_bets.rb b/db/migrate/0001_create_bets.rb new file mode 100644 index 0000000..08b83ea --- /dev/null +++ b/db/migrate/0001_create_bets.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class CreateBets < ActiveRecord::Migration[5.2] + def change + create_table :bets do |t| + t.references :user, index: true, null: false, foreign_key: { on_delete: :cascade } + t.references :match, index: true, null: false, foreign_key: { on_delete: :cascade } + t.references :team, index: true, null: true, foreign_key: { on_delete: :cascade } + + t.timestamps + end + end +end diff --git a/spec/models/bet_spec.rb b/spec/models/bet_spec.rb new file mode 100644 index 0000000..06e7a78 --- /dev/null +++ b/spec/models/bet_spec.rb @@ -0,0 +1,11 @@ +# 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 diff --git a/spec/models/match_spec.rb b/spec/models/match_spec.rb index 1491bfa..6610b96 100644 --- a/spec/models/match_spec.rb +++ b/spec/models/match_spec.rb @@ -5,6 +5,7 @@ require 'rails_helper' RSpec.describe Match, type: :model do context 'association' do it { should have_many :match_scores } + it { should have_many :bets } it { should belong_to(:stage).optional } it { should belong_to(:group).optional } end diff --git a/spec/models/team_spec.rb b/spec/models/team_spec.rb index c2f25e3..d6d097e 100644 --- a/spec/models/team_spec.rb +++ b/spec/models/team_spec.rb @@ -11,5 +11,6 @@ RSpec.describe Team, type: :model do it { should belong_to(:tournament).optional } it { should have_many :group_scores } it { should have_many :match_scores } + it { should have_many :bets } end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 7216b64..83ab130 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -5,6 +5,7 @@ require 'rails_helper' RSpec.describe User, type: :model do describe 'association' do it { should have_many :tournaments } + it { should have_many :bets } end describe 'validation' do From 2f0127897edb9969c78ffb3fbcf208bf1d582a32 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Wed, 12 Jun 2019 09:52:43 +0200 Subject: [PATCH 02/14] Add UserService --- app/services/user_service.rb | 22 +++++++++++ spec/services/user_service_spec.rb | 62 ++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 app/services/user_service.rb create mode 100644 spec/services/user_service_spec.rb diff --git a/app/services/user_service.rb b/app/services/user_service.rb new file mode 100644 index 0000000..fcbdf6e --- /dev/null +++ b/app/services/user_service.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class UserService + def initialize(user) + @user = user + end + + def bet!(match, team) + validate_bet! match, team + @user.bets.create! match: match, team: team + end + + private + + def validate_bet!(match, team) + if team.nil? + raise 'Betting on no team in a playoff match is not supported' unless match.group_match? + else + raise 'The given team is not involved in the given match' unless match.teams.include? team + end + end +end diff --git a/spec/services/user_service_spec.rb b/spec/services/user_service_spec.rb new file mode 100644 index 0000000..1711a36 --- /dev/null +++ b/spec/services/user_service_spec.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +RSpec.describe UserService do + before do + @user = create(:user) + @service = UserService.new @user + @team = create(:team) + end + + describe '#bet!' do + context 'with an unrelated team' do + it 'throws an exception' do + expect do + @service.bet! create(:playoff_match), create(:team) + end.to raise_error('The given team is not involved in the given match') + end + end + + context 'with an existing team' do + let(:match) do + create(:playoff_match, match_scores: [create(:match_score, team: @team)]) + end + + let(:bet) do + @service.bet! match, @team + end + + it 'associates the bet with the given team' do + expect(@team.bets).to include(bet) + end + + it 'associates the bet with the given match' do + expect(match.bets).to include(bet) + end + + it 'associates the bet with the creating user' do + expect(@user.bets).to include(bet) + end + end + context 'without a team' do + context 'on a playoff stage' do + it 'throws an exception' do + match = create(:playoff_match) + match.match_scores << create(:match_score, team: @team) + expect do + @service.bet! match, nil + end.to raise_error('Betting on no team in a playoff match is not supported') + end + end + + context 'on a group stage' do + it 'succeeds' do + match = create(:group_match) + match.match_scores << create(:match_score, team: @team) + bet = @service.bet! match, nil + expect(match.bets).to include(bet) + expect(@user.bets).to include(bet) + end + end + end + end +end From a9cee1d651984c03ca73695027ca54b8e7c2af15 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Thu, 13 Jun 2019 13:16:47 +0200 Subject: [PATCH 03/14] Add routes for bets controller --- config/routes.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 63c742d..d8f761a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,7 +6,9 @@ Rails.application.routes.draw do sessions: 'overrides/sessions' } - resources :matches, only: %i[show update] + resources :matches, only: %i[show update] do + resources :bets, only: %i[index create] + end resources :teams, only: %i[show update] resources :tournaments do resources :statistics, only: %i[index] From b9aaccb4870be712b9cfa39773fdbdc5b717bbfa Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 14:25:03 +0200 Subject: [PATCH 04/14] Raise UserServiceError instead of StandardError --- app/errors/user_service_error.rb | 4 ++++ app/services/user_service.rb | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 app/errors/user_service_error.rb diff --git a/app/errors/user_service_error.rb b/app/errors/user_service_error.rb new file mode 100644 index 0000000..9ef94df --- /dev/null +++ b/app/errors/user_service_error.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class UserServiceError < StandardError +end diff --git a/app/services/user_service.rb b/app/services/user_service.rb index fcbdf6e..37f181f 100644 --- a/app/services/user_service.rb +++ b/app/services/user_service.rb @@ -14,9 +14,9 @@ class UserService def validate_bet!(match, team) if team.nil? - raise 'Betting on no team in a playoff match is not supported' unless match.group_match? + raise UserServiceError, 'Betting on no team in a playoff match is not supported' unless match.group_match? else - raise 'The given team is not involved in the given match' unless match.teams.include? team + raise UserServiceError, 'The given team is not involved in the given match' unless match.teams.include? team end end end From 76e301e9203d14c7f89f1e2261653fba6de18005 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 14:25:22 +0200 Subject: [PATCH 05/14] Add BetsController --- app/controllers/bets_controller.rb | 34 +++++++++ spec/controllers/bets_controller_spec.rb | 91 ++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 app/controllers/bets_controller.rb create mode 100644 spec/controllers/bets_controller_spec.rb diff --git a/app/controllers/bets_controller.rb b/app/controllers/bets_controller.rb new file mode 100644 index 0000000..cc6e250 --- /dev/null +++ b/app/controllers/bets_controller.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +class BetsController < ApplicationController + before_action :set_match, only: %i[index create] + before_action :authenticate_user!, only: %i[create] + rescue_from UserServiceError, with: :handle_user_service_error + + def index + render json: @match.bets.group_by(&:team).map { |team, bets| + { + team: ActiveModelSerializers::SerializableResource.new(team).as_json, + bets: bets.size + } + } + end + + def create + render json: user_service.bet!(@match, Team.find_by(id: params[:team])) + end + + private + + def user_service + @user_service ||= UserService.new current_user + end + + def set_match + @match = Match.find params[:match_id] + end + + def handle_user_service_error(exception) + render json: { error: exception.message }, status: :unprocessable_entity + end +end diff --git a/spec/controllers/bets_controller_spec.rb b/spec/controllers/bets_controller_spec.rb new file mode 100644 index 0000000..c414241 --- /dev/null +++ b/spec/controllers/bets_controller_spec.rb @@ -0,0 +1,91 @@ +# 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_throw(UserServiceError.new(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 From 45ede9029ed105ab790c3715b7631a804ed22166 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 14:25:44 +0200 Subject: [PATCH 06/14] Add :bet factory --- spec/factories/bets.rb | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 spec/factories/bets.rb diff --git a/spec/factories/bets.rb b/spec/factories/bets.rb new file mode 100644 index 0000000..6cc28df --- /dev/null +++ b/spec/factories/bets.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :bet do + user + team + match + end +end From f08c4693ad7d9c75bd4f909eda8ae9a6749dd398 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 14:28:31 +0200 Subject: [PATCH 07/14] Expect UserServiceError in spec --- spec/services/user_service_spec.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spec/services/user_service_spec.rb b/spec/services/user_service_spec.rb index 1711a36..f0150f2 100644 --- a/spec/services/user_service_spec.rb +++ b/spec/services/user_service_spec.rb @@ -12,7 +12,7 @@ RSpec.describe UserService do it 'throws an exception' do expect do @service.bet! create(:playoff_match), create(:team) - end.to raise_error('The given team is not involved in the given match') + end.to raise_error(UserServiceError, 'The given team is not involved in the given match') end end @@ -37,6 +37,7 @@ RSpec.describe UserService do expect(@user.bets).to include(bet) end end + context 'without a team' do context 'on a playoff stage' do it 'throws an exception' do @@ -44,7 +45,7 @@ RSpec.describe UserService do match.match_scores << create(:match_score, team: @team) expect do @service.bet! match, nil - end.to raise_error('Betting on no team in a playoff match is not supported') + end.to raise_error(UserServiceError, 'Betting on no team in a playoff match is not supported') end end From ba758c73fffddbe44db4c1123abde9d8580a5d28 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 15:45:04 +0200 Subject: [PATCH 08/14] Fix mock using throw instead of raise --- spec/controllers/bets_controller_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/controllers/bets_controller_spec.rb b/spec/controllers/bets_controller_spec.rb index c414241..8587bb2 100644 --- a/spec/controllers/bets_controller_spec.rb +++ b/spec/controllers/bets_controller_spec.rb @@ -80,7 +80,7 @@ RSpec.describe BetsController, type: :controller do context 'on service exception' do it 'returns an error response' do msg = 'an error' - expect(user_service).to receive(:bet!).and_throw(UserServiceError.new(msg)) + 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) From 167a2116f17f4c4e854dde0d729b4cbd18c7b4ce Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 16:47:31 +0200 Subject: [PATCH 09/14] Prevent duplicate bets on the same match --- app/services/user_service.rb | 1 + spec/services/user_service_spec.rb | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/services/user_service.rb b/app/services/user_service.rb index 37f181f..0050189 100644 --- a/app/services/user_service.rb +++ b/app/services/user_service.rb @@ -18,5 +18,6 @@ class UserService else raise UserServiceError, 'The given team is not involved in the given match' unless match.teams.include? team end + raise UserServiceError, 'This user already created a bet on this match' if match.bets.map(&:user).include? @user end end diff --git a/spec/services/user_service_spec.rb b/spec/services/user_service_spec.rb index f0150f2..b949d07 100644 --- a/spec/services/user_service_spec.rb +++ b/spec/services/user_service_spec.rb @@ -21,20 +21,34 @@ RSpec.describe UserService do create(:playoff_match, match_scores: [create(:match_score, team: @team)]) end - let(:bet) do - @service.bet! match, @team + before do + @bet = @service.bet! match, @team + @user.reload + match.reload + @team.reload end it 'associates the bet with the given team' do - expect(@team.bets).to include(bet) + expect(@team.bets).to include(@bet) end it 'associates the bet with the given match' do - expect(match.bets).to include(bet) + expect(match.bets).to include(@bet) end it 'associates the bet with the creating user' do - expect(@user.bets).to include(bet) + expect(@user.bets).to include(@bet) + end + + context 'with an already existing bet' do + it 'throws an exception' do + match = create(:playoff_match, match_scores: [create(:match_score, team: @team)]) + @service.bet! match, @team + match.reload + expect do + @service.bet! match, @team + end.to raise_error(UserServiceError, 'This user already created a bet on this match') + end end end @@ -54,6 +68,7 @@ RSpec.describe UserService do match = create(:group_match) match.match_scores << create(:match_score, team: @team) bet = @service.bet! match, nil + match.reload expect(match.bets).to include(bet) expect(@user.bets).to include(bet) end From 48fc9fab57064615cac8cf1aaa4957ab1bb4c5e6 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 18:19:52 +0200 Subject: [PATCH 10/14] Refactor spec to use let instead of class vars --- spec/services/user_service_spec.rb | 53 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/spec/services/user_service_spec.rb b/spec/services/user_service_spec.rb index b949d07..8ed24fd 100644 --- a/spec/services/user_service_spec.rb +++ b/spec/services/user_service_spec.rb @@ -1,52 +1,60 @@ # frozen_string_literal: true RSpec.describe UserService do - before do - @user = create(:user) - @service = UserService.new @user - @team = create(:team) + let(:user) do + create(:user) + end + + let(:user_service) do + UserService.new(user) + end + + let(:team) do + create(:team) + end + + def build_match(involved_team = team, factory = :playoff_match) + create(factory, match_scores: [create(:match_score, team: involved_team)]) end describe '#bet!' do context 'with an unrelated team' do it 'throws an exception' do expect do - @service.bet! create(:playoff_match), create(:team) + user_service.bet! build_match(create(:team)), team end.to raise_error(UserServiceError, 'The given team is not involved in the given match') end end context 'with an existing team' do let(:match) do - create(:playoff_match, match_scores: [create(:match_score, team: @team)]) + build_match end - before do - @bet = @service.bet! match, @team - @user.reload - match.reload - @team.reload + let!(:bet) do + user_service.bet! match, team end it 'associates the bet with the given team' do - expect(@team.bets).to include(@bet) + expect(team.bets.reload).to include(bet) end it 'associates the bet with the given match' do - expect(match.bets).to include(@bet) + expect(match.bets.reload).to include(bet) end it 'associates the bet with the creating user' do - expect(@user.bets).to include(@bet) + expect(user.bets.reload).to include(bet) end context 'with an already existing bet' do it 'throws an exception' do - match = create(:playoff_match, match_scores: [create(:match_score, team: @team)]) - @service.bet! match, @team + match = build_match + user_service.bet! match, team + user.reload match.reload expect do - @service.bet! match, @team + user_service.bet! match, team end.to raise_error(UserServiceError, 'This user already created a bet on this match') end end @@ -55,22 +63,15 @@ RSpec.describe UserService do context 'without a team' do context 'on a playoff stage' do it 'throws an exception' do - match = create(:playoff_match) - match.match_scores << create(:match_score, team: @team) expect do - @service.bet! match, nil + user_service.bet! build_match, nil end.to raise_error(UserServiceError, 'Betting on no team in a playoff match is not supported') end end context 'on a group stage' do it 'succeeds' do - match = create(:group_match) - match.match_scores << create(:match_score, team: @team) - bet = @service.bet! match, nil - match.reload - expect(match.bets).to include(bet) - expect(@user.bets).to include(bet) + user_service.bet! build_match(team, :group_match), nil end end end From 6d12f889c5a5f7f902e73f6e518da09707b29c90 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 18:29:30 +0200 Subject: [PATCH 11/14] Add Bet serializer --- app/serializers/bet_serializer.rb | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/serializers/bet_serializer.rb diff --git a/app/serializers/bet_serializer.rb b/app/serializers/bet_serializer.rb new file mode 100644 index 0000000..9dc798e --- /dev/null +++ b/app/serializers/bet_serializer.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class BetSerializer < ApplicationSerializer + belongs_to :match + belongs_to :team +end From 175870ab42e12a500849eabc1cf56a221ab19035 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Fri, 14 Jun 2019 19:04:18 +0200 Subject: [PATCH 12/14] Prevent betting on running/finished matches --- app/services/user_service.rb | 2 ++ spec/services/user_service_spec.rb | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/services/user_service.rb b/app/services/user_service.rb index 0050189..990fc0a 100644 --- a/app/services/user_service.rb +++ b/app/services/user_service.rb @@ -19,5 +19,7 @@ class UserService raise UserServiceError, 'The given team is not involved in the given match' unless match.teams.include? team end raise UserServiceError, 'This user already created a bet on this match' if match.bets.map(&:user).include? @user + raise UserServiceError, "Betting is not supported while match is #{match.state}" \ + unless %w[not_ready not_started].include? match.state end end diff --git a/spec/services/user_service_spec.rb b/spec/services/user_service_spec.rb index 8ed24fd..071510d 100644 --- a/spec/services/user_service_spec.rb +++ b/spec/services/user_service_spec.rb @@ -14,7 +14,7 @@ RSpec.describe UserService do end def build_match(involved_team = team, factory = :playoff_match) - create(factory, match_scores: [create(:match_score, team: involved_team)]) + create(factory, state: :not_started, match_scores: [create(:match_score, team: involved_team)]) end describe '#bet!' do @@ -26,6 +26,16 @@ RSpec.describe UserService do end end + context 'on a running match' do + it 'throws an exception' do + match = build_match + match.state = :in_progress + expect do + user_service.bet! match, team + end.to raise_error(UserServiceError, 'Betting is not supported while match is in_progress') + end + end + context 'with an existing team' do let(:match) do build_match From 914cfbd94d79641cee7dc54e53dd92dec0f3ceb8 Mon Sep 17 00:00:00 2001 From: Thor77 Date: Mon, 17 Jun 2019 13:25:05 +0200 Subject: [PATCH 13/14] Reword error on invalid match state --- app/services/user_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/user_service.rb b/app/services/user_service.rb index 990fc0a..f950f0e 100644 --- a/app/services/user_service.rb +++ b/app/services/user_service.rb @@ -19,7 +19,7 @@ class UserService raise UserServiceError, 'The given team is not involved in the given match' unless match.teams.include? team end raise UserServiceError, 'This user already created a bet on this match' if match.bets.map(&:user).include? @user - raise UserServiceError, "Betting is not supported while match is #{match.state}" \ + raise UserServiceError, "Betting is not allowed while match is #{match.state}" \ unless %w[not_ready not_started].include? match.state end end From ce154a821c74df504c976245d22f54be5e56c3df Mon Sep 17 00:00:00 2001 From: Thor77 Date: Mon, 17 Jun 2019 13:38:00 +0200 Subject: [PATCH 14/14] Fix error message not changed in spec --- spec/services/user_service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/services/user_service_spec.rb b/spec/services/user_service_spec.rb index 071510d..b0e8c22 100644 --- a/spec/services/user_service_spec.rb +++ b/spec/services/user_service_spec.rb @@ -32,7 +32,7 @@ RSpec.describe UserService do match.state = :in_progress expect do user_service.bet! match, team - end.to raise_error(UserServiceError, 'Betting is not supported while match is in_progress') + end.to raise_error(UserServiceError, 'Betting is not allowed while match is in_progress') end end