From 46a035d00126be51a49f431e4838f3968d156486 Mon Sep 17 00:00:00 2001 From: Nick Plante Date: Tue, 24 Jun 2008 12:51:40 -0400 Subject: [PATCH] add scoped multi-site updates as described at http://blog.zerosum.org/2008/4/3/radiant-super-multi * scopes user level access to individual sites (admins and developers still have access to all sites) * regular users cannot see, edit, or access other user sites that they do not own * optionally scopes layouts to sites * snippets usable everywhere, but display and editing of snippets limited to admins/developers updated for radiant 0.6.7 --- README | 22 ++- app/models/site.rb | 14 +- app/views/admin/layout/_site.rhtml | 4 + app/views/admin/page/_site_subnav.rhtml | 13 +- app/views/admin/user/_site.rhtml | 5 + db/migrate/004_create_default_site.rb | 8 + db/migrate/005_add_site_id_to_users.rb | 9 + db/migrate/006_add_site_id_to_layouts.rb | 9 + lib/multi_site/layout_extensions.rb | 12 ++ lib/multi_site/page_controller_extensions.rb | 116 +++++++++--- lib/multi_site/response_cache_extensions.rb | 10 +- .../snippet_controller_extensions.rb | 10 + lib/multi_site/user_extensions.rb | 9 + multi_site_extension.rb | 16 +- .../page_controller_extensions_test.rb | 172 +++++++++++++++++- test/functional/sites_controller_test.rb | 3 +- .../snippet_controller_extensions_test.rb | 26 +++ test/unit/layout_extensions_test.rb | 13 ++ test/unit/response_cache_extensions_test.rb | 45 ++++- test/unit/user_extensions_test.rb | 19 ++ 20 files changed, 478 insertions(+), 57 deletions(-) create mode 100644 app/views/admin/layout/_site.rhtml create mode 100644 app/views/admin/user/_site.rhtml create mode 100644 db/migrate/004_create_default_site.rb create mode 100644 db/migrate/005_add_site_id_to_users.rb create mode 100644 db/migrate/006_add_site_id_to_layouts.rb create mode 100644 lib/multi_site/layout_extensions.rb create mode 100644 lib/multi_site/snippet_controller_extensions.rb create mode 100644 lib/multi_site/user_extensions.rb create mode 100644 test/functional/snippet_controller_extensions_test.rb create mode 100644 test/unit/layout_extensions_test.rb create mode 100644 test/unit/user_extensions_test.rb diff --git a/README b/README index 7f7f6c2..ed39d52 100644 --- a/README +++ b/README @@ -1,10 +1,11 @@ = Multi Site Created by Sean Cribbs, November 2007. Inspired by the original virtual_domain -behavior. +behavior. Extended by Nick Plante, March 2008. Multi Site allows you to host multiple websites on a single Radiant -installation. +installation. It also allows you to assign users to specific sites, scoping +all their administrative activity to that one domain. Each site has its own independent sitemap/page-tree and these attributes: @@ -16,10 +17,23 @@ Each site has its own independent sitemap/page-tree and these attributes: homepage_id: The numerical database ID of the root page (usually you can just leave this alone). +Any existing pages that you have will be scoped to the 'Default' site, which +is the site that will be seen for requests that don't match a particular +base_domain. + +In addition to scoping users to sites, layouts can also be scoped to a +particular site. Use the selection box on the edit layout page to assign a +layout to a site. If no site is chosen, the layout will be available for +selection from any site. Note that snippets are not limited in this way, +but that access to snippets has been DISABLED for "regular" users (those +users who are not developers or admins). + +If you don't like it, feel free to make suggestions or change it :). + Included images are slightly modified from FamFamFam Silk Icons by Mark James: http://www.famfamfam.com/lab/icons/silk/ -*** THIS EXTENSION REQUIRES THE 'SHARDS' EXTENSION TO BE INSTALLED *** +*** THIS EXTENSION REQUIRES RADIANT 0.6.7 OR LATER *** == Installation @@ -39,4 +53,4 @@ http://www.famfamfam.com/lab/icons/silk/ == Acknowledgments Thanks to Digital Pulp, Inc. for funding the initial development of this -extension as part of the Redken.com project. \ No newline at end of file +extension as part of the Redken.com project. diff --git a/app/models/site.rb b/app/models/site.rb index e7d31e0..d13f6eb 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -1,6 +1,10 @@ class Site < ActiveRecord::Base + has_many :users + has_many :layouts + acts_as_list order_by "position ASC" + class << self def find_for_host(hostname = '') default, normal = find(:all).partition {|s| s.domain.blank? } @@ -29,11 +33,11 @@ def dev_url(path = "/") def create_homepage if self.homepage_id.blank? - self.homepage = self.build_homepage(:title => "#{self.name} Homepage", - :slug => "#{self.name.slugify}", :breadcrumb => "Home", - :status => Status[:draft]) - self.homepage.parts << PagePart.new(:name => "body", :content => "") - save + self.homepage = self.build_homepage(:title => "#{self.name} Homepage", + :slug => "#{self.name.slugify}", :breadcrumb => "Home", + :status => Status[:draft]) + self.homepage.parts << PagePart.new(:name => "body", :content => "") + save end end end diff --git a/app/views/admin/layout/_site.rhtml b/app/views/admin/layout/_site.rhtml new file mode 100644 index 0000000..84bf276 --- /dev/null +++ b/app/views/admin/layout/_site.rhtml @@ -0,0 +1,4 @@ +

