link2 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,9 +16,10 @@ This is *not* a re-implementation of these helpers; rather it wraps these but pa
16
16
  *Goals/Features:*
17
17
 
18
18
  * *Rapid & flexible* - prototyping-friendly link helpers - with no trade-offs, really.
19
- * *DRY* - based on specified arguments: Use what's know to make smart assumptions => DRYer - and more maintainable view code.
19
+ * *DRY* - based on specified arguments: Use what's know to make smart assumptions for more readable and maintainable view code.
20
20
  * *I18n deluxe* - Lookup scoped translations based on action, model, etc., for more flexible translations - with lean defaults. Enhanced with some nifty interpolation features as well. Code first, translate later.
21
- * *Stable* - Full test-coverage for stability. Unit + Rails integration tests, check: @44 tests: all passed@
21
+ * *DOM Selectors* - Why defining DOM classes for RESTful links all the time when same patterns occur? Optionally DONE.
22
+ * *Stable* - Full test-coverage for stability. Unit + Rails integration tests, check: @54 tests: all passed@
22
23
  * *Maintainable* - Well-documented code.
23
24
 
24
25
  h2. Installation
@@ -52,12 +53,12 @@ h2. Usage
52
53
  link "No operation"
53
54
  # => link_to 'No operation', '#'
54
55
 
55
- link "Hilarious", 'http://bash.org'
56
- # => link_to 'No operation', 'http://bash.org'
57
-
58
56
  link 'http://bash.org'
59
57
  # => link_to 'http://bash.org', 'http://bash.org'
60
58
 
59
+ link "Hilarious", 'http://bash.org'
60
+ # => link_to 'Hilarious', 'http://bash.org'
61
+
61
62
  link :home, '/intro'
62
63
  # => link_to I18n.t(:home, ...), '/intro'
63
64
 
@@ -67,12 +68,24 @@ h2. Usage
67
68
  link :back
68
69
  # => link_to I18n.t(:home, ...), :back
69
70
 
71
+ link :index
72
+ # => link_to I18n.t(:index, ...), posts_path # Note: auto-detected
73
+
74
+ link :trash
75
+ # => link_to I18n.t(:trash, ...), trash_post_path(@post) # Note: auto-detected
76
+
77
+ link :new
78
+ # => link_to I18n.t(:new, ...), new_post_path(:id => @post.id) # Note: auto-detected, id for current resource - if found - passed, makes the implementation more generic
79
+
70
80
  link @post
71
81
  # => link_to I18n.t(:show, ...), post_path(@post)
72
82
 
73
83
  link [@post, @comment]
74
84
  # => link_to I18n.t(:show, ...), post_comment_path(@post, @comment)
75
85
 
86
+ link :go_back, :back
87
+ # => link_to I18n.t(:go_back, ...), :back
88
+
76
89
  link :new, :post
77
90
  # => link_to I18n.t(:new, ...), new_post_path
78
91
 
@@ -80,7 +93,7 @@ h2. Usage
80
93
  # => link_to I18n.t(:new, ...), new_post_path
81
94
 
82
95
  link :new, @post
83
- # => link_to I18n.t(:new, ...), new_post_path(:id => @post.id) # ...if you think about it; useful for cloning.
96
+ # => link_to I18n.t(:new, ...), new_post_path(:id => @post.id) # ...if you think about it; useful for cloning.
84
97
 
85
98
  link :edit, @post
86
99
  # => link_to I18n.t(:edit, ...), edit_post_path(@post)
@@ -91,6 +104,9 @@ h2. Usage
91
104
  link :kick, @post
92
105
  # => link_to I18n.t(:kick, ...), kick_post_path(@post)
93
106
 
107
+ link "All items", :index
108
+ # => link_to "All items", posts_path # Note: auto-detected, see above
109
+
94
110
  link "New one!", :new, Post
95
111
  # => link_to "New one!", new_post_path
96
112
 
@@ -105,14 +121,11 @@ h2. Usage
105
121
  <pre>
