Skip to content

Commit

Permalink
Mdot create supply order endpoint (#4092)
Browse files Browse the repository at this point in the history
* submit order spec

* increase mdot timeouts

* fix mdot url and specs

* add mdot supplies controller

* fix mdot client spec

* add mdot supply swagger spec stub

* add auth to swagger

* add order input body swagger

* lint

* add type to product_id

* test unauthenticated route mdot

* remove unused vcr cassette

* Update lib/mdot/configuration.rb

Co-Authored-By: Johnny Holton <johnny@oddball.io>

Co-authored-by: Johnny Holton <johnny@oddball.io>
  • Loading branch information
lihanli and Johnny Holton authored Apr 6, 2020
1 parent 1868fca commit dd1715a
Show file tree
Hide file tree
Showing 22 changed files with 305 additions and 109 deletions.
1 change: 1 addition & 0 deletions app/controllers/v0/apidocs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ class ApidocsController < ApplicationController
Swagger::Requests::IntentToFile,
Swagger::Requests::Letters,
Swagger::Requests::MaintenanceWindows,
Swagger::Requests::MDOT::Supplies,
Swagger::Requests::Messages::Folders,
Swagger::Requests::Messages::Messages,
Swagger::Requests::Messages::MessageDrafts,
Expand Down
34 changes: 34 additions & 0 deletions app/controllers/v0/mdot/supplies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# frozen_string_literal: true

module V0
module MDOT
class SuppliesController < ApplicationController
def create
render(json: client.submit_order(supply_params))
end

private

def supply_params
params.permit(
:use_permanent_address,
:use_temporary_address,
:additional_requests,
order: [:product_id],
permanent_address: %i[
street
street2
city
state
country
postal_code
]
).to_hash
end

def client
@client ||= ::MDOT::Client.new(current_user)
end
end
end
end
73 changes: 73 additions & 0 deletions app/swagger/requests/mdot/supplies.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# frozen_string_literal: true

module Swagger
module Requests
module MDOT
class Supplies
include Swagger::Blocks

swagger_path '/v0/mdot/supplies' do
operation :post do
key :description, 'Create a MDOT supply order'
key :operationId, 'addMdotOrder'
key :tags, %w[mdot]

extend Swagger::Responses::AuthenticationError
parameter :authorization

key :produces, ['application/json']
key :consumes, ['application/json']

parameter do
key :name, :order_input
key :in, :body
key :description, 'Order input'
key :required, true

schema do
key :type, :object
key :required, [:order]

property :use_permanent_address, type: :boolean
property :use_temporary_address, type: :boolean
property :additional_requests, type: :string

property :permanent_address do
key :type, :object

property :street, type: :string
property :street2, type: :string
property :city, type: :string
property :state, type: :string
property :country, type: :string
property :postal_code, type: :string
end

property :order do
key :type, :array

items do
key :type, :object

property :product_id, type: :string
end
end
end
end

response 200 do
key :description, 'mdot order response'

schema do
key :required, %i[status order_id]

property :status, type: :string
property :order_id, type: :string
end
end
end
end
end
end
end
end
4 changes: 4 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@
resource :announcement_subscription, only: [:create], controller: 'id_card_announcement_subscription'
end

namespace :mdot do
resources :supplies, only: %i[create]
end

namespace :preneeds do
resources :cemeteries, only: :index, defaults: { format: :json }
resources :states, only: :index, defaults: { format: :json }
Expand Down
2 changes: 1 addition & 1 deletion config/settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ ihub:
# Settings for Medical Devices Ordering Tool
mdot:
prefill: true
url: https://dlc-fake.fake.com
url: https://dlc-dummy.herokuapp.com
api_key: abcd1234abcd1234abcd1234abcd1234abcd1234
mock: false
enabled: false
Expand Down
3 changes: 1 addition & 2 deletions lib/mdot/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@ def get_supplies
#
def submit_order(request_body)
with_monitoring_and_error_handling do
raw_response = perform(:post, @supplies, request_body, headers)
MDOT::Response.new response: raw_response, schema: :submit
perform(:post, @supplies, request_body, headers).body
end
end

Expand Down
4 changes: 4 additions & 0 deletions lib/mdot/configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ def connection
f.response :snakecase, symbolize: false
f.response :json
f.adapter Faraday.default_adapter

# TODO: remove long timeouts after changing to real API
f.options.timeout = 30
f.options.open_timeout = 30
end
end

Expand Down
50 changes: 50 additions & 0 deletions spec/controllers/v0/mdot/supplies_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe V0::MDOT::SuppliesController, type: :controller do
let(:user_details) do
{
first_name: 'Greg',
last_name: 'Anderson',
middle_name: 'A',
birth_date: '1991-04-05',
ssn: '000550237'
}
end

let(:user) { build(:user, :loa3, user_details) }

before do
sign_in_as(user)
end

describe '#create' do
let(:body) do
{
'permanent_address' => {
'street' => '101 Example Street',
'street2' => 'Apt 2',
'city' => 'Kansas City',
'state' => 'MO',
'country' => 'USA',
'postal_code' => '64117'
},
'use_permanent_address' => true,
'use_temporary_address' => false,
'order' => [{ 'product_id' => '1' }, { 'product_id' => '4' }],
'additional_requests' => ''
}
end

it 'submits the req to the mdot client' do
VCR.use_cassette('mdot/submit_order', VCR::MATCH_EVERYTHING) do
post(:create, body: body.to_json, as: :json)

res = JSON.parse(response.body)
expect(res['status']).to eq('success')
expect(res['order_id']).to match(/[a-z0-9-]+/)
end
end
end
end
48 changes: 19 additions & 29 deletions spec/lib/mdot/client_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
first_name: 'Greg',
last_name: 'Anderson',
middle_name: 'A',
birth_date: '1949-03-04',
ssn: '000555555'
birth_date: '1991-04-05',
ssn: '000550237'
}
end

