Skip to content

Commit

Permalink
Allow a resourceful admin to be defined without registering it for lo…
Browse files Browse the repository at this point in the history
…okup by model
  • Loading branch information
spohlenz committed May 24, 2021
1 parent ce3d34b commit 7755546
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 12 deletions.
6 changes: 3 additions & 3 deletions lib/trestle.rb
Expand Up @@ -36,13 +36,13 @@ class << self
end

# Builds and registers a new plain admin
def self.admin(name, options={}, &block)
def self.admin(name, **options, &block)
register(Admin::Builder.create(name, options, &block))
end

# Builds and registers a new admin resource
def self.resource(name, options={}, &block)
register(Resource::Builder.create(name, options, &block))
def self.resource(name, register_model: true, **options, &block)
register(Resource::Builder.create(name, options, &block), register_model: register_model)
end

# Configuration methods
Expand Down
6 changes: 3 additions & 3 deletions lib/trestle/registry.rb
Expand Up @@ -22,11 +22,11 @@ def empty?
none?
end

def register(admin)
def register(admin, register_model: true)
@admins[admin.admin_name] = admin

if admin.respond_to?(:model)
@models[admin.model.name] = admin
if admin.respond_to?(:model) && register_model
@models[admin.model.name] ||= admin
end

admin
Expand Down
26 changes: 26 additions & 0 deletions spec/trestle/registry_spec.rb
Expand Up @@ -17,6 +17,32 @@
expect(registry).not_to be_empty
expect(registry.to_a).to eq([admin])
end

context "registering for model lookup" do
let(:model) { stub_const("Model", Class.new) }

let(:admin) { Trestle.resource(:test, model: model) }
let(:alternate) { Trestle.resource(:alternate, model: model) }

it "registers the admin for model lookup" do
registry.register(admin)
expect(registry.lookup_model(model)).to eq(admin)
end

it "does not overwrite an existing model registration" do
registry.register(admin)
registry.register(alternate)

expect(registry.lookup_model(model)).to eq(admin)
end

context "with register_model: false" do
it "does not register the admin for model lookup" do
registry.register(admin, register_model: false)
expect(registry.lookup_model(model)).to be_nil
end
end
end
end

describe "#each" do
Expand Down
48 changes: 42 additions & 6 deletions spec/trestle/trestle_spec.rb
Expand Up @@ -18,21 +18,57 @@
end

describe "#admin" do
it "builds an admin" do
admin = double(:admin, admin_name: "test")
let(:admin) { double(:admin, admin_name: "test") }

expect(Trestle::Admin::Builder).to receive(:create).with(:test, {}).and_return(admin)
before(:each) do
allow(Trestle::Admin::Builder).to receive(:create).and_return(admin)
end

it "builds and returns the admin" do
expect(Trestle::Admin::Builder).to receive(:create).with(:test, {})
expect(Trestle.admin(:test)).to eq(admin)
end

it "passes options to the admin builder" do
expect(Trestle::Admin::Builder).to receive(:create).with(:test, { path: "/custom" })
Trestle.admin(:test, path: "/custom")
end

it "registers the admin in the registry" do
expect(Trestle.registry).to receive(:register).with(admin)
Trestle.admin(:test)
end
end

describe "#resource" do
it "builds a resource admin" do
admin = double(:admin, admin_name: "test")
let(:model) { stub_const("Model", Class.new) }
let(:admin) { double(:admin, admin_name: "test", model: model) }

before(:each) do
allow(Trestle::Resource::Builder).to receive(:create).and_return(admin)
end

expect(Trestle::Resource::Builder).to receive(:create).with(:test, {}).and_return(admin)
it "builds and returns a resourceful admin" do
expect(Trestle::Resource::Builder).to receive(:create).with(:test, {})
expect(Trestle.resource(:test)).to eq(admin)
end

it "passes options to the resource builder" do
expect(Trestle::Resource::Builder).to receive(:create).with(:test, { path: "/custom" })
Trestle.resource(:test, path: "/custom")
end

it "registers the admin in the registry" do
expect(Trestle::Resource::Builder).to receive(:create).with(:test, { path: "/custom" })
expect(Trestle.registry).to receive(:register).with(admin, register_model: true)
Trestle.resource(:test, path: "/custom")
end

it "passes the :register_model option to Registry#register" do
expect(Trestle::Resource::Builder).to receive(:create).with(:test, { path: "/custom" })
expect(Trestle.registry).to receive(:register).with(admin, register_model: false)
Trestle.resource(:test, path: "/custom", register_model: false)
end
end

describe "#navigation" do
Expand Down

0 comments on commit 7755546

Please sign in to comment.