Basic feature spec for game play
This commit is contained in:
parent
0fde2e5091
commit
388e8bb2b1
@ -24,39 +24,45 @@ class GamesController < ApplicationController
|
|||||||
# TODO: validate player's turn, current_user == @game.current_player.user
|
# TODO: validate player's turn, current_user == @game.current_player.user
|
||||||
# TODO: move this logic out of controller maybe to model(s)
|
# TODO: move this logic out of controller maybe to model(s)
|
||||||
|
|
||||||
|
if params[:game]
|
||||||
|
if params[:game][:hand_type] == 'pass'
|
||||||
|
@game.set_active_player 'next'
|
||||||
|
flash[:notice] = 'Successfully passed.'
|
||||||
|
@game.save
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# If cards are played
|
# If cards are played
|
||||||
if params[:player_card_ids]
|
if params[:player_card_ids]
|
||||||
@cards_to_play = @game.current_player.player_cards.order(:value).find(params[:player_card_ids])
|
@cards_to_play = @game.current_player.player_cards.order(:value).find(params[:player_card_ids])
|
||||||
else
|
# Instantiate the play
|
||||||
# No cards are played
|
@play = @game.current_player.plays.new
|
||||||
@cards_to_play = []
|
@play.game_id = @game.id
|
||||||
end
|
@play.player_cards << @cards_to_play
|
||||||
|
if @play.save
|
||||||
# Instantiate the play
|
# TODO: Ensure active player only changes when valid hand is played
|
||||||
@play = @game.current_player.plays.new
|
@game.set_active_player 'next'
|
||||||
@play.game_id = @game.id
|
@game.save
|
||||||
@play.player_cards << @cards_to_play
|
else
|
||||||
@play.save
|
# If play is invalid, remove the cards from the play
|
||||||
|
#@play.player_cards.map {|card| card.play_id = nil; card.save}
|
||||||
#@cards_to_play.each do |card|
|
# Delete play
|
||||||
#@play.player_cards << card
|
#@play.destroy
|
||||||
#end
|
end
|
||||||
|
|
||||||
if @play.save
|
|
||||||
# TODO: Ensure active player only changes when valid hand is played
|
|
||||||
@game.set_active_player 'next'
|
|
||||||
@game.save
|
|
||||||
else
|
|
||||||
# If play is invalid, remove the cards from the play
|
|
||||||
#@play.player_cards.map {|card| card.play_id = nil; card.save}
|
|
||||||
# Delete play
|
|
||||||
#@play.destroy
|
|
||||||
end
|
|
||||||
|
|
||||||
#@play.save
|
#@play.save
|
||||||
@play.errors.messages.each do |key, msg|
|
@play.errors.messages.each do |key, msg|
|
||||||
flash[key] = msg.join
|
flash[key] = msg.join
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
# No cards are played
|
||||||
|
@cards_to_play = []
|
||||||
|
end
|
||||||
|
|
||||||
|
#@cards_to_play.each do |card|
|
||||||
|
#@play.player_cards << card
|
||||||
|
#end
|
||||||
|
|
||||||
redirect_to(@game)
|
redirect_to(@game)
|
||||||
|
|
||||||
# TODO: add current_hand logic
|
# TODO: add current_hand logic
|
||||||
|
|||||||
@ -39,7 +39,7 @@ class Play < ActiveRecord::Base
|
|||||||
|
|
||||||
if has_player_cards
|
if has_player_cards
|
||||||
|
|
||||||
@truths << !hand_type.empty?
|
@truths << !hand_type.nil?
|
||||||
|
|
||||||
if first_play?
|
if first_play?
|
||||||
@truths << contains_lowest_card?
|
@truths << contains_lowest_card?
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
-# TODO better logic, not in view
|
-# TODO better logic, not in view
|
||||||
- unless @game.status == nil
|
- unless @game.status == nil
|
||||||
.table
|
.table
|
||||||
- if @game.play_to_beat
|
- if @game.play_to_beat && @game.player_to_beat.user != current_user
|
||||||
- if @game.play_to_beat.play
|
- if @game.play_to_beat.play
|
||||||
%h1
|
%h1
|
||||||
Hand to beat
|
Hand to beat
|
||||||
@ -70,4 +70,9 @@
|
|||||||
// Provide id of current game
|
// Provide id of current game
|
||||||
-#= f.hidden_field :id
|
-#= f.hidden_field :id
|
||||||
= f.submit "Play Hand"
|
= f.submit "Play Hand"
|
||||||
|
= form_for @game, :url => play_hand_game_path(@game) do |f|
|
||||||
|
// Provide id of current game
|
||||||
|
-#= f.hidden_field :id
|
||||||
|
= f.hidden_field :hand_type, value: 'pass'
|
||||||
|
= f.submit "Pass"
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,13 @@ include Warden::Test::Helpers
|
|||||||
Warden.test_mode!
|
Warden.test_mode!
|
||||||
|
|
||||||
feature 'Play a hand', type: :feature do
|
feature 'Play a hand', type: :feature do
|
||||||
|
before(:all) do
|
||||||
|
@game = setup_game
|
||||||
|
@player = @game.current_player
|
||||||
|
login_as(@player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
|
end
|
||||||
|
|
||||||
after(:each) do
|
after(:each) do
|
||||||
Warden.test_reset!
|
Warden.test_reset!
|
||||||
end
|
end
|
||||||
@ -17,28 +24,24 @@ feature 'Play a hand', type: :feature do
|
|||||||
# expect successful play message
|
# expect successful play message
|
||||||
|
|
||||||
# TODO: extract game setup to a factory
|
# TODO: extract game setup to a factory
|
||||||
game = setup_game
|
|
||||||
login_as(game.current_player.user, scope: :user)
|
|
||||||
visit game_path game
|
|
||||||
# Click the lowest card checkbox
|
# Click the lowest card checkbox
|
||||||
@card_to_play = game.lowest_card
|
@card_to_play = @game.lowest_card
|
||||||
check @card_to_play.to_s
|
check @card_to_play.to_s
|
||||||
click_button 'Play Hand'
|
click_button 'Play Hand'
|
||||||
expect(page).to have_content('Played ' + game.lowest_card.to_s)
|
expect(page).to have_content('Played ' + @game.lowest_card.to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'first play does not contain lowest card' do
|
scenario 'first play does not contain lowest card' do
|
||||||
# current_player plays hand not containing lowest card
|
# current_player plays hand not containing lowest card
|
||||||
# expect unsuccessful play message hand MUST contain lowest card
|
# expect unsuccessful play message hand MUST contain lowest card
|
||||||
game = setup_game
|
|
||||||
login_as(game.current_player.user, scope: :user)
|
|
||||||
visit game_path game
|
|
||||||
# Click the lowest card checkbox
|
# Click the lowest card checkbox
|
||||||
@card_to_play = game.current_player.player_cards.order(:value).last
|
login_as(@game.current_player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
|
@card_to_play = @game.current_player.player_cards.order(:value).last
|
||||||
check @card_to_play.to_s
|
check @card_to_play.to_s
|
||||||
click_button 'Play Hand'
|
click_button 'Play Hand'
|
||||||
expect(page).to have_content "First hand must contain the lowest card: #{game.lowest_card.to_s}"
|
expect(page).to have_content "First hand must contain the lowest card: #{@game.lowest_card.to_s}"
|
||||||
expect(game.play_to_beat).to eq(nil)
|
expect(@game.play_to_beat).to eq(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Scenario: Played cards leave the players inventory
|
# Scenario: Played cards leave the players inventory
|
||||||
@ -46,18 +49,16 @@ feature 'Play a hand', type: :feature do
|
|||||||
# When I play a hand
|
# When I play a hand
|
||||||
# Then the cards played should leave my inventory
|
# Then the cards played should leave my inventory
|
||||||
scenario 'played cards are removed from the players inventory' do
|
scenario 'played cards are removed from the players inventory' do
|
||||||
game = setup_game
|
|
||||||
# Store initial state of players inventory
|
# Store initial state of players inventory
|
||||||
@player = game.current_player
|
login_as(@game.current_player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
@player_inventory = @player.player_cards.order(:value).join(' ')
|
@player_inventory = @player.player_cards.order(:value).join(' ')
|
||||||
@player_inventory = @player.inventory.order(:value).join(' ')
|
@player_inventory = @player.inventory.order(:value).join(' ')
|
||||||
login_as(game.current_player.user, scope: :user)
|
@card_to_play = @game.current_player.player_cards.order(:value).first
|
||||||
visit game_path game
|
|
||||||
@card_to_play = game.current_player.player_cards.order(:value).first
|
|
||||||
check @card_to_play.to_s
|
check @card_to_play.to_s
|
||||||
click_button 'Play Hand'
|
click_button 'Play Hand'
|
||||||
# Played hand is rendered
|
# Played hand is rendered
|
||||||
expect(page).to have_content('Played ' + game.lowest_card.to_s)
|
expect(page).to have_content('Played ' + @game.lowest_card.to_s)
|
||||||
# Player inventory is rendered without played cards
|
# Player inventory is rendered without played cards
|
||||||
expect(page).to have_content(@player_inventory.gsub(@card_to_play.to_s,''))
|
expect(page).to have_content(@player_inventory.gsub(@card_to_play.to_s,''))
|
||||||
# Player inventory method does not return played cards
|
# Player inventory method does not return played cards
|
||||||
@ -69,37 +70,33 @@ feature 'Play a hand', type: :feature do
|
|||||||
# When I play an invalid hand
|
# When I play an invalid hand
|
||||||
# Then the cards played should not leave my inventory
|
# Then the cards played should not leave my inventory
|
||||||
scenario 'invalid hand played cards are not removed from the players inventory' do
|
scenario 'invalid hand played cards are not removed from the players inventory' do
|
||||||
game = setup_game
|
|
||||||
# Store initial state of players inventory
|
# Store initial state of players inventory
|
||||||
@player = game.current_player
|
|
||||||
@player_inventory = @player.player_cards.order(:value).join(' ')
|
@player_inventory = @player.player_cards.order(:value).join(' ')
|
||||||
@player_inventory = @player.inventory.order(:value).join(' ')
|
@player_inventory = @player.inventory.order(:value).join(' ')
|
||||||
login_as(game.current_player.user, scope: :user)
|
login_as(@game.current_player.user, scope: :user)
|
||||||
visit game_path game
|
visit game_path @game
|
||||||
# Play invalid hand
|
# Play invalid hand
|
||||||
@card_to_play = game.current_player.player_cards.order(:value).last
|
@card_to_play = @game.current_player.player_cards.order(:value).last
|
||||||
check @card_to_play.to_s
|
check @card_to_play.to_s
|
||||||
click_button 'Play Hand'
|
click_button 'Play Hand'
|
||||||
# Played hand is rendered
|
# Played hand is rendered
|
||||||
expect(page).to have_content("First hand must contain the lowest card: #{game.lowest_card.to_s}")
|
expect(page).to have_content("First hand must contain the lowest card: #{@game.lowest_card.to_s}")
|
||||||
# Player inventory is rendered with played cards
|
# Player inventory is rendered with played cards
|
||||||
expect(page).to have_content(@player_inventory)
|
expect(page).to have_content(@player_inventory)
|
||||||
# Player inventory method does return played cards
|
# Player inventory method does return played cards
|
||||||
expect(@player.inventory.order(:value).join(' ')).to have_content(@card_to_play.to_s)
|
expect(@player.inventory.order(:value).join(' ')).to have_content(@card_to_play.to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# Scenario: Current player status updates after successful play
|
# Scenario: Current player status updates after successful play
|
||||||
# Given I am the current player
|
# Given I am the current player
|
||||||
# When I play a hand
|
# When I play a hand
|
||||||
# Then the next player becomes the current player
|
# Then the next player becomes the current player
|
||||||
scenario 'active player rotates after a valid hand' do
|
scenario 'active player rotates after a valid hand' do
|
||||||
@game = setup_game
|
login_as(@player.user, scope: :user)
|
||||||
login_as(@game.active_player.user, scope: :user)
|
visit game_path @game
|
||||||
@next_player_id = @game.next_player_id
|
@next_player_id = @game.next_player_id
|
||||||
@active_player_id = @game.active_player.id
|
@active_player_id = @game.active_player.id
|
||||||
@active_player_index = @game.players.index(@game.active_player)
|
@active_player_index = @game.players.index(@game.active_player)
|
||||||
visit game_path @game
|
|
||||||
@card_to_play = @game.active_player.player_cards.order(:value).first
|
@card_to_play = @game.active_player.player_cards.order(:value).first
|
||||||
check @card_to_play.to_s
|
check @card_to_play.to_s
|
||||||
click_button 'Play Hand'
|
click_button 'Play Hand'
|
||||||
@ -115,42 +112,23 @@ feature 'Play a hand', type: :feature do
|
|||||||
expect(@game.active_player_id).to eq(@next_player_id)
|
expect(@game.active_player_id).to eq(@next_player_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Scenario: Player can play a valid hand on their turn
|
|
||||||
# Given I am the active player
|
|
||||||
# And the last played card was a single card
|
|
||||||
# When I play a valid hand of one higher card
|
|
||||||
# Then I see a successful play message
|
|
||||||
scenario 'active player can play a valid hand' do
|
|
||||||
skip 'to be implemented'
|
|
||||||
# create game with players
|
|
||||||
game = setup_game
|
|
||||||
# current_player plays the lowest card
|
|
||||||
login_as(game.current_player.user, scope: :user)
|
|
||||||
visit game_path game
|
|
||||||
@card_to_play = game.lowest_card
|
|
||||||
check @card_to_play.to_s
|
|
||||||
click_button 'Play Hand'
|
|
||||||
expect(page).to have_content('Played ' + game.lowest_card.to_s)
|
|
||||||
# next player plays a valid hand
|
|
||||||
login_as(game.current_player.user, scope: :user)
|
|
||||||
visit game_path game
|
|
||||||
expect(page).to have_content('Played ' + game.lowest_card.to_s)
|
|
||||||
@card_to_play = game.current_player.player_cards.order(:value).first
|
|
||||||
check @card_to_play.to_s
|
|
||||||
click_button 'Play Hand'
|
|
||||||
expect(page).to have_content('Played ' + @card_to_play.to_s)
|
|
||||||
# expect successful play message
|
|
||||||
end
|
|
||||||
|
|
||||||
# Scenario: Player can not play an invalid hand on their turn
|
# Scenario: Player can not play an invalid hand on their turn
|
||||||
# Given I am the active player
|
# Given I am the active player
|
||||||
# When I play an invalid hand
|
# When I play an invalid hand
|
||||||
# Then I see an invalid hand message
|
# Then I see an invalid hand message
|
||||||
scenario 'active player can play a valid hand' do
|
scenario 'active player can not play an invalid hand' do
|
||||||
# create game with players
|
login_as(@player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
|
@cards_to_play = [@player.player_cards.order(:value).first.to_s, @player.player_cards.order(:value).last.to_s]
|
||||||
|
@cards_to_play.each do |card|
|
||||||
|
check card
|
||||||
|
end
|
||||||
|
click_button 'Play Hand'
|
||||||
# current_player plays an invalid hand
|
# current_player plays an invalid hand
|
||||||
# expect invalid hand message
|
# expect invalid hand message
|
||||||
skip 'to be implemented'
|
expect(page).to have_content("Invalid pair.")
|
||||||
|
# expect inventory to remain unchanged
|
||||||
|
expect(page).to have_content("#{@player.inventory.map {|c| c.to_s}.join ' '}")
|
||||||
end
|
end
|
||||||
|
|
||||||
# Scenario: Player can not play a hand when it is not their turn
|
# Scenario: Player can not play a hand when it is not their turn
|
||||||
@ -160,7 +138,56 @@ feature 'Play a hand', type: :feature do
|
|||||||
scenario 'inactive player can not play a hand' do
|
scenario 'inactive player can not play a hand' do
|
||||||
# create game with players
|
# create game with players
|
||||||
# not_current_player plays a valid hand
|
# not_current_player plays a valid hand
|
||||||
# expect unsuccessful play message
|
# expect not to be able to submit a play
|
||||||
skip 'to be implemented'
|
@inactive_player = @game.players.where.not(id: @game.current_player_id).first
|
||||||
|
login_as(@inactive_player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
|
expect(page).to_not have_button 'Play Hand'
|
||||||
|
# TODO: Submit a POST request
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Scenario: Player can pass when it is their turn
|
||||||
|
# Given I am the active player
|
||||||
|
# When I pass
|
||||||
|
# Then I see an successful pass message
|
||||||
|
scenario 'active player can pass' do
|
||||||
|
login_as(@player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
|
@current_user = @game.current_player
|
||||||
|
click_button 'Pass'
|
||||||
|
expect(page).to have_content 'Successfully passed.'
|
||||||
|
# Expect active player should rotate
|
||||||
|
expect(page).to_not have_button 'Play Hand'
|
||||||
|
@new_current_player = @game.current_player
|
||||||
|
expect(@game.current_player).to_not eq(@current_player)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Scenario: Player can play any hand when they are the player to beat
|
||||||
|
# Given I am the active player
|
||||||
|
# And I am the player to beat
|
||||||
|
# Then I see an open table
|
||||||
|
scenario 'active player to beat has open table' do
|
||||||
|
login_as(@player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
|
@card_to_play = @game.lowest_card
|
||||||
|
check @card_to_play.to_s
|
||||||
|
click_button 'Play Hand'
|
||||||
|
@game.reload
|
||||||
|
|
||||||
|
3.times do
|
||||||
|
login_as(@game.active_player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
|
click_button 'Pass'
|
||||||
|
expect(page).to_not have_button 'Play Hand'
|
||||||
|
@game.reload
|
||||||
|
end
|
||||||
|
|
||||||
|
login_as(@game.active_player.user, scope: :user)
|
||||||
|
visit game_path @game
|
||||||
|
# Expect active player should rotate
|
||||||
|
expect(page).to have_button 'Play Hand'
|
||||||
|
#expect(@game.player_to_beat).to eq(@game.active_player)
|
||||||
|
expect(page).to have_content 'Open table'
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user