Commit 83730f73a4697d42bd6bdeebd190d4447183618a
1 parent
bfb52480
Exists in
master
and in
11 other branches
proposals_discussion: added tests
Showing
12 changed files
with
206 additions
and
27 deletions
Show diff stats
controllers/public/proposals_discussion_plugin_public_controller.rb
| ... | ... | @@ -9,27 +9,27 @@ class ProposalsDiscussionPluginPublicController < ApplicationController |
| 9 | 9 | page = (params[:page] || 1).to_i |
| 10 | 10 | |
| 11 | 11 | set_seed |
| 12 | - proposals = holder.proposals.public.reorder('random()') | |
| 13 | - proposals = proposals.page(page).per_page(5) | |
| 12 | + @proposals = holder.proposals.public.reorder('random()') | |
| 13 | + @proposals = @proposals.page(page).per_page(5) | |
| 14 | 14 | |
| 15 | - unless proposals.empty? | |
| 16 | - render :partial => 'content_viewer/proposals_list_content', :locals => {:proposals => proposals, :holder => holder, :next_page => page+1} | |
| 15 | + unless @proposals.empty? | |
| 16 | + render :partial => 'content_viewer/proposals_list_content', :locals => {:proposals => @proposals, :holder => holder, :page => page+1} | |
| 17 | 17 | else |
| 18 | 18 | render :text => '' |
| 19 | 19 | end |
| 20 | 20 | end |
| 21 | 21 | |
| 22 | - private | |
| 22 | + private | |
| 23 | 23 | |
| 24 | - def set_seed | |
| 25 | - #XXX postgresql specific | |
| 26 | - seed_val = profile.connection.quote(cookies[:_noosfero_proposals_discussion_rand_seed]) | |
| 27 | - profile.connection.execute("select setseed(#{seed_val})") | |
| 28 | - end | |
| 24 | + def set_seed | |
| 25 | + #XXX postgresql specific | |
| 26 | + seed_val = profile.connection.quote(cookies[:_noosfero_proposals_discussion_rand_seed]) | |
| 27 | + profile.connection.execute("select setseed(#{seed_val})") | |
| 28 | + end | |
| 29 | 29 | |
| 30 | - def set_rand_cookie | |
| 31 | - return if cookies[:_noosfero_proposals_discussion_rand_seed].present? | |
| 32 | - cookies[:_noosfero_proposals_discussion_rand_seed] = {value: rand, expires: Time.now + 900} | |
| 33 | - end | |
| 30 | + def set_rand_cookie | |
| 31 | + return if cookies[:_noosfero_proposals_discussion_rand_seed].present? | |
| 32 | + cookies[:_noosfero_proposals_discussion_rand_seed] = {value: rand, expires: Time.now + 600} | |
| 33 | + end | |
| 34 | 34 | |
| 35 | 35 | end | ... | ... |
public/style.css
| 1 | 1 | .private-proposals .proposal { |
| 2 | - background: rgb(249, 252, 193); | |
| 2 | + background: url(/images/hachure.png); | |
| 3 | + opacity: 0.5; | |
| 4 | + filter: alpha(opacity=25); | |
| 5 | + zoom: 1; | |
| 3 | 6 | } |
| 4 | 7 | |
| 5 | 8 | .proposal { |
| ... | ... | @@ -10,7 +13,6 @@ |
| 10 | 13 | vertical-align: top; |
| 11 | 14 | margin: 12px 13px 12px 0; |
| 12 | 15 | box-shadow: 5px 5px 5px -2px #ddd; |
| 13 | - padding: 5px; | |
| 14 | 16 | } |
| 15 | 17 | |
| 16 | 18 | .article-body-proposals-discussion-plugin_discussion .actions, |
| ... | ... | @@ -22,11 +24,12 @@ |
| 22 | 24 | display: table-cell; |
| 23 | 25 | border-right: 1px solid; |
| 24 | 26 | border-color: rgb(201, 201, 201); |
| 27 | + padding: 5px; | |
| 25 | 28 | } |
| 26 | 29 | .proposal .topic { |
| 27 | 30 | border-right: 0; |
| 28 | 31 | text-align: center; |
| 29 | - width: 30%; | |
| 32 | + width: 24%; | |
| 30 | 33 | } |
| 31 | 34 | .proposal .score { |
| 32 | 35 | width: 8%; |
| ... | ... | @@ -50,16 +53,16 @@ |
| 50 | 53 | } |
| 51 | 54 | |
| 52 | 55 | #article .proposal .title a { |
| 53 | - padding: 8px 0px; | |
| 56 | + padding: 4px 0px; | |
| 54 | 57 | } |
| 55 | 58 | |
| 56 | 59 | .proposal .content { |
| 57 | - width: 60%; | |
| 60 | + width: 68%; | |
| 58 | 61 | color: rgb(83, 83, 83); |
| 59 | 62 | } |
| 60 | 63 | |
| 61 | 64 | .proposal .abstract { |
| 62 | - padding-top: 8px; | |
| 65 | + padding-top: 4px; | |
| 63 | 66 | } |
| 64 | 67 | |
| 65 | 68 | form .proposals-discussion-plugin textarea { | ... | ... |
test/functional/proposals_discussion_plugin_myprofile_controller_test.rb
0 → 100644
| ... | ... | @@ -0,0 +1,44 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | + | |
| 3 | +class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestCase | |
| 4 | + | |
| 5 | + def setup | |
| 6 | + @profile = fast_create(Community) | |
| 7 | + @discussion = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) | |
| 8 | + @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) | |
| 9 | + @person = create_user_with_permission('testinguser', 'post_content') | |
| 10 | + login_as :testinguser | |
| 11 | + end | |
| 12 | + | |
| 13 | + attr_reader :profile, :discussion, :topic, :person | |
| 14 | + | |
| 15 | + should 'list topics for selection' do | |
| 16 | + 3.times {fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id, :profile_id => profile.id)} | |
| 17 | + get :select_topic, :profile => profile.identifier, :parent_id => discussion.id | |
| 18 | + assert_equal discussion, assigns(:discussion) | |
| 19 | + assert_select 'div#topics' do | |
| 20 | + assert_select 'div.content', discussion.topics.count | |
| 21 | + assert_select "input[name='discussion[topic]']", discussion.topics.count | |
| 22 | + end | |
| 23 | + assert_tag :form, :attributes => {:action => "/myprofile/#{profile.identifier}/plugin/proposals_discussion/myprofile/new_proposal"} | |
| 24 | + end | |
| 25 | + | |
| 26 | + should 'new_proposal redirect to cms controller' do | |
| 27 | + get :new_proposal, :profile => profile.identifier, :discussion => {:topic => topic.id} | |
| 28 | + assert_redirected_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => topic.id | |
| 29 | + end | |
| 30 | + | |
| 31 | + should 'publish a proposal' do | |
| 32 | + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :profile_id => profile.id, :published => false, :created_by_id => person.id) | |
| 33 | + get :publish_proposal, :proposal_id => proposal.id, :profile => profile.identifier | |
| 34 | + assert proposal.reload.published | |
| 35 | + end | |
| 36 | + | |
| 37 | + should 'do not publish if the logged user do not have edition permission' do | |
| 38 | + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :profile_id => profile.id, :published => false) | |
| 39 | + get :publish_proposal, :proposal_id => proposal.id, :profile => profile.identifier | |
| 40 | + assert_response 403 | |
| 41 | + assert !proposal.reload.published | |
| 42 | + end | |
| 43 | + | |
| 44 | +end | ... | ... |
test/functional/proposals_discussion_plugin_public_controller_test.rb
0 → 100644
| ... | ... | @@ -0,0 +1,30 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | + | |
| 3 | +class ProposalsDiscussionPluginPublicControllerTest < ActionController::TestCase | |
| 4 | + | |
| 5 | + def setup | |
| 6 | + @profile = fast_create(Community) | |
| 7 | + @discussion = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) | |
| 8 | + @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) | |
| 9 | + end | |
| 10 | + | |
| 11 | + attr_reader :profile, :discussion, :topic | |
| 12 | + | |
| 13 | + should 'load proposals' do | |
| 14 | + proposals = 3.times.map { fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)} | |
| 15 | + get :load_proposals, :profile => profile.identifier, :holder_id => discussion.id | |
| 16 | + assert_equivalent proposals, assigns(:proposals) | |
| 17 | + end | |
| 18 | + | |
| 19 | + should 'add link to next page' do | |
| 20 | + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id) | |
| 21 | + get :load_proposals, :profile => profile.identifier, :holder_id => discussion.id | |
| 22 | + assert_match /href=.*page=2/, response.body | |
| 23 | + end | |
| 24 | + | |
| 25 | + should 'render blank text if it is the last page' do | |
| 26 | + get :load_proposals, :profile => profile.identifier, :holder_id => discussion.id | |
| 27 | + assert_equal '', response.body | |
| 28 | + end | |
| 29 | + | |
| 30 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,27 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | + | |
| 3 | +class DiscussionTest < ActiveSupport::TestCase | |
| 4 | + | |
| 5 | + def setup | |
| 6 | + @profile = fast_create(Community) | |
| 7 | + @discussion = ProposalsDiscussionPlugin::Discussion.new(:name => 'test', :profile => @profile) | |
| 8 | + end | |
| 9 | + | |
| 10 | + attr_reader :profile, :discussion | |
| 11 | + | |
| 12 | + should 'return list of topics' do | |
| 13 | + discussion.save! | |
| 14 | + topic1 = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) | |
| 15 | + topic2 = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) | |
| 16 | + assert_equivalent [topic1, topic2], discussion.topics | |
| 17 | + end | |
| 18 | + | |
| 19 | + should 'return list of proposals' do | |
| 20 | + discussion.save! | |
| 21 | + topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) | |
| 22 | + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | |
| 23 | + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | |
| 24 | + assert_equivalent [proposal1, proposal2], discussion.proposals | |
| 25 | + end | |
| 26 | + | |
| 27 | +end | ... | ... |
test/unit/proposal_test.rb
| 1 | 1 | require File.dirname(__FILE__) + '/../test_helper' |
| 2 | 2 | |
| 3 | -class ProposalsDiscussionPluginTest < ActiveSupport::TestCase | |
| 3 | +class ProposalTest < ActiveSupport::TestCase | |
| 4 | 4 | |
| 5 | 5 | def setup |
| 6 | 6 | @profile = fast_create(Community) |
| 7 | + @person = fast_create(Person) | |
| 7 | 8 | @proposal = ProposalsDiscussionPlugin::Proposal.new(:name => 'test', :profile => @profile) |
| 9 | + @proposal.created_by = @person | |
| 8 | 10 | end |
| 9 | 11 | |
| 10 | - attr_reader :profile, :proposal | |
| 12 | + attr_reader :profile, :proposal, :person | |
| 11 | 13 | |
| 12 | 14 | should 'save a proposal' do |
| 13 | 15 | proposal.abstract = 'abstract' |
| ... | ... | @@ -19,4 +21,12 @@ class ProposalsDiscussionPluginTest < ActiveSupport::TestCase |
| 19 | 21 | assert proposal.errors['abstract'].present? |
| 20 | 22 | end |
| 21 | 23 | |
| 24 | + should 'allow edition if user is the author' do | |
| 25 | + assert proposal.allow_edit?(person) | |
| 26 | + end | |
| 27 | + | |
| 28 | + should 'do not allow edition if user is not the author' do | |
| 29 | + assert !proposal.allow_edit?(fast_create(Person)) | |
| 30 | + end | |
| 31 | + | |
| 22 | 32 | end | ... | ... |
test/unit/proposals_discussion_plugin_test.rb
| ... | ... | @@ -26,9 +26,15 @@ class ProposalsDiscussionPluginTest < ActiveSupport::TestCase |
| 26 | 26 | assert_not_includes plugin.content_types, ProposalsDiscussionPlugin::Discussion |
| 27 | 27 | end |
| 28 | 28 | |
| 29 | - should 'return Proposal as a content type if parent is a Discussion' do | |
| 29 | + should 'return Topic as a content type if parent is a Discussion' do | |
| 30 | 30 | parent = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) |
| 31 | 31 | @params[:parent_id] = parent.id |
| 32 | + assert_includes plugin.content_types, ProposalsDiscussionPlugin::Topic | |
| 33 | + end | |
| 34 | + | |
| 35 | + should 'return Proposal as a content type if parent is a Topic' do | |
| 36 | + parent = fast_create(ProposalsDiscussionPlugin::Topic, :profile_id => @profile.id) | |
| 37 | + @params[:parent_id] = parent.id | |
| 32 | 38 | assert_includes plugin.content_types, ProposalsDiscussionPlugin::Proposal |
| 33 | 39 | end |
| 34 | 40 | ... | ... |
| ... | ... | @@ -0,0 +1,50 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | + | |
| 3 | +class TopicTest < ActiveSupport::TestCase | |
| 4 | + | |
| 5 | + def setup | |
| 6 | + @profile = fast_create(Community) | |
| 7 | + @topic = ProposalsDiscussionPlugin::Topic.new(:name => 'test', :profile => @profile) | |
| 8 | + end | |
| 9 | + | |
| 10 | + attr_reader :profile, :topic | |
| 11 | + | |
| 12 | + should 'return list of proposals' do | |
| 13 | + topic.save! | |
| 14 | + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | |
| 15 | + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | |
| 16 | + assert_equivalent [proposal1, proposal2], topic.proposals | |
| 17 | + end | |
| 18 | + | |
| 19 | + should 'allow any user to create proposals in a topic' do | |
| 20 | + assert topic.allow_create?(Person.new) | |
| 21 | + end | |
| 22 | + | |
| 23 | + should 'return list of comments' do | |
| 24 | + topic.save! | |
| 25 | + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | |
| 26 | + comment1 = fast_create(Comment, :source_id => proposal.id) | |
| 27 | + comment2 = fast_create(Comment, :source_id => proposal.id) | |
| 28 | + assert_equivalent [comment1, comment2], topic.proposals_comments | |
| 29 | + end | |
| 30 | + | |
| 31 | + should 'return list of authors' do | |
| 32 | + topic.save! | |
| 33 | + author1 = fast_create(Person) | |
| 34 | + author2 = fast_create(Person) | |
| 35 | + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author1) | |
| 36 | + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author2) | |
| 37 | + assert_equivalent [author1, author2], topic.proposals_authors | |
| 38 | + end | |
| 39 | + | |
| 40 | + should 'return most active participants' do | |
| 41 | + topic.save! | |
| 42 | + author1 = fast_create(Person) | |
| 43 | + author2 = fast_create(Person) | |
| 44 | + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author1) | |
| 45 | + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author2) | |
| 46 | + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author2) | |
| 47 | + assert_equal [author2, author1], topic.most_active_participants | |
| 48 | + end | |
| 49 | + | |
| 50 | +end | ... | ... |
views/content_viewer/_proposal_card.html.erb
| ... | ... | @@ -4,7 +4,7 @@ |
| 4 | 4 | <%= link_to proposal_card.name, proposal_card.view_url %> |
| 5 | 5 | </div> |
| 6 | 6 | <div class="abstract"> |
| 7 | - <%= link_to strip_tags(proposal_card.lead), proposal_card.view_url %> | |
| 7 | + <%= link_to strip_tags(proposal_card.abstract), proposal_card.view_url %> | |
| 8 | 8 | </div> |
| 9 | 9 | </div> |
| 10 | 10 | <div class="score"> | ... | ... |
views/content_viewer/_proposals_list.html.erb
| ... | ... | @@ -9,7 +9,7 @@ |
| 9 | 9 | }); |
| 10 | 10 | </script> |
| 11 | 11 | |
| 12 | -<% private_proposals = @page.proposals.private(user)%> | |
| 12 | +<% private_proposals = user ? @page.proposals.private(user) : [] %> | |
| 13 | 13 | <% unless private_proposals.empty? %> |
| 14 | 14 | <div class="private-proposals"> |
| 15 | 15 | <h5><%= _('My private proposals') %></h5> |
| ... | ... | @@ -18,7 +18,6 @@ |
| 18 | 18 | <% end %> |
| 19 | 19 | |
| 20 | 20 | <div class="proposals"> |
| 21 | - <h5><%= _('Proposals') %></h5> | |
| 22 | 21 | <div class="more"> |
| 23 | 22 | <img src="/images/loading.gif" alt="Loading" /><%= _("Loading...") %> |
| 24 | 23 | <%= link_to '', url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier }) %> | ... | ... |
views/content_viewer/_proposals_list_content.html.erb
| 1 | +<% unless proposals.empty? %> | |
| 2 | + <h5><%= _('Proposals') %></h5> | |
| 3 | +<% end %> | |
| 4 | + | |
| 1 | 5 | <%= render :partial => 'content_viewer/proposal_card', :collection => proposals %> |
| 2 | 6 | |
| 3 | 7 | <div class="more"> |
| 4 | - <%= link_to _('More'), url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier, :page => next_page }) %> | |
| 8 | + <%= link_to _('More'), url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier, :page => page }) %> | |
| 5 | 9 | </div> | ... | ... |
views/content_viewer/topic.html.erb
| ... | ... | @@ -24,4 +24,10 @@ |
| 24 | 24 | </span> |
| 25 | 25 | </div> |
| 26 | 26 | |
| 27 | +<div class="actions"> | |
| 28 | + <%= link_to url_for({:controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => @page.id}), :class => 'button with-text icon-add' do %> | |
| 29 | + <strong><%= _("Send my proposal") %></strong> | |
| 30 | + <% end %> | |
| 31 | +</div> | |
| 32 | + | |
| 27 | 33 | <%= render :partial => 'content_viewer/proposals_list', :locals => {:holder => @page} %> | ... | ... |