require_relative "../test_helper" require 'content_viewer_controller' class ContentViewerControllerTest < ActionController::TestCase all_fixtures def setup @controller = ContentViewerController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new @profile = create_user('testinguser').person @environment = @profile.environment end attr_reader :profile, :environment def test_should_display_page page = profile.articles.build(:name => 'test') page.save! uses_host 'colivre.net' get :view_page, :profile => profile.identifier, :page => [ 'test' ] assert_response :success assert_equal page, assigns(:page) end def test_should_display_homepage a = profile.articles.build(:name => 'test') a.save! profile.home_page = a profile.save! get :view_page, :profile => profile.identifier, :page => [ 'test'] assert_response :success assert_template 'view_page' assert_equal a, assigns(:page) end def test_should_get_not_found_error_for_unexisting_page uses_host 'anhetegua.net' get :view_page, :profile => 'aprofile', :page => ['some_unexisting_page'] assert_response :missing end def test_should_get_not_found_error_for_unexisting_profile Profile.delete_all uses_host 'anhetegua' get :view_page, :profile => 'some_unexisting_profile', :page => [] assert_response :missing end should 'produce a download-link when article is a uploaded file' do profile = create_user('someone').person html = UploadedFile.create! :uploaded_data => fixture_file_upload('/files/500.html', 'text/html'), :profile => profile html.save! get :view_page, :profile => 'someone', :page => [ '500.html' ] assert_response :success assert_match /#{html.public_filename}/, @response.body end should 'download file when article is image' do profile = create_user('someone').person image = UploadedFile.create! :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => profile image.save! get :view_page, :profile => 'someone', :page => [ 'rails.png' ] assert_response :success assert_not_nil assigns(:page).data assert_match /image\/png/, @response.headers['Content-Type'] end should 'display image on a page when article is image and has a view param' do profile = create_user('someone').person image = UploadedFile.create! :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => profile image.save! get :view_page, :profile => 'someone', :page => [ 'rails.png' ], :view => true assert_response :success assert_template 'view_page' assert_match /text\/html/, @response.headers['Content-Type'] end should 'produce a download-link when article is not text/html' do # for example, RSS feeds profile = create_user('someone').person page = profile.articles.build(:name => 'myarticle', :body => 'the body of the text') page.save! feed = RssFeed.new(:name => 'testfeed') feed.profile = profile feed.save! get :view_page, :profile => 'someone', :page => [ 'testfeed' ] assert_response :success assert_match /^text\/xml/, @response.headers['Content-Type'] assert_equal feed.data, @response.body end should "display current article's tags" do page = profile.articles.create!(:name => 'myarticle', :body => 'test article', :tag_list => 'tag1, tag2') get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ] assert_tag :tag => 'div', :attributes => { :id => 'article-tags' }, :descendant => { :tag => 'a', :attributes => { :href => "/profile/#{profile.identifier}/tags/tag1" } } assert_tag :tag => 'div', :attributes => { :id => 'article-tags' }, :descendant => { :tag => 'a', :attributes => { :href => "/profile/#{profile.identifier}/tags/tag2" } } assert_tag :tag => 'div', :attributes => { :id => 'article-tags' }, :descendant => { :content => /This article's tags:/ } end should "display image label on article image" do page = TinyMceArticle.create!( :profile => profile, :name => 'myarticle', :image_builder => { :uploaded_data => fixture_file_upload('/files/tux.png', 'image/png'), :label => 'test-label' } ) get :view_page, page.url assert_match /test-label/, @response.body end should "not display current article's tags" do page = profile.articles.create!(:name => 'myarticle', :body => 'test article') get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ] assert_no_tag :tag => 'div', :attributes => { :id => 'article-tags' } assert_no_tag :tag => 'div', :attributes => { :id => 'article-tags' }, :descendant => { :content => /This article's tags:/ } end should 'not display forbidden articles' do profile.articles.create!(:name => 'test') profile.update!({:public_content => false}, :without_protection => true) Article.any_instance.expects(:display_to?).with(anything).returns(false) get :view_page, :profile => profile.identifier, :page => [ 'test' ] assert_response 403 end should 'display allowed articles' do profile.articles.create!(:name => 'test') profile.update!({:public_content => false}, :without_protection => true) Article.any_instance.expects(:display_to?).with(anything).returns(true) get :view_page, :profile => profile.identifier, :page => [ 'test' ] assert_response 200 end should 'give 404 status on unexisting article' do profile.articles.delete_all get :view_page, :profile => profile.identifier, :page => [ 'VERY-UNPROBABLE-PAGE' ] assert_response 404 end should 'show access denied to unpublished articles' do profile.articles.create!(:name => 'test', :published => false) get :view_page, :profile => profile.identifier, :page => [ 'test' ] assert_response 403 end should 'show unpublished articles to the user himself' do profile.articles.create!(:name => 'test', :published => false) login_as(profile.identifier) get :view_page, :profile => profile.identifier, :page => [ 'test' ] assert_response :success end should 'not show private content to members' do community = fast_create(Community) admin = fast_create(Person) community.add_member(admin) folder = fast_create(Folder, :profile_id => community.id, :published => false, :show_to_followers => false) community.add_member(profile) login_as(profile.identifier) get :view_page, :profile => community.identifier, :page => [ folder.path ] assert_template 'shared/access_denied' end should 'show private content to profile moderators' do community = Community.create!(:name => 'testcomm') community.articles.create!(:name => 'test', :published => false) community.add_moderator(profile) login_as(profile.identifier) get :view_page, :profile => community.identifier, :page => [ 'test' ] assert_response :success end should 'show private content to profile admins' do community = Community.create!(:name => 'testcomm') community.articles.create!(:name => 'test', :published => false) community.add_admin(profile) login_as(profile.identifier) get :view_page, :profile => community.identifier, :page => [ 'test' ] assert_response :success end should 'load the correct profile when using hosted domain' do profile = create_user('mytestuser').person profile.domains << Domain.create!(:name => 'micojones.net') profile.save! ActionController::TestRequest.any_instance.expects(:host).returns('www.micojones.net').at_least_once get :view_page, :page => [] assert_equal profile, assigns(:profile) end should 'give link to edit the article for owner' do login_as('testinguser') xhr :get, :view_page, :profile => 'testinguser', :page => [], :toolbar => true assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/edit/#{@profile.home_page.id}" } } end should 'not give link to edit the article for non-logged-in people' do xhr :get, :view_page, :profile => 'testinguser', :page => [], :toolbar => true assert_no_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/edit/#{@profile.home_page.id}" } } end should 'not give link to edit article for other people' do login_as(create_user('anotheruser').login) xhr :get, :view_page, :profile => 'testinguser', :page => [], :toolbar => true assert_no_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/edit/#{@profile.home_page.id}" } } end should 'give link to create new article' do login_as('testinguser') xhr :get, :view_page, :profile => 'testinguser', :page => [], :toolbar => true assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/new" } } end should 'give no link to create new article for non-logged in people ' do xhr :get, :view_page, :profile => 'testinguser', :page => [], :toolbar => true assert_no_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/new" } } end should 'give no link to create new article for other people' do login_as(create_user('anotheruser').login) xhr :get, :view_page, :profile => 'testinguser', :page => [], :toolbar => true assert_no_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/new" } } end should 'give link to create new article inside folder' do login_as('testinguser') folder = Folder.create!(:name => 'myfolder', :profile => @profile) xhr :get, :view_page, :profile => 'testinguser', :page => [ 'myfolder' ], :toolbar => true assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/new?parent_id=#{folder.id}" } } end should 'not give access to private articles if logged off' do profile = Community.create!(:name => 'test profile', :identifier => 'test_profile') intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false) get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] assert_template "shared/access_denied" end should 'not give access to private articles if logged in but not member' do login_as('testinguser') profile = Community.create!(:name => 'test profile', :identifier => 'test_profile') intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false) get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] assert_template "profile/_private_profile" end should 'not give access to private articles if logged in and only member' do person = create_user('test_user').person profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false, :show_to_followers => false) profile.affiliate(person, Profile::Roles.member(profile.environment.id)) login_as('test_user') get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] assert_template 'shared/access_denied' end should 'give access to private articles if logged in and moderator' do person = create_user('test_user').person profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false) profile.affiliate(person, Profile::Roles.moderator(profile.environment.id)) login_as('test_user') get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] assert_template 'view_page' end should 'give access to private articles if logged in and admin' do person = create_user('test_user').person profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false) profile.affiliate(person, Profile::Roles.admin(profile.environment.id)) login_as('test_user') get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] assert_template 'view_page' end should 'list comments if article has them, even if new comments are not allowed' do page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text', :accept_comments => false) page.comments.create!(:author => profile, :title => 'list my comment', :body => 'foo bar baz') get :view_page, :profile => profile.identifier, :page => ['myarticle'] assert_tag :content => /list my comment/ end should 'redirect to new article path under an old path' do p = create_user('test_user').person a = p.articles.create(:name => 'old-name') old_path = a.path a.name = 'new-name' a.save! get :view_page, :profile => p.identifier, :page => old_path assert_response :redirect assert_redirected_to :host => p.default_hostname, :controller => 'content_viewer', :action => 'view_page', :profile => p.identifier, :page => a.path end should 'load new article name equal of another article old name' do p = create_user('test_user').person a1 = p.articles.create!(:name => 'old-name') old_path = a1.path a1.name = 'new-name' a1.save! a2 = p.articles.create!(:name => 'old-name') get :view_page, :profile => p.identifier, :page => old_path assert_equal a2, assigns(:page) end should 'redirect to article with most recent version with the name if there is no article with the name' do p = create_user('test_user').person a1 = p.articles.create!(:name => 'old-name') old_path = a1.path a1.name = 'new-name' a1.save! a2 = p.articles.create!(:name => 'old-name') a2.name = 'other-new-name' a2.save! get :view_page, :profile => p.identifier, :page => old_path assert_response :redirect assert_redirected_to :host => p.default_hostname, :controller => 'content_viewer', :action => 'view_page', :profile => p.identifier, :page => a2.path end should "display current article's versions" do page = TextArticle.create!(:name => 'myarticle', :body => 'test article', :display_versions => true, :profile => profile) page.body = 'test article edited'; page.save get :article_versions, :profile => profile.identifier, :page => [ 'myarticle' ] assert_select "ul#article-versions a[href=http://#{profile.environment.default_hostname}/#{profile.identifier}/#{page.path}?version=1]" end should "fetch correct article version" do page = TextArticle.create!(:name => 'myarticle', :body => 'original article', :display_versions => true, :profile => profile) page.body = 'edited article'; page.save get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ], :version => 1 assert_tag :tag => 'div', :attributes => { :class => /article-body/ }, :content => /original article/ end should "display current article if version does not exist" do page = TextArticle.create!(:name => 'myarticle', :body => 'original article', :display_versions => true, :profile => profile) page.body = 'edited article'; page.save get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ], :version => 'bli' assert_tag :tag => 'div', :attributes => { :class => /article-body/ }, :content => /edited article/ end should "display differences between article's versions" do page = TextArticle.create!(:name => 'myarticle', :body => 'original article', :display_versions => true, :profile => profile) page.body = 'edited article'; page.save get :versions_diff, :profile => profile.identifier, :page => [ 'myarticle' ], :v1 => 1, :v2 => 2; assert_tag :tag => 'li', :attributes => { :class => /del/ }, :content => /original/ assert_tag :tag => 'li', :attributes => { :class => /ins/ }, :content => /edited/ assert_response :success end should 'not return an article of a different user' do p1 = create_user('test_user').person a = p1.articles.create!(:name => 'old-name') old_path = a.path a.name = 'new-name' a.save! p2 = create_user('another_user').person get :view_page, :profile => p2.identifier, :page => old_path assert_response :missing end should 'not show a profile in an environment that is not its home environment' do p = create(Profile, :identifier => 'mytestprofile', :name => 'My test profile', :environment => Environment.default) current = fast_create(Environment, :name => 'test environment') current.domains.create!(:name => 'example.com') uses_host 'www.example.com' get :view_page, :profile => 'mytestprofile', :page => [] assert_response :missing end should 'list unpublished posts to owner with a different class' do login_as('testinguser') blog = Blog.create!(:name => 'A blog test', :profile => profile) blog.posts << TextileArticle.create!(:name => 'Post', :profile => profile, :parent => blog, :published => false) get :view_page, :profile => profile.identifier, :page => [blog.path] assert_tag :tag => 'div', :attributes => {:class => /not-published/} end should 'not list unpublished posts to a not logged person' do blog = Blog.create!(:name => 'A blog test', :profile => profile) blog.posts << TextileArticle.create!(:name => 'Post', :profile => profile, :parent => blog, :published => false) get :view_page, :profile => profile.identifier, :page => [blog.path] assert_no_tag :tag => 'a', :content => "Post" end should 'display pagination links of blog' do blog = Blog.create!(:name => 'A blog test', :profile => profile, :posts_per_page => 5) for n in 1..10 blog.posts << TextileArticle.create!(:name => "Post #{n}", :profile => profile, :parent => blog) end assert_equal 10, blog.posts.size get :view_page, :profile => profile.identifier, :page => [blog.path] assert_tag :tag => 'a', :attributes => { :href => "/#{profile.identifier}/#{blog.path}?npage=2", :rel => 'next' } end should 'display first page of blog posts' do blog = Blog.create!(:name => 'My blog', :profile => profile, :posts_per_page => 5) for n in 1..10 blog.children << TextileArticle.create!(:name => "Post #{n}", :profile => profile, :parent => blog) end assert_equal 10, blog.posts.size get :view_page, :profile => profile.identifier, :page => [blog.path] for n in 1..5 assert_no_tag :tag => 'h1', :attributes => { :class => 'title' }, :descendant => {:tag => 'a', :attributes => {:href => /\/#{profile.identifier}\/my-blog\/post-#{n}/}, :content => "Post #{n}"} end for n in 6..10 assert_tag :tag => 'h1', :attributes => { :class => 'title' }, :descendant => {:tag => 'a', :attributes => {:href => /\/#{profile.identifier}\/my-blog\/post-#{n}/}, :content => "Post #{n}"} end end should 'display others pages of blog posts' do blog = Blog.create!(:name => 'My blog', :profile => profile, :posts_per_page => 5) for n in 1..10 blog.children << TextileArticle.create!(:name => "Post #{n}", :profile => profile, :parent => blog) end assert_equal 10, blog.posts.size get :view_page, :profile => profile.identifier, :page => [blog.path], :npage => 2 for n in 1..5 assert_tag :tag => 'h1', :attributes => { :class => 'title' }, :descendant => {:tag => 'a', :attributes => {:href => /\/#{profile.identifier}\/my-blog\/post-#{n}/}, :content => "Post #{n}"} end for n in 6..10 assert_no_tag :tag => 'h1', :attributes => { :class => 'title' }, :descendant => {:tag => 'a', :attributes => {:href => /\/#{profile.identifier}\/my-blog\/post-#{n}/}, :content => "Post #{n}"} end end should 'set year and month filter from URL params' do blog = Blog.create!(:name => "blog", :profile => profile) profile.articles << blog past_post = create(TextileArticle, :name => "past post", :profile => profile, :parent => blog, :published_at => blog.created_at - 1.year) current_post = TextileArticle.create!(:name => "current post", :profile => profile, :parent => blog) blog.children << past_post blog.children << current_post year, month = profile.blog.created_at.year.to_s, '%02d' % profile.blog.created_at.month get :view_page, :profile => profile.identifier, :page => [profile.blog.path], :year => year, :month => month assert_no_tag :tag => 'a', :content => past_post.title assert_tag :tag => 'a', :content => current_post.title end should 'give link to create new article inside folder when view child of folder' do login_as('testinguser') folder = Folder.create!(:name => 'myfolder', :profile => @profile) folder.children << TextileArticle.new(:name => 'children-article', :profile => @profile) xhr :get, :view_page, :profile => 'testinguser', :page => [ 'myfolder', 'children-article' ], :toolbar => true assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/new?parent_id=#{folder.id}" } } end should "display 'New article' when create children of folder" do login_as(profile.identifier) a = Folder.new(:name => 'article folder'); profile.articles << a; a.save! Article.stubs(:short_description).returns('bli') xhr :get, :view_page, :profile => profile.identifier, :page => [a.path], :toolbar => true assert_tag :tag => 'a', :content => 'New article' end should "display 'New post' when create children of blog" do login_as(profile.identifier) a = Blog.create!(:name => 'article folder', :profile => profile) Article.stubs(:short_description).returns('bli') xhr :get, :view_page, :profile => profile.identifier, :page => [a.path], :toolbar => true assert_tag :tag => 'a', :content => 'New post' end should "display same label for new article button of parent" do login_as(profile.identifier) a = Blog.create!(:name => 'article folder', :profile => profile) Article.stubs(:short_description).returns('bli') t = TextileArticle.create!(:name => 'first post', :parent => a, :profile => profile) xhr :get, :view_page, :profile => profile.identifier, :page => [t.path], :toolbar => true assert_tag :tag => 'a', :content => 'New post' end should 'display button to remove article' do login_as(profile.identifier) t = TextileArticle.create!(:name => 'article to destroy', :profile => profile) xhr :get, :view_page, :profile => profile.identifier, :page => [t.path], :toolbar => true assert_tag :tag => 'a', :content => 'Delete', :attributes => {:href => "/myprofile/#{profile.identifier}/cms/destroy/#{t.id}"} end should 'not display delete button for homepage' do login_as(profile.identifier) page = profile.home_page xhr :get, :view_page, :profile => profile.identifier, :page => page.path, :toolbar => true assert_no_tag :tag => 'a', :content => 'Delete', :attributes => { :href => "/myprofile/#{profile.identifier}/cms/destroy/#{page.id}" } end should 'add meta tag to rss feed on view blog' do login_as(profile.identifier) profile.articles << Blog.new(:name => 'Blog', :profile => profile) get :view_page, :profile => profile.identifier, :page => ['blog'] assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'Blog', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" } end should 'add meta tag to rss feed on view post blog' do login_as(profile.identifier) blog = Blog.create!(:name => 'Blog', :profile => profile) TextileArticle.create!(:name => 'first post', :parent => blog, :profile => profile) get :view_page, :profile => profile.identifier, :page => ['blog', 'first-post'] assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'Blog', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" } end should 'hit the article when viewed' do a = profile.articles.create!(:name => 'test article') get :view_page, :profile => profile.identifier, :page => [a.path] a.reload assert_equal 1, a.hits end should 'render html for image when view' do file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => profile) get :view_page, :profile => profile.identifier, :page => file.path, :view => true assert_response :success assert_template 'view_page' end should "display 'Upload files' when create children of image gallery" do login_as(profile.identifier) f = Gallery.create!(:name => 'gallery', :profile => profile) xhr :get, :view_page, :profile => profile.identifier, :page => f.path, :toolbar => true assert_tag :tag => 'a', :content => 'Upload files', :attributes => {:href => /parent_id=#{f.id}/} end should "display 'New article' when showing folder child of image gallery" do login_as(profile.identifier) folder1 = Gallery.create!(:name => 'gallery1', :profile => profile) folder1.children << folder2 = Folder.new(:name => 'gallery2', :profile => profile) xhr :get, :view_page, :profile => profile.identifier, :page => folder2.path, :toolbar => true assert_tag :tag => 'a', :content => 'New article', :attributes => {:href =>/parent_id=#{folder2.id}/} end should "display 'Upload files' to image gallery when showing its children" do login_as(profile.identifier) folder = Gallery.create!(:name => 'gallery', :profile => profile) file = UploadedFile.create!(:profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) xhr :get, :view_page, :profile => profile.identifier, :page => file.path, :view => true, :toolbar => true assert_tag :tag => 'a', :content => 'Upload files', :attributes => {:href => /parent_id=#{folder.id}/} end should 'render slideshow template' do f = Folder.create!(:name => 'gallery', :profile => profile) get :view_page, :profile => profile.identifier, :page => f.path, :slideshow => true assert_template 'slideshow' end should 'display all images from profile in the slideshow' do @controller.stubs(:per_page).returns(1) folder = Gallery.create!(:name => 'gallery', :profile => profile) image1 = UploadedFile.create!(:profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg')) image2 = UploadedFile.create!(:profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) get :view_page, :profile => profile.identifier, :page => folder.path, :slideshow => true assert_equal 2, assigns(:images).size end should 'not display private images in the slideshow for unauthorized people' do owner = create_user('owner').person unauthorized = create_user('unauthorized').person folder = Gallery.create!(:name => 'gallery', :profile => owner) image1 = UploadedFile.create!(:profile => owner, :parent => folder, :uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg'), :published => false) login_as('unauthorized') get :view_page, :profile => owner.identifier, :page => folder.path, :slideshow => true assert_response :success assert_equal 0, assigns(:images).length end should 'not display private images thumbnails for unauthorized people' do owner = create_user('owner').person unauthorized = create_user('unauthorized').person folder = Gallery.create!(:name => 'gallery', :profile => owner) image1 = UploadedFile.create!(:profile => owner, :parent => folder, :uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg'), :published => false) login_as('unauthorized') get :view_page, :profile => owner.identifier, :page => folder.path assert_response :success assert_select '.image-gallery-item', 0 end should 'display default image in the slideshow if thumbnails were not processed' do @controller.stubs(:per_page).returns(1) folder = Gallery.create!(:name => 'gallery', :profile => profile) image1 = UploadedFile.create!(:profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg')) get :view_page, :profile => profile.identifier, :page => folder.path, :slideshow => true assert_tag :tag => 'img', :attributes => {:src => /\/images\/icons-app\/image-loading-display.png/} end should 'display thumbnail image in the slideshow if thumbnails were processed' do @controller.stubs(:per_page).returns(1) folder = Gallery.create!(:name => 'gallery', :profile => profile) image1 = UploadedFile.create!(:profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg')) process_delayed_job_queue get :view_page, :profile => profile.identifier, :page => folder.path, :slideshow => true assert_tag :tag => 'img', :attributes => {:src => /other-pic_display.jpg/} end should 'display default image in gallery if thumbnails were not processed' do @controller.stubs(:per_page).returns(1) folder = Gallery.create!(:name => 'gallery', :profile => profile) image1 = UploadedFile.create!(:profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg')) get :view_page, :profile => profile.identifier, :page => folder.path assert_tag :tag => 'a', :attributes => {:class => 'image', :style => /background-image: url\(\/images\/icons-app\/image-loading-thumb.png\)/} end should 'display thumbnail image in gallery if thumbnails were processed' do @controller.stubs(:per_page).returns(1) folder = Gallery.create!(:name => 'gallery', :profile => profile) image1 = UploadedFile.create!(:profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/other-pic.jpg', 'image/jpg')) process_delayed_job_queue get :view_page, :profile => profile.identifier, :page => folder.path assert_tag :tag => 'a', :attributes => {:class => 'image', :style => /background-image: url\(.*\/other-pic_thumb.jpg\)/} end should 'display source from article' do profile.articles << TextileArticle.new(:name => "Article one", :profile => profile, :source => 'http://www.original-source.invalid') get :view_page, :profile => profile.identifier, :page => ['article-one'] assert_tag :tag => 'div', :attributes => { :id => 'article-source' }, :content => /http:\/\/www.original-source.invalid/ end should 'not display source if article has no source' do profile.articles << TextileArticle.new(:name => "Article one", :profile => profile) get :view_page, :profile => profile.identifier, :page => ['article-one'] assert_no_tag :tag => 'div', :attributes => { :id => 'article-source' } end should 'redirect to profile controller when there is no homepage' do profile.home_page.destroy get :view_page, :profile => profile.identifier, :page => [] assert_redirected_to :controller => 'profile', :action => 'index', :profile => profile.identifier end should "not display 'Upload files' when viewing blog" do login_as(profile.identifier) b = Blog.create!(:name => 'article folder', :profile => profile) xhr :get, :view_page, :profile => profile.identifier, :page => b.path, :toolbar => true assert_no_tag :tag => 'a', :content => 'Upload files', :attributes => {:href => /parent_id=#{b.id}/} end should "not display 'Upload files' when viewing post from a blog" do login_as(profile.identifier) b = Blog.create!(:name => 'article folder', :profile => profile) blog_post = TextileArticle.create!(:name => 'children-article', :profile => profile, :parent => b) xhr :get, :view_page, :profile => profile.identifier, :page => blog_post.path, :toolbar => true assert_no_tag :tag => 'a', :content => 'Upload files', :attributes => {:href => /parent_id=#{b.id}/} end should 'display title of image on image gallery' do login_as(profile.identifier) folder = fast_create(Gallery, :profile_id => profile.id) file = UploadedFile.create!(:title => 'my img title', :profile => profile, :parent => folder, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) get :view_page, :profile => profile.identifier, :page => folder.path assert_tag :tag => 'li', :attributes => {:title => 'my img title', :class => 'image-gallery-item'}, :child => {:tag => 'span', :content => 'my img title'} end should 'allow publisher owner view private articles' do c = Community.create!(:name => 'test_com') u = create_user_with_permission('test_user', 'publish_content', c) login_as u.identifier a = create(Article, :profile => c, :name => 'test-article', :author => u, :published => false) get :view_page, :profile => c.identifier, :page => a.path assert_response :success assert_template 'view_page' end should 'display link to new_article if profile is publisher' do c = Community.create!(:name => 'test_com') u = create_user_with_permission('test_user', 'publish_content', c) login_as u.identifier a = create(Article, :profile => c, :name => 'test-article', :author => profile, :published => true) xhr :get, :view_page, :profile => c.identifier, :page => a.path, :toolbar => true assert_tag :tag => 'a', :content => 'New article' end should 'display message if user was removed' do article = profile.articles.create(:name => 'comment test') to_be_removed = create_user('removed_user').person comment = article.comments.create(:author => to_be_removed, :title => 'Test Comment', :body => 'My author does not exist =(') to_be_removed.destroy get :view_page, :profile => profile.identifier, :page => article.path assert_tag :tag => 'span', :content => '(removed user)', :attributes => {:class => 'comment-user-status icon-user-removed'} end should 'show only first paragraph of blog posts if visualization_format is short' do login_as(profile.identifier) blog = Blog.create!(:name => 'A blog test', :profile => profile, :visualization_format => 'short') blog.posts << TinyMceArticle.create!(:name => 'first post', :parent => blog, :profile => profile, :body => '
Content to be displayed.
Anything') get :view_page, :profile => profile.identifier, :page => blog.path assert_tag :tag => 'div', :attributes => { :class => 'short-post'}, :content => /Content to be displayed./ assert_no_tag :tag => 'div', :attributes => { :class => 'short-post'}, :content => /Anything/ end should 'show only first paragraph with picture of posts if visualization_format is short+pic' do login_as(profile.identifier) blog = Blog.create!(:name => 'A blog test', :profile => profile, :visualization_format => 'short+pic') blog.posts << TinyMceArticle.create!(:name => 'first post', :parent => blog, :profile => profile, :body => 'Content to be displayed.
This is a bold statement right there!
" ) get :view_page, :profile => profile.identifier, :page => [blog.path] assert_tag :tag => 'strong', :content => /bold/ end should 'add extra content on article header from plugins' do class Plugin1 < Noosfero::Plugin def article_header_extra_contents(args) proc { content_tag('div', '', :class => 'plugin1') } end end class Plugin2 < Noosfero::Plugin def article_header_extra_contents(args) proc { content_tag('div', '', :class => 'plugin2') } end end Noosfero::Plugin.stubs(:all).returns([Plugin1.name, Plugin2.name]) Environment.default.enable_plugin(Plugin1.name) Environment.default.enable_plugin(Plugin2.name) page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') xhr :get, :view_page, :profile => profile.identifier, :page => [ 'myarticle' ], :toolbar => true assert_tag :tag => 'div', :attributes => {:class => 'plugin1'} assert_tag :tag => 'div', :attributes => {:class => 'plugin2'} end should 'display link to download of non-recognized file types on its page' do file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/test.txt', 'bin/unknown'), :profile => profile) get :view_page, file.url assert_match /#{file.public_filename}/, @response.body end should 'not count hit from bots' do article = fast_create(Article, :profile_id => profile.id) assert_no_difference 'article.hits' do @request.env['HTTP_USER_AGENT'] = 'bot' get 'view_page', :profile => profile.identifier, :page => article.path.split('/') @request.env['HTTP_USER_AGENT'] = 'spider' get 'view_page', :profile => profile.identifier, :page => article.path.split('/') @request.env['HTTP_USER_AGENT'] = 'crawler' get 'view_page', :profile => profile.identifier, :page => article.path.split('/') @request.env['HTTP_USER_AGENT'] = '(http://some-crawler.com)' get 'view_page', :profile => profile.identifier, :page => article.path.split('/') article.reload end end should 'manage private article visualization' do community = Community.create(:name => 'test-community') community.add_member(@profile) community.save! blog = community.articles.find_by_name("Blog") article = TinyMceArticle.create(:name => 'Article to be shared with images', :body => 'This article should be shared with all social networks', :profile => community, :published => false, :show_to_followers => true) article.parent = blog article.save! otheruser = create_user('otheruser').person community.add_member(otheruser) login_as(otheruser.identifier) get :view_page, :profile => community.identifier, "page" => 'blog' assert_response :success assert_tag :tag => 'h1', :attributes => { :class => /title/ }, :content => article.name article.show_to_followers = false article.save! get :view_page, :profile => community.identifier, "page" => 'blog' assert_no_tag :tag => 'h1', :attributes => { :class => /title/ }, :content => article.name end should 'add extra toolbar actions on article from plugins' do class Plugin1 < Noosfero::Plugin def article_extra_toolbar_buttons(article) {:title => 'some_title1', :icon => 'some_icon1', :url => {}} end end Noosfero::Plugin.stubs(:all).returns([Plugin1.name]) Environment.default.enable_plugin(Plugin1.name) page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ] assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :title => "some_title1" }} end should 'add more than one extra toolbar actions on article from plugins' do class Plugin1 < Noosfero::Plugin def article_extra_toolbar_buttons(article) {:title => 'some_title1', :icon => 'some_icon1', :url => {}} end end class Plugin2 < Noosfero::Plugin def article_extra_toolbar_buttons(article) {:title => 'some_title2', :icon => 'some_icon2', :url => {}} end end Noosfero::Plugin.stubs(:all).returns([Plugin1.name, Plugin2.name]) Environment.default.enable_plugin(Plugin1.name) Environment.default.enable_plugin(Plugin2.name) page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ] assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :title => "some_title1" }} assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :title => "some_title2" }} end should 'add icon attribute in extra toolbar actions on article from plugins' do class Plugin1 < Noosfero::Plugin def article_extra_toolbar_buttons(article) {:title => 'some_title', :icon => 'some_icon', :url => {}} end end Noosfero::Plugin.stubs(:all).returns([Plugin1.name]) Environment.default.enable_plugin(Plugin1.name) page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ] assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :class => /some_icon/ }} end should 'add url attribute in extra toolbar actions on article from plugins' do class Plugin1 < Noosfero::Plugin def article_extra_toolbar_buttons(article) {:title => 'some_title', :icon => 'some_icon', :url => '/someurl'} end end Noosfero::Plugin.stubs(:all).returns([Plugin1.name]) Environment.default.enable_plugin(Plugin1.name) page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ] assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/someurl" }} end should 'use context method in extra toolbar actions on article from plugins' do class Plugin1 < Noosfero::Plugin def article_extra_toolbar_buttons(article) if profile.public? {:title => 'some_title', :icon => 'some_icon', :url => '/someurl'} else {:title => 'another_title', :icon => 'another_icon', :url => '/anotherurl'} end end end Noosfero::Plugin.stubs(:all).returns([Plugin1.name]) Environment.default.enable_plugin(Plugin1.name) page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') profile.public_profile = false profile.save login_as(profile.identifier) get :view_page, :profile => profile.identifier, :page => [ 'myarticle' ] assert_tag :tag => 'div', :attributes => { :id => 'article-actions' }, :descendant => { :tag => 'a', :attributes => { :href => "/anotherurl" }} end should 'show lead,image and title in compact blog visualization' do community = Community.create(:name => 'test-community') community.add_member(@profile) community.save! blog = community.articles.find_by_name("Blog") blog.visualization_format = 'compact' blog.save! article = TinyMceArticle.create(:name => 'Article to be shared with images', :body => 'This article should be shared with all social networks', :profile => @profile, :published => false, :abstract => "teste teste teste", :show_to_followers => true, :image_builder => { :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')} ) article.parent = blog article.save! login_as(@profile.identifier) get :view_page, :profile => community.identifier, "page" => 'blog' assert_tag :tag => 'div', :attributes => { :class => 'article-compact-image' } assert_tag :tag => 'div', :attributes => { :class => 'article-compact-abstract-with-image' } end should 'not count a visit twice for the same user' do profile = create_user('someone').person login_as(@profile.identifier) page = profile.articles.build(:name => 'myarticle', :body => 'the body of the text') page.save! get :view_page, :profile => profile.identifier, :page => 'myarticle' page.reload assert_equal 1, page.hits get :view_page, :profile => profile.identifier, :page => 'myarticle' page.reload assert_equal 1, page.hits end should 'not count a visit twice for unlogged users' do profile = create_user('someone').person page = profile.articles.build(:name => 'myarticle', :body => 'the body of the text') page.save! get :view_page, :profile => profile.identifier, :page => 'myarticle' page.reload assert_equal 1, page.hits get :view_page, :profile => profile.identifier, :page => 'myarticle' page.reload assert_equal 1, page.hits end should 'show blog image only inside blog cover' do blog = create(Blog, :profile_id => profile.id, :name=>'testblog', :image_builder => { :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')}) blog.save! get :view_page, :profile => profile.identifier, :page => [blog.path] assert_select '.blog-cover > img', 1 assert_select '.article-body-img > img', 0 end end