From 8d4587506b9d216330ffcce6416082cead539b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 13 Aug 2020 11:02:54 +0200 Subject: [PATCH] Add SuppliedProducts controller --- .../api/supplied_products_controller.rb | 14 +++++ .../dfc_provider/catalog_item_serializer.rb | 8 +++ .../supplied_product_serializer.rb | 10 +++- engines/dfc_provider/config/routes.rb | 1 + .../api/supplied_products_controller_spec.rb | 54 +++++++++++++++++++ 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb create mode 100644 engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb new file mode 100644 index 0000000000..a078bbe66e --- /dev/null +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +# Controller used to provide the SuppliedProducts API for the DFC application +module DfcProvider + module Api + class SuppliedProductsController < BaseController + def show + @product = @enterprise.supplied_products.find(params[:id]) + + render json: @product, serializer: DfcProvider::SuppliedProductSerializer + end + end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb index 412f39bd70..0b98993305 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -42,6 +42,14 @@ module DfcProvider private + def reference_id + dfc_provider_routes.api_dfc_provider_enterprise_supplied_product_url( + enterprise_id: object.product.supplier_id, + id: object.product_id, + host: root_url + ) + end + def dfc_provider_routes DfcProvider::Engine.routes.url_helpers end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb index 2be61f6284..8c791dca75 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb @@ -17,7 +17,11 @@ module DfcProvider has_many :physical_characteristics, key: 'dfc:physicalCharacterisctics' def id - "/supplied_products/#{object.id}" + dfc_provider_routes.api_dfc_provider_enterprise_supplied_product_url( + enterprise_id: object.supplier_id, + id: object.id, + host: root_url + ) end def type @@ -60,5 +64,9 @@ module DfcProvider def unit_name object.unit_description.presence || 'piece' end + + def dfc_provider_routes + DfcProvider::Engine.routes.url_helpers + end end end diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb index 38d7baff2e..fe7f004c90 100644 --- a/engines/dfc_provider/config/routes.rb +++ b/engines/dfc_provider/config/routes.rb @@ -5,6 +5,7 @@ DfcProvider::Engine.routes.draw do scope :dfc_provider, as: :dfc_provider, path: '/dfc_provider' do resources :enterprises, only: [:show] do resources :catalog_items, only: [:index, :show] + resources :supplied_products, only: [:show] end end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb new file mode 100644 index 0000000000..a4a2c0731e --- /dev/null +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe DfcProvider::Api::SuppliedProductsController, type: :controller do + render_views + + let!(:user) { create(:user) } + let!(:enterprise) { create(:distributor_enterprise, owner: user) } + let!(:product) { create(:simple_product, supplier: enterprise ) } + + describe('.show') do + context 'with authorization token' do + before do + request.headers['Authorization'] = 'Bearer 123456.abcdef.123456' + end + + context 'with an authenticated user' do + before do + allow_any_instance_of(DfcProvider::AuthorizationControl) + .to receive(:process) + .and_return(user) + end + + context 'with an enterprise' do + context 'given with an id' do + before do + api_get :show, + enterprise_id: 'default', + id: product.id + end + + it 'is successful' do + expect(response.status).to eq 200 + end + + it 'renders the required content' do + expect(response.body) + .to include(product.name) + end + end + + context 'given with a wrong id' do + before { api_get :show, id: 999 } + + it 'returns 404' do + expect(response.status).to eq 404 + end + end + end + end + end + end +end