Commit 3cd609d0bdd56d539ad86ffb8d7d31aba4e77013

Authored by Victor Costa
1 parent 56eca94b

proposals_discussion: added tests

plugins/proposals_discussion/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
... ...
plugins/proposals_discussion/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 {
... ...
plugins/proposals_discussion/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
... ...
plugins/proposals_discussion/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
... ...
plugins/proposals_discussion/test/unit/discussion_test.rb 0 → 100644
... ... @@ -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
... ...
plugins/proposals_discussion/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 &lt; 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
... ...
plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb
... ... @@ -26,9 +26,15 @@ class ProposalsDiscussionPluginTest &lt; 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  
... ...
plugins/proposals_discussion/test/unit/topic_test.rb 0 → 100644
... ... @@ -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
... ...
plugins/proposals_discussion/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">
... ...
plugins/proposals_discussion/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 }) %>
... ...
plugins/proposals_discussion/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>
... ...
plugins/proposals_discussion/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} %>
... ...