+ + <%= select "layout", "site_id", [['', nil]] + Site.find(:all).map { |s| [s.name, s.id] } %> +

diff --git a/app/views/admin/page/_site_subnav.rhtml b/app/views/admin/page/_site_subnav.rhtml index a89ea54..4415cbd 100644 --- a/app/views/admin/page/_site_subnav.rhtml +++ b/app/views/admin/page/_site_subnav.rhtml @@ -14,12 +14,13 @@ margin-right: 10px; } <% end %> -
- <% Site.find(:all).each do |site| %> - <% name = (@site == site) ? "#{site.name}" : site.name -%> - <%= link_to name, page_index_path(:root => site.homepage) %> - <% end %> -
+<% if developer? && Site.count > 1 %> +
+ Site: + <%= select_tag('site-selector', options_from_collection_for_select(Site.find(:all), :homepage_id, :name, @site.nil? ? nil : @site.homepage_id), + :onchange => "document.location = '#{page_index_path}?root=' + this.options[this.selectedIndex].value") %> +
+<% end %> <% if Radiant::Config['multi_site.scoped?'] %> <% content_for :page_scripts do %> diff --git a/app/views/admin/user/_site.rhtml b/app/views/admin/user/_site.rhtml new file mode 100644 index 0000000..a421781 --- /dev/null +++ b/app/views/admin/user/_site.rhtml @@ -0,0 +1,5 @@ + + + <%= select "user", "site_id", [['', nil]] + Site.find(:all).map { |s| [s.name, s.id] } %> + Optional. Please specify a site for this user. + diff --git a/db/migrate/004_create_default_site.rb b/db/migrate/004_create_default_site.rb new file mode 100644 index 0000000..7909c78 --- /dev/null +++ b/db/migrate/004_create_default_site.rb @@ -0,0 +1,8 @@ +class CreateDefaultSite < ActiveRecord::Migration + def self.up + Site.create(:name => 'Default', :domain => '', :base_domain => 'default', :homepage => Page.find(:first, :conditions => "parent_id IS NULL")) + end + + def self.down + end +end diff --git a/db/migrate/005_add_site_id_to_users.rb b/db/migrate/005_add_site_id_to_users.rb new file mode 100644 index 0000000..3e0430d --- /dev/null +++ b/db/migrate/005_add_site_id_to_users.rb @@ -0,0 +1,9 @@ +class AddSiteIdToUsers < ActiveRecord::Migration + def self.up + add_column :users, :site_id, :integer + end + + def self.down + remove_column :users, :site_id + end +end diff --git a/db/migrate/006_add_site_id_to_layouts.rb b/db/migrate/006_add_site_id_to_layouts.rb new file mode 100644 index 0000000..d20ba8f --- /dev/null +++ b/db/migrate/006_add_site_id_to_layouts.rb @@ -0,0 +1,9 @@ +class AddSiteIdToLayouts < ActiveRecord::Migration + def self.up + add_column :layouts, :site_id, :integer + end + + def self.down + remove_column :layouts, :site_id + end +end diff --git a/lib/multi_site/layout_extensions.rb b/lib/multi_site/layout_extensions.rb new file mode 100644 index 0000000..2210655 --- /dev/null +++ b/lib/multi_site/layout_extensions.rb @@ -0,0 +1,12 @@ +module MultiSite::LayoutExtensions + def self.included(base) + base.belongs_to :site + base.extend ClassMethods + end + + module ClassMethods + def scoped_to_site(site_id, &block) + with_scope(:find => { :conditions => ["site_id = ? OR site_id IS NULL", site_id] }, &block) + end + end +end diff --git a/lib/multi_site/page_controller_extensions.rb b/lib/multi_site/page_controller_extensions.rb index 28ecded..61c74b5 100644 --- a/lib/multi_site/page_controller_extensions.rb +++ b/lib/multi_site/page_controller_extensions.rb @@ -1,53 +1,113 @@ module MultiSite::PageControllerExtensions def self.included(base) base.class_eval { + before_filter :set_site, :only => [:remove, :new, :edit] + around_filter :scope_layouts_to_site, :only => [:new, :edit] + alias_method_chain :index, :root - alias_method_chain :clear_model_cache, :site - alias_method_chain :continue_url, :site - %w{remove}.each do |m| - alias_method_chain m.to_sym, :back + %w{edit new remove continue_url clear_model_cache}.each do |m| + alias_method_chain m.to_sym, :site end } end def index_with_root - if params[:root] # If a root page is specified - @homepage = Page.find(params[:root]) - @site = @homepage.root.site - elsif @site = Site.find(:first, :order => "position ASC") # If there is a site defined - if @site.homepage + cookies.delete('expanded_rows') + if user_developer? # or admin + if params[:root] # If a root page is specified (should this ever be required for non-developers?) + @homepage = Page.find(params[:root]) + @site = @homepage.root.site + elsif (@site = Site.find(:first, :order => "position ASC")) && @site.homepage # If there is a site defined @homepage = @site.homepage else index_without_root end - else # Just do the default - index_without_root + elsif (@site = current_user.site) && @site.homepage + @homepage = @site.homepage + else + access_denied end end - - def remove_with_back - @page = Page.find(params[:id]) - if request.post? - announce_pages_removed(@page.children.count + 1) - @page.destroy - return_url = session[:came_from] - session[:came_from] = nil - if return_url && return_url != page_index_url(:root => @page) - redirect_to return_url + + def remove_with_site + if user_authorized? + if request.post? + announce_pages_removed(@page.children.count + 1) + @page.destroy + return_url = session[:came_from] + session[:came_from] = nil + if return_url && return_url != page_index_url(:root => @page) + redirect_to return_url + else + redirect_to page_index_url(:page => @page.parent) + end else - redirect_to page_index_url(:page => @page.parent) + session[:came_from] = request.env["HTTP_REFERER"] end else - session[:came_from] = request.env["HTTP_REFERER"] + access_denied end end - + def clear_model_cache_with_site Page.current_site ||= @site || @page.root.site clear_model_cache_without_site end - - def continue_url_with_site(options={}) - options[:redirect_to] || (params[:continue] ? page_edit_url(:id => model.id) : page_index_url(:root => model.root.id)) + + def new_with_site + if user_authorized? + if request.get? + @page = Page.new_with_defaults(config) + else + @page = Page.new + end + + @page.slug = params[:slug] + @page.breadcrumb = params[:breadcrumb] + @page.parent = Page.find_by_id(params[:parent_id]) + render :action => :edit if handle_new_or_edit_post + else + access_denied + end + end + + def edit_with_site + if user_authorized? + @old_page_url = @page.url + handle_new_or_edit_post + else + access_denied + end end -end \ No newline at end of file + + protected + + def continue_url_with_site(options = {}) + options[:redirect_to] || (params[:continue] ? model_edit_url(:id => model.id) : model_index_url(:root => model.root.id)) + end + + def access_denied + flash[:error] = 'Access denied.' + redirect_to login_url + end + + def user_developer? + current_user and (current_user.developer? or current_user.admin?) + end + + def user_authorized? + user_developer? || (!current_user.nil? && current_user.owner?(@site)) + end + + def set_site + id = params[:id] || params[:root] || params[:parent_id] + @page = Page.find(id) + @site = @page.root.site + end + + def scope_layouts_to_site + Layout.scoped_to_site(@site.id) do + yield + end + end +end diff --git a/lib/multi_site/response_cache_extensions.rb b/lib/multi_site/response_cache_extensions.rb index 3b0d562..a7896f8 100644 --- a/lib/multi_site/response_cache_extensions.rb +++ b/lib/multi_site/response_cache_extensions.rb @@ -2,6 +2,7 @@ module MultiSite::ResponseCacheExtensions def self.included(base) base.alias_method_chain :page_cache_path, :site + base.alias_method_chain :clear, :site end def page_cache_path_with_site(path) @@ -11,4 +12,11 @@ def page_cache_path_with_site(path) cache_path = File.expand_path(File.join(root_dir, path), root_dir) cache_path if cache_path.index(root_dir) == 0 end -end \ No newline at end of file + + def clear_with_site(site = nil) + dirs = site.nil? ? Dir["#{directory}/*"] : Dir["#{directory}/#{site.base_domain}"] + dirs.each do |f| + FileUtils.rm_rf f + end + end +end diff --git a/lib/multi_site/snippet_controller_extensions.rb b/lib/multi_site/snippet_controller_extensions.rb new file mode 100644 index 0000000..fba60e3 --- /dev/null +++ b/lib/multi_site/snippet_controller_extensions.rb @@ -0,0 +1,10 @@ +module MultiSite::SnippetControllerExtensions + def self.included(base) + base.class_eval { + only_allow_access_to :index, :new, :edit, :remove, + :when => [:developer, :admin], + :denied_url => { :controller => 'page', :action => 'index' }, + :denied_message => 'You must have developer privileges to perform this action.' + } + end +end diff --git a/lib/multi_site/user_extensions.rb b/lib/multi_site/user_extensions.rb new file mode 100644 index 0000000..b31af36 --- /dev/null +++ b/lib/multi_site/user_extensions.rb @@ -0,0 +1,9 @@ +module MultiSite::UserExtensions + def self.included(base) + base.belongs_to :site + end + + def owner?(multi_site) + site == multi_site + end +end diff --git a/multi_site_extension.rb b/multi_site_extension.rb index 4a69ddb..5dfc5c3 100644 --- a/multi_site_extension.rb +++ b/multi_site_extension.rb @@ -22,13 +22,27 @@ def activate require_dependency 'application' Page.send :include, MultiSite::PageExtensions + ResponseCache.send :include, MultiSite::ResponseCacheExtensions + User.send :include, MultiSite::UserExtensions + Layout.send :include, MultiSite::LayoutExtensions + SiteController.send :include, MultiSite::SiteControllerExtensions Admin::PageController.send :include, MultiSite::PageControllerExtensions - ResponseCache.send :include, MultiSite::ResponseCacheExtensions + Admin::SnippetController.send :include, MultiSite::SnippetControllerExtensions + Radiant::Config["dev.host"] = 'preview' + # Add site navigation admin.page.index.add :top, "site_subnav" admin.tabs.add "Sites", "/admin/sites", :visibility => [:admin] + + # Make snippets visible only to admins and developers + admin.tabs.remove "Snippets" + admin.tabs.add "Snippets", "/admin/snippets", :before => "Layouts", :visibility => [:admin, :developer] + + # Add site admin scoping fields + admin.user.edit.add :form, "site", :before => "edit_table_footer" + admin.layout.edit.add :form, "site", :before => "edit_timestamp" end def deactivate diff --git a/test/functional/page_controller_extensions_test.rb b/test/functional/page_controller_extensions_test.rb index 8f9a18b..4c62f72 100644 --- a/test/functional/page_controller_extensions_test.rb +++ b/test/functional/page_controller_extensions_test.rb @@ -4,47 +4,203 @@ Admin::PageController.class_eval { def rescue_action(e) raise e end } class PageControllerExtensionsTest < Test::Unit::TestCase + include ActionController::UrlWriter + fixtures :sites, :pages - test_helper :page, :login + test_helper :pages, :login, :difference + + class TestResponse < ActionController::TestResponse + def initialize(body = '', headers = {}) + self.body = body + self.headers = headers + end + end def setup @controller = Admin::PageController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new - login_as(:existing) + + default_url_options[:host] = 'test.host' end def test_should_set_root_to_given_page_id + login_as(:developer) # or admin get :index, :root => 5 assert_response :success assert_not_nil assigns(:homepage) assert_equal 5, assigns(:homepage).id assert_equal sites(:one), assigns(:site) end + + def test_should_deny_regular_user_access_to_other_sites + login_as(:existing) + get :index, :root => 5 + assert_response :redirect + assert_redirected_to login_url + end def test_should_pick_first_site_if_no_root_given + login_as(:developer) # non-devel or admin users are bound to their own sites get :index assert_response :success assert_equal pages(:homepage), assigns(:homepage) assert_equal sites(:one), assigns(:site) end - + def test_should_fallback_on_default_when_no_sites_defined + login_as(:developer) # or admin Site.delete_all get :index assert_response :success assert_equal pages(:homepage), assigns(:homepage) end + + def test_should_deny_access_if_user_site_deleted + user = users(:existing) + user.site = sites(:one) + user.save + + login_as(:existing) + Site.delete_all + get :index + assert_response :redirect + assert_redirected_to login_url + end + + def test_should_remove_page_if_site_owner + create_pages_for(sites(:two)) + @user = users(:existing) + @user.site = sites(:two) + @user.save + + login_as(:existing) + assert_difference(Page, :count, -1) do + post :remove, :id => sites(:two).homepage.children[0].id + assert_response :redirect + assert sites(:two), assigns(:site) + end + end + + def test_should_deny_remove_page_if_user_is_not_owner + login_as(:existing) + assert_no_difference(Page, :count) do + post :remove, :id => pages(:childless) + assert_response :redirect + assert_redirected_to login_url + end + end + + def test_should_redirect_after_remove + create_pages_for(sites(:two)) + login_as(:developer) + + assert_difference(Page, :count, -1) do + post :remove, :id => sites(:two).homepage.children[0].id + assert_response :redirect + assert sites(:two), assigns(:site) + end + end + + def test_should_create_user_site_page + @user = users(:existing) + @user.site = sites(:two) + @user.save + + create_pages_for(sites(:two)) + + login_as(:existing) + assert_difference(Page, :count) do + post :new, :parent_id => sites(:two).homepage_id, :page => page_params(:title => 'xyz', :slug => 'xyz') + assert_response :redirect + assert_equal sites(:two), assigns(:site) + end + end + + def test_should_limit_create_to_user_site + login_as(:existing) + assert_no_difference(Page, :count) do + post :new, :parent_id => pages(:homepage), :page => page_params(:title => 'xyz', :slug => 'xyz') + assert_response :redirect + assert_redirected_to login_url + end + end + + def test_should_redirect_on_create # admin or developer + create_pages_for(sites(:two)) + + login_as(:developer) + assert_difference(Page, :count) do + post :new, :parent_id => sites(:two).homepage_id, :page => page_params(:title => 'xyz', :slug => 'xyz') + assert_response :redirect + assert_equal sites(:two), assigns(:site) + end + end + + def test_should_edit_user_site_page + @user = users(:existing) + @user.site = sites(:one) + @user.save + + login_as(:existing) + post :edit, :id => pages(:homepage), :page => { :title => 'updated', :slug => 'updated' } + assert_response :redirect + assert_equal sites(:one), assigns(:site) + + assert_equal 'updated', sites(:one).homepage.title + end + + def test_should_limit_edit_to_user_site + login_as(:existing) + title = pages(:homepage).title + post :edit, :id => pages(:homepage), :page => { :title => 'updated', :slug => 'updated' } + assert_response :redirect + assert_redirected_to login_url + assert_equal title, pages(:homepage).reload.title + end + + def test_should_redirect_on_edit # admin or developer + login_as(:developer) + post :edit, :id => pages(:homepage), :page => { :title => 'updated', :slug => 'updated' } + assert_response :redirect + assert_equal pages(:homepage).root.site, assigns(:site) + assert_equal 'updated', pages(:homepage).reload.title + end def test_should_set_site_when_clearing_cache + Page.send "current_site=", nil @controller.send :instance_variable_set, "@page", pages(:homepage) @controller.send :clear_model_cache assert_equal sites(:one), Page.current_site end - - def test_should_redirect_to_same_site_after_edit - post :edit, :id => 2 - assert_response :redirect - assert_redirected_to page_index_url(:root => 1) + + def test_should_scope_layouts_to_site + @user = users(:existing) + @user.site = sites(:one) + @user.save + + @layout = Layout.create(:name => "Layout for site", :site => sites(:two)) + + login_as(:existing) + get :edit, :id => pages(:homepage) + assert_response :success + assert_select "select#page_layout_id" do + assert_select "option", Layout.count(:conditions => "site_id IS NULL or site_id = #{@user.site_id}") + 1 # +1 is inherit + end end + + protected + + def create_pages_for(site) + homepage = create_test_page(:title => "new home page", :slug => "new1") + childpage = create_test_page(:title => "new child page", :slug => "new2", :parent_id => homepage.id) + site.homepage = homepage + site.save + end + + def create_cached_pages_for(site) + Page.current_site = site + @cache.cache_response('test', TestResponse.new('test')) + assert_equal 2, Dir["#{@cache_dir}/#{site.base_domain}/*"].size + end end diff --git a/test/functional/sites_controller_test.rb b/test/functional/sites_controller_test.rb index bcb62ee..5738a7f 100644 --- a/test/functional/sites_controller_test.rb +++ b/test/functional/sites_controller_test.rb @@ -6,6 +6,7 @@ class SitesControllerTest < Test::Unit::TestCase test_helper :login, :difference fixtures :sites + def setup @controller = SitesController.new @request = ActionController::TestRequest.new @@ -45,8 +46,6 @@ def test_create assert_difference Site, :count do post :create, :site => {:name => "New site", :domain => "new-site", :position => nil, :base_domain => "new-site.dp.com"} assert_response :redirect - assert_equal "New site", assigns(:site).name - assert_equal "new-site", assigns(:site).domain end end diff --git a/test/functional/snippet_controller_extensions_test.rb b/test/functional/snippet_controller_extensions_test.rb new file mode 100644 index 0000000..e449ab8 --- /dev/null +++ b/test/functional/snippet_controller_extensions_test.rb @@ -0,0 +1,26 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class SnippetControllerExtensionsTest < Test::Unit::TestCase + fixtures :sites, :pages + test_helper :login + + def setup + @controller = Admin::SnippetController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + end + + def test_should_prevent_access + login_as(:existing) + get :index + assert_response :redirect + assert_redirected_to :controller => "admin/page" + assert_equal "You must have developer privileges to perform this action.", flash[:error] + end + + def test_should_allow_developer_access + login_as(:developer) + get :index + assert_response :success + end +end diff --git a/test/unit/layout_extensions_test.rb b/test/unit/layout_extensions_test.rb new file mode 100644 index 0000000..90a78d8 --- /dev/null +++ b/test/unit/layout_extensions_test.rb @@ -0,0 +1,13 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class LayoutExtensionsTest < Test::Unit::TestCase + fixtures :sites + + def setup + @layout = Layout.new(:site => sites(:one)) + end + + def test_should_add_instance_methods + assert_respond_to @layout, :site + end +end diff --git a/test/unit/response_cache_extensions_test.rb b/test/unit/response_cache_extensions_test.rb index e3cff21..1e48823 100644 --- a/test/unit/response_cache_extensions_test.rb +++ b/test/unit/response_cache_extensions_test.rb @@ -2,9 +2,22 @@ class ResponseCacheExtensionsTest < Test::Unit::TestCase fixtures :sites + + class TestResponse < ActionController::TestResponse + def initialize(body = '', headers = {}) + self.body = body + self.headers = headers + end + end def setup - @cache = ResponseCache.new + @cache_dir = File.expand_path("#{RAILS_ROOT}/test/cache") + Dir["#{@cache_dir}/*"].each { |d| FileUtils.rm_rf d } + + @cache = ResponseCache.new( + :directory => @cache_dir, + :perform_caching => true + ) end def test_should_scope_cache_location_to_current_site @@ -17,4 +30,32 @@ def test_should_scope_cache_location_to_current_site assert_equal File.join(base_path, '_site-root'), @cache.send(:page_cache_path, "/") assert_equal File.join(base_path, 'blah'), @cache.send(:page_cache_path_without_site, '/mysite.domain.com/blah') end -end \ No newline at end of file + + def test_should_clear_site_cache + Page.current_site = sites(:one) + @cache.cache_response("test1", response('content')) + @cache.cache_response("test2", response('content')) + assert_equal 1, Dir["#{@cache_dir}/*"].size + assert_equal 4, Dir["#{@cache_dir}/#{sites(:one).base_domain}/*"].size + + @cache.clear_with_site(sites(:one)) + assert_equal 0, Dir["#{@cache_dir}/#{sites(:one).base_domain}/*"].size + end + + def test_should_clear_all_site_caches + Page.current_site = sites(:one) + @cache.cache_response("test1", response('content')) + @cache.cache_response("test2", response('content')) + assert_equal 1, Dir["#{@cache_dir}/*"].size + assert_equal 4, Dir["#{@cache_dir}/#{sites(:one).base_domain}/*"].size + + @cache.clear_with_site(nil) + assert_equal 0, Dir["#{@cache_dir}/*"].size + end + + private + + def response(*args) + TestResponse.new(*args) + end +end diff --git a/test/unit/user_extensions_test.rb b/test/unit/user_extensions_test.rb new file mode 100644 index 0000000..0f3397a --- /dev/null +++ b/test/unit/user_extensions_test.rb @@ -0,0 +1,19 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class UserExtensionsTest < Test::Unit::TestCase + fixtures :sites + + def setup + @user = User.new(:site => sites(:one)) + end + + def test_should_add_instance_methods + assert_respond_to @user, :site + assert_respond_to @user, :owner? + end + + def test_should_be_owner + assert_equal @user.site, sites(:one) + assert @user.owner?(sites(:one)) + end +end