diff --git a/plugins/proposals_discussion/controllers/public/proposals_discussion_plugin_public_controller.rb b/plugins/proposals_discussion/controllers/public/proposals_discussion_plugin_public_controller.rb index 7243eeb..f3cc7ae 100644 --- a/plugins/proposals_discussion/controllers/public/proposals_discussion_plugin_public_controller.rb +++ b/plugins/proposals_discussion/controllers/public/proposals_discussion_plugin_public_controller.rb @@ -9,27 +9,27 @@ class ProposalsDiscussionPluginPublicController < ApplicationController page = (params[:page] || 1).to_i set_seed - proposals = holder.proposals.public.reorder('random()') - proposals = proposals.page(page).per_page(5) + @proposals = holder.proposals.public.reorder('random()') + @proposals = @proposals.page(page).per_page(5) - unless proposals.empty? - render :partial => 'content_viewer/proposals_list_content', :locals => {:proposals => proposals, :holder => holder, :next_page => page+1} + unless @proposals.empty? + render :partial => 'content_viewer/proposals_list_content', :locals => {:proposals => @proposals, :holder => holder, :page => page+1} else render :text => '' end end - private + private - def set_seed - #XXX postgresql specific - seed_val = profile.connection.quote(cookies[:_noosfero_proposals_discussion_rand_seed]) - profile.connection.execute("select setseed(#{seed_val})") - end + def set_seed + #XXX postgresql specific + seed_val = profile.connection.quote(cookies[:_noosfero_proposals_discussion_rand_seed]) + profile.connection.execute("select setseed(#{seed_val})") + end - def set_rand_cookie - return if cookies[:_noosfero_proposals_discussion_rand_seed].present? - cookies[:_noosfero_proposals_discussion_rand_seed] = {value: rand, expires: Time.now + 900} - end + def set_rand_cookie + return if cookies[:_noosfero_proposals_discussion_rand_seed].present? + cookies[:_noosfero_proposals_discussion_rand_seed] = {value: rand, expires: Time.now + 600} + end end diff --git a/plugins/proposals_discussion/public/style.css b/plugins/proposals_discussion/public/style.css index 058ebff..43180a5 100644 --- a/plugins/proposals_discussion/public/style.css +++ b/plugins/proposals_discussion/public/style.css @@ -1,5 +1,8 @@ .private-proposals .proposal { - background: rgb(249, 252, 193); + background: url(/images/hachure.png); + opacity: 0.5; + filter: alpha(opacity=25); + zoom: 1; } .proposal { @@ -10,7 +13,6 @@ vertical-align: top; margin: 12px 13px 12px 0; box-shadow: 5px 5px 5px -2px #ddd; - padding: 5px; } .article-body-proposals-discussion-plugin_discussion .actions, @@ -22,11 +24,12 @@ display: table-cell; border-right: 1px solid; border-color: rgb(201, 201, 201); + padding: 5px; } .proposal .topic { border-right: 0; text-align: center; - width: 30%; + width: 24%; } .proposal .score { width: 8%; @@ -50,16 +53,16 @@ } #article .proposal .title a { - padding: 8px 0px; + padding: 4px 0px; } .proposal .content { - width: 60%; + width: 68%; color: rgb(83, 83, 83); } .proposal .abstract { - padding-top: 8px; + padding-top: 4px; } form .proposals-discussion-plugin textarea { diff --git a/plugins/proposals_discussion/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb b/plugins/proposals_discussion/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb new file mode 100644 index 0000000..2ea908d --- /dev/null +++ b/plugins/proposals_discussion/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb @@ -0,0 +1,44 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestCase + + def setup + @profile = fast_create(Community) + @discussion = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) + @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) + @person = create_user_with_permission('testinguser', 'post_content') + login_as :testinguser + end + + attr_reader :profile, :discussion, :topic, :person + + should 'list topics for selection' do + 3.times {fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id, :profile_id => profile.id)} + get :select_topic, :profile => profile.identifier, :parent_id => discussion.id + assert_equal discussion, assigns(:discussion) + assert_select 'div#topics' do + assert_select 'div.content', discussion.topics.count + assert_select "input[name='discussion[topic]']", discussion.topics.count + end + assert_tag :form, :attributes => {:action => "/myprofile/#{profile.identifier}/plugin/proposals_discussion/myprofile/new_proposal"} + end + + should 'new_proposal redirect to cms controller' do + get :new_proposal, :profile => profile.identifier, :discussion => {:topic => topic.id} + assert_redirected_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => topic.id + end + + should 'publish a proposal' do + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :profile_id => profile.id, :published => false, :created_by_id => person.id) + get :publish_proposal, :proposal_id => proposal.id, :profile => profile.identifier + assert proposal.reload.published + end + + should 'do not publish if the logged user do not have edition permission' do + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :profile_id => profile.id, :published => false) + get :publish_proposal, :proposal_id => proposal.id, :profile => profile.identifier + assert_response 403 + assert !proposal.reload.published + end + +end diff --git a/plugins/proposals_discussion/test/functional/proposals_discussion_plugin_public_controller_test.rb b/plugins/proposals_discussion/test/functional/proposals_discussion_plugin_public_controller_test.rb new file mode 100644 index 0000000..be5cb94 --- /dev/null +++ b/plugins/proposals_discussion/test/functional/proposals_discussion_plugin_public_controller_test.rb @@ -0,0 +1,30 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ProposalsDiscussionPluginPublicControllerTest < ActionController::TestCase + + def setup + @profile = fast_create(Community) + @discussion = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) + @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) + end + + attr_reader :profile, :discussion, :topic + + should 'load proposals' do + proposals = 3.times.map { fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)} + get :load_proposals, :profile => profile.identifier, :holder_id => discussion.id + assert_equivalent proposals, assigns(:proposals) + end + + should 'add link to next page' do + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id) + get :load_proposals, :profile => profile.identifier, :holder_id => discussion.id + assert_match /href=.*page=2/, response.body + end + + should 'render blank text if it is the last page' do + get :load_proposals, :profile => profile.identifier, :holder_id => discussion.id + assert_equal '', response.body + end + +end diff --git a/plugins/proposals_discussion/test/unit/discussion_test.rb b/plugins/proposals_discussion/test/unit/discussion_test.rb new file mode 100644 index 0000000..80c975c --- /dev/null +++ b/plugins/proposals_discussion/test/unit/discussion_test.rb @@ -0,0 +1,27 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class DiscussionTest < ActiveSupport::TestCase + + def setup + @profile = fast_create(Community) + @discussion = ProposalsDiscussionPlugin::Discussion.new(:name => 'test', :profile => @profile) + end + + attr_reader :profile, :discussion + + should 'return list of topics' do + discussion.save! + topic1 = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) + topic2 = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) + assert_equivalent [topic1, topic2], discussion.topics + end + + should 'return list of proposals' do + discussion.save! + topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) + assert_equivalent [proposal1, proposal2], discussion.proposals + end + +end diff --git a/plugins/proposals_discussion/test/unit/proposal_test.rb b/plugins/proposals_discussion/test/unit/proposal_test.rb index aa093ca..87cf3e7 100644 --- a/plugins/proposals_discussion/test/unit/proposal_test.rb +++ b/plugins/proposals_discussion/test/unit/proposal_test.rb @@ -1,13 +1,15 @@ require File.dirname(__FILE__) + '/../test_helper' -class ProposalsDiscussionPluginTest < ActiveSupport::TestCase +class ProposalTest < ActiveSupport::TestCase def setup @profile = fast_create(Community) + @person = fast_create(Person) @proposal = ProposalsDiscussionPlugin::Proposal.new(:name => 'test', :profile => @profile) + @proposal.created_by = @person end - attr_reader :profile, :proposal + attr_reader :profile, :proposal, :person should 'save a proposal' do proposal.abstract = 'abstract' @@ -19,4 +21,12 @@ class ProposalsDiscussionPluginTest < ActiveSupport::TestCase assert proposal.errors['abstract'].present? end + should 'allow edition if user is the author' do + assert proposal.allow_edit?(person) + end + + should 'do not allow edition if user is not the author' do + assert !proposal.allow_edit?(fast_create(Person)) + end + end diff --git a/plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb b/plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb index 2c69cdc..2b4944d 100644 --- a/plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb +++ b/plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb @@ -26,9 +26,15 @@ class ProposalsDiscussionPluginTest < ActiveSupport::TestCase assert_not_includes plugin.content_types, ProposalsDiscussionPlugin::Discussion end - should 'return Proposal as a content type if parent is a Discussion' do + should 'return Topic as a content type if parent is a Discussion' do parent = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) @params[:parent_id] = parent.id + assert_includes plugin.content_types, ProposalsDiscussionPlugin::Topic + end + + should 'return Proposal as a content type if parent is a Topic' do + parent = fast_create(ProposalsDiscussionPlugin::Topic, :profile_id => @profile.id) + @params[:parent_id] = parent.id assert_includes plugin.content_types, ProposalsDiscussionPlugin::Proposal end diff --git a/plugins/proposals_discussion/test/unit/topic_test.rb b/plugins/proposals_discussion/test/unit/topic_test.rb new file mode 100644 index 0000000..dccc0fa --- /dev/null +++ b/plugins/proposals_discussion/test/unit/topic_test.rb @@ -0,0 +1,50 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class TopicTest < ActiveSupport::TestCase + + def setup + @profile = fast_create(Community) + @topic = ProposalsDiscussionPlugin::Topic.new(:name => 'test', :profile => @profile) + end + + attr_reader :profile, :topic + + should 'return list of proposals' do + topic.save! + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) + assert_equivalent [proposal1, proposal2], topic.proposals + end + + should 'allow any user to create proposals in a topic' do + assert topic.allow_create?(Person.new) + end + + should 'return list of comments' do + topic.save! + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) + comment1 = fast_create(Comment, :source_id => proposal.id) + comment2 = fast_create(Comment, :source_id => proposal.id) + assert_equivalent [comment1, comment2], topic.proposals_comments + end + + should 'return list of authors' do + topic.save! + author1 = fast_create(Person) + author2 = fast_create(Person) + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author1) + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author2) + assert_equivalent [author1, author2], topic.proposals_authors + end + + should 'return most active participants' do + topic.save! + author1 = fast_create(Person) + author2 = fast_create(Person) + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author1) + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author2) + fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :created_by_id => author2) + assert_equal [author2, author1], topic.most_active_participants + end + +end diff --git a/plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb b/plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb index 8c39f8a..ef6e30b 100644 --- a/plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb +++ b/plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb @@ -4,7 +4,7 @@ <%= link_to proposal_card.name, proposal_card.view_url %>