@@ -9,10 +9,12 @@
<%= t("proposals.proposal.supports", count: proposal.total_votes) %>
- <%= link_to vote_proposal_path(proposal, value: 'yes'), class: "button button-support tiny radius expand #{voted_classes[:in_favor]}",
+
+ <%= link_to vote_proposal_path(proposal, value: 'yes'), class: "button button-support tiny radius expand #{voted_classes[:in_favor]}",
title: t('proposals.proposal.support'), method: "post", remote: true do %>
<%= t("proposals.proposal.support") %>
- <% end %>
+ <% end %>
+
@@ -23,7 +25,7 @@
<% elsif user_signed_in? && !proposal.votable_by?(current_user)%>
- <%= t("votes.anonymous",
+ <%= t("votes.verified_only",
verify_account: link_to(t("votes.verify_account"), verification_path )).html_safe %>
diff --git a/app/views/proposals/vote.js.erb b/app/views/proposals/vote.js.erb
new file mode 100644
index 000000000..4a5ca6b6b
--- /dev/null
+++ b/app/views/proposals/vote.js.erb
@@ -0,0 +1 @@
+$("#<%= dom_id(@proposal) %>_votes").html('<%= j render("proposals/votes", proposal: @proposal) %>');
\ No newline at end of file
diff --git a/config/initializers/vote_extensions.rb b/config/initializers/vote_extensions.rb
index 2a77bbef6..50fb60c9f 100644
--- a/config/initializers/vote_extensions.rb
+++ b/config/initializers/vote_extensions.rb
@@ -4,7 +4,7 @@ ActsAsVotable::Vote.class_eval do
end
def self.for_proposals(proposals)
- where(votable_type: 'Debate', votable_id: proposals)
+ where(votable_type: 'Proposal', votable_id: proposals)
end
def value
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 6f2bb4bda..85e4a2544 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -244,7 +244,8 @@ en:
unauthenticated: "You need to %{signin} or %{signup} before continuing."
signin: sign in
signup: sign up
- anonymous: "This debate already has too much anonymous votes, %{verify_account} to vote."
+ anonymous: "Too many anonymous votes, %{verify_account} to vote."
+ verified_only: "This proposal can only be voted by verified users, %{verify_account}."
verify_account: verify your account
organizations: Organizations can not vote
account:
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 8e0c55275..52d9eeeb0 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -244,7 +244,8 @@ es:
unauthenticated: "Necesitas %{signin} o %{signup} para continuar."
signin: iniciar sesión
signup: registrarte
- anonymous: "Esta propuesta ya tiene demasiados votos anónimos, para poder votar %{verify_account}."
+ anonymous: "Demasiados votos anónimos, para poder votar %{verify_account}."
+ verified_only: "Esta propuesta sólo puede ser votada por usuarios verificados, %{verify_account}."
verify_account: verifica tu cuenta
organizations: Las organizaciones no pueden votar
account:
diff --git a/spec/features/votes_spec.rb b/spec/features/votes_spec.rb
index 33f8f3146..c7664ee3c 100644
--- a/spec/features/votes_spec.rb
+++ b/spec/features/votes_spec.rb
@@ -10,7 +10,9 @@ feature 'Votes' do
end
feature 'Debates' do
- scenario "Home shows user votes on featured debates" do
+ xscenario "Home shows user votes on featured debates" do
+ pending "logged in user cannot see this page"
+
debate1 = create(:debate)
debate2 = create(:debate)
debate3 = create(:debate)
@@ -200,7 +202,8 @@ feature 'Votes' do
expect(page).to have_content "1 vote"
end
- scenario 'Create in featured', :js do
+ xscenario 'Create in featured', :js do
+ pending "logged in user cannot see this page"
visit root_path
find('.in-favor a').click
@@ -241,6 +244,52 @@ feature 'Votes' do
expect(current_path).to eq(debates_path)
end
end
+
+ scenario 'Not logged user trying to vote', :js do
+ debate = create(:debate)
+
+ visit "/"
+ click_link "Logout"
+
+ within("#debate_#{debate.id}") do
+ find("div.votes").hover
+ expect_message_you_need_to_sign_in
+ end
+
+ visit debates_path
+ within("#debate_#{debate.id}") do
+ find("div.votes").hover
+ expect_message_you_need_to_sign_in
+ end
+
+ visit debate_path(debate)
+ within("#debate_#{debate.id}") do
+ find("div.votes").hover
+ expect_message_you_need_to_sign_in
+ end
+ end
+
+ scenario 'Anonymous user trying to vote', :js do
+ user = create(:user)
+ debate = create(:debate)
+
+ Setting.find_by(key: "max_ratio_anon_votes_on_debates").update(value: 50)
+ debate.update(cached_anonymous_votes_total: 520, cached_votes_total: 1000)
+
+ login_as(user)
+
+ visit debates_path
+ within("#debate_#{debate.id}") do
+ find("div.votes").hover
+ expect_message_to_many_anonymous_votes
+ end
+
+ visit debate_path(debate)
+ within("#debate_#{debate.id}") do
+ find("div.votes").hover
+ expect_message_to_many_anonymous_votes
+ end
+ end
end
feature 'Comments' do
@@ -324,4 +373,199 @@ feature 'Votes' do
end
end
end
+
+ feature 'Proposals' do
+ xscenario "Home shows user votes on featured proposals" do
+ pending "logged in user cannot see this page"
+ proposal1 = create(:proposal)
+ proposal2 = create(:proposal)
+ proposal3 = create(:proposal)
+ create(:vote, voter: @manuela, votable: proposal1, vote_flag: true)
+ create(:vote, voter: @manuela, votable: proposal3, vote_flag: false)
+
+ visit root_path
+
+ within("#featured-proposals") do
+ within("#proposal_#{proposal1.id}_votes") do
+ within(".supports") do
+ expect(page).to have_css("a.voted")
+ expect(page).to_not have_css("a.no-voted")
+ end
+ end
+
+ within("#proposal_#{proposal2.id}_votes") do
+ within(".supports") do
+ expect(page).to_not have_css("a.voted")
+ expect(page).to_not have_css("a.no-voted")
+ end
+ end
+
+ within("#proposal_#{proposal3.id}_votes") do
+ within(".supports") do
+ expect(page).to have_css("a.no-voted")
+ expect(page).to_not have_css("a.voted")
+ end
+ end
+ end
+ end
+
+ scenario "Index shows user votes on proposals" do
+ proposal1 = create(:proposal)
+ proposal2 = create(:proposal)
+ proposal3 = create(:proposal)
+ create(:vote, voter: @manuela, votable: proposal1, vote_flag: true)
+ create(:vote, voter: @manuela, votable: proposal3, vote_flag: false)
+
+ visit proposals_path
+
+ within("#proposals") do
+ within("#proposal_#{proposal1.id}_votes") do
+ expect(page).to have_css("a.voted")
+ expect(page).to_not have_css("a.no-voted")
+ end
+
+ within("#proposal_#{proposal2.id}_votes") do
+ expect(page).to_not have_css("a.voted")
+ expect(page).to_not have_css("a.no-voted")
+ end
+
+ within("#proposal_#{proposal3.id}_votes") do
+ expect(page).to have_css("a.no-voted")
+ expect(page).to_not have_css("a.voted")
+ end
+ end
+ end
+
+ feature 'Single proposal' do
+ background do
+ @proposal = create(:proposal)
+ end
+
+ scenario 'Show no votes' do
+ visit proposal_path(@proposal)
+
+ expect(page).to have_content "No supports"
+
+ within('.supports') do
+ expect(page).to_not have_css("a.voted")
+ expect(page).to_not have_css("a.no-voted")
+ end
+ end
+
+ scenario 'Update', :js do
+ visit proposal_path(@proposal)
+
+ within('.supports') do
+ find('.in-favor a').click
+ expect(page).to have_content "1 support"
+ expect(page).to have_css("a.voted")
+
+ find('.in-favor a').click
+ expect(page).to have_content "No supports"
+ expect(page).to_not have_css("a.no-voted")
+ end
+ end
+
+ scenario 'Trying to vote multiple times', :js do
+ visit proposal_path(@proposal)
+
+ within('.supports') do
+ find('.in-favor a').click
+ find('.in-favor a').click
+
+ expect(page).to have_content "1 support"
+ end
+ end
+
+ scenario 'Show' do
+ create(:vote, voter: @manuela, votable: @proposal, vote_flag: true)
+ create(:vote, voter: @pablo, votable: @proposal, vote_flag: true)
+
+ visit proposal_path(@proposal)
+
+ within('.supports') do
+ expect(page).to have_content "2 supports / 53.726"
+ end
+ end
+
+ scenario 'Create from proposal show', :js do
+ visit proposal_path(@proposal)
+
+ within('.supports') do
+ find('.in-favor a').click
+
+ expect(page).to have_content "1 support"
+ expect(page).to have_css("a.voted")
+ end
+ end
+
+ xscenario 'Create in featured', :js do
+ pending "logged in user cannot see this page"
+ visit root_path
+
+ within("#featured-proposals") do
+ find('.in-favor a').click
+
+ expect(page).to have_content "1 support"
+ expect(page).to have_css("a.voted")
+ end
+ expect(URI.parse(current_url).path).to eq(root_path)
+ end
+
+ scenario 'Create in index', :js do
+ visit proposals_path
+
+ within("#proposals") do
+ find('.in-favor a').click
+
+ expect(page).to have_content "1 support"
+ expect(page).to have_css("a.voted")
+ end
+ expect(URI.parse(current_url).path).to eq(proposals_path)
+ end
+ end
+ end
+
+ scenario 'Not logged user trying to vote', :js do
+ proposal = create(:proposal)
+
+ visit "/"
+ click_link "Logout"
+
+ within("#proposal_#{proposal.id}") do
+ find("div.supports").hover
+ expect_message_you_need_to_sign_in
+ end
+
+ visit proposals_path
+ within("#proposal_#{proposal.id}") do
+ find("div.supports").hover
+ expect_message_you_need_to_sign_in
+ end
+
+ visit proposal_path(proposal)
+ within("#proposal_#{proposal.id}") do
+ find("div.supports").hover
+ expect_message_you_need_to_sign_in
+ end
+ end
+
+ scenario "Anonymous user trying to vote", :js do
+ user = create(:user)
+ proposal = create(:proposal)
+
+ login_as(user)
+ visit proposals_path
+
+ within("#proposal_#{proposal.id}") do
+ find("div.supports").hover
+ expect_message_only_verified_can_vote
+ end
+
+ visit proposal_path(proposal)
+ within("#proposal_#{proposal.id}") do
+ find("div.supports").hover
+ expect_message_only_verified_can_vote
+ end
+ end
end
diff --git a/spec/models/proposal_spec.rb b/spec/models/proposal_spec.rb
index 5ae9c3318..c52355ccf 100644
--- a/spec/models/proposal_spec.rb
+++ b/spec/models/proposal_spec.rb
@@ -73,4 +73,23 @@ describe Proposal do
expect(proposal.editable?).to be false
end
end
+
+ describe "#votable_by?" do
+ let(:proposal) { create(:proposal) }
+
+ it "should be true for level two verified users" do
+ user = create(:user, residence_verified_at: Time.now, confirmed_phone: "666333111")
+ expect(proposal.votable_by?(user)).to be true
+ end
+
+ it "should be true for level three verified users" do
+ user = create(:user, verified_at: Time.now)
+ expect(proposal.votable_by?(user)).to be true
+ end
+
+ it "should be false for anonymous users" do
+ user = create(:user)
+ expect(proposal.votable_by?(user)).to be false
+ end
+ end
end
\ No newline at end of file
diff --git a/spec/support/common_actions.rb b/spec/support/common_actions.rb
index ff0e861ca..24e9c5ad6 100644
--- a/spec/support/common_actions.rb
+++ b/spec/support/common_actions.rb
@@ -135,4 +135,19 @@ module CommonActions
expect(page).to have_content 'Correct code'
end
+ def expect_message_you_need_to_sign_in
+ expect(page).to have_content 'You need to sign in or sign up before continuing'
+ expect(page).to have_selector('.in-favor a', visible: false)
+ end
+
+ def expect_message_to_many_anonymous_votes
+ expect(page).to have_content 'Too many anonymous votes, verify your account to vote.'
+ expect(page).to have_selector('.in-favor a', visible: false)
+ end
+
+ def expect_message_only_verified_can_vote
+ expect(page).to have_content 'This proposal can only be voted by verified users, verify your account.'
+ expect(page).to have_selector('.in-favor a', visible: false)
+ end
+
end