public
Fork of caring/acts_as_url_param
Description: Pretty url support for Ruby on Rails applications
Homepage: http://www.caring.com
Clone URL: git://github.com/chriseppstein/acts_as_url_param.git
Christopher Eppstein (author)
Wed Mar 19 07:06:27 -0700 2008
acts_as_url_param / test / acts_as_url_param_test.rb
100644 202 lines (172 sloc) 6.982 kb
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
require File.expand_path(File.dirname(__FILE__) + "/test_helper")
require "mocha"
 
require "acts_as_url_param_base"
require "author"
require "blog_post"
require "item"
require "book"
require "magazine"
require "newspaper"
require "user"
require "story"
require "before_item"
 
class ActsAsUrlParamTest < Test::Unit::TestCase
  
  def test_should_define_finder
    item = ActsAsUrlParam::Item.create(:name => 'just try and find me')
    assert_equal item, ActsAsUrlParam::Item.find_by_url(item.to_param)
  end
  
  def test_should_set_url_name_on_create
    assert !ActsAsUrlParam::Item.create(:name => 'test a url param').url_name.blank?
  end
  
  def test_should_not_set_url_name_if_already_set
    item = ActsAsUrlParam::Item.create(:name => 'test a url param', :url_name => 'test-this')
    assert_equal('test-this', item.to_param)
  end
  
  def test_should_make_manually_set_urls_safe
    item = ActsAsUrlParam::Item.create(:name => 'test a manual url param', :url_name => 'test this one')
    assert_equal('test-this-one', item.to_param)
  end
  
  def test_should_set_url_name_if_blank
    item = ActsAsUrlParam::Item.create(:name => 'no url param')
    item.send(:write_attribute, :url_name, nil)
    item.save
    assert item.url_name
  end
  
  def test_should_make_custom_urls_safe
    ActsAsUrlParam::Item.any_instance.expects(:url_safe)
    ActsAsUrlParam::Item.new(:url_name => 'make me safe')
  end
  
  def test_should_use_correct_column_to_create_url_name
    assert ActsAsUrlParam::User.create(:name => 'john doe', :login => 'jdog').url_name =~ /jdog/
  end
  
  def test_should_be_invalid_without_content_to_create_url
    user = ActsAsUrlParam::User.create(:name => 'john doe')
    assert !user.valid?
  end
  
  def test_should_allow_blank_url_param_if_specified
    item = ActsAsUrlParam::Story.create
    assert item.valid?
  end
  
  def test_should_check_if_url_param_available
    ActsAsUrlParam::User.create(:login => 'tester')
    assert !ActsAsUrlParam::User.url_param_available?('tester')
    assert ActsAsUrlParam::User.url_param_available?('goodman')
  end
  
  def test_should_use_block_to_check_if_url_param_available
    ActsAsUrlParam::Story.create(:title => 'new post')
    assert !ActsAsUrlParam::BlogPost.url_param_available?('new post')
  end
  
  def test_should_use_block_to_compute_url_name
    post = ActsAsUrlParam::BlogPost.new(:title => 'post')
    assert_equal 'post', post.compute_url_param
    story = ActsAsUrlParam::Story.create(:title => 'new post')
    new_post = ActsAsUrlParam::BlogPost.new(:title => 'new post')
    assert_not_equal new_post.compute_url_param, story.to_param
  end
  
  def test_should_create_redirect_trail
    name = "this is a redirectable item"
    item = ActsAsUrlParam::Item.create(:name => name)
    url = item.url_name
    assert_equal 0, item.redirects.size
    item.update_attributes :name => "redirect to me"
    assert_equal 1, item.redirects.count
    assert_equal url, item.redirects.first.url_name
  end
  
  def test_should_create_redirect_trail_with_manual_url
    name = "this is another redirectable item"
    item = ActsAsUrlParam::Item.create(:name => name)
    url = item.url_name
    assert_equal 0, item.redirects.size
    item.update_attributes :url_name => "a-new-url-for-you"
    assert_equal 1, item.redirects.count
    assert_equal url, item.redirects.first.url_name
  end
  
  def test_should_find_from_url_trail
    name = "this is a redirectable item"
    item = ActsAsUrlParam::Item.create(:name => name)
    url = item.url_name
    item.update_attributes :name => "redirect to me"
    assert item.to_param != url
    assert_equal item, ActsAsUrlParam::Item.find_redirect(url)
  end
  
  def test_should_check_redirects_table_for_available_names
    name = "this is a redirectable item"
    item = ActsAsUrlParam::Book.create(:name => name)
    url = item.url_name
    item.update_attributes(:name => "second one")
    assert !ActsAsUrlParam::Book.url_param_available?(url)
    assert ActsAsUrlParam::Magazine.url_param_available?(url)
  end
  
  def test_should_compute_url_name
    name = 'this is a url param'
    item = ActsAsUrlParam::Item.new(:name => name)
    assert !ActsAsUrlParam::Item.compute_url_param(name).blank?
    assert_equal(item.compute_url_param, ActsAsUrlParam::Item.compute_url_param(name))
  end
  
  def test_should_update_url_name_on_custom_callback
    author = ActsAsUrlParam::Author.create(:label => 'name of author')
    author_url = author.to_param
    author.update_attributes(:label => 'a new author')
    assert_not_equal(author_url, author.to_param)
  end
  
  def test_should_not_update_url_name_on_custom_callback_when_no_change
    author = ActsAsUrlParam::Author.create(:label => 'name of author')
    author_url = author.to_param
    author.update_attributes(:bio => 'unrelated to url param')
    assert_equal(author_url, author.to_param)
  end
  
  def test_should_not_set_existing_url_name_to_blank
    author = ActsAsUrlParam::Author.create(:label => 'name of author')
    author_url = author.to_param
    author.update_attributes(:label => '')
    assert_equal(author_url, author.to_param)
  end
 
  def test_should_not_update_url_name_by_default
    item = ActsAsUrlParam::Newspaper.create(:name => 'this is a url param')
    item_url = item.to_param
    item.update_attributes(:name => 'not updated')
    assert_equal(item_url, item.to_param)
  end
  
  def test_should_work_with_two_items_of_same_name
    name = "just another name"
    item = ActsAsUrlParam::Item.create(:name => name)
    url = item.to_param
    item.update_attributes(:content => "irrelevant")
    assert_equal url, item.to_param
  end
  
  def test_should_work_with_sti
    item = ActsAsUrlParam::Item.create(:name => 'an item')
    book = ActsAsUrlParam::Book.create(:name => 'an item')
    newspaper = ActsAsUrlParam::Newspaper.create(:name => 'an item')
    assert_not_equal(item.to_param, book.to_param)
    assert_equal(item.to_param, newspaper.to_param)
    
    newspaper = ActsAsUrlParam::Newspaper.create(:name => 'another item')
    book = ActsAsUrlParam::Book.create(:name => 'another item')
    assert_equal(book.to_param, newspaper.to_param)
  end
  
  def test_should_use_method_for_url_from_if_exists
    magazine = ActsAsUrlParam::Magazine.create()
    assert !magazine.to_param.blank?
  end
  
  def test_should_run_before_method_if_passed
    ActsAsUrlParam::BeforeItem.any_instance.expects(:set_name)
    item = ActsAsUrlParam::BeforeItem.create(:name => 'the name')
  end
  
  def test_should_run_before_method_before_setting_url
    item = ActsAsUrlParam::BeforeItem.create(:name => 'the name')
    assert_match /is-set/, item.to_param
  end
  
  private
  def acts_as_url_name_model(column = nil, options = {})
    m = Class.new(ActiveRecord::Base)
    m.class_eval do
      set_table_name :items
      if column
        acts_as_url_param column, options
      else
        acts_as_url_param options
      end
    end
    m
  end
end