gearnode/moneyc

View on GitHub
lib/moneyc/converter.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Moneyc
  class Converter
    def initialize(from:, to: nil, at: nil)
      @reference_currency = from
      @target_currency = presence(to) || @reference_currency
      @conversion_date = presence(at) || Time.now
    end

    def rate
      if reference_and_target_is_same?
        1
      else
        retrieve_taget_currency_rate
      end
    end

    def convert(total_in_reference_currency)
      total_in_reference_currency.to_f * rate
    end

    private

    def presence(object)
      object if !(object.respond_to?(:empty?) ? !!object.empty? : !object)
    end

    def reference_and_target_is_same?
      @reference_currency == @target_currency
    end

    def retrieve_taget_currency_rate
      if http_response.nil? || http_response[@target_currency.to_sym].nil?
        fail ArgumentError, argument_error_message
      else
        http_response[@target_currency.to_sym]
      end
    end

    def argument_error_message
      "#@target_currency or #@reference_currency is not available currency"
    end

    def http_response
      FixerHTTPClient.new(
        conversion_date: @conversion_date,
        reference_currency: @reference_currency
      ).fetch_currency_rate
    end
  end
end