diff --git a/app/controllers/api/v1/accreditation_center/invoice_status_controller.rb b/app/controllers/api/v1/accreditation_center/invoice_status_controller.rb new file mode 100644 index 000000000..62bf4c741 --- /dev/null +++ b/app/controllers/api/v1/accreditation_center/invoice_status_controller.rb @@ -0,0 +1,32 @@ +module Api + module V1 + module AccreditationCenter + class InvoiceStatusController < ::Api::V1::AccreditationCenter::BaseController + def index + username, password = Base64.urlsafe_decode64(basic_token).split(':') + @current_user ||= ApiUser.find_by(username: username, plain_text_password: password) + + return render json: { errors: 'No user found' }, status: :not_found if @current_user.nil? + + @invoices = @current_user.registrar.invoices.select { |i| i.cancelled_at != nil } + + if @invoices + render json: { code: 1000, invoices: @invoices }, + status: :found + else + render json: { errors: 'No invoices' }, status: :not_found + end + end + + private + + def basic_token + pattern = /^Basic / + header = request.headers['Authorization'] + header = header.gsub(pattern, '') if header&.match(pattern) + header.strip + end + end + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 19a19af27..4772fbe4b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -127,6 +127,9 @@ Rails.application.routes.draw do end namespace :accreditation_center do + # At the moment invoice_status endpoint returns only cancelled invoices. But in future logic of this enpoint can change. + # And it will need to return invoices of different statuses. I decided to leave the name of the endpoint "invoice_status" + resources :invoice_status, only: [ :index ] resource :domains, only: [ :show ], param: :name resource :contacts, only: [ :show ], param: :id # resource :auth, only: [ :index ] diff --git a/test/integration/api/accreditation_center/domains_test.rb b/test/integration/api/accreditation_center/domains_test.rb index 0e6b49ccd..1f571ccdc 100644 --- a/test/integration/api/accreditation_center/domains_test.rb +++ b/test/integration/api/accreditation_center/domains_test.rb @@ -2,16 +2,14 @@ require 'test_helper' class DomainsTest < ApplicationIntegrationTest def setup - super - @domain = domains(:shop) end def test_get_domain_info - get "/api/v1/accreditation_center/domains/?name=#{@domain.name}" + get "/api/v1/accreditation_center/domains/?name=shop.test" json = JSON.parse(response.body, symbolize_names: true) - assert_equal json[:domain][:name], @domain.name + assert_equal json[:domain][:name], "shop.test" end def test_return_code_error_if_valid_domain_name diff --git a/test/integration/api/accreditation_center/invoice_status_test.rb b/test/integration/api/accreditation_center/invoice_status_test.rb new file mode 100644 index 000000000..d97a3b825 --- /dev/null +++ b/test/integration/api/accreditation_center/invoice_status_test.rb @@ -0,0 +1,33 @@ +require 'test_helper' + +class DomainsTest < ApplicationIntegrationTest + def setup + super + + @user = users(:api_bestnames) + @header = { 'Authorization' => "Basic #{generate_base64}" } + end + + def test_should_return_cancelled_invoices + date_now = Time.now + + get "/api/v1/accreditation_center/invoice_status", headers: @header + json = JSON.parse(response.body, symbolize_names: true) + + assert_equal json[:invoices].count, 0 + + invoice = @user.registrar.invoices.last + invoice.update(cancelled_at: date_now) + + get "/api/v1/accreditation_center/invoice_status", headers: @header + json = JSON.parse(response.body, symbolize_names: true) + + assert_equal json[:invoices].count, 1 + end + + private + + def generate_base64 + Base64.encode64("#{@user.username}:#{@user.plain_text_password}") + end +end \ No newline at end of file