aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/controller/action_caching_test.rb
blob: 84b0cbd4a5e7240a3a6ad25dfd94665ff355fb4f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
require 'fileutils'
require File.dirname(__FILE__) + '/../abstract_unit'

CACHE_DIR = 'test_cache'
# Don't change '/../temp/' cavalierly or you might hoze something you don't want hozed
FILE_STORE_PATH = File.join(File.dirname(__FILE__), '/../temp/', CACHE_DIR)
ActionController::Base.perform_caching = true
ActionController::Base.fragment_cache_store = :file_store, FILE_STORE_PATH

class ActionCachingTestController < ActionController::Base
  caches_action :index
 
  def index
    @cache_this = Time.now.to_f.to_s
    render :text => @cache_this
  end
  
  def expire
    expire_action :controller => 'action_caching_test', :action => 'index'
    render :nothing => true
  end
  
end

class ActionCachingMockController
  attr_accessor :mock_url_for
  attr_accessor :mock_path
  
  def initialize
    yield self if block_given?
  end
  
  def url_for(*args)
    @mock_url_for
  end
  
  def request
    mocked_path = @mock_path
    Object.new.instance_eval(<<-EVAL)
      def path; '#{@mock_path}' end
      self
    EVAL
  end
end

class ActionCacheTest < Test::Unit::TestCase
  def setup
    reset!
    FileUtils.mkdir_p(FILE_STORE_PATH)
    @path_class = ActionController::Caching::Actions::ActionCachePath
    @mock_controller = ActionCachingMockController.new
  end
  
  def teardown
    FileUtils.rm_rf(File.dirname(FILE_STORE_PATH))
  end
  
  def test_simple_action_cache
    get :index
    cached_time = content_to_cache
    assert_equal cached_time, @response.body
    reset!
    
    get :index
    assert_equal cached_time, @response.body
  end
  
  def test_cache_expiration
    get :index
    cached_time = content_to_cache
    reset!
        
    get :index
    assert_equal cached_time, @response.body
    reset!

    get :expire
    reset!
    
    get :index
    new_cached_time = content_to_cache
    assert_not_equal cached_time, @response.body
    reset!
    
    get :index
    assert_response :success
    assert_equal new_cached_time, @response.body
  end
  
  def test_cache_is_scoped_by_subdomain
    @request.host = 'jamis.hostname.com'
    get :index
    jamis_cache = content_to_cache
    
    @request.host = 'david.hostname.com'
    get :index
    david_cache = content_to_cache
    assert_not_equal jamis_cache, @response.body
    
    @request.host = 'jamis.hostname.com'
    get :index
    assert_equal jamis_cache, @response.body
    
    @request.host = 'david.hostname.com'
    get :index
    assert_equal david_cache, @response.body
  end
  
  def test_xml_version_of_resource_is_treated_as_different_cache
    @mock_controller.mock_url_for = 'http://example.org/posts/'
    @mock_controller.mock_path    = '/posts/index.xml'
    path_object = @path_class.new(@mock_controller)
    assert_equal 'xml', path_object.extension
    assert_equal 'example.org/posts/index.xml', path_object.path
  end
  
  def test_empty_path_is_normalized
    @mock_controller.mock_url_for = 'http://example.org/'
    @mock_controller.mock_path    = '/'

    assert_equal 'example.org/index', @path_class.path_for(@mock_controller)
  end
  
  private
  
    def content_to_cache
      assigns(:cache_this)
    end
    
    def reset!
      @request    = ActionController::TestRequest.new
      @response   = ActionController::TestResponse.new
      @controller = ActionCachingTestController.new
      @request.host = 'hostname.com'
    end
  
end