245 lines
9.1 KiB
Ruby
245 lines
9.1 KiB
Ruby
require 'rails_helper'
|
|
include Warden::Test::Helpers
|
|
Warden.test_mode!
|
|
|
|
feature 'Play a hand', type: :feature, js: true do
|
|
before(:each) do
|
|
@game = setup_game
|
|
@game.reload
|
|
@player = @game.controlling_player
|
|
signin(@player.user.email,'password')
|
|
#login_as(@player.user, scope: :user)
|
|
visit game_path @game
|
|
end
|
|
|
|
after(:each) do
|
|
Warden.test_reset!
|
|
end
|
|
|
|
scenario 'player only sees own cards' do
|
|
#expect to see own cards
|
|
#expect not to see other players cards
|
|
end
|
|
|
|
scenario 'player only sees own controls' do
|
|
#expect to see own controls
|
|
#expect not to see other players controls
|
|
end
|
|
|
|
scenario 'first play does not contain lowest card' do
|
|
# controlling_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
|
|
find("[data-card-name='#{@card_to_play.to_s}'] ~ img").click
|
|
#click_button 'Play Hand'
|
|
click_button "play_hand_button_#{@player.id}"
|
|
|
|
# No play to beat, because play was invalid
|
|
expect(@game.play_to_beat).to eq(nil)
|
|
# TODO: This scenario is causing other scenarios to fail unless we slow down here
|
|
sleep 1
|
|
# TODO: Flash messages
|
|
#expect(page).to have_content "First hand must contain the lowest card: #{@game.lowest_card.to_s}"
|
|
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
|
|
find("[data-card-name='#{@card_to_play.to_s}'] ~ img").click
|
|
#click_button 'Play Hand'
|
|
click_button "play_hand_button_#{@player.id}"
|
|
#expect(page).to have_content(/Hand to beat.*#{@game.lowest_card.to_s}/)
|
|
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
|
|
find("[data-card-name='#{@card_to_play.to_s}'] ~ img").click
|
|
#click_button 'Play Hand'
|
|
click_button "play_hand_button_#{@player.id}"
|
|
#wait_for_ajax
|
|
# 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.find("#player_controls_#{@player.id}")).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
|
|
@initial_player_inventory = @player.inventory
|
|
|
|
# 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| find("[data-card-name='#{card.to_s}'] ~ img").click }
|
|
#click_button 'Play Hand'
|
|
click_button "play_hand_button_#{@player.id}"
|
|
|
|
# Played hand is rendered
|
|
# TODO: Flash messages
|
|
#expect(page).to have_content("Invalid pair")
|
|
# Player inventory is rendered with played cards
|
|
@initial_player_inventory.each do |card|
|
|
expect(page).to have_selector("[data-card-name='#{card.to_s}'] ~ img")
|
|
end
|
|
# TODO: This scenario is causing other scenarios to fail unless we slow down here
|
|
sleep 1
|
|
# Player inventory method still returns played cards because the play was invalid
|
|
# TODO: Flash messages
|
|
#expect(@game.controlling_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
|
|
@game.reload
|
|
@next_player_id = @game.next_player_id
|
|
@controlling_player_id = @player.id
|
|
@controlling_player_index = @game.player_ids.index(@game.controlling_player_id)
|
|
|
|
@card_to_play = @player.inventory.first
|
|
find("[data-card-name='#{@card_to_play.to_s}'] ~ img").click
|
|
#click_button 'Play Hand'
|
|
click_button "play_hand_button_#{@player.id}"
|
|
|
|
# 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.controlling_player_id).to_not eq(@controlling_player_id)
|
|
#expect(@game.controlling_player_id).to eq(@next_player_id)
|
|
expect(page).to have_selector("#player-#{@next_player_id}.has-control")
|
|
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.controlling_player.player_cards.order(:value).first.to_s, @game.controlling_player.player_cards.order(:value).last.to_s]
|
|
@cards_to_play.each do |card|
|
|
find("[data-card-name='#{card.to_s}'] ~ img").click
|
|
end
|
|
#click_button 'Play Hand'
|
|
click_button "play_hand_button_#{@player.id}"
|
|
# controlling_player plays an invalid hand
|
|
# expect invalid hand message
|
|
#:TODO: Flash messages
|
|
#expect(page).to have_content("Invalid pair.")
|
|
# expect inventory to remain unchanged
|
|
@game.controlling_player.inventory.each do |card|
|
|
expect(page).to have_selector("[data-card-name='#{card.to_s}'] ~ img")
|
|
end
|
|
# TODO: This scenario is causing other scenarios to fail unless we slow down here
|
|
sleep 1
|
|
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 'non-controlling player can not play a hand' do
|
|
# create game with players
|
|
# not_controlling_player plays a valid hand
|
|
# expect not to be able to submit a play
|
|
@non_controlling_player = @game.players.where.not(id: @game.controlling_player_id).first
|
|
login_as(@non_controlling_player.user, scope: :user)
|
|
visit game_path @game
|
|
#expect(page).to_not have_button 'Play Hand'
|
|
elem = page.find "input#play_hand_button_#{@non_controlling_player.id}"
|
|
expect(elem.disabled?).to be true
|
|
# 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.controlling_player
|
|
#click_button 'Pass'
|
|
click_button "pass_hand_button_#{@player.id}"
|
|
## TODO: Flash messages
|
|
#expect(page).to have_content 'Successfully passed.'
|
|
# Expect active player should rotate
|
|
#expect(page).to_not have_button 'Play Hand'
|
|
elem = page.find "input#play_hand_button_#{@player.id}"
|
|
expect(elem.disabled?).to be false
|
|
|
|
@new_controlling_player = @game.controlling_player
|
|
expect(@game.controlling_player).to_not eq(@controlling_player)
|
|
# TODO: This scenario is causing other scenarios to fail unless we slow down here
|
|
sleep 1
|
|
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
|
|
@game.reload
|
|
@player = @game.controlling_player
|
|
@card_to_play = @player.inventory.first
|
|
find("[data-card-name='#{@card_to_play.to_s}'] ~ img").click
|
|
#click_button 'Play Hand'
|
|
click_button "play_hand_button_#{@player.id}"
|
|
|
|
expect(page).to have_content "Hand to beat: #{@card_to_play.to_s}"
|
|
@game.reload
|
|
expect(@game.player_to_beat).to eq @player
|
|
|
|
# set control player to player to beat
|
|
@game.controlling_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(page).to have_button "play_hand_button_#{@player.id}"
|
|
#expect(@game.player_to_beat).to eq(@game.controlling_player)
|
|
expect(page).to have_content 'Hand to beat: None'
|
|
end
|
|
|
|
# Scenario: Player wins the game
|
|
# Given I am the active player
|
|
# And I play my last card(s)
|
|
# And I am the first player to do so
|
|
# Then I see a 1st place winner message
|
|
scenario 'first place winner' do
|
|
# play last card
|
|
pending "TBD"
|
|
expect(@player.inventory.count).to eq 0
|
|
expect(page).to have_content "Winner: #{@player.display_name}"
|
|
end
|
|
|
|
|
|
end
|