From 24abbda8f2f6c1637bcb994b59fc3ee1d8a718cc Mon Sep 17 00:00:00 2001 From: Georgiy Melnikov Date: Thu, 1 Apr 2021 14:18:36 +0500 Subject: [PATCH] add support to handle response --- lib/fnsapi.rb | 1 + lib/fnsapi/exceptions.rb | 38 ++++++++++++++++++++++++++++++++++++++ lib/fnsapi/kkt_service.rb | 21 ++++++++++++++++++++- spec/kkt_service_spec.rb | 4 ++-- 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 lib/fnsapi/exceptions.rb diff --git a/lib/fnsapi.rb b/lib/fnsapi.rb index a37190a..eaf5f30 100644 --- a/lib/fnsapi.rb +++ b/lib/fnsapi.rb @@ -10,6 +10,7 @@ require 'fnsapi/kkt_concern' require 'fnsapi/get_message_service' require 'fnsapi/kkt_service' +require 'fnsapi/exceptions' module Fnsapi class << self diff --git a/lib/fnsapi/exceptions.rb b/lib/fnsapi/exceptions.rb new file mode 100644 index 0000000..343bd80 --- /dev/null +++ b/lib/fnsapi/exceptions.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +# Fns Exceptions +module Fnsapi + class Error < ::StandardError; end + + class APIError < Error; end + + # status 400 + class FnsBadRequestError < APIError + def message + 'Не пройден форматно-логический контроль реквизитов фискальных документов' + end + end + + # status 404 + class FnsNotFoundError < APIError + def message + 'Фискальный документ не найден в оперативном хранилище (сформирован более 2,5 месяцев назад)' + end + end + + # status 406 + class FnsCryptoProtectionError < APIError + def message + 'Направленный фискальный признак не прошел проверку системы криптозащиты, поиск фискального документа прерван, дальнейшие попытки проверки запрещены' + end + end + + # status 503 + class FnsServiceUnaviableError < APIError + def message + 'Недокументированная ошибка в работе сервиса, для выяснения причин следует обратиться в техподдержку, указав: URL запроса к сервису, текст запроса к сервису, текст ответа от сервиса.' + end + end + + class FnsUnknownError < APIError; end +end \ No newline at end of file diff --git a/lib/fnsapi/kkt_service.rb b/lib/fnsapi/kkt_service.rb index 907010f..483db26 100644 --- a/lib/fnsapi/kkt_service.rb +++ b/lib/fnsapi/kkt_service.rb @@ -4,6 +4,8 @@ module Fnsapi class KktService < BaseService include KktConcern + SUCCESS_STATUS_CODES = %w(200).freeze + def check_data(object, user_id = 'default_user') ticket = Ticket.new(object) result = client(auth_params(user_id)).call(:send_message, message: check_ticket_hash(ticket)) @@ -25,7 +27,7 @@ def get_data(object, user_id = 'default_user') return unless message code = message.dig(:get_ticket_response, :result, :code) - return code if code != '200' + handle_response(code) JSON.parse(message.dig(:get_ticket_response, :result, :ticket)) end @@ -89,5 +91,22 @@ def ticket_hash(ticket) 'tns:TypeOperation' => 1 } end + + def handle_response(code) + return if SUCCESS_STATUS_CODES.include?(code) + + case code + when '400' + raise ::Fnsapi::FnsBadRequestError + when '404' + raise ::Fnsapi::FnsNotFoundError + when '406' + raise ::Fnsapi::FnsCryptoProtectionError + when '503' + raise ::Fnsapi::FnsServiceUnaviableError + else + raise ::Fnsapi::FnsUnknownError + end + end end end diff --git a/spec/kkt_service_spec.rb b/spec/kkt_service_spec.rb index 98201fc..1327256 100644 --- a/spec/kkt_service_spec.rb +++ b/spec/kkt_service_spec.rb @@ -245,8 +245,8 @@ } } end - it 'returns code' do - expect(subject).to eq('400') + it 'raise error' do + expect { subject }.to raise_error(Fnsapi::FnsBadRequestError) end end end