106
122
  link :edit, [@post, @comment]
107
123
  # => ::Link2::NotImplementedYetError, "case link(:action, [...]) not yet supported. Need to refactor some stuff."
108
-
109
- link :new
110
- # => ::Link2::NotImplementedYetError, "Auto-detection of resource is not supported yet."
111
124
  </pre>
112
125
 
113
126
  Same works for @button_to@, and you also can optionally use the branded aliases: @link2@ and @button2@.
114
127
 
115
- h2. Options hashes: URL Options + HTML Options
128
+ h2. Options hashes: URL + HTML Options
116
129
 
117
130
  Link2 link helpers accept options in the same way as the core helpers @link_to@/@button_to@: first @options@ (a.k.a. @url_options@) and then @html_options@. See the "Rails core UrlHelpers documentation":http://railsapi.com/doc/rails-v2.3.5/classes/ActionView/Helpers/UrlHelper.html#M002452 for details on this. Link2 helpers just pass any non-Link2-related options to the Rails core helpers. In other words no need to learn a new API; just pass the needed options like in the past.
118
131
 
data/TODO CHANGED
@@ -1,16 +1,6 @@
1
1
  TODO
2
2
 
3
- 1) Auto-detect current resource instance for member views (non-collection)
4
-
5
- link(:edit) => link(:edit, @post)
6
-
7
- Detect using "self.controller_name.singularize", or use "resource" if InheritedResources is used.
8
-
9
- 2) [ISSUE:] Implement the problematic one: link(:action, [@parent, @resource])
10
-
11
- * Collections detection:
12
-
13
- link(:index) => link(@posts) => link(:index, @posts) => link("Index", @posts)
3
+ 1) [ISSUE:] Implement the problematic one: link(:action, [@parent, @resource])
14
4
 
15
5
  * Fix action mapping procs to handle named scopes. Should work, but do not for some reason. =/
16
6
 
@@ -28,9 +18,27 @@ TODO
28
18
 
29
19
  * Check Rails 3 compatibility.
30
20
 
21
+ * Link2::Brain#link_to_args MUST be refactored when the DSL is 100% settled. Not far from it, but feedback first.
31
22
 
32
23
  * Integration tests for namespaced controllers/models
33
24
 
25
+ * This works:
26
+ link_to x, :terms => link_to x, terms_path
27
+
28
+ So maybe this should work the same?:
29
+ link :terms, :terms <=> link :terms => link :terms, terms_path
30
+
31
+ The middle part (auto-detect route for :fraggle before resource :fraggle) maybe too abstract DSL, not sure.
32
+
33
+
34
34
  NOT SURE:
35
35
 
36
+ * Check with Rails routes (RouteSet) if current action is a :member or :collection, and look for resource vs. collection:
37
+
38
+ link(:show) => link(@post) => link(:show, @post) => link("Show", @posts)
39
+ link(:index) => link(@posts) => link(:index, @posts) => link("Index", @posts)
40
+
41
+ Current implementation is a bit dumber but should work okay: resource_or_collection = @post || @posts, where
42
+ @post is tried first. Maybe should be developers responsibility like now...
43
+
36
44
  * Make Link2 parse label and title-attribute for the link based on configuration: Link2.label_method = :to_s, Link2.attr_methods = {:title => :description}
@@ -100,6 +100,8 @@ module Link2
100
100
  else
101
101
  expression
102
102
  end
103
+ rescue
104
+ nil
103
105
  end
104
106
 
105
107
  end
@@ -3,6 +3,8 @@
3
3
  module Link2
4
4
  module Brain
5
5
 
6
+ AutoDetectionFailed = Class.new(::NotImplementedError)
7
+
6
8
  URL_PATH_REGEX = /\//
7
9
  CLASS_INSTANCE_STRING = /\#\<.*\:0x.*\>/
8
10
 
@@ -29,7 +31,7 @@ module Link2
29
31
 
30
32
  case args.size
31
33
  when 0
