Renamed helpers to correspond to renamed Controller classes.
[merb_radiant.git] / radiant_specs / spec / lib / radiant / .svn / text-base / extension_loader_spec.rb.svn-base
blob25ad3ee9ba451ca4a41dad9286bddf3c72baef76
1 require File.dirname(__FILE__) + "/../../spec_helper"
3 describe Radiant::ExtensionLoader do
5   before :each do
6     $LOAD_PATH.stub!(:unshift)
7     @observer = mock("observer")
8     @configuration = mock("configuration")
9     @initializer = mock("initializer")
10     @initializer.stub!(:configuration).and_return(@configuration)
11     @instance = Radiant::ExtensionLoader.send(:new)
12     @instance.initializer = @initializer
13     
14     @extensions = %w{01_basic 02_overriding load_order_blue load_order_green load_order_red}
15     @extension_paths = @extensions.map do |ext|
16       File.expand_path("#{RADIANT_ROOT}/test/fixtures/extensions/#{ext}")
17     end
18     Radiant::AdminUI.tabs.clear
19   end
21   it "should be a Simpleton" do
22     Radiant::ExtensionLoader.included_modules.should include(Simpleton)
23   end
25   it "should have the initializer's configuration" do
26     @initializer.should_receive(:configuration).and_return(@configuration)
27     @instance.configuration.should == @configuration
28   end  
29   
30   it "should only load extensions specified in the configuration" do
31     @configuration.should_receive(:extensions).at_least(:once).and_return([:basic])
32     @instance.stub!(:all_extension_roots).and_return(@extension_paths)
33     @instance.send(:select_extension_roots).should == [File.expand_path("#{RADIANT_ROOT}/test/fixtures/extensions/01_basic")]  
34   end
35   
36   it "should select extensions in an explicit order from the configuration" do
37     extensions = [:load_order_red, :load_order_blue, :load_order_green]
38     extension_roots = extensions.map {|ext| File.expand_path("#{RADIANT_ROOT}/test/fixtures/extensions/#{ext}") }
39     @instance.stub!(:all_extension_roots).and_return(@extension_paths)
40     @configuration.should_receive(:extensions).at_least(:once).and_return(extensions)
41     @instance.send(:select_extension_roots).should == extension_roots
42   end
43   
44   it "should insert all unspecified extensions into the paths at position of :all in configuration" do
45     extensions = [:load_order_red, :all, :load_order_green]
46     extension_roots = @extension_paths[0..-2].unshift(@extension_paths[-1])
47     @instance.stub!(:all_extension_roots).and_return(@extension_paths)
48     @configuration.should_receive(:extensions).at_least(:once).and_return(extensions)
49     @instance.send(:select_extension_roots).should == extension_roots
50   end
51   
52   it "should raise an error when an extension named in the configuration cannot be found" do
53     extensions = [:foobar]
54     @instance.stub!(:all_extension_roots).and_return(@extension_paths)
55     @configuration.should_receive(:extensions).at_least(:once).and_return(extensions)
56     lambda { @instance.send(:select_extension_roots) }.should raise_error(LoadError)
57   end
58   
59   it "should determine load paths from an extension path" do
60     @instance.send(:load_paths_for, "#{RADIANT_ROOT}/vendor/extensions/archive").should == %W{
61         #{RADIANT_ROOT}/vendor/extensions/archive/lib
62         #{RADIANT_ROOT}/vendor/extensions/archive/app/models
63         #{RADIANT_ROOT}/vendor/extensions/archive/test/helpers
64         #{RADIANT_ROOT}/vendor/extensions/archive}
65   end
66   
67   it "should have load paths" do
68     @instance.stub!(:load_extension_roots).and_return(@extension_paths)
69     @instance.should respond_to(:extension_load_paths)
70     @instance.extension_load_paths.should be_instance_of(Array)
71     @instance.extension_load_paths.all? {|f| File.directory?(f) }.should be_true
72   end
73   
74   it "should have plugin paths" do
75     @instance.stub!(:load_extension_roots).and_return(@extension_paths)
76     @instance.should respond_to(:plugin_paths)
77     @instance.plugin_paths.should be_instance_of(Array)
78     @instance.plugin_paths.all? {|f| File.directory?(f) }.should be_true
79   end
80   
81   it "should add extension paths to the configuration" do
82     load_paths = []
83     @instance.should_receive(:extension_load_paths).and_return(@extension_paths)
84     @configuration.should_receive(:load_paths).at_least(:once).and_return(load_paths)
85     @instance.add_extension_paths
86     load_paths.should == @extension_paths
87   end
88   
89   it "should add plugin paths to the configuration" do
90     plugin_paths = []
91     @instance.should_receive(:plugin_paths).and_return([@extension_paths.first + "/vendor/plugins"])
92     @configuration.should_receive(:plugin_paths).and_return(plugin_paths)
93     @instance.add_plugin_paths
94     plugin_paths.should == [@extension_paths.first + "/vendor/plugins"]
95   end
96   
97   it "should add plugin paths in the same order as the extension load order" do
98     plugin_paths = []
99     ext_plugin_paths = @extension_paths[0..1].map {|e| e + "/vendor/plugins" }
100     @instance.should_receive(:load_extension_roots).and_return(@extension_paths)
101     @configuration.should_receive(:plugin_paths).and_return(plugin_paths)
102     @instance.add_plugin_paths
103     plugin_paths.should == ext_plugin_paths
104   end
105   
106   it "should have controller paths" do
107     @instance.should respond_to(:controller_paths)
108     @instance.controller_paths.should be_instance_of(Array)
109     @instance.controller_paths.all? {|f| File.directory?(f) }.should be_true
110   end
111   
112   it "should add controller paths to the configuration" do
113     controller_paths = []
114     @instance.stub!(:extensions).and_return([BasicExtension])
115     @configuration.should_receive(:controller_paths).and_return(controller_paths)
116     @instance.add_controller_paths
117     controller_paths.should include(BasicExtension.root + "/app/controllers")
118   end
119   
120   it "should have view paths" do
121     @instance.should respond_to(:view_paths)
122     @instance.view_paths.should be_instance_of(Array)
123     @instance.view_paths.all? {|f| File.directory?(f) }.should be_true    
124   end
125   
126   it "should load and initialize extensions when discovering" do
127     @instance.should_receive(:load_extension_roots).and_return(@extension_paths)
128     @instance.load_extensions
129     @extensions.each do |ext|
130       ext_class = Object.const_get(ext.gsub(/^\d+_/, '').camelize + "Extension")
131       ext_class.should_not be_nil
132       ext_class.root.should_not be_nil
133     end
134   end
135   
136   it "should deactivate extensions" do
137     extensions = [BasicExtension, OverridingExtension]
138     @instance.extensions = extensions
139     @instance.deactivate_extensions
140     extensions.any?(&:active?).should be_false
141   end
142   
143   it "should activate extensions" do
144     @initializer.should_receive(:initialize_default_admin_tabs)
145     @initializer.should_receive(:initialize_framework_views)
146     extensions = [BasicExtension, OverridingExtension]
147     @instance.extensions = extensions
148     @instance.activate_extensions
149     extensions.all?(&:active?).should be_true
150   end
154 describe Radiant::ExtensionLoader::DependenciesObserver do
155   before :each do
156     @config = mock("rails config")
157     @observer = Radiant::ExtensionLoader::DependenciesObserver.new(@config)
158   end
160   it "should be a MethodObserver" do
161     @observer.should be_kind_of(MethodObserver)
162   end
163   
164   it "should attach to the clear method" do
165     @observer.should respond_to(:before_clear)
166     @observer.should respond_to(:after_clear)
167   end
168   
169   it "should deactivate extensions before clear" do
170     Radiant::ExtensionLoader.should_receive(:deactivate_extensions)
171     @observer.before_clear
172   end
173   
174   it "should load and activate extensions after clear" do
175     Radiant::ExtensionLoader.should_receive(:load_extensions)
176     Radiant::ExtensionLoader.should_receive(:activate_extensions)
177     @observer.after_clear
178   end