Basic feature spec for game play

This commit is contained in:
Jesse C. Fisher 2015-08-18 04:59:35 -07:00
parent 0fde2e5091
commit 388e8bb2b1
4 changed files with 124 additions and 86 deletions

View File

@ -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

View File

@ -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?

View File

@ -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"

View File

@ -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