require_relative "../test_helper" class CommunityTest < ActiveSupport::TestCase def setup @person = fast_create(Person) end attr_reader :person should 'inherit from Profile' do assert_kind_of Profile, Community.new end should 'convert name into identifier' do c = Community.new c.name ='My shiny new Community' assert_equal 'My shiny new Community', c.name assert_equal 'my-shiny-new-community', c.identifier end should 'have a description attribute' do c = build(Community, :environment => Environment.default) c.description = 'the description of the community' assert_equal 'the description of the community', c.description end should 'create default set of blocks' do c = create(Community, :environment => Environment.default, :name => 'my new community') refute c.boxes[0].blocks.empty?, 'person must have blocks in area 1' refute c.boxes[1].blocks.empty?, 'person must have blocks in area 2' refute c.boxes[2].blocks.empty?, 'person must have blocks in area 3' end should 'create a default set of articles' do blog = build(Blog) Community.any_instance.stubs(:default_set_of_articles).returns([blog]) community = create(Community, :environment => Environment.default, :name => 'my new community') assert_kind_of Blog, community.articles.find_by_path(blog.path) assert_kind_of RssFeed, community.articles.find_by_path(blog.feed.path) end should 'have contact_person' do community = build(Community, :environment => Environment.default, :name => 'my new community') assert_respond_to community, :contact_person end should 'allow to add new members' do c = fast_create(Community, :name => 'my test profile', :identifier => 'mytestprofile') p = create_user('mytestuser').person c.add_member(p) assert c.members.include?(p), "Community should add the new member" end should 'allow to remove members' do c = fast_create(Community, :name => 'my other test profile', :identifier => 'myothertestprofile') p = create_user('myothertestuser').person c.add_member(p) assert_includes c.members, p c.remove_member(p) c.reload assert_not_includes c.members, p end should 'clear relationships after destroy' do c = fast_create(Community, :name => 'my test profile', :identifier => 'mytestprofile') member = create_user('memberuser').person admin = create_user('adminuser').person moderator = create_user('moderatoruser').person c.add_member(member) c.add_admin(admin) c.add_moderator(moderator) relationships = c.role_assignments assert_not_nil relationships c.destroy relationships.each do |i| refute RoleAssignment.exists?(i.id) end end should 'have a community template' do template = fast_create(Community, :is_template => true) p = create(Community, :name => 'test_com', :identifier => 'test_com', :template => template) assert_equal template, p.template end should 'have a default community template' do env = create(Environment, :name => 'test env') p = create(Community, :name => 'test_com', :identifier => 'test_com', :environment => env) assert_kind_of Community, p.template end should 'return active_community_fields' do e = Environment.default e.expects(:active_community_fields).returns(['contact_phone', 'contact_email']).at_least_once ent = build(Community, :environment => e) assert_equal e.active_community_fields, ent.active_fields end should 'return required_community_fields' do e = Environment.default e.expects(:required_community_fields).returns(['contact_phone', 'contact_email']).at_least_once community = build(Community, :environment => e) assert_equal e.required_community_fields, community.required_fields end should 'require fields if community needs' do e = Environment.default e.expects(:required_community_fields).returns(['contact_phone']).at_least_once community = build(Community, :name => 'My community', :environment => e) refute community.valid? assert community.errors[:contact_phone.to_s].present? community.contact_phone = '99999' community.valid? refute community.errors[:contact_phone.to_s].present? end should 'not require fields if community is a template' do e = Environment.default e.expects(:required_community_fields).returns(['contact_phone']).at_least_once community = build(Community, :name => 'My community', :environment => e) refute community.valid? assert community.errors[:contact_phone.to_s].present? community.is_template = true community.valid? refute community.errors[:contact_phone.to_s].present? end should 'return newest text articles as news' do c = fast_create(Community, :name => 'test_com') f = fast_create(Folder, :name => 'folder', :profile_id => c.id) u = create(UploadedFile, :profile => c, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) older_t = fast_create(TinyMceArticle, :name => 'old news', :profile_id => c.id) t = fast_create(TinyMceArticle, :name => 'news', :profile_id => c.id) t_in_f = fast_create(TinyMceArticle, :name => 'news', :profile_id => c.id, :parent_id => f.id) assert_equal [t_in_f, t], c.news(2) end should 'not return highlighted news when not asked' do c = fast_create(Community, :name => 'test_com') highlighted_t = fast_create(TinyMceArticle, :name => 'high news', :profile_id => c.id, :highlighted => true) t = fast_create(TinyMceArticle, :name => 'news', :profile_id => c.id) assert_equal [t].map(&:slug), c.news(2).map(&:slug) end should 'return highlighted news when asked' do c = fast_create(Community, :name => 'test_com') highlighted_t = fast_create(TinyMceArticle, :name => 'high news', :profile_id => c.id, :highlighted => true) t = fast_create(TinyMceArticle, :name => 'news', :profile_id => c.id) assert_equal [highlighted_t].map(&:slug), c.news(2, true).map(&:slug) end should 'sanitize description' do c = create(Community, :name => 'test_com', :description => 'new community') assert_sanitized c.description end should 'sanitize name' do c = create(Community, :name => 'test_com') assert_sanitized c.name end should 'create a task when creating a community if feature is enabled' do env = Environment.default env.enable('admin_must_approve_new_communities') person.stubs(:notification_emails).returns(['sample@example.org']) assert_difference 'CreateCommunity.count' do Community.create_after_moderation(person, {:environment => env, :name => 'Example'}) end assert_no_difference 'Community.count' do Community.create_after_moderation(person, {:environment => env, :name => 'Example'}) end end should 'create a community if feature is disabled' do env = Environment.default env.disable('admin_must_approve_new_communities') assert_difference 'Community.count' do Community.create_after_moderation(person, {:environment => env, :name => 'Example 1'}) end assert_no_difference 'CreateCommunity.count' do Community.create_after_moderation(person, {:environment => env, :name => 'Example 2'}) end end should 'set as member without task if organization is closed and has no members' do community = fast_create(Community) community.closed = true community.save assert_no_difference 'AddMember.count' do community.add_member(person) end assert person.is_member_of?(community) end should 'set as member without task if organization is not closed and has no members' do community = fast_create(Community) assert_no_difference 'AddMember.count' do community.add_member(person) end assert person.is_member_of?(community) end should 'not create new request membership if it already exists' do community = fast_create(Community) community.closed = true community.save community.add_member(fast_create(Person)) community.reload community.stubs(:notification_emails).returns(['sample@example.org']) assert_difference 'AddMember.count' do community.add_member(person) end assert_no_difference 'AddMember.count' do community.add_member(person) end end should 'escape malformed html tags' do community = Community.new community.name = "