32
- raise "No arguments specified. A least specify action or url."
34
+ raise ArgumentError, "No arguments specified. A least specify action or url."
33
35
  when 1
34
36
  if args.first.is_a?(String)
35
37
  if args.first =~ URL_PATH_REGEX
@@ -53,13 +55,19 @@ module Link2
53
55
  resource = args.shift
54
56
  label, url = self.label_and_url_for_resource(resource, url_options)
55
57
  else
56
- raise "Invalid 1st argument: #{args.inspect}"
58
+ raise ArgumentError, "Invalid 1st argument: #{args.inspect}"
57
59
  end
58
60
  when 2
59
61
  if args.first.is_a?(String)
60
62
  if args.second.is_a?(String)
61
63
  # link "Hello", hello_path => link_to "Hello", hello_path
62
64
  label, url = args.slice!(0..1)
65
+ elsif args.second.is_a?(Symbol) && ::Link2.url_for_mapping(args.second)
66
+ # link "Start", :home => link_to I18n.t(:start, ...), root_path
67
+ # link "Cancel", :back => link_to I18n.t(:cancel, ...), :back
68
+ label, action = args.slice!(0..1)
69
+ resource = nil
70
+ url = self.url_for_args(action, resource, url_options)
63
71
  elsif ::Link2::Support.resource_identifier_class?(args.second)
64
72
  # link "New", :new => link_to "New", new_{auto_detected_resource}_path
65
73
  # link "<<", :back => link_to "<<", (session[:return_to] || :back)
@@ -67,7 +75,7 @@ module Link2
67
75
  resource = nil # TODO: auto-detect resource.
68
76
  url = self.url_for_args(action, resource, url_options)
69
77
  else
70
- raise "Invalid 2nd argument: #{args.inspect}"
78
+ raise ArgumentError, "Invalid 2nd argument: #{args.inspect}"
71
79
  end
72
80
  elsif args.first.is_a?(Symbol)
73
81
  # TODO: Implement support for aray of nested resources.
@@ -79,7 +87,16 @@ module Link2
79
87
  # link :new, new_post_path => link_to I18n.t(:new, ...), new_post_path
80
88
  # link :back, root_path => link_to I18n.t(:back, ...), (session[:return_to] || :back)
81
89
  action, url = args.slice!(0..1)
82
- label = self.localized_label(action, nil, url_options)
90
+ resource = nil
91
+ label = self.localized_label(action, resource, url_options)
92
+ elsif args.second.is_a?(Symbol) && ::Link2.url_for_mapping(args.second)
93
+ # link :start, :home => link_to I18n.t(:start, ...), root_path
94
+ # link :cancel, :back => link_to I18n.t(:cancel, ...), :back
95
+ key, action = args.slice!(0..1)
96
+ resource = nil
97
+ resource = self.auto_detect_resource || self.auto_detect_resource
98
+ label = self.localized_label(key, resource, url_options)
99
+ url = self.url_for_args(action, resource, url_options)
83
100
  elsif ::Link2::Support.resource_identifier_class?(args.second)
84
101
  # link :new, Post => link_to I18n.t(:new, ...), new_post_path
85
102
  # link :edit, @post => link_to I18n.t(:edit, ...), edit_post_path(@post)
@@ -88,10 +105,10 @@ module Link2
88
105
  label = self.localized_label(action, resource, url_options)
89
106
  url = self.url_for_args(action, resource, url_options)
90
107
  else
91
- raise "Invalid 2nd argument: #{args.inspect}"
108
+ raise ArgumentError, "Invalid 2nd argument: #{args.inspect}"
92
109
  end
93
110
  else
94
- raise "Invalid 1st argument: #{args.inspect}"
111
+ raise ArgumentError, "Invalid 1st argument: #{args.inspect}"
95
112
  end
96
113
  when 3
97
114
  if args.first.is_a?(String)
@@ -107,16 +124,16 @@ module Link2
107
124
  label, action, resource = args.slice!(0..2)
