Replace method_missing per explicit delegation

To avoid as much magic as possible
pull/15879/head
Alberto Miedes Garcés 4 years ago
parent d4e459692e
commit ba35408eee

@ -259,6 +259,8 @@ WORKING_SPECS_9 = \
services/geocoder/spec/hires_geocoder_factory_spec.rb \ services/geocoder/spec/hires_geocoder_factory_spec.rb \
services/table-geocoder/spec/geocoder_cache_spec.rb \ services/table-geocoder/spec/geocoder_cache_spec.rb \
services/user-mover/spec/user_mover_spec.rb \ services/user-mover/spec/user_mover_spec.rb \
spec/presenters/base_presenter_spec.rb \
spec/presenters/organization_presenter_spec.rb \
$(NULL) $(NULL)
# Tests using spec_helper_min instead of spec_helper # Tests using spec_helper_min instead of spec_helper

@ -2,17 +2,17 @@ class BasePresenter
attr_accessor :object, :params attr_accessor :object, :params
def initialize(object, params = {}) def self.object_klass
@object = object raise 'Must be overriden in child class'
@params = params
end end
def method_missing(*args, &block) def self.delegated_methods
object.send(*args, &block) object_klass.columns.map(&:name).map(&:to_sym) + object_klass.instance_methods
end end
def respond_to_missing?(method_name, _include_private = false) def initialize(object, params = {})
object.respond_to?(method_name) @object = object
@params = params
end end
end end

@ -1,5 +1,14 @@
class OrganizationPresenter < BasePresenter class OrganizationPresenter < BasePresenter
def self.object_klass
Carto::Organization
end
# rubocop:disable Style/AccessModifierDeclarations
protected(*delegate(*delegated_methods, to: :object))
# rubocop:enable Style/AccessModifierDeclarations
delegate(:owner, :unassigned_quota, :db_size_in_bytes, to: :object)
def data def data
params[:extended] ? extended_representation : default_representation params[:extended] ? extended_representation : default_representation
end end

@ -0,0 +1,27 @@
require 'spec_helper'
describe BasePresenter do
class DummyPresenter < BasePresenter
def self.object_klass
Carto::Organization
end
# rubocop:disable Style/AccessModifierDeclarations
private(*delegate(*delegated_methods, to: :object))
# rubocop:enable Style/AccessModifierDeclarations
def data
{ id: id }
end
end
let(:organization) { create(:carto_organization) }
let(:presenter) { DummyPresenter.new(organization) }
it 'delegates basic methods to inner object while keeping them private' do
expect(presenter.data[:id]).to eq(organization.id)
expect { presenter.id }.to raise_error(NoMethodError)
end
end

@ -0,0 +1,25 @@
require 'spec_helper'
describe OrganizationPresenter do
let(:user) { create(:carto_user, period_end_date: Time.parse('2018-01-01')) }
let(:organization) { create(:carto_organization, owner: user) }
let(:presenter) { described_class.new(organization) }
let(:date_range) { { Date.new(2017, 3, 20) => 1 } }
describe '#data' do
before do
CartoDB::ServiceUsageMetrics.any_instance.stubs(:get_date_range).returns(date_range)
end
it 'returns the default representation' do
expect(presenter.data[:id]).to eq(organization.id)
expect(presenter.data[:owner][:username]).to eq(organization.owner.username)
end
it 'returns extra attributes for the extended representation' do
presenter = described_class.new(organization, extended: true)
expect(presenter.data[:table_count]).to eq(0)
end
end
end
Loading…
Cancel
Save