> html >< tag" community.address = "

,<< html >< tag" community.contact_phone = "

>> html >><>< tag" community.description = "

>><<> html ><>h1< tag" community.valid? assert_no_match /[<>]/, community.name assert_no_match /[<>]/, community.address assert_no_match /[<>]/, community.contact_phone assert_no_match /[<>]/, community.description end should "the followed_by method be protected and true to the community members by default" do c = fast_create(Community) p1 = fast_create(Person) p2 = fast_create(Person) p3 = fast_create(Person) refute p1.is_member_of?(c) c.add_member(p1) assert p1.is_member_of?(c) refute p3.is_member_of?(c) c.add_member(p3) assert p3.is_member_of?(c) assert_equal true, c.send(:followed_by?,p1) assert_equal true, c.send(:followed_by?,p3) assert_equal false, c.send(:followed_by?,p2) end should "be created an tracked action when the user is join to the community" do p1 = Person.first community = fast_create(Community) p2 = fast_create(Person) p3 = fast_create(Person) RoleAssignment.delete_all ActionTrackerNotification.delete_all assert_difference 'ActionTrackerNotification.count', 5 do community.add_member(p1) process_delayed_job_queue community.add_member(p3) assert p1.is_member_of?(community) refute p2.is_member_of?(community) assert p3.is_member_of?(community) process_delayed_job_queue end ActionTrackerNotification.all.map{|a|a.profile}.map do |profile| assert [community,p1,p3].include?(profile) end end should "update the action of article creation when an community's article is commented" do ActionTrackerNotification.delete_all p1 = Person.first community = fast_create(Community) p2 = create_user.person p3 = create_user.person community.add_member(p3) article = create(TextileArticle, :profile_id => community.id) time = article.activity.updated_at + 1.day Time.stubs(:now).returns(time) create(Comment, :source_id => article.id, :title => 'some', :body => 'some', :author_id => p2.id) process_delayed_job_queue assert_equal time, article.activity.updated_at end should "see get all received scraps" do c = fast_create(Community) assert_equal [], c.scraps_received fast_create(Scrap, :receiver_id => c.id) fast_create(Scrap, :receiver_id => c.id) assert_equal 2, c.scraps_received.count c2 = fast_create(Community) fast_create(Scrap, :receiver_id => c2.id) assert_equal 2, c.scraps_received.count fast_create(Scrap, :receiver_id => c.id) assert_equal 3, c.scraps_received.count end should "see get all received scraps that are not replies" do c = fast_create(Community) s1 = fast_create(Scrap, :receiver_id => c.id) s2 = fast_create(Scrap, :receiver_id => c.id) s3 = fast_create(Scrap, :receiver_id => c.id, :scrap_id => s1.id) assert_equal 3, c.scraps_received.count assert_equal [s1,s2], c.scraps_received.not_replies c2 = fast_create(Community) s4 = fast_create(Scrap, :receiver_id => c2.id) s5 = fast_create(Scrap, :receiver_id => c2.id, :scrap_id => s4.id) assert_equal 2, c2.scraps_received.count assert_equal [s4], c2.scraps_received.not_replies end should "the community browse for a scrap with a Scrap object" do c = fast_create(Community) s1 = fast_create(Scrap, :receiver_id => c.id) s2 = fast_create(Scrap, :receiver_id => c.id) s3 = fast_create(Scrap, :receiver_id => c.id) assert_equal s2, c.scraps(s2) end should "the person browse for a scrap with an integer and string id" do c = fast_create(Community) s1 = fast_create(Scrap, :receiver_id => c.id) s2 = fast_create(Scrap, :receiver_id => c.id) s3 = fast_create(Scrap, :receiver_id => c.id) assert_equal s2, c.scraps(s2.id) assert_equal s2, c.scraps(s2.id.to_s) end should 'receive scrap notification' do community = fast_create(Community) assert_equal false, community.receives_scrap_notification? end should 'return scraps as activities' do person = fast_create(Person) community = fast_create(Community) scrap = create(Scrap, defaults_for_scrap(:sender => person, :receiver => community, :content => 'A scrap')) activity = ActionTracker::Record.last assert_equal [scrap], community.activities.map(&:activity) end should 'return tracked_actions of community as activities' do person = create_user.person community = fast_create(Community) User.current = person.user assert_difference 'ActionTracker::Record.count', 1 do article = create(TinyMceArticle, :profile => community, :name => 'An article about free software') assert_equal [article.activity], community.activities.map(&:activity) end end should 'not return tracked_actions of other community as activities' do person = fast_create(Person) community = fast_create(Community) community2 = fast_create(Community) User.current = person.user article = create(TinyMceArticle, :profile => community2, :name => 'Another article about free software') assert_not_includes community.activities.map { |a| a.klass.constantize.find(a.id) }, article.activity end should 'check if a community admin user is really a community admin' do c = fast_create(Community, :name => 'my test profile', :identifier => 'mytestprofile') admin = create_user('adminuser').person c.add_admin(admin) assert c.is_admin?(admin) end should 'a member user not be a community admin' do c = fast_create(Community, :name => 'my test profile', :identifier => 'mytestprofile') admin = create_user('adminuser').person c.add_admin(admin) member = create_user('memberuser').person c.add_member(member) refute c.is_admin?(member) end should 'a moderator user not be a community admin' do c = fast_create(Community, :name => 'my test profile', :identifier => 'mytestprofile') moderator = create_user('moderatoruser').person c.add_moderator(moderator) refute c.is_admin?(moderator) end end