rails/actionpack/test/abstract/collector_test.rb
Łukasz Strzałkowski 2d3a6a0cb8 Action Pack Variants
By default, variants in the templates will be picked up if a variant is set
and there's a match. The format will be:

  app/views/projects/show.html.erb
  app/views/projects/show.html+tablet.erb
  app/views/projects/show.html+phone.erb

If request.variant = :tablet is set, we'll automatically be rendering the
html+tablet template.

In the controller, we can also tailer to the variants with this syntax:

  class ProjectsController < ActionController::Base
    def show
      respond_to do |format|
        format.html do |html|
          @stars = @project.stars

          html.tablet { @notifications = @project.notifications }
          html.phone  { @chat_heads    = @project.chat_heads }
        end

        format.js
        format.atom
      end
    end
  end

The variant itself is nil by default, but can be set in before filters, like
so:

  class ApplicationController < ActionController::Base
    before_action do
      if request.user_agent =~ /iPad/
        request.variant = :tablet
      end
    end
  end

This is modeled loosely on custom mime types, but it's specifically not
intended to be used together. If you're going to make a custom mime type,
you don't need a variant. Variants are for variations on a single mime
types.
2013-12-04 00:13:16 +01:00

58 lines
1.6 KiB
Ruby

require 'abstract_unit'
module AbstractController
module Testing
class MyCollector
include AbstractController::Collector
attr_accessor :responses
def initialize
@responses = []
end
def custom(mime, *args, &block)
@responses << [mime, args, block]
end
end
class TestCollector < ActiveSupport::TestCase
test "responds to default mime types" do
collector = MyCollector.new
assert_respond_to collector, :html
assert_respond_to collector, :text
end
test "does not respond to unknown mime types" do
collector = MyCollector.new
assert !collector.respond_to?(:unknown)
end
test "register mime types on method missing" do
AbstractController::Collector.send(:remove_method, :js)
collector = MyCollector.new
assert !collector.respond_to?(:js)
collector.js
assert_respond_to collector, :js
end
test "does not register unknown mime types" do
collector = MyCollector.new
assert_raise NoMethodError do
collector.unknown
end
end
test "generated methods call custom with arguments received" do
collector = MyCollector.new
collector.html
collector.text(:foo)
collector.js(:bar) { :baz }
assert_equal [Mime::HTML, [], nil], collector.responses[0]
assert_equal [Mime::TEXT, [:foo], nil], collector.responses[1]
assert_equal [Mime::JS, [:bar]], collector.responses[2][0,2]
assert_equal :baz, collector.responses[2][2].call
end
end
end
end