Created
November 19, 2014 17:22
-
-
Save biscuitvile/e063e6ccaa7801e57c4c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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