From 262f4e0c2abfefbd6965358fdfd9a8c332a38d57 Mon Sep 17 00:00:00 2001 From: hukl Date: Wed, 7 Oct 2009 23:36:03 +0200 Subject: refactored revsions controller to act as a nested resource of nodes. boy that cleaned up some stuff quite a bit. also having tests for that is just feeling great --- app/controllers/revisions_controller.rb | 21 +++---- app/views/nodes/edit.html.erb | 2 +- app/views/nodes/index.html.erb | 2 +- app/views/nodes/show.html.erb | 2 +- app/views/revisions/diff.html.erb | 6 +- app/views/revisions/index.html.erb | 45 +++++++++++++- app/views/revisions/show.html.erb | 88 +++++++++++++++------------- config/routes.rb | 5 +- test/functional/nodes_controller_test.rb | 2 +- test/functional/revisions_controller_test.rb | 59 ++++++++++++++++++- 10 files changed, 164 insertions(+), 68 deletions(-) diff --git a/app/controllers/revisions_controller.rb b/app/controllers/revisions_controller.rb index 32110ae..05e8acc 100644 --- a/app/controllers/revisions_controller.rb +++ b/app/controllers/revisions_controller.rb @@ -7,12 +7,12 @@ class RevisionsController < ApplicationController layout 'admin' def index + @node = Node.find(params[:node_id]) end def diff - @node = Node.find(params[:id]) + @node = Node.find(params[:node_id]) - puts @node.pages.length if @node.pages.length > 1 params[:start_revision] ||= @node.pages.all[-2].revision params[:end_revision] ||= @node.pages.all[-1].revision @@ -20,26 +20,19 @@ class RevisionsController < ApplicationController params[:start], params[:end] = 1, 1 end - @start = Page.find( :first, :conditions => { - :node_id => params[:id], - :revision => params[:start_revision] - }) - - @end = Page.find( :first, :conditions => { - :node_id => params[:id], - :revision => params[:end_revision] - }) - + @start = @node.pages.find_by_revision( params[:start_revision] ) + @end = @node.pages.find_by_revision( params[:end_revision] ) end def show - @node = Node.find(params[:id]) + @node = Node.find(params[:node_id]) + @page = @node.pages.find(params[:id]) end def restore page = Page.find(params[:id]) page.node.restore_revision! page.revision flash[:notice] = "Revision #{page.revision} restored" - redirect_to :back + redirect_to node_path(page.node) end end diff --git a/app/views/nodes/edit.html.erb b/app/views/nodes/edit.html.erb index 0635dac..0063dd9 100644 --- a/app/views/nodes/edit.html.erb +++ b/app/views/nodes/edit.html.erb @@ -3,7 +3,7 @@ <%= link_to 'Show', @node %> <%= link_to 'Preview', preview_page_path(@draft) %> <%= link_to 'Publish', publish_node_path, :method => :put, :confirm => "Publish this draft?" %> - <%= link_to 'Revisions', revision_path(params[:id]) %> + <%= link_to 'Revisions', node_revisions_path(@node) %> <% end %>
diff --git a/app/views/nodes/index.html.erb b/app/views/nodes/index.html.erb index 0603c08..d78a997 100644 --- a/app/views/nodes/index.html.erb +++ b/app/views/nodes/index.html.erb @@ -21,7 +21,7 @@ <%= link_to 'show', node_path(node) %> - <%= link_to 'Revisions', :controller => :revisions, :action => :show, :id => node.id %> + <%= link_to 'Revisions', node_revisions_path(node) %> <%# link_to 'Destroy', node, :method => :delete, :confirm => "Are you sure you want to delete this node?" %> <%= link_to 'Unlock', unlock_node_path(node), :method => :put, :confirm => "Are you sure you want to unlock?" %> diff --git a/app/views/nodes/show.html.erb b/app/views/nodes/show.html.erb index 8d8a985..8f56c7c 100644 --- a/app/views/nodes/show.html.erb +++ b/app/views/nodes/show.html.erb @@ -1,7 +1,7 @@ <% content_for :subnavigation do %> <%= link_to 'Edit', edit_node_path(@node), :class => "unselected" %> <%= link_to 'Preview', preview_page_path(@page) %> - <%= link_to 'Revisions', revision_path(params[:id]) %> + <%= link_to 'Revisions', node_revisions_path(@node) %> <%= link_to 'Unlock', unlock_node_path(@node), :method => :put, :confirm => "Are you sure you want to unlock?" %> <% end %> diff --git a/app/views/revisions/diff.html.erb b/app/views/revisions/diff.html.erb index 9428b7a..f7ad79c 100644 --- a/app/views/revisions/diff.html.erb +++ b/app/views/revisions/diff.html.erb @@ -1,11 +1,11 @@ <% content_for :subnavigation do %> - <%= link_to 'Edit', edit_node_path(@node) %> - <%= link_to 'Revisions', revision_path(params[:id]) %> + <%= link_to 'Edit', edit_node_path(@node) %> + <%= link_to 'Revisions', node_revisions_path(@node) %> <% end %>

Revisions#diff

-<% form_tag diff_revision_path do %> +<% form_tag diff_node_revisions_path do %> <%= select_tag :start_revision, options_for_select(@node.pages.map{|x| x.revision}, params[:start_revision].to_i) %> <%= select_tag :end_revision, options_for_select(@node.pages.map{|x| x.revision}, params[:end_revision].to_i) %> <%= submit_tag 'Diff' %> diff --git a/app/views/revisions/index.html.erb b/app/views/revisions/index.html.erb index e3134d7..dbb612b 100644 --- a/app/views/revisions/index.html.erb +++ b/app/views/revisions/index.html.erb @@ -1 +1,44 @@ -

Revisions#index

+<% content_for :subnavigation do %> + <%= link_to 'Edit', edit_node_path(@node) %> +<% end %> + +

Revisions for Node: <%= @node.unique_name %>

+ +<% form_tag diff_node_revisions_path(@node) do %> + + + + + + + + + + +<% @node.pages.reverse.each do |page| %> + + + + + + + + + + +<% end %> + + + +
FirstLastRev.TitleUserDate
<%= radio_button_tag :start_revision, page.revision %><%= radio_button_tag :end_revision, page.revision %><%= page.revision %><%= page.title %><%= page.user.try(:login) %><%= page.updated_at %> + <%= link_to 'show', node_revision_path(@node, page) %> + + <%= link_to( + 'restore', + restore_node_revision_path(@node, page), + :method => :put, + :confirm => "Restore this revision?" + ) %> +
<%= submit_tag 'Diff revisions' %>
+ +<% end %> \ No newline at end of file diff --git a/app/views/revisions/show.html.erb b/app/views/revisions/show.html.erb index ebda18d..154d31b 100644 --- a/app/views/revisions/show.html.erb +++ b/app/views/revisions/show.html.erb @@ -1,44 +1,50 @@ <% content_for :subnavigation do %> - <%= link_to 'Edit', edit_node_path(@node) %> + <%= link_to 'show all revisions', node_revisions_path(@node) %> <% end %> -

Revisions for Node: <%= @node.unique_name %>

- -<% form_tag diff_revision_path do %> - - - - - - - - - - -<% @node.pages.reverse.each do |page| %> - - - - - - - - - - -<% end %> - - - -
FirstLastRev.TitleUserDate
<%= radio_button_tag :start_revision, page.revision %><%= radio_button_tag :end_revision, page.revision %><%= page.revision %><%= page.title %><%= page.user.try(:login) %><%= page.updated_at %> - <%= link_to 'show', node_path(page.node) %> - - <%= link_to( - 'restore', - restore_revision_path(page), - :method => :put, - :confirm => "Restore this revision?" - ) %> -
<%= submit_tag 'Diff revisions' %>
- -<% end %> \ No newline at end of file +
+ + + + + + + + + + <% if @page.node.locked? %> + + + + + <% end %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Path<%= @page.public_link %>
Author<%= @page.user.try(:login) %>
Locked by<%= @page.node.lock_owner.login %>
Last updated<%= @page.updated_at %>
Published at<%= @page.published_at %>
Revision<%= @page.revision %>
Title<%= @page.title %>
Abstract<%= @page.abstract %>
Body<%= @page.body %>
+
\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d591619..9b5980b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,9 +12,10 @@ ActionController::Routing::Routes.draw do |map| map.resources :tags map.resources :occurrences map.resources :events - map.resources :revisions, :member => {:diff => :post, :restore => :put} map.resources :pages, :member => {:preview => :get, :sort_images => :put} - map.resources :nodes, :member => {:publish => :put, :unlock => :put} + map.resources :nodes, :member => {:publish => :put, :unlock => :put} do |node| + node.resources :revisions, :member => {:restore => :put}, :collection => {:diff => :post} + end map.logout '/logout', :controller => 'sessions', :action => 'destroy' map.login '/login', :controller => 'sessions', :action => 'new' map.admin_search 'admin/search', :controller => 'admin', :action => 'search' diff --git a/test/functional/nodes_controller_test.rb b/test/functional/nodes_controller_test.rb index 3dae9db..eca7d93 100644 --- a/test/functional/nodes_controller_test.rb +++ b/test/functional/nodes_controller_test.rb @@ -84,7 +84,7 @@ class NodesControllerTest < ActionController::TestCase end end - def test_editing_a_node + test "editing a node" do login_as :quentin node = Node.find_by_unique_name("fourth_child") diff --git a/test/functional/revisions_controller_test.rb b/test/functional/revisions_controller_test.rb index d752b0e..43001df 100644 --- a/test/functional/revisions_controller_test.rb +++ b/test/functional/revisions_controller_test.rb @@ -1,8 +1,61 @@ require 'test_helper' class RevisionsControllerTest < ActionController::TestCase - # Replace this with your real tests. - test "the truth" do - assert true + + def setup + Node.root.descendants.destroy_all + @user = User.find_by_login("aaron") + @node = Node.root.children.create!( :slug => "version_me" ) + + draft = @node.draft + draft.body = "first" + @node.publish_draft! + @node.find_or_create_draft @user + draft = @node.draft + draft.update_attributes(:body => "second") + @node.publish_draft! + end + + test "setup" do + assert_equal 2, Node.count + assert_equal 2, @node.pages.count + assert_equal ["first", "second"], @node.pages.map {|p| p.body} + end + + test "get list of revisions for a given node" do + login_as :quentin + get :index, :node_id => @node.id + assert_response :success + assert_select ".revision", 2 + end + + test "showing one revision" do + login_as :quentin + get :show, :node_id => @node.id, :id => @node.pages.last.id + assert_response :success + assert_select "strong", "Body" + assert_select "td", {:count => 1, :text => "second"} + end + + test "diffing two revisions" do + login_as :quentin + post( + :diff, + :node_id => @node.id, + :start_revision => @node.pages.first.revision, + :end_revision => @node.pages.last.revision + ) + assert_response :success + end + + test "restoring a revision" do + assert_equal "second", @node.head.body + + login_as :aaron + put( :restore, :node_id => @node.id, :id => @node.pages.first.id ) + + @node.reload + assert_equal @node.head, @node.pages.first + assert_equal "first", @node.head.reload.body end end -- cgit v1.3