108
125
  url = self.url_for_args(action, resource, url_options)
109
126
  else
110
- raise "Invalid 3rd argument: #{args.inspect}"
127
+ raise ArgumentError, "Invalid 3rd argument: #{args.inspect}"
111
128
  end
112
129
  else
113
- raise "Invalid 2nd argument: #{args.inspect}"
130
+ raise ArgumentError, "Invalid 2nd argument: #{args.inspect}"
114
131
  end
115
132
  else
116
- raise "Invalid 1st argument: #{args.inspect}"
133
+ raise ArgumentError, "Invalid 1st argument: #{args.inspect}"
117
134
  end
118
135
  else # when else
119
- raise "Invalid number of arguments: #{args.inspect}."
136
+ raise ArgumentError, "Invalid number of arguments: #{args.inspect}."
120
137
  end
121
138
 
122
139
  if ::Link2.dom_selectors == true
@@ -127,8 +144,6 @@ module Link2
127
144
  args << html_options if html_options
128
145
 
129
146
  [label, url, *args]
130
- rescue => e
131
- raise ::ArgumentError, e
132
147
  end
133
148
 
134
149
  # Extracts a label and a url for a (polymorphic) resource.
@@ -185,17 +200,17 @@ module Link2
185
200
  options = args.extract_options!.dup
186
201
  action, resource = args
187
202
 
188
- if resource.nil?
189
- url = ::Link2.url_for_mapping(action, resource) rescue nil
190
- if url
191
- url
192
- else
193
- raise ::Link2::NotImplementedYetError,
194
- "Resource needs to be specified for non-mapped actions; auto-detection of resource(s) not implemented yet."
195
- end
196
- elsif resource.is_a?(String)
203
+ if resource.is_a?(String) # url
197
204
  resource
205
+ elsif resource.nil? && url = ::Link2.url_for_mapping(action, resource) # mapping
206
+ url
198
207
  else
208
+ resource ||= self.auto_detect_resource || self.auto_detect_collection
209
+ if resource.nil?
210
+ raise ::Link2::Brain::AutoDetectionFailed,
211
+ "Auto-detection of resource or collection failed for args: #{[action, resource].inspect}."
212
+ end
213
+
199
214
  options[:controller] ||= "/%s" % self.controller_name_for_resource(resource)
200
215
  options[:action] = action
201
216
  options[:id] = resource.id if !resource.is_a?(Class) && ::Link2::Support.record_class?(resource)
@@ -231,12 +246,21 @@ module Link2
231
246
  # controller_name_for_resource(@post)
232
247
  # # => "posts"
233
248
  #
234
- def controller_name_for_resource(resource = nil)
235
- resource_class = ::Link2::Support.find_resource_class(resource)
236
- if ::Link2::Support.record_class?(resource_class)
237
- resource_class.to_s.tableize # rescue nil
249
+ # controller_name_for_resource([@post_1, @post_2])
250
+ # # => "posts"
251
+ #
252
+ def controller_name_for_resource(resource_or_collection = nil)
253
+ if resource_or_collection
254
+ if ::Link2::Support.record_collection?(resource_or_collection)
255
+ resource_or_collection.first.class.name.tableize
256
+ else
257
+ resource_class = ::Link2::Support.find_resource_class(resource_or_collection)
258
+ resource_class.name.tableize if ::Link2::Support.record_class?(resource_class)
259
+ end
238
260
  end || self.controller.controller_name
239
261
  end
262
+ # When no resource is passed +current_controller_name+ makes more sense.
263
+ alias :current_controller_name :controller_name_for_resource
240
264
 
241
265
  # Parse human resource name for a specified resource.
242
266
  #
@@ -269,6 +293,30 @@ module Link2
269
293
  custom_name
270
294
  end
271
295
 
