From ff6c41276559fe78075ad3fb277bfe7abb35d486 Mon Sep 17 00:00:00 2001 From: Zach Holt Date: Sun, 18 May 2008 15:42:05 -0700 Subject: [PATCH] Added require_js and require_css matcher helper methods --- merb-assets/lib/merb-assets/test.rb | 3 + merb-assets/lib/merb-assets/test/matchers.rb | 9 +++ .../test/matchers/controller_matchers.rb | 63 ++++++++++++++++++++ merb-assets/spec/test/controller_matchers_spec.rb | 61 +++++++++++++++++++ 4 files changed, 136 insertions(+), 0 deletions(-) create mode 100644 merb-assets/lib/merb-assets/test.rb create mode 100644 merb-assets/lib/merb-assets/test/matchers.rb create mode 100644 merb-assets/lib/merb-assets/test/matchers/controller_matchers.rb create mode 100644 merb-assets/spec/test/controller_matchers_spec.rb diff --git a/merb-assets/lib/merb-assets/test.rb b/merb-assets/lib/merb-assets/test.rb new file mode 100644 index 0000000..754780e --- /dev/null +++ b/merb-assets/lib/merb-assets/test.rb @@ -0,0 +1,3 @@ +module Merb; module Test; end; end + +require 'merb-assets/test/matchers' diff --git a/merb-assets/lib/merb-assets/test/matchers.rb b/merb-assets/lib/merb-assets/test/matchers.rb new file mode 100644 index 0000000..7d06c8e --- /dev/null +++ b/merb-assets/lib/merb-assets/test/matchers.rb @@ -0,0 +1,9 @@ +module Merb::Test::Rspec; end + +require "merb-assets/test/matchers/controller_matchers" +#require "merb-assets/test/matchers/route_matchers" +#require "merb-assets/test/matchers/view_matchers" + +Merb::Test::ControllerHelper.send(:include, Merb::Test::Rspec::ControllerMatchers) +#Merb::Test::RouteHelper.send(:include, Merb::Test::Rspec::RouteMatchers) +#Merb::Test::ViewHelper.send(:include, Merb::Test::Rspec::ViewMatchers) \ No newline at end of file diff --git a/merb-assets/lib/merb-assets/test/matchers/controller_matchers.rb b/merb-assets/lib/merb-assets/test/matchers/controller_matchers.rb new file mode 100644 index 0000000..3177478 --- /dev/null +++ b/merb-assets/lib/merb-assets/test/matchers/controller_matchers.rb @@ -0,0 +1,63 @@ +module Merb::Test::Rspec::ControllerMatchers + + # Passes if the target required the asset + # + # ==== Examples + # controller.should require_css( 'master' ) + class RequireAsset + # === Parameters + # String:: An asset to check + def initialize(expected,asset_type=:js) + @asset_type = asset_type + @expected = expected + end + + # ==== Parameters + # target:: + # A controller instance + # + # ==== Returns + # Boolean:: True if the asset was required by the controller + def matches?(target) + @target = target + case @asset_type + when :js + @target.instance_variable_get( '@required_js' ).flatten.any?{ |js| js =~ /^#{@expected}(.js)?$/ } + when :css + @target.instance_variable_get( '@required_css' ).flatten.any?{ |js| js =~ /^#{@expected}(.css)?$/ } + else + false + end + rescue + false + end + + # ==== Returns + # String:: The failure message. + def failure_message + "expected #{@target.class.name} instance to require #{@expected}.#{@asset_type.to_s}, but it doesn't" + end + + # ==== Returns + # String:: The failure message to be displayed in negative matches. + def negative_failure_message + "expected #{@target.class.name} instance not to require #{@expected}.#{@asset_type.to_s}, but it does" + end + end + + # Passes if the controller actually requires the target js + # + # ==== Example + # controller_instance.should require_js( 'jquery' ) + def require_js( expected ) + RequireAsset.new( expected, :js ) + end + + # Passes if the controller actually requires the target css + # + # ==== Example + # controller_instance.should require_css( 'master' ) + def require_css( expected ) + RequireAsset.new( expected, :css ) + end +end diff --git a/merb-assets/spec/test/controller_matchers_spec.rb b/merb-assets/spec/test/controller_matchers_spec.rb new file mode 100644 index 0000000..d0e1b50 --- /dev/null +++ b/merb-assets/spec/test/controller_matchers_spec.rb @@ -0,0 +1,61 @@ +require File.join(File.dirname(__FILE__), "..", "spec_helper") + +Merb.start :environment => 'test', :log_level => :fatal + +class TestController < Merb::Controller + attr_accessor :redirect_to + def redirect_action; redirect(@redirect_to || "/"); end + def success_action; end + def missing_action; render("i can has errorz", :status => 404); end +end + + +module Merb::Test::Rspec + module ControllerMatchers + class RedirectableTarget + attr_accessor :status, :headers + def initialize; @headers = {}; end + include Merb::AssetsMixin + end + + describe RequireAsset do + before do + @target = RedirectableTarget.new + @target.instance_eval do + require_js 'eeny' + require_css 'meeny' + end + end + + it 'should match with explicit js' do + RequireAsset.new( 'eeny', :js ).matches?( @target ).should be_true + end + + it 'should match with implicit js' do + RequireAsset.new( 'eeny' ).matches?( @target ).should be_true + end + + it 'should not match non-required js' do + RequireAsset.new( 'meeny', :js ).matches?( @target ).should be_false + end + + it 'should match even after an include_required_js' do + @target.instance_eval{ include_required_js } + RequireAsset.new( 'eeny' ).matches?( @target ).should be_true + end + + it 'should not match non-required css' do + RequireAsset.new( 'eeny', :css ).matches?( @target ).should be_false + end + + it 'should match with css' do + RequireAsset.new( 'meeny', :css ).matches?( @target ).should be_true + end + + it 'should match even after an include_required_css' do + @target.instance_eval{ include_required_css } + RequireAsset.new( 'meeny', :css ).matches?( @target ).should be_true + end + end + end +end -- 1.5.4.3