diff --git a/app/views/polls/_warnings.html.erb b/app/views/polls/_warnings.html.erb
new file mode 100644
index 000000000..b6b44fbc0
--- /dev/null
+++ b/app/views/polls/_warnings.html.erb
@@ -0,0 +1,28 @@
+<% if current_user.nil? %>
+
+
+ <%= t("polls.show.cant_answer_not_logged_in",
+ signin: link_to(t("polls.show.signin"), new_user_session_path, class: "probe-message"),
+ signup: link_to(t("polls.show.signup"), new_user_registration_path, class: "probe-message")).html_safe %>
+
+
+<% elsif current_user.unverified? %>
+
+
+ <%= t('polls.show.cant_answer_verify_html',
+ verify_link: link_to(t('polls.show.verify_link'), verification_path)) %>
+
+
+<% elsif @poll.incoming? %>
+
+
+ <%= t('polls.show.cant_answer_incoming') %>
+
+
+<% elsif @poll.expired? %>
+
+
+ <%= t('polls.show.cant_answer_expired') %>
+
+
+<% end %>
diff --git a/app/views/polls/show.html.erb b/app/views/polls/show.html.erb
index 71870cedf..90965e739 100644
--- a/app/views/polls/show.html.erb
+++ b/app/views/polls/show.html.erb
@@ -1,10 +1,23 @@
<%= @poll.name %>
+<%= render 'warnings' %>
+
<% @questions.each do |question| %>
<%= question.title %>
+
<%= question.valid_answers.each do |valid_answer| %>
- <%= link_to valid_answer %>
+ <% if can? :answer, @poll %>
+ <%= link_to valid_answer %>
+ <% else %>
+
<%= valid_answer %>
+ <% end %>
+ <% end %>
+
+ <% if false #wrong geozone %>
+
+ <%= t('polls.show.cant_answer_wrong_geozone') %>
+
<% end %>
<% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 9230ecbf8..d139b724b 100755
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -375,6 +375,16 @@ en:
update:
form:
submit_button: Save changes
+ polls:
+ show:
+ cant_answer_not_logged_in: "You must %{signin} or %{signup} to participate."
+ signin: Sign in
+ signup: Sign up
+ cant_answer_verify_html: "You must %{verify_link} in order to answer."
+ verify_link: "verify your account"
+ cant_answer_incoming: "This poll has not yet started."
+ cant_answer_expired: "This poll has finished."
+ cant_answer_wrong_geozone: "This enquiry is not available on your geozone."
proposal_ballots:
title: "Votings"
description_html: "The following citizen proposals that have reached the required supports and will be voted."
diff --git a/spec/features/polls_spec.rb b/spec/features/polls_spec.rb
index f206407d2..a226f8a65 100644
--- a/spec/features/polls_spec.rb
+++ b/spec/features/polls_spec.rb
@@ -3,31 +3,173 @@ require 'rails_helper'
feature 'Polls' do
- scenario 'Polls can be listed' do
- polls = create_list(:poll, 3)
+ context '#index' do
- visit polls_path
+ scenario 'Polls can be listed' do
+ polls = create_list(:poll, 3)
- polls.each do |poll|
- expect(page).to have_link(poll.name)
- end
- end
+ visit polls_path
- scenario 'Polls can be seen' do
- poll = create(:poll)
- questions = create_list(:poll_question, 5, poll: poll)
-
- visit poll_path(poll)
- expect(page).to have_content(poll.name)
-
- questions.each do |question|
- within("#poll_question_#{question.id}") do
- expect(page).to have_content(question.title)
- question.valid_answers.each do |answer|
- expect(page).to have_link(answer)
- end
+ polls.each do |poll|
+ expect(page).to have_link(poll.name)
end
end
+
+ xscenario 'Filtering enquiries' do
+ create(:poll_question, poll: poll, title: "Open question")
+ create(:poll_question, :incoming, poll: poll, title: "Incoming question")
+ create(:poll_question, :expired, poll: poll, title: "Expired question")
+
+ visit enquiries_path
+ expect(page).to have_content('Open question')
+ expect(page).to_not have_content('Incoming question')
+ expect(page).to_not have_content('Expired question')
+
+ visit enquiries_path(filter: 'incoming')
+ expect(page).to_not have_content('Open question')
+ expect(page).to have_content('Incoming question')
+ expect(page).to_not have_content('Expired question')
+
+ visit enquiries_path(filter: 'expired')
+ expect(page).to_not have_content('Open question')
+ expect(page).to_not have_content('Incoming question')
+ expect(page).to have_content('Expired question')
+ end
+
+ xscenario "Current filter is properly highlighted" do
+ visit enquiries_path
+ expect(page).to_not have_link('Open')
+ expect(page).to have_link('Incoming')
+ expect(page).to have_link('Expired')
+
+ visit enquiries_path(filter: 'incoming')
+ expect(page).to have_link('Open')
+ expect(page).to_not have_link('Incoming')
+ expect(page).to have_link('Expired')
+
+ visit enquiries_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) }
+
+ 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(normal_question.title)
+ expect(page).to have_content(proposal_question.title)
+ end
+
+ scenario 'Non-logged in users' do
+ create(:poll_question, poll: poll, valid_answers: 'Han Solo, 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
+ create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
+ login_as(create(:user, geozone: geozone))
+ visit poll_path(poll)
+
+ expect(page).to have_content('Han Solo')
+ expect(page).to have_content('Chewbacca')
+ expect(page).to have_content('You must verify your account in order to answer')
+
+ expect(page).to_not have_link('Han Solo')
+ expect(page).to_not have_link('Chewbacca')
+ end
+
+ scenario 'Level 2 users in an incoming question' do
+ incoming_poll = create(:poll, :incoming)
+ create(:poll_question, poll: incoming_poll, geozone_ids: [geozone.id], valid_answers: 'Rey, 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 question' do
+ expired_poll = create(:poll, :expired)
+ create(:poll_question, poll: expired_poll, geozone_ids: [geozone.id], valid_answers: 'Luke, 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
+
+ xscenario 'Level 2 users in an question for a geozone which is not theirs' do
+ create(:poll_question, poll: poll, geozone_ids: [], valid_answers: 'Vader, 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
+
+ xscenario 'Level 2 users who can answer' do
+ create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, 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
+
+ xscenario 'Level 2 users who have already answered' do
+ question = create(:poll_question, poll: poll, geozone_ids:[geozone.id], valid_answers: 'Han Solo, Chewbacca')
+ user = create(:user, :level_two, geozone: geozone)
+ create(:question_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
+
+ xscenario 'Level 2 users answering', :js do
+ create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, 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
+
+ end
+
end