On branch mlucena-poll-comments Changes to be committed: modified: app/views/comments/show.html.erb modified: spec/features/polls/polls_spec.rb
338 lines
11 KiB
Ruby
338 lines
11 KiB
Ruby
require 'rails_helper'
|
|
|
|
feature 'Polls' do
|
|
|
|
context '#index' do
|
|
|
|
scenario 'Polls can be listed' do
|
|
polls = create_list(:poll, 3)
|
|
create(:image, imageable: polls[0])
|
|
create(:image, imageable: polls[1])
|
|
create(:image, imageable: polls[2])
|
|
|
|
visit polls_path
|
|
|
|
polls.each do |poll|
|
|
expect(page).to have_content(poll.name)
|
|
expect(page).to have_css("img[alt='#{poll.image.title}']")
|
|
expect(page).to have_link("Participate in this poll")
|
|
end
|
|
end
|
|
|
|
scenario 'Filtering polls' do
|
|
create(:poll, name: "Current poll")
|
|
create(:poll, :incoming, name: "Incoming poll")
|
|
create(:poll, :expired, name: "Expired poll")
|
|
|
|
visit polls_path
|
|
expect(page).to have_content('Current poll')
|
|
expect(page).to have_link('Participate in this poll')
|
|
expect(page).to_not have_content('Incoming poll')
|
|
expect(page).to_not have_content('Expired poll')
|
|
|
|
visit polls_path(filter: 'incoming')
|
|
expect(page).to_not have_content('Current poll')
|
|
expect(page).to have_content('Incoming poll')
|
|
expect(page).to have_link('More information')
|
|
expect(page).to_not have_content('Expired poll')
|
|
|
|
visit polls_path(filter: 'expired')
|
|
expect(page).to_not have_content('Current poll')
|
|
expect(page).to_not have_content('Incoming poll')
|
|
expect(page).to have_content('Expired poll')
|
|
expect(page).to have_link('Poll ended')
|
|
end
|
|
|
|
scenario "Current filter is properly highlighted" do
|
|
visit polls_path
|
|
expect(page).to_not have_link('Open')
|
|
expect(page).to have_link('Incoming')
|
|
expect(page).to have_link('Expired')
|
|
|
|
visit polls_path(filter: 'incoming')
|
|
expect(page).to have_link('Open')
|
|
expect(page).to_not have_link('Incoming')
|
|
expect(page).to have_link('Expired')
|
|
|
|
visit polls_path(filter: 'expired')
|
|
expect(page).to have_link('Open')
|
|
expect(page).to have_link('Incoming')
|
|
expect(page).to_not have_link('Expired')
|
|
end
|
|
end
|
|
|
|
context 'Show' do
|
|
let(:geozone) { create(:geozone) }
|
|
let(:poll) { create(:poll, summary: "Summary", description: "Description") }
|
|
|
|
scenario 'Lists questions from proposals as well as regular ones' do
|
|
normal_question = create(:poll_question, poll: poll)
|
|
proposal_question = create(:poll_question, poll: poll, proposal: create(:proposal))
|
|
|
|
visit poll_path(poll)
|
|
expect(page).to have_content(poll.name)
|
|
expect(page).to have_content(poll.summary)
|
|
expect(page).to have_content(poll.description)
|
|
|
|
expect(page).to have_content(normal_question.title)
|
|
expect(page).to have_content(proposal_question.title)
|
|
end
|
|
|
|
scenario 'Non-logged in users' do
|
|
question = create(:poll_question, poll: poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Han Solo')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Chewbacca')
|
|
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_content('Han Solo')
|
|
expect(page).to have_content('Chewbacca')
|
|
expect(page).to have_content('You must Sign in or Sign up to participate')
|
|
|
|
expect(page).to_not have_link('Han Solo')
|
|
expect(page).to_not have_link('Chewbacca')
|
|
end
|
|
|
|
scenario 'Level 1 users' do
|
|
poll.update(geozone_restricted: true)
|
|
poll.geozones << geozone
|
|
|
|
question = create(:poll_question, poll: poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Han Solo')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Chewbacca')
|
|
|
|
login_as(create(:user, geozone: geozone))
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_content('You must verify your account in order to answer')
|
|
|
|
expect(page).to have_content('Han Solo')
|
|
expect(page).to have_content('Chewbacca')
|
|
|
|
expect(page).to_not have_link('Han Solo')
|
|
expect(page).to_not have_link('Chewbacca')
|
|
end
|
|
|
|
scenario 'Level 2 users in an incoming poll' do
|
|
incoming_poll = create(:poll, :incoming, geozone_restricted: true)
|
|
incoming_poll.geozones << geozone
|
|
|
|
question = create(:poll_question, poll: incoming_poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Rey')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Finn')
|
|
|
|
login_as(create(:user, :level_two, geozone: geozone))
|
|
|
|
visit poll_path(incoming_poll)
|
|
|
|
expect(page).to have_content('Rey')
|
|
expect(page).to have_content('Finn')
|
|
expect(page).to_not have_link('Rey')
|
|
expect(page).to_not have_link('Finn')
|
|
|
|
expect(page).to have_content('This poll has not yet started')
|
|
end
|
|
|
|
scenario 'Level 2 users in an expired poll' do
|
|
expired_poll = create(:poll, :expired, geozone_restricted: true)
|
|
expired_poll.geozones << geozone
|
|
|
|
question = create(:poll_question, poll: expired_poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Luke')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Leia')
|
|
|
|
login_as(create(:user, :level_two, geozone: geozone))
|
|
|
|
visit poll_path(expired_poll)
|
|
|
|
expect(page).to have_content('Luke')
|
|
expect(page).to have_content('Leia')
|
|
expect(page).to_not have_link('Luke')
|
|
expect(page).to_not have_link('Leia')
|
|
|
|
expect(page).to have_content('This poll has finished')
|
|
end
|
|
|
|
scenario 'Level 2 users in a poll with questions for a geozone which is not theirs' do
|
|
poll.update(geozone_restricted: true)
|
|
poll.geozones << create(:geozone)
|
|
|
|
question = create(:poll_question, poll: poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Vader')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Palpatine')
|
|
|
|
login_as(create(:user, :level_two))
|
|
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_content('Vader')
|
|
expect(page).to have_content('Palpatine')
|
|
expect(page).to_not have_link('Vader')
|
|
expect(page).to_not have_link('Palpatine')
|
|
end
|
|
|
|
scenario 'Level 2 users reading a same-geozone poll' do
|
|
poll.update(geozone_restricted: true)
|
|
poll.geozones << geozone
|
|
|
|
question = create(:poll_question, poll: poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Han Solo')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Chewbacca')
|
|
|
|
login_as(create(:user, :level_two, geozone: geozone))
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_link('Han Solo')
|
|
expect(page).to have_link('Chewbacca')
|
|
end
|
|
|
|
scenario 'Level 2 users reading a all-geozones poll' do
|
|
question = create(:poll_question, poll: poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Han Solo')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Chewbacca')
|
|
|
|
login_as(create(:user, :level_two))
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_link('Han Solo')
|
|
expect(page).to have_link('Chewbacca')
|
|
end
|
|
|
|
scenario 'Level 2 users who have already answered' do
|
|
question = create(:poll_question, poll: poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Han Solo')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Chewbacca')
|
|
user = create(:user, :level_two)
|
|
create(:poll_answer, question: question, author: user, answer: 'Chewbacca')
|
|
|
|
login_as user
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_link('Han Solo')
|
|
expect(page).to_not have_link('Chewbacca')
|
|
expect(page).to have_content('Chewbacca')
|
|
end
|
|
|
|
scenario 'Level 2 users answering', :js do
|
|
poll.update(geozone_restricted: true)
|
|
poll.geozones << geozone
|
|
|
|
question = create(:poll_question, poll: poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Han Solo')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Chewbacca')
|
|
|
|
user = create(:user, :level_two, geozone: geozone)
|
|
|
|
login_as user
|
|
visit poll_path(poll)
|
|
|
|
click_link 'Han Solo'
|
|
|
|
expect(page).to_not have_link('Han Solo')
|
|
expect(page).to have_link('Chewbacca')
|
|
end
|
|
|
|
scenario 'Level 2 users changing answer', :js do
|
|
poll.update(geozone_restricted: true)
|
|
poll.geozones << geozone
|
|
|
|
question = create(:poll_question, poll: poll)
|
|
answer1 = create(:poll_question_answer, question: question, title: 'Han Solo')
|
|
answer2 = create(:poll_question_answer, question: question, title: 'Chewbacca')
|
|
|
|
user = create(:user, :level_two, geozone: geozone)
|
|
|
|
login_as user
|
|
visit poll_path(poll)
|
|
|
|
click_link 'Han Solo'
|
|
|
|
expect(page).to_not have_link('Han Solo')
|
|
expect(page).to have_link('Chewbacca')
|
|
|
|
click_link 'Chewbacca'
|
|
|
|
expect(page).to_not have_link('Chewbacca')
|
|
expect(page).to have_link('Han Solo')
|
|
end
|
|
|
|
scenario 'User can write comments' do
|
|
create(:comment, commentable: poll)
|
|
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_css('.comment', count: 1)
|
|
|
|
comment = Comment.last
|
|
within first('.comment') do
|
|
expect(page).to have_content comment.user.name
|
|
expect(page).to have_content I18n.l(comment.created_at, format: :datetime)
|
|
expect(page).to have_content comment.body
|
|
end
|
|
end
|
|
|
|
scenario 'user b can access to comments from user a' do
|
|
oliver = create(:user, username: 'Oliver Atom')
|
|
benji = create(:user, username: 'Benji Prince')
|
|
create(:comment, commentable: poll, user: oliver)
|
|
|
|
login_as(benji)
|
|
visit poll_path(poll)
|
|
|
|
expect(page).to have_content oliver.username
|
|
end
|
|
|
|
scenario 'user b can reply to comments from user a', :js do
|
|
koji = create(:user, username: 'Koji Kabuto')
|
|
sayaka = create(:user, username: 'Sayaka')
|
|
comment = create(:comment, commentable: poll, user: koji)
|
|
|
|
login_as(sayaka)
|
|
visit poll_path(poll)
|
|
|
|
click_link "Reply"
|
|
|
|
within "#js-comment-form-comment_#{comment.id}" do
|
|
fill_in "comment-body-comment_#{comment.id}", with: 'MAZINGER!!.'
|
|
click_button 'Publish reply'
|
|
end
|
|
|
|
within "#comment_#{comment.id}" do
|
|
expect(page).to have_content 'MAZINGER!!.'
|
|
end
|
|
|
|
expect(page).to_not have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
|
|
end
|
|
|
|
scenario 'user can upvote a comment', :js do
|
|
goku = create(:user, username: 'Goku')
|
|
vegeta = create(:user, username: 'Vegeta')
|
|
comment = create(:comment, commentable: poll, user: goku)
|
|
|
|
login_as(vegeta)
|
|
visit poll_path(poll)
|
|
|
|
within("#comment_#{comment.id}_votes") do
|
|
find('.in_favor a').click
|
|
|
|
expect(page).to have_content "1 vote"
|
|
end
|
|
end
|
|
|
|
scenario 'user can downvote a comment', :js do
|
|
doraemon = create(:user, username: 'Doraemon')
|
|
nobita = create(:user, username: 'Nobi Nobita')
|
|
comment = create(:comment, commentable: poll, user: doraemon)
|
|
|
|
login_as(nobita)
|
|
visit poll_path(poll)
|
|
|
|
within("#comment_#{comment.id}_votes") do
|
|
find('.against a').click
|
|
|
|
expect(page).to have_content "1 vote"
|
|
end
|
|
end
|
|
end
|
|
end
|