From 6ac49a7694e50b3d34e3975dc7f2ff81fc7bbcb2 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Fri, 20 Jan 2017 15:52:27 +1100 Subject: [PATCH] Adding route and controller action for searching for customer addresses using AddressFinder --- .../admin/search_controller_decorator.rb | 12 +++++++ app/models/spree/ability_decorator.rb | 2 +- config/routes.rb | 1 + .../spree/admin/search_controller_spec.rb | 31 +++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/app/controllers/spree/admin/search_controller_decorator.rb b/app/controllers/spree/admin/search_controller_decorator.rb index d0069fd2ae..aead4756e3 100644 --- a/app/controllers/spree/admin/search_controller_decorator.rb +++ b/app/controllers/spree/admin/search_controller_decorator.rb @@ -1,3 +1,5 @@ +require 'open_food_network/address_finder' + Spree::Admin::SearchController.class_eval do def known_users if exact_match = Spree.user_class.find_by_email(params[:q]) @@ -33,4 +35,14 @@ Spree::Admin::SearchController.class_eval do end alias_method_chain :users, :ams + + def customer_addresses + customer = Customer.of(spree_current_user.enterprises).find(params[:customer_id]) + redirect_to :unauthorised unless customer.present? + + finder = OpenFoodNetwork::AddressFinder.new(customer, customer.email) + bill_address = Api::AddressSerializer.new(finder.bill_address).serializable_hash + ship_address = Api::AddressSerializer.new(finder.ship_address).serializable_hash + render json: { bill_address: bill_address, ship_address: ship_address } + end end diff --git a/app/models/spree/ability_decorator.rb b/app/models/spree/ability_decorator.rb index 8085f4fee0..97c963bde1 100644 --- a/app/models/spree/ability_decorator.rb +++ b/app/models/spree/ability_decorator.rb @@ -111,7 +111,7 @@ class AbilityDecorator user.enterprises.include? enterprise_fee.enterprise end - can [:admin, :known_users, :customers], :search + can [:admin, :known_users, :customers, :customer_addresses], :search can [:admin, :show], :account diff --git a/config/routes.rb b/config/routes.rb index e8ce16d875..811fb8992e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -288,6 +288,7 @@ Spree::Core::Engine.routes.prepend do namespace :admin do get '/search/known_users' => "search#known_users", :as => :search_known_users get '/search/customers' => 'search#customers', :as => :search_customers + get '/search/customer_addresses' => 'search#customer_addresses', :as => :search_customer_addresses resources :products do get :product_distributions, on: :member diff --git a/spec/controllers/spree/admin/search_controller_spec.rb b/spec/controllers/spree/admin/search_controller_spec.rb index 59490cec5b..c376d561ee 100644 --- a/spec/controllers/spree/admin/search_controller_spec.rb +++ b/spec/controllers/spree/admin/search_controller_spec.rb @@ -70,5 +70,36 @@ describe Spree::Admin::SearchController, type: :controller do end end end + + describe "searching for customer addresses" do + let(:bill_address) { create(:address, firstname: "Dominic", address1: "123 Lala Street" ) } + let(:ship_address) { create(:address, firstname: "Dom", address1: "123 Sesame Street") } + let(:managed_customer) { create(:customer, enterprise: enterprise, bill_address: bill_address, ship_address: ship_address) } + let(:unmanaged_customer) { create(:customer) } + let(:params) { { format: :json } } + + context "when I manage the customer" do + before { params.merge!({customer_id: managed_customer.id}) } + + it "returns with serialized addresses for the customer" do + spree_get :customer_addresses, params + json_response = JSON.parse(response.body) + expect(json_response.keys).to include "bill_address", "ship_address" + expect(json_response["bill_address"]["firstname"]).to eq "Dominic" + expect(json_response["bill_address"]["address1"]).to eq "123 Lala Street" + expect(json_response["ship_address"]["firstname"]).to eq "Dom" + expect(json_response["ship_address"]["address1"]).to eq "123 Sesame Street" + end + end + + context "when I don't manage the customer" do + before { params.merge!({customer_id: unmanaged_customer.id}) } + + it "redirects to unauthorised" do + spree_get :customer_addresses, params + expect(response).to redirect_to spree.unauthorized_path + end + end + end end end