Skip to content

Commit

Permalink
AbstractAdapter improved and added specs
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhomart committed Feb 2, 2015
1 parent 76ba414 commit 073d6a2
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 10 deletions.
31 changes: 31 additions & 0 deletions lib/active_admin/object_mapper/abstract_adapter.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,37 @@
module ActiveAdmin
module ObjectMapper
class AbstractAdapter

class << self

attr_accessor :adapters

def register(klass)
self.adapters ||= []
self.adapters << klass
end

def for(object_mapper, adapter_name, base)
klass = class_for(object_mapper, adapter_name)
adapters && adapters.include?(klass) or
raise NoAdapterFound.new("Adapter #{adapter_name} is not registered")
klass.new(base)
end

def class_for(object_mapper, adapter_name)
adapter_class = "#{adapter_name}_adapter"
class_name = "ActiveAdmin::ObjectMapper::#{object_mapper.to_s.classify}::#{adapter_class.classify}"
Object.const_defined?(class_name) or
raise NoAdapterFound.new("Class #{class_name} not found")
class_name.constantize
end

def inherited(klass)
ActiveAdmin::ObjectMapper::AbstractAdapter.register(klass)
end

end

attr_accessor :base

def initialize(base)
Expand Down
16 changes: 6 additions & 10 deletions lib/active_admin/object_mapper/active_record.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,16 @@

require 'active_admin/object_mapper/active_record/comments'

require 'active_admin/object_mapper/active_record/adapters/form_builder_adapter'
require 'active_admin/object_mapper/active_record/adapters/formtastic_addons_adapter'
require 'active_admin/object_mapper/active_record/adapters/resource_extension_adapter'

module ActiveAdmin
module ObjectMapper
module ActiveRecord

ADAPTERS = [ 'form_builder_adapter', 'formtastic_addons_adapter',
'resource_extension_adapter' ]

ADAPTERS.each do |adapter|
require "active_admin/object_mapper/active_record/adapters/#{adapter}"

klass = %[ActiveAdmin::ObjectMapper::ActiveRecord::#{adapter.classify}].constantize
define_singleton_method adapter do |base|
klass.new(base)
end
def self.adapter(name, base)
AbstractAdapter.for(:active_record, name, base)
end

end
Expand Down
60 changes: 60 additions & 0 deletions spec/unit/object_mapper/abstract_adapter_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
require 'rails_helper'

describe ActiveAdmin::ObjectMapper::AbstractAdapter do

module ActiveAdmin::ObjectMapper::KnownOrm; class SimpleAdapter < ActiveAdmin::ObjectMapper::AbstractAdapter; end; end

let(:simple_adapter_class) { ActiveAdmin::ObjectMapper::KnownOrm::SimpleAdapter }

subject { ActiveAdmin::ObjectMapper::AbstractAdapter }

describe ".register" do
let(:adapter) { double }

after do
subject.adapters.delete(adapter)
end

it "registers an Adapter" do
subject.register adapter
expect(subject.adapters).to include(adapter)
end
end

describe ".for" do
context "When adapter is not found" do
it "rises a NoAdapterFound error" do
expect {
subject.for("unknown_orm", "simple", nil)
}.to raise_error ActiveAdmin::NoAdapterFound
end
end

context "When adapter is not registered" do
module ActiveAdmin::ObjectMapper::KnownOrm; class NotAdapter; end; end

it "rises a NoAdapterFound error" do
expect {
subject.for("known_orm", "not_adapter", nil)
}.to raise_error ActiveAdmin::NoAdapterFound
end
end

context "When adapter is registered" do
it "returns adapter" do
expect(subject.for("known_orm", "simple", nil)).to be_a(simple_adapter_class)
end
end
end

context "Adapter" do
let(:base_object) { double }
let(:simple_adapter) { subject.for("known_orm", "simple", base_object) }

it "delegates method calls to base object" do
expect(base_object).to receive(:method_of_object)
simple_adapter.method_of_object
end
end

end

0 comments on commit 073d6a2

Please sign in to comment.