From 60d29d619ffe696343faa03eadbb595d295d2d4f Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Fri, 6 Mar 2020 17:34:45 +0100 Subject: [PATCH] Replace :truncate_data definition with new class And cover it with a test. --- lib/tasks/data/truncate_data.rake | 80 ++++--------------- .../lib/tasks/data/truncate_data_rake_spec.rb | 34 ++++++++ 2 files changed, 48 insertions(+), 66 deletions(-) create mode 100644 spec/lib/tasks/data/truncate_data_rake_spec.rb diff --git a/lib/tasks/data/truncate_data.rake b/lib/tasks/data/truncate_data.rake index a815f6ea1f..69f529cc67 100644 --- a/lib/tasks/data/truncate_data.rake +++ b/lib/tasks/data/truncate_data.rake @@ -1,3 +1,8 @@ +# frozen_string_literal: true + +require 'highline' +require 'tasks/data/truncate_data' + # This task can be used to significantly reduce the size of a database # This is used for example when loading live data into a staging server # This way the staging server is not overloaded with too much data @@ -7,75 +12,18 @@ namespace :ofn do task truncate: :environment do guard_and_warn - sql_delete_from " - spree_inventory_units #{where_order_id_in_orders_to_delete}" - sql_delete_from " - spree_inventory_units - where shipment_id in (select id from spree_shipments #{where_order_id_in_orders_to_delete})" - - truncate_adjustments - - sql_delete_from "spree_line_items #{where_order_id_in_orders_to_delete}" - sql_delete_from "spree_payments #{where_order_id_in_orders_to_delete}" - sql_delete_from "spree_shipments #{where_order_id_in_orders_to_delete}" - Spree::ReturnAuthorization.delete_all - - truncate_order_cycle_data - - sql_delete_from "proxy_orders #{where_oc_id_in_ocs_to_delete}" - - sql_delete_from "spree_orders #{where_oc_id_in_ocs_to_delete}" - sql_delete_from "order_cycle_schedules #{where_oc_id_in_ocs_to_delete}" - sql_delete_from "order_cycles #{where_ocs_to_delete}" - - Spree::TokenizedPermission.where("created_at < '#{date}'").delete_all - Spree::StateChange.delete_all - Spree::LogEntry.delete_all - sql_delete_from "sessions" + TruncateData.new.call end - def sql_delete_from(sql) - ActiveRecord::Base.connection.execute("delete from #{sql}") - end + def guard_and_warn + if Rails.env.production? + Rails.logger.info("This task cannot be executed in production") + exit + end - private - - def date - 3.months.ago - end - - def where_ocs_to_delete - "where orders_close_at < '#{date}'" - end - - def where_oc_id_in_ocs_to_delete - "where order_cycle_id in (select id from order_cycles #{where_ocs_to_delete} )" - end - - def where_order_id_in_orders_to_delete - "where order_id in (select id from spree_orders #{where_oc_id_in_ocs_to_delete})" - end - - def truncate_adjustments - sql_delete_from "spree_adjustments where source_type = 'Spree::Order' - and source_id in (select id from spree_orders #{where_oc_id_in_ocs_to_delete})" - sql_delete_from "spree_adjustments where source_type = 'Spree::Shipment' - and source_id in (select id from spree_shipments #{where_order_id_in_orders_to_delete})" - sql_delete_from "spree_adjustments where source_type = 'Spree::Payment' - and source_id in (select id from spree_payments #{where_order_id_in_orders_to_delete})" - sql_delete_from "spree_adjustments where source_type = 'Spree::LineItem' - and source_id in (select id from spree_line_items #{where_order_id_in_orders_to_delete})" - end - - def truncate_order_cycle_data - sql_delete_from "coordinator_fees #{where_oc_id_in_ocs_to_delete}" - sql_delete_from " - exchange_variants where exchange_id - in (select id from exchanges #{where_oc_id_in_ocs_to_delete})" - sql_delete_from " - exchange_fees where exchange_id - in (select id from exchanges #{where_oc_id_in_ocs_to_delete})" - sql_delete_from "exchanges #{where_oc_id_in_ocs_to_delete}" + message = "\n <%= color('This will permanently change DB contents', :yellow) %>, + are you sure you want to proceed? (y/N)" + exit unless HighLine.new.agree(message) { |q| q.default = "n" } end end end diff --git a/spec/lib/tasks/data/truncate_data_rake_spec.rb b/spec/lib/tasks/data/truncate_data_rake_spec.rb new file mode 100644 index 0000000000..fff40d5b1f --- /dev/null +++ b/spec/lib/tasks/data/truncate_data_rake_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' +require 'rake' + +describe 'truncate_data.rake' do + describe ':truncate' do + context 'when months_to_keep is specified' do + it 'truncates order cycles closed earlier than months_to_keep months ago' do + Rake.application.rake_require 'tasks/data/truncate_data' + Rake::Task.define_task(:environment) + + highline = instance_double(HighLine, agree: true) + allow(HighLine).to receive(:new).and_return(highline) + + old_order_cycle = create( + :order_cycle, + orders_open_at: 7.months.ago, + orders_close_at: 7.months.ago + 1.day, + ) + create(:order, order_cycle: old_order_cycle) + recent_order_cycle = create( + :order_cycle, + orders_open_at: 1.months.ago, + orders_close_at: 1.months.ago + 1.day, + ) + create(:order, order_cycle: recent_order_cycle) + + months_to_keep = 6 + Rake.application.invoke_task "ofn:data:truncate[#{months_to_keep}]" + + expect(OrderCycle.all).to contain_exactly(recent_order_cycle) + end + end + end +end