194 lines
7.0 KiB
Ruby

require 'rails_helper'
include Warden::Test::Helpers
Warden.test_mode!
feature 'Play a hand', type: :feature, js: true do
# TODO: Implement a player / seat order. scenario 'active player rotates after a valid hand'
## fails without a consistent seat order. Workaround is to create a new game for each scenario
## with before :each instead of :all
## When using :all, the order of @game.player_ids inexplicably changes
before(:each) do
@game = setup_game
end
before(:each) do
@game.reload
@player = @game.current_player
login_as(@player.user, scope: :user)
visit game_path @game
end
after(:each) do
Warden.test_reset!
end
scenario 'first play does not contain lowest card' do
# current_player plays hand not containing lowest card
# expect unsuccessful play message hand MUST contain lowest card
# Play the highest card
@card_to_play = @player.inventory.last
check @card_to_play.to_s
click_button 'Play Hand'
expect(page).to have_content "First hand must contain the lowest card: #{@game.lowest_card.to_s}"
# No play to beat, because play was invalid
expect(@game.play_to_beat).to eq(nil)
end
# Scenario: The first play must be the lowest dealt card
# Given: A new game and I am the holder of the lowest card
# When I play a hand containing the lowest card
# Then I see the hand to beat is this play
scenario 'first play contains lowest card' do
@card_to_play = @game.lowest_card
check @card_to_play.to_s
click_button 'Play Hand'
expect(page).to have_content(/Hand to beat.*#{@game.lowest_card.to_s}/)
end
# Scenario: Played cards leave the players inventory
# Given I am the current player
# When I play a hand
# Then the cards played should leave my inventory
scenario 'played cards are removed from the players inventory' do
# Store initial state of players inventory
@player_inventory = @player.inventory.join(' ')
@card_to_play = @player.inventory.first
check @card_to_play.to_s
click_button 'Play Hand'
# Played hand is rendered
expect(page).to have_content(/Hand to beat.*#{@game.lowest_card.to_s}/)
# Player inventory is rendered without played cards
expect(page).to have_content(@player_inventory.gsub(@card_to_play.to_s,''))
# Player inventory method does not return played cards
expect(@game.current_player.inventory.order(:value).join(' ')).to_not have_content(@card_to_play.to_s)
end
# Scenario: Invalid cards do not leave the players inventory
# Given I am the current player
# When I play an invalid hand
# Then the cards played should not leave my inventory
scenario 'invalid hand played cards are not removed from the players inventory' do
#@game.reload
# Store initial state of players inventory
@player_inventory = @player.inventory.join(' ')
# Create invalid hand
@cards_to_play = []
@cards_to_play << @player.inventory.last
@cards_to_play << @player.inventory.first
# Select each card to play
@cards_to_play.map {|card| check card.to_s }
click_button 'Play Hand'
# Played hand is rendered
expect(page).to have_content("Invalid pair")
# Player inventory is rendered with played cards
expect(page).to have_content(@player_inventory)
# Player inventory method still returns played cards because the play was invalid
expect(@game.current_player.inventory.order(:value).join(' ')).to have_content(@card_to_play.to_s)
end
# Scenario: Current player status updates after successful play
# Given I am the current player
# When I play a hand
# Then the next player becomes the current player
scenario 'active player rotates after a valid hand' do
@next_player_id = @game.next_player_id
@current_player_id = @player.id
@current_player_index = @game.player_ids.index(@game.active_player.id)
@card_to_play = @player.inventory.first
check @card_to_play.to_s
click_button 'Play Hand'
# reload the game object instance
@game.reload
expect(page).to have_content(/Hand to beat.*#{@card_to_play.to_s}/)
# render active player style
#expect(page).to have_content(@game.players.find(@next_player_id).user.email + " My Turn")
# next player is now the active player
expect(@game.active_player_id).to_not eq(@active_player_id)
expect(@game.active_player_id).to eq(@next_player_id)
end
# Scenario: Player can not play an invalid hand on their turn
# Given I am the active player
# When I play an invalid hand
# Then I see an invalid hand message
scenario 'active player can not play an invalid hand' do
#@game.reload
@cards_to_play = [@game.current_player.player_cards.order(:value).first.to_s, @game.current_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
# expect invalid hand message
expect(page).to have_content("Invalid pair.")
# expect inventory to remain unchanged
expect(page).to have_content("#{@game.current_player.inventory.map {|c| c.to_s}.join ' '}")
end
# Scenario: Player can not play a hand when it is not their turn
# Given I am not the active player
# When I play a hand
# Then I see an unsuccessful play message
scenario 'inactive player can not play a hand' do
# create game with players
# not_current_player plays a valid hand
# expect not to be able to submit a play
#@game.reload
@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
# 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
@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
# play a card
@card_to_play = @player.inventory.first
check @card_to_play.to_s
click_button 'Play Hand'
expect(page).to have_content 'Hand to beat'
@game.reload
expect(@game.player_to_beat).to eq @player
# set control player to player to beat
@game.control_player_id = @player.id
@game.save
@game.reload
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