296
+ # Auto-detect current view resource instance based on expected ivar-name.
297
+ #
298
+ def auto_detect_resource
299
+ if self.respond_to?(:resource) # InheritedResources pattern
300
+ self.resource
301
+ else
302
+ self.instance_variable_get(:"@#{self.current_controller_name.singularize}") # @post
303
+ end
304
+ rescue
305
+ nil
306
+ end
307
+
308
+ # Auto-detect current view resource collection instance based on expected ivar-name.
309
+ #
310
+ def auto_detect_collection
311
+ if self.respond_to?(:collection) # InheritedResources pattern
312
+ self.collection
313
+ else
314
+ self.instance_variable_get(:"@#{self.current_controller_name.pluralize}") # @posts
315
+ end
316
+ rescue
317
+ nil
318
+ end
319
+
272
320
  # Attach Link2 semantic DOM selector attributes (attributes "id" and "class") based on
273
321
  # action and resource - if any can be parsed.
274
322
  #
@@ -28,6 +28,22 @@ module Link2
28
28
  raise "No such class: #{resource_class_name}"
29
29
  end
30
30
 
31
+ # Extract resource based on resource or collecton of resources.
32
+ #
33
+ # == Usage/Examples:
34
+ #
35
+ # extract_resource?(nil)
36
+ # # => nil
37
+ #
38
+ # extract_resource?([])
39
+ # # => nil
40
+ #
41
+ # extract_resource?(@post)
42
+ # # => @post
43
+ #
44
+ # extract_resource?([@post_1, @post_2])
45
+ # # => @post_2
46
+ #
31
47
  def extract_resource(resource)
32
48
  resource.compact! if resource.is_a?(Array)
33
49
  [resource].flatten.last
@@ -36,8 +52,55 @@ module Link2
36
52
  # Check if the specified object is a valid resource identifier class. Used
37
53
  # for detecting current resource based on controller, action, etc.
38
54
  #
55
+ # resource_identifier_class?(:string)
56
+ # # => false
57
+ #
58
+ # resource_identifier_class?(:post)
59
+ # # => true
60
+ #
61
+ # resource_identifier_class?(String)
62
+ # # => false
63
+ #
64
+ # resource_identifier_class?(Post)
65
+ # # => true
66
+ #
67
+ # resource_identifier_class?("")
68
+ # # => false
69
+ #
70
+ # resource_identifier_class?(@post)
71
+ # # => true
72
+ #
39
73
  def resource_identifier_class?(object)
40
- object.is_a?(NilClass) || object.is_a?(Symbol) || self.record_class?(object)
74
+ (object.is_a?(NilClass) || object.is_a?(Symbol) || self.record_class?(object))
75
+ end
76
+
77
+ # Check if passed object is an array for record instances, i.e. "collection".
78
+ # THis assumes all objects in the array is of same kind; makes little sense with mixing
79
+ # different records kinds in a collection, and in such case any auto-detection is hard.
80
+ #
81
+ # == Usage/Examples:
82
+ #
83
+ # record_collection?([])
84
+ # # => false
85
+ #
86
+ # record_collection?(@post)
87
+ # # => false
88
+ #
89
+ # record_collection?([@post])
90
+ # # => true
91
+ #
92
+ # record_collection?([@post, @article])
93
+ # # => false
94
+ #
95
+ # record_collection?([@post, @post])
96
+ # # => true
97
+ #
98
+ def record_collection?(collection_maybe)
99
+ if collection_maybe.present? && collection_maybe.is_a?(Array)
100
+ collection_maybe.compact.all? { |object| record_object?(object) }
101
+ else
102
+ false
103
+ end
41
104
  end
42
105
 
43
106
  # Check if a specified objec is a record class type.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Link2
4
- VERSION = '0.1.5'.freeze
4
+ VERSION = '0.1.6'.freeze
5
5
  end
@@ -9,6 +9,7 @@ class BrainTest < ActionView::TestCase
9
9
  ::I18n.locale = :en
10
10
 
11
11
  @mookey = ::Fraggle.create(:name => 'Mookey')
12
+ @wembley = ::Fraggle.create(:name => 'Wembley')
12
13
  @tweaked_mookey = ::Fraggle.create(:name => 'Mookey 2.0')
