diff --git a/Makefile b/Makefile index ec5bfa87ee..c864d58eda 100644 --- a/Makefile +++ b/Makefile @@ -236,6 +236,7 @@ WORKING_SPECS_9 = \ spec/models/carto/invitation_spec.rb \ spec/models/carto/user_service_spec.rb \ spec/models/carto/user_spec.rb \ + spec/models/carto/helpers/billing_cycle_spec.rb \ spec/models/carto/user_table_spec.rb \ spec/models/carto/organization_spec.rb \ spec/models/carto/visualization_export_spec.rb \ diff --git a/app/models/carto/helpers/billing_cycle.rb b/app/models/carto/helpers/billing_cycle.rb index 32ab918e46..71bfee55a6 100644 --- a/app/models/carto/helpers/billing_cycle.rb +++ b/app/models/carto/helpers/billing_cycle.rb @@ -1,3 +1,5 @@ +require 'active_support/time' + module Carto module BillingCycle def last_billing_cycle diff --git a/spec/models/carto/helpers/billing_cycle_spec.rb b/spec/models/carto/helpers/billing_cycle_spec.rb new file mode 100644 index 0000000000..a9e79de259 --- /dev/null +++ b/spec/models/carto/helpers/billing_cycle_spec.rb @@ -0,0 +1,98 @@ +require_relative '../../../../app/models/carto/helpers/billing_cycle' +require 'ostruct' +require 'timecop' + +describe Carto::BillingCycle do + + describe :last_billing_cycle do + class MyDummyUser < OpenStruct; + include Carto::BillingCycle + end + + before(:each) do + @user = MyDummyUser.new + end + + after(:each) do + @user = nil + end + + [ + { today: '2017-02-21', expected: '2017-01-23' }, + { today: '2017-01-01', expected: '2016-12-03' }, + { today: '2017-01-31', expected: '2017-01-02' }, + { today: '2017-02-01', expected: '2017-01-03' }, + { today: '2017-02-28', expected: '2017-01-30' }, + { today: '2017-03-01', expected: '2017-02-28' }, + { today: '2017-03-31', expected: '2017-03-02' } + ].each do |example| + today = example[:today] + expected = example[:expected] + it "arbitrarily assumes period_end_date.day = 29.days.ago.day if no period_end_date" \ + " (today = #{today}, expected = #{expected})" do + # See commit 83850567 + # Maybe better to throw an error if that happens? + @user.period_end_date = nil + Timecop.freeze(Date.parse(today)) do + @user.last_billing_cycle.should eq Date.parse(expected) + end + end + end + + [ + { today: '2017-03-21', period_end_date: '2017-02-21', expected: '2017-03-21' }, + { today: '2017-03-21', period_end_date: '2017-02-01', expected: '2017-03-01' }, + { today: '2017-02-21', period_end_date: '2017-01-01', expected: '2017-02-01' }, + { today: '2017-01-31', period_end_date: '2016-10-31', expected: '2017-01-31' }, + { today: '2017-03-01', period_end_date: '2016-10-01', expected: '2017-03-01' } + ].each do |example| + today = example[:today] + period_end_date = example[:period_end_date] + expected = example[:expected] + it "returns the current month if period_end_date.day <= today.day" \ + " (today = #{today}, period_end_date = #{period_end_date}, expected = #{expected})" do + @user.period_end_date = Date.parse(period_end_date) + Timecop.freeze(Date.parse(today)) do + @user.last_billing_cycle.should eq Date.parse(expected) + end + end + end + + [ + { today: '2017-03-20', period_end_date: '2017-02-21', expected: '2017-02-21' }, + { today: '2017-03-01', period_end_date: '2017-02-21', expected: '2017-02-21' }, + { today: '2017-02-01', period_end_date: '2017-01-21', expected: '2017-01-21' }, + { today: '2017-01-30', period_end_date: '2016-10-31', expected: '2016-12-31' }, + { today: '2017-03-01', period_end_date: '2016-10-02', expected: '2017-02-02' } + ].each do |example| + today = example[:today] + period_end_date = example[:period_end_date] + expected = example[:expected] + it "returns the previous month if period_end_date.day > today.day" \ + " (today = #{today}, period_end_date = #{period_end_date}, expected = #{expected})" do + @user.period_end_date = Date.parse(period_end_date) + Timecop.freeze(Date.parse(today)) do + @user.last_billing_cycle.should eq Date.parse(expected) + end + end + end + + [ + { today: '2017-03-21', period_end_date: '2017-01-31', expected: '2017-02-28' }, + # 2020 is a leap year + { today: '2020-03-21', period_end_date: '2017-01-31', expected: '2020-02-29' }, + { today: '2017-05-21', period_end_date: '2017-01-31', expected: '2017-04-30' } + ].each do |example| + today = example[:today] + period_end_date = example[:period_end_date] + expected = example[:expected] + it "returns the previous valid day when dealing with 28, 29 or 30-day month corner cases" \ + " (today = #{today}, period_end_date = #{period_end_date}, expected = #{expected})" do + @user.period_end_date = Date.parse(period_end_date) + Timecop.freeze(Date.parse(today)) do + @user.last_billing_cycle.should eq Date.parse(expected) + end + end + end + end +end diff --git a/spec/models/user_shared_examples.rb b/spec/models/user_shared_examples.rb index aa2bedc0f5..134e35062f 100644 --- a/spec/models/user_shared_examples.rb +++ b/spec/models/user_shared_examples.rb @@ -2,7 +2,6 @@ require 'mock_redis' require 'active_support/time' -require 'timecop' require_relative '../spec_helper' require_relative '../../services/dataservices-metrics/lib/geocoder_usage_metrics' require_relative '../../services/dataservices-metrics/lib/observatory_snapshot_usage_metrics' @@ -795,93 +794,4 @@ shared_examples_for "user models" do user.default_basemap['name'].should eq 'GMaps Roadmap' end end - - describe :last_billing_cycle do - - before(:all) do - @user = create_user - end - - after(:all) do - @user.destroy - end - - [ - { today: '2017-02-21', expected: '2017-01-23' }, - { today: '2017-01-01', expected: '2016-12-03' }, - { today: '2017-01-31', expected: '2017-01-02' }, - { today: '2017-02-01', expected: '2017-01-03' }, - { today: '2017-02-28', expected: '2017-01-30' }, - { today: '2017-03-01', expected: '2017-02-28' }, - { today: '2017-03-31', expected: '2017-03-02' } - ].each do |example| - today = example[:today] - expected = example[:expected] - it "arbitrarily assumes period_end_date.day = 29.days.ago.day if no period_end_date" \ - " (today = #{today}, expected = #{expected})" do - # See commit 83850567 - # Maybe better to throw an error if that happens? - @user.period_end_date = nil - Timecop.freeze(Date.parse(today)) do - @user.last_billing_cycle.should eq Date.parse(expected) - end - end - end - - [ - { today: '2017-03-21', period_end_date: '2017-02-21', expected: '2017-03-21' }, - { today: '2017-03-21', period_end_date: '2017-02-01', expected: '2017-03-01' }, - { today: '2017-02-21', period_end_date: '2017-01-01', expected: '2017-02-01' }, - { today: '2017-01-31', period_end_date: '2016-10-31', expected: '2017-01-31' }, - { today: '2017-03-01', period_end_date: '2016-10-01', expected: '2017-03-01' } - ].each do |example| - today = example[:today] - period_end_date = example[:period_end_date] - expected = example[:expected] - it "returns the current month if period_end_date.day <= today.day" \ - " (today = #{today}, period_end_date = #{period_end_date}, expected = #{expected})" do - @user.period_end_date = Date.parse(period_end_date) - Timecop.freeze(Date.parse(today)) do - @user.last_billing_cycle.should eq Date.parse(expected) - end - end - end - - [ - { today: '2017-03-20', period_end_date: '2017-02-21', expected: '2017-02-21' }, - { today: '2017-03-01', period_end_date: '2017-02-21', expected: '2017-02-21' }, - { today: '2017-02-01', period_end_date: '2017-01-21', expected: '2017-01-21' }, - { today: '2017-01-30', period_end_date: '2016-10-31', expected: '2016-12-31' }, - { today: '2017-03-01', period_end_date: '2016-10-02', expected: '2017-02-02' } - ].each do |example| - today = example[:today] - period_end_date = example[:period_end_date] - expected = example[:expected] - it "returns the previous month if period_end_date.day > today.day" \ - " (today = #{today}, period_end_date = #{period_end_date}, expected = #{expected})" do - @user.period_end_date = Date.parse(period_end_date) - Timecop.freeze(Date.parse(today)) do - @user.last_billing_cycle.should eq Date.parse(expected) - end - end - end - - [ - { today: '2017-03-21', period_end_date: '2017-01-31', expected: '2017-02-28' }, - # 2020 is a leap year - { today: '2020-03-21', period_end_date: '2017-01-31', expected: '2020-02-29' }, - { today: '2017-05-21', period_end_date: '2017-01-31', expected: '2017-04-30' } - ].each do |example| - today = example[:today] - period_end_date = example[:period_end_date] - expected = example[:expected] - it "returns the previous valid day when dealing with 28, 29 or 30-day month corner cases" \ - " (today = #{today}, period_end_date = #{period_end_date}, expected = #{expected})" do - @user.period_end_date = Date.parse(period_end_date) - Timecop.freeze(Date.parse(today)) do - @user.last_billing_cycle.should eq Date.parse(expected) - end - end - end - end end