1 require File.dirname(__FILE__) + "/../../spec_helper"
3 describe Radiant::ExtensionLoader 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
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}")
18 Radiant::AdminUI.tabs.clear
21 it "should be a Simpleton" do
22 Radiant::ExtensionLoader.included_modules.should include(Simpleton)
25 it "should have the initializer's configuration" do
26 @initializer.should_receive(:configuration).and_return(@configuration)
27 @instance.configuration.should == @configuration
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")]
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
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
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)
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}
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
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
81 it "should add extension paths to the configuration" do
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
89 it "should add plugin paths to the configuration" do
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"]
97 it "should add plugin paths in the same order as the extension load order" do
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
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
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")
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
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
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
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
154 describe Radiant::ExtensionLoader::DependenciesObserver do
156 @config = mock("rails config")
157 @observer = Radiant::ExtensionLoader::DependenciesObserver.new(@config)
160 it "should be a MethodObserver" do
161 @observer.should be_kind_of(MethodObserver)
164 it "should attach to the clear method" do
165 @observer.should respond_to(:before_clear)
166 @observer.should respond_to(:after_clear)
169 it "should deactivate extensions before clear" do
170 Radiant::ExtensionLoader.should_receive(:deactivate_extensions)
171 @observer.before_clear
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