diff options
Diffstat (limited to 'test/controllers')
| -rw-r--r-- | test/controllers/content_controller_test.rb | 13 | ||||
| -rw-r--r-- | test/controllers/csp_reports_controller_test.rb | 8 | ||||
| -rw-r--r-- | test/controllers/node_actions_controller_test.rb | 51 | ||||
| -rw-r--r-- | test/controllers/nodes_controller_test.rb | 120 | ||||
| -rw-r--r-- | test/controllers/page_translations_controller_test.rb | 11 |
5 files changed, 189 insertions, 14 deletions
diff --git a/test/controllers/content_controller_test.rb b/test/controllers/content_controller_test.rb index e8bc55f..9731d08 100644 --- a/test/controllers/content_controller_test.rb +++ b/test/controllers/content_controller_test.rb | |||
| @@ -73,8 +73,7 @@ class ContentControllerTest < ActionController::TestCase | |||
| 73 | def test_nonexistant_custom_template_defaults_to_standard_template | 73 | def test_nonexistant_custom_template_defaults_to_standard_template |
| 74 | new_node = create_node_under_root "fnord" | 74 | new_node = create_node_under_root "fnord" |
| 75 | draft = find_or_create_draft(new_node, @user1) | 75 | draft = find_or_create_draft(new_node, @user1) |
| 76 | draft.template_name = "huchibu" | 76 | draft.update_column(:template_name, "huchibu") |
| 77 | draft.save | ||
| 78 | new_node.publish_draft! | 77 | new_node.publish_draft! |
| 79 | 78 | ||
| 80 | get :render_page, params: { :locale => 'de', :page_path => ["fnord"] } | 79 | get :render_page, params: { :locale => 'de', :page_path => ["fnord"] } |
| @@ -105,6 +104,16 @@ class ContentControllerTest < ActionController::TestCase | |||
| 105 | assert_response :success | 104 | assert_response :success |
| 106 | File.write("/tmp/no_fill_response.html", @response.body) | 105 | File.write("/tmp/no_fill_response.html", @response.body) |
| 107 | end | 106 | end |
| 107 | |||
| 108 | test "render_gallery renders for a published page" do | ||
| 109 | node = Node.root.children.create!(:slug => "gallery_render_test") | ||
| 110 | Globalize.with_locale(I18n.default_locale) { node.draft.update!(:title => "Galerie") } | ||
| 111 | node.publish_draft! | ||
| 112 | |||
| 113 | get :render_gallery, params: { :page_path => "gallery_render_test", :locale => "de" } | ||
| 114 | |||
| 115 | assert_response :success | ||
| 116 | end | ||
| 108 | 117 | ||
| 109 | protected | 118 | protected |
| 110 | 119 | ||
diff --git a/test/controllers/csp_reports_controller_test.rb b/test/controllers/csp_reports_controller_test.rb new file mode 100644 index 0000000..7dd8c9e --- /dev/null +++ b/test/controllers/csp_reports_controller_test.rb | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | require 'test_helper' | ||
| 2 | |||
| 3 | class CspReportsControllerTest < ActionController::TestCase | ||
| 4 | test "accepts anonymous reports without CSRF" do | ||
| 5 | post :create, body: '{"csp-report":{"violated-directive":"script-src"}}' | ||
| 6 | assert_response :no_content | ||
| 7 | end | ||
| 8 | end | ||
diff --git a/test/controllers/node_actions_controller_test.rb b/test/controllers/node_actions_controller_test.rb new file mode 100644 index 0000000..8bc68ec --- /dev/null +++ b/test/controllers/node_actions_controller_test.rb | |||
| @@ -0,0 +1,51 @@ | |||
| 1 | require 'test_helper' | ||
| 2 | |||
| 3 | class NodeActionsControllerTest < ActionController::TestCase | ||
| 4 | |||
| 5 | def setup | ||
| 6 | login_as :quentin | ||
| 7 | end | ||
| 8 | |||
| 9 | def logged_node slug, title | ||
| 10 | node = Node.root.children.create!(:slug => slug) | ||
| 11 | Globalize.with_locale(I18n.default_locale) { node.draft.update!(:title => title) } | ||
| 12 | node | ||
| 13 | end | ||
| 14 | |||
| 15 | test "index renders" do | ||
| 16 | get :index | ||
| 17 | assert_response :success | ||
| 18 | end | ||
| 19 | |||
| 20 | test "index filters by node" do | ||
| 21 | node_a = logged_node("log_filter_a", "Alpha Subject") | ||
| 22 | node_b = logged_node("log_filter_b", "Beta Subject") | ||
| 23 | NodeAction.record!(:node => node_a, :action => "create", :user => users(:quentin)) | ||
| 24 | NodeAction.record!(:node => node_b, :action => "create", :user => users(:quentin)) | ||
| 25 | |||
| 26 | get :index, params: { :node_id => node_a.id } | ||
| 27 | |||
| 28 | assert_response :success | ||
| 29 | assert_includes @response.body, "Alpha Subject" | ||
| 30 | assert_not_includes @response.body, "Beta Subject" | ||
| 31 | end | ||
| 32 | |||
| 33 | test "index filters by user" do | ||
| 34 | node = logged_node("log_filter_user", "Gamma Subject") | ||
| 35 | NodeAction.record!(:node => node, :action => "create", :user => users(:quentin)) | ||
| 36 | |||
| 37 | get :index, params: { :user_id => users(:quentin).id } | ||
| 38 | assert_includes @response.body, "Gamma Subject" | ||
| 39 | |||
| 40 | other = User.where.not(:id => users(:quentin).id).first | ||
| 41 | get :index, params: { :user_id => other.id } | ||
| 42 | assert_not_includes @response.body, "Gamma Subject" | ||
| 43 | end | ||
| 44 | |||
| 45 | test "index requires login" do | ||
| 46 | session[:user_id] = nil | ||
| 47 | @controller.instance_variable_set(:@current_user, nil) | ||
| 48 | get :index | ||
| 49 | assert_response :redirect | ||
| 50 | end | ||
| 51 | end | ||
diff --git a/test/controllers/nodes_controller_test.rb b/test/controllers/nodes_controller_test.rb index 9da9514..ddc4565 100644 --- a/test/controllers/nodes_controller_test.rb +++ b/test/controllers/nodes_controller_test.rb | |||
| @@ -140,7 +140,7 @@ class NodesControllerTest < ActionController::TestCase | |||
| 140 | :page => { | 140 | :page => { |
| 141 | :title => "Hello", | 141 | :title => "Hello", |
| 142 | :body => "There", | 142 | :body => "There", |
| 143 | :template_name => "Foobar" | 143 | :template_name => "title_only" |
| 144 | } | 144 | } |
| 145 | } | 145 | } |
| 146 | 146 | ||
| @@ -148,7 +148,17 @@ class NodesControllerTest < ActionController::TestCase | |||
| 148 | test_node.reload | 148 | test_node.reload |
| 149 | assert_equal "Hello", test_node.head.title | 149 | assert_equal "Hello", test_node.head.title |
| 150 | assert_equal "There", test_node.head.body | 150 | assert_equal "There", test_node.head.body |
| 151 | assert_equal "Foobar", test_node.head.template_name | 151 | assert_equal "title_only", test_node.head.template_name |
| 152 | end | ||
| 153 | |||
| 154 | def test_update_rejects_a_template_name_not_on_disk | ||
| 155 | test_node = Node.root.children.create! :slug => "test_node" | ||
| 156 | login_as :quentin | ||
| 157 | put :update, params: { :id => test_node.id, | ||
| 158 | :page => { :title => "Hello", :template_name => "Foobar" } } | ||
| 159 | |||
| 160 | test_node.reload | ||
| 161 | assert_not_equal "Foobar", test_node.draft&.template_name | ||
| 152 | end | 162 | end |
| 153 | 163 | ||
| 154 | test "publish draft with staged_slug unqueal slug" do | 164 | test "publish draft with staged_slug unqueal slug" do |
| @@ -417,11 +427,11 @@ class NodesControllerTest < ActionController::TestCase | |||
| 417 | test "show never renders a destroy link for events" do | 427 | test "show never renders a destroy link for events" do |
| 418 | login_as :quentin | 428 | login_as :quentin |
| 419 | node = create_node_with_published_page | 429 | node = create_node_with_published_page |
| 420 | Event.create!(node_id: node.id, start_time: Time.now, end_time: Time.now + 1.hour) | 430 | event = Event.create!(node_id: node.id, start_time: Time.now, end_time: Time.now + 1.hour) |
| 421 | 431 | ||
| 422 | get :show, params: { id: node.id } | 432 | get :show, params: { id: node.id } |
| 423 | assert_response :success | 433 | assert_response :success |
| 424 | assert_select "form.button_to.destructive", count: 0 | 434 | assert_select "form[action=?]", event_path(event), count: 0 |
| 425 | end | 435 | end |
| 426 | 436 | ||
| 427 | test "reverting from nodes#show returns to the show page, not the editor, even if a draft remains" do | 437 | test "reverting from nodes#show returns to the show page, not the editor, even if a draft remains" do |
| @@ -469,7 +479,8 @@ class NodesControllerTest < ActionController::TestCase | |||
| 469 | login_as :quentin | 479 | login_as :quentin |
| 470 | get :show, params: { :id => node.id } | 480 | get :show, params: { :id => node.id } |
| 471 | assert_response :success | 481 | assert_response :success |
| 472 | assert_select "form.destructive", :count => 0 | 482 | assert_select "form[action=?]", revert_node_path(node), count: 0 |
| 483 | assert_select "form[action=?]", trash_node_path(node), count: 1 | ||
| 473 | end | 484 | end |
| 474 | 485 | ||
| 475 | test "drafts includes a never-published node with only a draft" do | 486 | test "drafts includes a never-published node with only a draft" do |
| @@ -647,4 +658,103 @@ class NodesControllerTest < ActionController::TestCase | |||
| 647 | assert_select ".sitemap_node_actions", :text => /Create Child/ | 658 | assert_select ".sitemap_node_actions", :text => /Create Child/ |
| 648 | assert_select ".sitemap_node_actions", :text => /Revisions/, :count => 0 | 659 | assert_select ".sitemap_node_actions", :text => /Revisions/, :count => 0 |
| 649 | end | 660 | end |
| 661 | |||
| 662 | test "create logs a create NodeAction with path and title" do | ||
| 663 | login_as :quentin | ||
| 664 | |||
| 665 | assert_difference "NodeAction.count" do | ||
| 666 | post :create, params: { :kind => "generic", :title => "Brand New", :parent_id => Node.root.id } | ||
| 667 | end | ||
| 668 | |||
| 669 | action = NodeAction.last | ||
| 670 | assert_equal "create", action.action | ||
| 671 | assert_equal users(:quentin), action.user | ||
| 672 | assert_equal Node.last, action.node | ||
| 673 | assert_equal "Brand New", action.metadata["title"] | ||
| 674 | assert_equal Node.last.unique_name, action.metadata["path"] | ||
| 675 | end | ||
| 676 | |||
| 677 | test "trash moves the node and redirects to the Trash" do | ||
| 678 | login_as :quentin | ||
| 679 | node = Node.root.children.create!(:slug => "trash_me") | ||
| 680 | |||
| 681 | put :trash, params: { :id => node.id } | ||
| 682 | |||
| 683 | assert_redirected_to trashed_nodes_path | ||
| 684 | assert node.reload.in_trash? | ||
| 685 | end | ||
| 686 | |||
| 687 | test "trashing the Trash node itself is refused" do | ||
| 688 | login_as :quentin | ||
| 689 | |||
| 690 | put :trash, params: { :id => Node.trash.id } | ||
| 691 | |||
| 692 | assert_redirected_to node_path(Node.trash) | ||
| 693 | assert flash[:error].present? | ||
| 694 | end | ||
| 695 | |||
| 696 | test "restore_from_trash reparents to the given parent" do | ||
| 697 | login_as :quentin | ||
| 698 | node = Node.root.children.create!(:slug => "restore_me") | ||
| 699 | node.trash!(users(:quentin)) | ||
| 700 | target = Node.root.children.create!(:slug => "restore_home") | ||
| 701 | |||
| 702 | put :restore_from_trash, params: { :id => node.id, :parent_id => target.id } | ||
| 703 | |||
| 704 | assert_redirected_to node_path(node) | ||
| 705 | assert_equal target, node.reload.parent | ||
| 706 | end | ||
| 707 | |||
| 708 | test "destroy refuses a node outside the Trash" do | ||
| 709 | login_as :quentin | ||
| 710 | node = Node.root.children.create!(:slug => "not_deletable_here") | ||
| 711 | |||
| 712 | delete :destroy, params: { :id => node.id } | ||
| 713 | |||
| 714 | assert Node.exists?(node.id) | ||
| 715 | assert flash[:error].present? | ||
| 716 | end | ||
| 717 | |||
| 718 | test "destroy deletes a trashed node and redirects to the Trash" do | ||
| 719 | login_as :quentin | ||
| 720 | node = Node.root.children.create!(:slug => "deletable") | ||
| 721 | node.trash!(users(:quentin)) | ||
| 722 | |||
| 723 | delete :destroy, params: { :id => node.id } | ||
| 724 | |||
| 725 | assert_not Node.exists?(node.id) | ||
| 726 | assert_redirected_to trashed_nodes_path | ||
| 727 | end | ||
| 728 | |||
| 729 | test "trash lists trashed subtree roots" do | ||
| 730 | login_as :quentin | ||
| 731 | node = Node.root.children.create!(:slug => "listed_in_trash") | ||
| 732 | node.trash!(users(:quentin)) | ||
| 733 | |||
| 734 | get :trashed | ||
| 735 | assert_response :success | ||
| 736 | assert_select "a[href=?]", node_path(node) | ||
| 737 | end | ||
| 738 | |||
| 739 | test "trashed rows carry provenance and a delete for childless roots" do | ||
| 740 | login_as :quentin | ||
| 741 | node = Node.root.children.create!(:slug => "provenance_test") | ||
| 742 | node.trash!(users(:quentin)) | ||
| 743 | |||
| 744 | get :trashed | ||
| 745 | assert_select "td", /quentin/ | ||
| 746 | assert_select "form[action=?]", node_path(node), count: 1 | ||
| 747 | end | ||
| 748 | |||
| 749 | test "show annotates history rows with their lifecycle" do | ||
| 750 | login_as :quentin | ||
| 751 | node = Node.root.children.create!(:slug => "history_annotation_test") | ||
| 752 | Globalize.with_locale(I18n.default_locale) { node.draft.update!(:title => "Annotated") } | ||
| 753 | node.publish_draft!(users(:quentin)) | ||
| 754 | |||
| 755 | get :show, params: { :id => node.id } | ||
| 756 | |||
| 757 | assert_response :success | ||
| 758 | assert_select "span.revision_lifecycle", /quentin/ | ||
| 759 | end | ||
| 650 | end | 760 | end |
diff --git a/test/controllers/page_translations_controller_test.rb b/test/controllers/page_translations_controller_test.rb index 82f8bce..feaacd0 100644 --- a/test/controllers/page_translations_controller_test.rb +++ b/test/controllers/page_translations_controller_test.rb | |||
| @@ -83,18 +83,15 @@ class PageTranslationsControllerTest < ActionController::TestCase | |||
| 83 | assert_equal "in progress", Globalize.with_locale(:en) { node.autosave.title } | 83 | assert_equal "in progress", Globalize.with_locale(:en) { node.autosave.title } |
| 84 | end | 84 | end |
| 85 | 85 | ||
| 86 | test "destroy logs a translation_destroy NodeAction" do | 86 | test "destroy removes the translation, logs nothing, and redirects" do |
| 87 | login_as :quentin | 87 | login_as :quentin |
| 88 | node = Node.root.children.create!(:slug => "translation_destroy_log_test") | 88 | node = Node.root.children.create!(:slug => "translation_destroy_log_test") |
| 89 | Globalize.with_locale(:en) { node.draft.update!(:title => "English title") } | 89 | Globalize.with_locale(:en) { node.draft.update!(:title => "English title") } |
| 90 | 90 | ||
| 91 | delete :destroy, params: { :node_id => node.id, :translation_locale => "en" } | 91 | assert_no_difference "NodeAction.count" do |
| 92 | delete :destroy, params: { :node_id => node.id, :translation_locale => "en" } | ||
| 93 | end | ||
| 92 | 94 | ||
| 93 | action = NodeAction.last | ||
| 94 | assert_equal node, action.node | ||
| 95 | assert_equal "en", action.locale | ||
| 96 | assert_equal "translation_destroy", action.action | ||
| 97 | assert_equal users(:quentin), action.user | ||
| 98 | assert_redirected_to node_path(node) | 95 | assert_redirected_to node_path(node) |
| 99 | end | 96 | end |
| 100 | end | 97 | end |