13
14
  @tweaked_mookey.class_eval do
14
15
  def to_s
@@ -49,8 +50,25 @@ class BrainTest < ActionView::TestCase
49
50
  end
50
51
 
51
52
  test "#controller_name_for_resource: should return current controller if no resource is specified or is nil" do
52
- # Current: TestController
53
- assert_equal 'test', controller_name_for_resource(nil)
53
+ self.expects(:controller_name_for_resource).with(nil).returns('fraggles').at_least_once
54
+ assert_equal 'fraggles', controller_name_for_resource(nil)
55
+ end
56
+
57
+ test "#current_controller_name: should return current controller" do
58
+ self.expects(:current_controller_name).returns('fraggles').at_least_once
59
+ assert_equal 'fraggles', current_controller_name
60
+ end
61
+
62
+ test "#auto_detect_resource: " do
63
+ self.expects(:current_controller_name).returns('fraggles').at_least_once
64
+ @fraggle = @mookey
65
+ assert_equal @fraggle, auto_detect_resource
66
+ end
67
+
68
+ test "#auto_detect_collection: should " do
69
+ self.expects(:current_controller_name).returns('fraggles').at_least_once
70
+ @fraggles = [@mookey, @wembley]
71
+ assert_equal @fraggles, auto_detect_collection
54
72
  end
55
73
 
56
74
  test "#human_name_for_resource: should return reosurce name based on resource using #to_s or #human_name" do
@@ -14,6 +14,7 @@ class HelpersTest < ActionView::TestCase
14
14
  ::Link2.i18n_scopes = [] # Keep it simple - no scoped lookups by default.
15
15
 
16
16
  @mookey = ::Fraggle.create(:name => 'Mookey')
17
+ @wembley = ::Fraggle.create(:name => 'Wembley')
17
18
  @mookeys_cool_aid = ::CoolAid.create(:name => 'Super-tasty')
18
19
  end
19
20
 
@@ -30,22 +31,49 @@ class HelpersTest < ActionView::TestCase
30
31
  assert_equal link_to('/posts?by=date', '/posts?by=date'), link('/posts?by=date')
31
32
  end
32
33
 
33
- test "link(label) should render link_to(str_label, '#')" do
34
+ test "link(label) should render link_to(label, '#')" do
34
35
  assert_equal link_to('Hello', '#'), link('Hello')
35
36
  end
36
37
 
37
- test "link(:action, url) should render link_to(t(:action, ...), url)" do
38
- assert_equal link_to('Home', '/custom-home'), link(:home, '/custom-home')
38
+ test "auto-detecting resource: link(:action) should render link_to(t(:action, ...), @resource)" do
39
+ self.expects(:current_controller_name).with(nil).returns('fraggles').at_least_once
40
+
41
+ assert_raise(::Link2::Brain::AutoDetectionFailed) do
42
+ link(:show)
43
+ end
44
+
45
+ @fraggle = @mookey
46
+
47
+ assert_nothing_raised(::Link2::Brain::AutoDetectionFailed) do
48
+ link(:show)
49
+ end
50
+
51
+ assert_equal link_to("Show", "/fraggles/#{@fraggle.id}"), link(:show)
52
+ assert_equal link_to("Show", "/fraggles/#{@fraggle.id}", ONE_HASH), link(:show, ONE_HASH)
53
+ assert_equal link_to("Show", "/fraggles/#{@fraggle.id}", *TWO_HASHES), link(:show, *TWO_HASHES)
39
54
  end
40
55
 
