From 393b299a1f60bb0ca937054362785e562e28a8bd Mon Sep 17 00:00:00 2001 From: Joshua Clayton Date: Fri, 20 Apr 2012 23:49:37 -0400 Subject: [PATCH] Add StaticRegistry decorator to mix in exceptions --- lib/factory_girl.rb | 7 ++--- lib/factory_girl/registry.rb | 14 +++------- lib/factory_girl/strict_registry.rb | 25 +++++++++++++++++ spec/factory_girl/registry_spec.rb | 14 ---------- spec/factory_girl/strict_registry_spec.rb | 33 +++++++++++++++++++++++ 5 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 lib/factory_girl/strict_registry.rb create mode 100644 spec/factory_girl/strict_registry_spec.rb diff --git a/lib/factory_girl.rb b/lib/factory_girl.rb index 1f1a650..2f2cf26 100644 --- a/lib/factory_girl.rb +++ b/lib/factory_girl.rb @@ -8,6 +8,7 @@ require "factory_girl/strategy/create" require "factory_girl/strategy/attributes_for" require "factory_girl/strategy/stub" require "factory_girl/strategy/null" +require 'factory_girl/strict_registry' require 'factory_girl/registry' require 'factory_girl/null_factory' require 'factory_girl/null_object' @@ -35,7 +36,7 @@ require 'factory_girl/version' module FactoryGirl def self.factories - @factories ||= Registry.new("Factory") + @factories ||= StrictRegistry.new(Registry.new("Factory")) end def self.register_factory(factory) @@ -50,7 +51,7 @@ module FactoryGirl end def self.sequences - @sequences ||= Registry.new("Sequence") + @sequences ||= StrictRegistry.new(Registry.new("Sequence")) end def self.register_sequence(sequence) @@ -65,7 +66,7 @@ module FactoryGirl end def self.traits - @traits ||= Registry.new("Trait") + @traits ||= StrictRegistry.new(Registry.new("Trait")) end def self.register_trait(trait) diff --git a/lib/factory_girl/registry.rb b/lib/factory_girl/registry.rb index ca82c52..4bbde73 100644 --- a/lib/factory_girl/registry.rb +++ b/lib/factory_girl/registry.rb @@ -2,31 +2,25 @@ module FactoryGirl class Registry include Enumerable + attr_reader :name + def initialize(name) @name = name @items = {} end def register(name, item) - if registered?(name) - raise DuplicateDefinitionError, "#{@name} already registered: #{name}" - else - @items[name.to_sym] = item - end + @items[name.to_sym] = item end def find(name) - @items[name.to_sym] or raise ArgumentError.new("#{@name} not registered: #{name.to_s}") + @items[name.to_sym] end def each(&block) @items.values.uniq.each(&block) end - def [](name) - find(name) - end - def registered?(name) @items.key?(name.to_sym) end diff --git a/lib/factory_girl/strict_registry.rb b/lib/factory_girl/strict_registry.rb new file mode 100644 index 0000000..ac543bd --- /dev/null +++ b/lib/factory_girl/strict_registry.rb @@ -0,0 +1,25 @@ +module FactoryGirl + class StrictRegistry + def initialize(component) + @component = component + end + + delegate :each, :registered?, :clear, to: :@component + + def register(name, item) + if registered?(name) + raise DuplicateDefinitionError, "#{@component.name} already registered: #{name}" + else + @component.register(name, item) + end + end + + def find(name) + if registered?(name) + @component.find(name) + else + raise ArgumentError, "#{@component.name} not registered: #{name}" + end + end + end +end diff --git a/spec/factory_girl/registry_spec.rb b/spec/factory_girl/registry_spec.rb index e0fd4f8..f10f500 100644 --- a/spec/factory_girl/registry_spec.rb +++ b/spec/factory_girl/registry_spec.rb @@ -13,10 +13,6 @@ describe FactoryGirl::Registry do subject.find(:object_name).should == registered_object end - it "raises when trying to find an unregistered object" do - expect { subject.find(:bogus) }.to raise_error(ArgumentError, "Great thing not registered: bogus") - end - it "adds and returns the object registered" do subject.register(:object_name, registered_object).should == registered_object end @@ -35,11 +31,6 @@ describe FactoryGirl::Registry do subject.should_not be_registered("bogus") end - it "can be accessed like a hash" do - subject.register(:object_name, registered_object) - subject[:object_name].should == registered_object - end - it "iterates registered objects" do subject.register(:first_object, registered_object) subject.register(:second_object, second_registered_object) @@ -52,11 +43,6 @@ describe FactoryGirl::Registry do subject.to_a.should == [registered_object] end - it "doesn't allow a duplicate name" do - expect { 2.times { subject.register(:same_name, registered_object) } }. - to raise_error(FactoryGirl::DuplicateDefinitionError, "Great thing already registered: same_name") - end - it "clears registered factories" do subject.register(:object_name, registered_object) subject.clear diff --git a/spec/factory_girl/strict_registry_spec.rb b/spec/factory_girl/strict_registry_spec.rb new file mode 100644 index 0000000..0a4d824 --- /dev/null +++ b/spec/factory_girl/strict_registry_spec.rb @@ -0,0 +1,33 @@ +require "spec_helper" + +describe FactoryGirl::StrictRegistry do + let(:registry) { stub("registry", name: "Great thing", register: true, find: true, each: true, registered?: true, clear: true) } + + subject { FactoryGirl::StrictRegistry.new(registry) } + + it "delegates #each to the registry" do + block = -> {} + subject.each(block) + registry.should have_received(:each).with(block) + end + + it "delegates #registered? to the registry" do + subject.registered?(:great_name) + registry.should have_received(:registered?).with(:great_name) + end + + it "delegates #clear to the registry" do + subject.clear + registry.should have_received(:clear) + end + + it "raises when trying to find an unregistered object" do + registry.stubs(registered?: false) + expect { subject.find(:bogus) }.to raise_error(ArgumentError, "Great thing not registered: bogus") + end + + it "doesn't allow a duplicate name" do + expect { 2.times { subject.register(:same_name, {}) } }. + to raise_error(FactoryGirl::DuplicateDefinitionError, "Great thing already registered: same_name") + end +end