Expand Down Expand Up @@ -52,37 +52,27 @@
describe '#submit_order' do
let(:valid_order) do
{
veteranFullName: {
first: 'Greg',
middle: 'A',
last: 'Anderson'
},
veteranAddress: {
street: '101 Example Street',
street2: 'Apt 2',
city: 'Kansas City',
state: 'MO',
country: 'USA',
postalCode: '64117'
},
order: [
{
productId: 1
},
{
productId: 4
}
],
additionalRequests: ''
}.to_json
'use_permanent_address' => true,
'use_temporary_address' => false,
'additional_requests' => '',
'order' => [{ 'product_id' => '1' }, { 'product_id' => '4' }],
'permanent_address' => {
'street' => '101 Example Street',
'street2' => 'Apt 2',
'city' => 'Kansas City',
'state' => 'MO',
'country' => 'USA',
'postal_code' => '64117'
}
}
end

context 'with a valid supplies order' do
it 'returns a successful response' do
VCR.use_cassette('mdot/submit_order_202') do
response = subject.submit_order(valid_order)
expect(response).to be_accepted
expect(response).to be_an MDOT::Response
VCR.use_cassette('mdot/submit_order', VCR::MATCH_EVERYTHING) do
res = subject.submit_order(valid_order)
expect(res['status']).to eq('success')
expect(res['order_id']).to match(/[a-z0-9-]+/)
end
end
end
Expand Down
1 change: 1 addition & 0 deletions spec/rails_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ def self.all_matches
c.filter_sensitive_data('<OKTA_TOKEN>') { Settings.oidc.base_api_token }
c.filter_sensitive_data('<EE_PASS>') { Settings.hca.ee.pass }
c.filter_sensitive_data('<AV_KEY>') { Settings.vet360.address_validation.api_key }
c.filter_sensitive_data('<MDOT_KEY>') { Settings.mdot.api_key }
c.before_record do |i|
%i[response request].each do |env|
next unless i.send(env).headers.keys.include?('Token')
Expand Down
53 changes: 53 additions & 0 deletions spec/request/swagger_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,59 @@
end
end

context 'MDOT tests' do
let(:user_details) do
{
first_name: 'Greg',
last_name: 'Anderson',
middle_name: 'A',
birth_date: '1991-04-05',
ssn: '000550237'
}
end

let(:user) { build(:user, :loa3, user_details) }
let(:headers) do
{
'_headers' => {
'Cookie' => sign_in(user, nil, true),
'accept' => 'application/json',
'content-type' => 'application/json'
}
}
end

let(:body) do
{
'permanent_address' => {
'street' => '101 Example Street',
'street2' => 'Apt 2',
'city' => 'Kansas City',
'state' => 'MO',
'country' => 'USA',
'postal_code' => '64117'
},
'use_permanent_address' => true,
'use_temporary_address' => false,
'order' => [{ 'product_id' => '1' }, { 'product_id' => '4' }],
'additional_requests' => ''
}
end

it 'supports creating a MDOT order' do
expect(subject).to validate(:post, '/v0/mdot/supplies', 401)

VCR.use_cassette('mdot/submit_order', VCR::MATCH_EVERYTHING) do
expect(subject).to validate(
:post,
'/v0/mdot/supplies',
200,
headers.merge('_data' => body.to_json)
)
end
end
end

it 'supports adding a preneed claim' do
VCR.use_cassette('preneeds/burial_forms/creates_a_pre_need_burial_form') do
expect(subject).to validate(
Expand Down
2 changes: 1 addition & 1 deletion spec/support/vcr_cassettes/mdot/get_supplies_200.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion spec/support/vcr_cassettes/mdot/get_supplies_404.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion spec/support/vcr_cassettes/mdot/get_supplies_502.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion spec/support/vcr_cassettes/mdot/post_supplies_202.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion spec/support/vcr_cassettes/mdot/post_supplies_404.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion spec/support/vcr_cassettes/mdot/post_supplies_422.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit dd1715a

Please sign in to comment.