41
- test "link(:action) should render link_to(t(:action, ...), url_for(:action => :action, ...)), auto-detecting resource" do
42
- # assert_equal link_to("New Fraggle"), link(:new)
43
- assert_raise(::Link2::NotImplementedYetError) { link(:new) }
56
+ test "auto-detecting collection: link(:action) should render link_to(t(:action, ...), @collection)" do
57
+ self.expects(:current_controller_name).with(nil).returns('fraggles').at_least_once
58
+
59
+ assert_raise(::Link2::Brain::AutoDetectionFailed) do
60
+ link(:index)
61
+ end
62
+
63
+ @fraggles = [@mookey, @wembley]
64
+
65
+ assert_nothing_raised(::Link2::Brain::AutoDetectionFailed) do
66
+ link(:index)
67
+ end
68
+
69
+ assert_equal link_to("Index", "/fraggles"), link(:index)
70
+ assert_equal link_to("Index", "/fraggles", ONE_HASH), link(:index, ONE_HASH)
71
+ assert_equal link_to("Index", "/fraggles", *TWO_HASHES), link(:index, *TWO_HASHES)
44
72
  end
45
73
 
46
- test "link(:mapping) should render link_to(t(:mapping, ...), url_for_mapping(:mapping, ...)), auto-detecting resource" do
47
- assert_equal link_to("Home", '/'), link(:home)
48
- assert_equal link_to("Home", '/', ONE_HASH), link(:home, ONE_HASH)
74
+ test "link(:mapping) should render link_to(t(:mapping, ...), url_for_mapping(:mapping, ...)), lookup mapping" do
75
+ assert_equal link_to("Home", '/'), link(:home)
76
+ assert_equal link_to("Home", '/', ONE_HASH), link(:home, ONE_HASH)
49
77
  assert_equal link_to("Home", '/', *TWO_HASHES), link(:home, *TWO_HASHES)
50
78
 
51
79
  swap ::Link2, :action_mappings => {:secret => '/secret'} do
@@ -70,6 +98,22 @@ class HelpersTest < ActionView::TestCase
70
98
 
71
99
  # link(x, y, {}, {})
72
100
 
101
+ test "link(:action, url) should render link_to(t(:action, ...), url)" do
102
+ assert_equal link_to('Home', '/custom-home'), link(:home, '/custom-home')
103
+ end
104
+
105
+ test "link(..., :mapping) should render link_to(..., url_for_mapping(:mapping, ...))" do
106
+ assert_nothing_raised(Exception) { link("Home", :home) }
107
+ assert_equal link_to("Home", root_path), link("Home", :home)
108
+ assert_nothing_raised(Exception) { link(:home, :home) }
109
+ assert_equal link_to("Home", root_path), link(:home, :home)
110
+
111
+ assert_nothing_raised(Exception) { link("Back", :back) }
112
+ assert_equal link_to("Back", :back), link("Back", :back)
113
+ assert_nothing_raised(Exception) { link(:back, :back) }
114
+ assert_equal link_to("Back", :back), link(:back, :back)
115
+ end
116
+
73
117
  test "link(label, url) should render link_to(label, url)" do
74
118
  assert_equal link_to('New', '/posts/new'), link('New', '/posts/new')
75
119
  assert_equal link_to('New', '/posts/new', ONE_HASH), link('New', '/posts/new', ONE_HASH)
@@ -82,9 +126,9 @@ class HelpersTest < ActionView::TestCase
82
126
 
83
127
  test "link(:action) should render link_to(label, url_for(:action => :action, ...)), auto-detecting resource" do
84
128
  # assert_equal link_to("New Fraggle!!"), link("New Fraggle!!", :new)
85
- assert_raise(::Link2::NotImplementedYetError) { link("New Fraggle!!", :new) }
86
- assert_raise(::Link2::NotImplementedYetError) { link("New Fraggle!!", :new, ONE_HASH) }
87
- assert_raise(::Link2::NotImplementedYetError) { link("New Fraggle!!", :new, *TWO_HASHES) }
129
+ assert_raise(::Link2::Brain::AutoDetectionFailed) { link("New Fraggle!!", :new) }
130
+ assert_raise(::Link2::Brain::AutoDetectionFailed) { link("New Fraggle!!", :new, ONE_HASH) }
131
+ assert_raise(::Link2::Brain::AutoDetectionFailed) { link("New Fraggle!!", :new, *TWO_HASHES) }
88
132
  end
