Skip to content

Instantly share code, notes, and snippets.

@biscuitvile
Created November 19, 2014 17:22
Show Gist options
  • Select an option

  • Save biscuitvile/e063e6ccaa7801e57c4c to your computer and use it in GitHub Desktop.

Select an option

Save biscuitvile/e063e6ccaa7801e57c4c to your computer and use it in GitHub Desktop.
commit 0767df15ac5e43df7c1e9f92824a51a16c81d404
Author: Andy Borsz <andy.borsz@gmail.com>
Date: Wed Nov 19 12:20:32 2014 -0500
Make AccountList more functional
Decouple so extremely from dependencies and pass
them in instead.
diff --git a/app/controllers/support/accounts_controller.rb b/app/controllers/support/accounts_controller.rb
index f22793e..3903998 100644
--- a/app/controllers/support/accounts_controller.rb
+++ b/app/controllers/support/accounts_controller.rb
@@ -1,7 +1,7 @@
class Support::AccountsController < Support::AuthenticatedController
def index
- @account_list = AccountList.new(account_list_params)
+ @account_list = account_list
end
def show
@@ -10,8 +10,23 @@ class Support::AccountsController < Support::AuthenticatedController
private
- def account_list_params
- params.permit(:offset, :query)
+ def account_list
+ AccountList.new(
+ paginator: paginator,
+ decoration_class: AccountDecorator,
+ )
+ end
+
+ def paginator
+ Paginator.new(
+ collection: searched_accounts,
+ limit: 100,
+ offset: params[:offset],
+ )
+ end
+
+ def searched_accounts
+ AccountSearch.new(query: params[:query]).call
end
end
diff --git a/app/models/account_list.rb b/app/models/account_list.rb
index ad4e604..d3e7412 100644
--- a/app/models/account_list.rb
+++ b/app/models/account_list.rb
@@ -1,25 +1,16 @@
class AccountList
- attr_reader :limit, :offset
+ attr_reader :paginator, :decoration_class
def initialize(args={})
- @collection = args.fetch(:collection) { Account.order(created_at: :desc) }
- @query = args.fetch(:query, '')
- @offset = args.fetch(:offset, nil)
- @limit = args.fetch(:limit, 100)
- @pagination_class = args.fetch(:pagination_class) { Paginator }
- @search_class = args.fetch(:search_class) { AccountSearch }
- @decoration_class = args.fetch(:decoration_class) { AccountDecorator }
+ @paginator = args.fetch(:paginator)
+ @decoration_class = args.fetch(:decoration_class)
end
def accounts
decoration_class.decorate_all paginator.results
end
- def total
- paginator.total
- end
-
def first_set?
paginator.first_set?
end
@@ -28,10 +19,6 @@ class AccountList
paginator.last_set?
end
- def pagination_offset
- paginator.offset
- end
-
def previous_set
paginator.previous_set
end
@@ -44,21 +31,4 @@ class AccountList
paginator.set_description
end
- private
-
- attr_accessor :collection, :query, :pagination_class,
- :search_class, :decoration_class
-
- def paginator
- @paginator ||= pagination_class.new(
- collection: searched_accounts,
- limit: limit,
- offset: offset
- )
- end
-
- def searched_accounts
- search_class.new(accounts: collection, query: query).call
- end
-
end
diff --git a/app/models/account_search.rb b/app/models/account_search.rb
index 809cdac..b44f812 100644
--- a/app/models/account_search.rb
+++ b/app/models/account_search.rb
@@ -1,7 +1,7 @@
class AccountSearch
def initialize(args={})
- @accounts = args.fetch(:accounts) { Account }
+ @accounts = args.fetch(:accounts) { Account.order(created_at: :desc) }
@query = args.fetch(:query, '')
end
diff --git a/spec/models/account_list_spec.rb b/spec/models/account_list_spec.rb
index 2209cbf..43085b1 100644
--- a/spec/models/account_list_spec.rb
+++ b/spec/models/account_list_spec.rb
@@ -3,48 +3,57 @@ require 'account_list'
describe AccountList do
- let(:collection) { double 'collection' }
- let(:search_class) { double 'search_class' }
- let(:pagination_class) { double 'pagination_class' }
let(:decoration_class) { double 'decoration_class' }
+ let(:paginator) { double 'paginator' }
+
+ let(:list) do
+ described_class.new(
+ paginator: paginator,
+ decoration_class: decoration_class,
+ )
+ end
describe "#accounts" do
- let(:search_instance) { double 'search instance' }
- let(:search_results) { double 'search results' }
- let(:paginator_instance) { double 'paginator instance' }
- let(:paginated_records) { double 'paginated records' }
- let(:decorated_records) { double 'decorated records' }
-
- let(:list) do
- described_class.new(
- collection: collection,
- query: 'foo',
- offset: 3,
- limit: 20,
- search_class: search_class,
- decoration_class: decoration_class,
- pagination_class: pagination_class,
- )
- end
-
- it 'paginates deocorated, searched accounts' do
- expect(search_class).to receive(:new).with(
- accounts: collection,
- query: 'foo'
- ).and_return(search_instance)
-
- expect(search_instance).to receive(:call) { search_results }
- expect(pagination_class).to receive(:new).with(
- collection: search_results,
- limit: 20,
- offset: 3
- ).and_return(paginator_instance)
-
- expect(paginator_instance).to receive(:results) { paginated_records }
+ it 'decorates a paginated set' do
+ expect(paginator).to receive(:results) { 'results' }
expect(decoration_class).to receive(:decorate_all)
- .with(paginated_records) { decorated_records }
+ .with('results') { 'decorated results' }
+ expect(list.accounts).to eql 'decorated results'
+ end
+ end
- expect(list.accounts).to eql decorated_records
+ describe "#first_set?" do
+ it "delegates to its paginator" do
+ allow(paginator).to receive(:first_set?) { true }
+ expect(list.first_set?).to eql true
+ end
+ end
+
+ describe "#last_set?" do
+ it "delegates to its paginator" do
+ allow(paginator).to receive(:last_set?) { true }
+ expect(list.last_set?).to eql true
+ end
+ end
+
+ describe "#previous_set" do
+ it "delegates to its paginator" do
+ allow(paginator).to receive(:previous_set) { true }
+ expect(list.previous_set).to eql true
+ end
+ end
+
+ describe "#next_set" do
+ it "delegates to its paginator" do
+ allow(paginator).to receive(:next_set) { true }
+ expect(list.next_set).to eql true
+ end
+ end
+
+ describe "#set_description" do
+ it "delegates to its paginator" do
+ allow(paginator).to receive(:set_description) { true }
+ expect(list.set_description).to eql true
end
end
diff --git a/spec/models/account_search_spec.rb b/spec/models/account_search_spec.rb
index 8620701..7041f83 100644
--- a/spec/models/account_search_spec.rb
+++ b/spec/models/account_search_spec.rb
@@ -7,6 +7,12 @@ describe AccountSearch do
expect(AccountSearch.new(accounts: [b]).call).to_not include a
end
+ it 'uses ordered accounts by default' do
+ a = create(:account, store_name: 'foo', created_at: Date.today - 5)
+ b = create(:account, store_name: 'oop', created_at: Date.today )
+ expect(AccountSearch.new(query: 'oo').call).to eq [b,a]
+ end
+
describe "#call" do
it 'searches accounts by store_name' do
a = create(:account, store_name: 'foo')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment