Drowze/aspirebudgeting_ruby

View on GitHub
tasks/update_fixtures.rake

Summary

Maintainability
Test Coverage
# frozen_string_literal: true

require 'pry'
require 'bundler/setup'
require 'google_drive'
require 'aspire_budget'

class ManageFixtures
  include Rake::DSL

  FIXTURES_RELATIVE_PATH = '../spec/support/fixtures/'

  SPREADSHEET_KEYS = {
    'v3-1-0' => '1RHgsiisoZRsMVUp286UV9SipGIDYKxgAuzkkGzWeV2A',
    'v3-2-0' => '1qcTJ885txKWr4gc1pIR0iWAc1nHzYMzpDIxsQvA4Go0'
  }.freeze

  ACTIVE_WORKSHEET_KLASSES = [
    AspireBudget::Worksheets::Transactions,
    AspireBudget::Worksheets::CategoryTransfers,
    AspireBudget::Worksheets::BackendData
  ].freeze

  def initialize
    namespace :fixtures do
      desc 'Update fixtures'
      task :update do
        SPREADSHEET_KEYS.each_key(&method(:update_fixtures))
      end

      desc 'Validate current fixtures'
      task :validate do
        SPREADSHEET_KEYS.each_key(&method(:validate_fixtures))
      end
    end
  end

  private

  def worksheets
    @worksheets ||= SPREADSHEET_KEYS.reduce({}) do |h, (version, key)|
      worksheets = ACTIVE_WORKSHEET_KLASSES.reduce({}) do |h2, klass|
        h2.merge(klass::WS_TITLE => klass.new(session: session, spreadsheet_key: key))
      end

      h.merge(version => worksheets)
    end
  end

  def session
    @session ||= GoogleDrive::Session.from_service_account_key(nil)
  end

  def file_path(version, title)
    file_basename = title.downcase.tr(' ', '_')
    "#{__dir__}/#{FIXTURES_RELATIVE_PATH}#{version}/#{file_basename}.json"
  end

  def fixture_for(worksheet)
    worksheet.send(:ws).rows.then(&JSON.method(:pretty_generate))
  end

  def update_fixtures(version)
    worksheets[version].each_pair do |title, worksheet|
      File.write(file_path(version, title), fixture_for(worksheet))
    end
  end

  def validate_fixtures(version)
    worksheets[version].each_pair do |title, worksheet|
      existing_fixture = File.read(file_path(version, title))
      raise 'Fixture not up to date' if existing_fixture != fixture_for(worksheet)
    end
  end
end

# register the tasks
ManageFixtures.new