89
133
 
90
134
  test "link(label, action) should render link_to(label, url_for_mapping(:mapping, ...)), auto-detecting resource" do
@@ -122,6 +166,42 @@ class HelpersTest < ActionView::TestCase
122
166
  assert_raise(::Link2::NotImplementedYetError) { link(:edit, [@mookey, @mookeys_cool_aid], *TWO_HASHES) }
123
167
  end
124
168
 
169
+ test "auto-detecting resource: link(label, :action) should render link_to(label, @resource, :action => :action)" do
170
+ self.expects(:current_controller_name).with(nil).returns('fraggles').at_least_once
171
+
172
+ assert_raise(::Link2::Brain::AutoDetectionFailed) do
173
+ link("Show it", :show)
174
+ end
175
+
176
+ @fraggle = @mookey
177
+
178
+ assert_nothing_raised(::Link2::Brain::AutoDetectionFailed) do
179
+ link("Show it", :show)
180
+ end
181
+
182
+ assert_equal link_to("Show it", "/fraggles/#{@fraggle.id}"), link("Show it", :show)
183
+ assert_equal link_to("Show it", "/fraggles/#{@fraggle.id}", ONE_HASH), link("Show it", :show, ONE_HASH)
184
+ assert_equal link_to("Show it", "/fraggles/#{@fraggle.id}", *TWO_HASHES), link("Show it", :show, *TWO_HASHES)
185
+ end
186
+
187
+ test "auto-detecting collection: link(label, :action) should render link_to(label, @collection, :action => :action)" do
188
+ self.expects(:current_controller_name).with(nil).returns('fraggles').at_least_once
189
+
190
+ assert_raise(::Link2::Brain::AutoDetectionFailed) do
191
+ link("All", :index)
192
+ end
193
+
194
+ @fraggles = [@mookey, @wembley]
195
+
196
+ assert_nothing_raised(::Link2::Brain::AutoDetectionFailed) do
197
+ link("All", :index)
198
+ end
199
+
200
+ assert_equal link_to("All", "/fraggles"), link("All", :index)
201
+ assert_equal link_to("All", "/fraggles", ONE_HASH), link("All", :index, ONE_HASH)
202
+ assert_equal link_to("All", "/fraggles", *TWO_HASHES), link("All", :index, *TWO_HASHES)
203
+ end
204
+
125
205
  # link(x, y, z, {}, {})
126
206
 
127
207
  test "link(label, action, resource)" do
@@ -26,10 +26,26 @@ class SupportTest < ActiveSupport::TestCase
26
26
  assert_not ::Link2::Support.resource_identifier_class?(::Unicorn)
27
27
  end
28
28
 
29
+ test "#record_collection?: should be true only i passed value is array of record objects of same kind" do
30
+ assert_not ::Link2::Support.record_collection?([])
31
+ assert_not ::Link2::Support.record_collection?(::Fraggle.new)
32
+ assert_not ::Link2::Support.record_collection?([::Unicorn.new])
33
+ assert_not ::Link2::Support.record_collection?([::Unicorn.new, ::Fraggle.new])
34
+
35
+ assert ::Link2::Support.record_collection?([::Fraggle.new])
36
+ assert ::Link2::Support.record_collection?([::Fraggle.new, ::Fraggle.new])
37
+ end
38
+
29
39
  test "#record_class?: should only be true for record classes" do
30
40
  assert ::Link2::Support.record_class?(::Fraggle)
31
41
 
32
42
  assert_not ::Link2::Support.record_class?(::Unicorn)
33
43
  end
34
44
 
45
+ test "#record_object?: should only be true for record objects" do
46
+ assert ::Link2::Support.record_class?(::Fraggle.new)
47
+
48
+ assert_not ::Link2::Support.record_class?(::Unicorn.new)
49
+ end
50
+
35
51
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: link2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Grimfelt
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-03 00:00:00 +01:00
12
+ date: 2010-03-04 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency