Project

General

Profile

Download (7.46 KB) Statistics
| Branch: | Tag: | Revision:
require 'test_helper'
require 'rake'

class TrendsTest < ActiveSupport::TestCase
setup do
Rake.application.rake_require 'tasks/trends'
Rake::Task.define_task(:environment)
Rake::Task['trends:reduce'].reenable

TrendCounter.unscoped.delete_all
Trend.unscoped.delete_all
end

test 'trends:reduce reduces single trend' do
trend = FactoryGirl.create(:foreman_trends, :operating_system)
point_dates = create_trend_line(trend, [1,1,1,1,1,1])

Rake.application.invoke_task 'trends:reduce'

trend_counter = TrendCounter.where(trend_id: trend.id)

assert_equal 1, trend_counter.count

trend_counter = trend_counter.first

assert_equal point_dates.min.to_i, trend_counter.interval_start.to_i
assert_nil trend_counter.interval_end
end

test 'trends:reduce does not iterfere between two trend ids' do
trend1 = FactoryGirl.create(:foreman_trends, :operating_system)
trend2 = FactoryGirl.create(:foreman_trends, :operating_system)
create_trend_line(trend1, [1,1,1,1,1,1])
create_trend_line(trend2, [2,2,2,2,2,2])

Rake.application.invoke_task 'trends:reduce'

trend_10 = TrendCounter.where(trend_id: trend1.id)
trend_20 = TrendCounter.where(trend_id: trend2.id)

assert_equal 1, trend_10.count
assert_equal 1, trend_20.count

trend_10 = trend_10.first
trend_20 = trend_20.first

assert_equal trend_10.interval_start, trend_20.interval_start
assert_equal trend_10.interval_end, trend_20.interval_end
end

test 'trends:reduce crossing graphs' do
new_os_trend = FactoryGirl.create(:foreman_trends, :operating_system)
old_os_trend = FactoryGirl.create(:foreman_trends, :operating_system)
new_os_point_dates = create_trend_line(new_os_trend, [1,1,1,2,2,2,3,3,3])
create_trend_line(old_os_trend, [3,3,3,2,2,2,1,1,1])
interval_starts = [new_os_point_dates[0], new_os_point_dates[3], new_os_point_dates[6]]

Rake.application.invoke_task 'trends:reduce'

new_os_intervals = TrendCounter.where(trend_id: new_os_trend.id).order(:interval_start).to_a
old_os_intervals = TrendCounter.where(trend_id: old_os_trend.id).order(:interval_start).to_a

assert_equal 3, new_os_intervals.length
assert_equal 3, old_os_intervals.length

interval_starts.each_with_index do |start, idx|
assert_equal start, old_os_intervals[idx].interval_start
assert_equal start, new_os_intervals[idx].interval_start

next_start = interval_starts[idx + 1] unless idx >= 2
assert_equal next_start, old_os_intervals[idx].interval_end
assert_equal next_start, new_os_intervals[idx].interval_end

assert_equal 4, old_os_intervals[idx].count + new_os_intervals[idx].count
end
end

test 'trends:reduce mirrored saw graphs' do
new_os_trend = FactoryGirl.create(:foreman_trends, :operating_system)
old_os_trend = FactoryGirl.create(:foreman_trends, :operating_system)
new_os_point_dates = create_trend_line(new_os_trend, [1,1,1,2,2,2,1,1,1,2,2,2])
create_trend_line(old_os_trend, [3,3,3,2,2,2,3,3,3,2,2,2])
interval_starts = [new_os_point_dates[0], new_os_point_dates[3], new_os_point_dates[6], new_os_point_dates[9]]
new_os_counts = [1,2,1,2]

Rake.application.invoke_task 'trends:reduce'

new_os_intervals = TrendCounter.where(trend_id: new_os_trend.id).order(:interval_start).to_a
old_os_intervals = TrendCounter.where(trend_id: old_os_trend.id).order(:interval_start).to_a

assert_equal 4, new_os_intervals.length
assert_equal 4, old_os_intervals.length

interval_starts.each_with_index do |start, idx|
assert_equal start, old_os_intervals[idx].interval_start
assert_equal start, new_os_intervals[idx].interval_start

next_start = interval_starts[idx + 1] unless idx >= 3
assert_equal next_start, old_os_intervals[idx].interval_end
assert_equal next_start, new_os_intervals[idx].interval_end

assert_equal 4, old_os_intervals[idx].count + new_os_intervals[idx].count
assert_equal new_os_counts[idx], new_os_intervals[idx].count
end
end

test 'trends:reduce can rerun with additional datapoint with the same value' do
os_trend = FactoryGirl.create(:foreman_trends, :operating_system)
os_point_dates = create_trend_line(os_trend, [1,1,1,1,1,1])
Rake.application.invoke_task 'trends:reduce'

interval = TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
assert_equal 1, interval.length
interval = interval.first

FactoryGirl.create(:trend_counter, :trend => os_trend, :created_at => os_point_dates[3], :updated_at => os_point_dates[3], :count => 1)

Rake::Task['trends:reduce'].reenable
Rake.application.invoke_task 'trends:reduce'

new_interval = TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
assert_equal 1, new_interval.length
new_interval = new_interval.first

assert_equal new_interval, interval
end

test 'trends:reduce can rerun with additional datapoint with different value in open interval' do
os_trend = FactoryGirl.create(:foreman_trends, :operating_system)
os_point_dates = create_trend_line(os_trend, [1,1,1,1,1,1])
Rake.application.invoke_task 'trends:reduce'

interval = TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
assert_equal 1, interval.length

FactoryGirl.create(:trend_counter, :trend => os_trend, :created_at => os_point_dates[3], :updated_at => os_point_dates[3], :count => 2)

Rake::Task['trends:reduce'].reenable
Rake.application.invoke_task 'trends:reduce'

new_intervals = TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
assert_equal 2, new_intervals.length

assert_equal 1, new_intervals[0].count
assert_equal 2, new_intervals[1].count

assert_equal os_point_dates[0], new_intervals[0].interval_start
assert_equal os_point_dates[3], new_intervals[0].interval_end
assert_equal os_point_dates[3], new_intervals[1].interval_start
end

test 'trends:reduce can rerun with additional datapoint with different value in closed interval' do
os_trend = FactoryGirl.create(:foreman_trends, :operating_system)
os_point_dates = create_trend_line(os_trend, [1,1,1,1,1,2])
Rake.application.invoke_task 'trends:reduce'

interval = TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
assert_equal 2, interval.length

FactoryGirl.create(:trend_counter, :trend => os_trend, :created_at => os_point_dates[3], :updated_at => os_point_dates[3], :count => 3)

Rake::Task['trends:reduce'].reenable
Rake.application.invoke_task 'trends:reduce'

new_intervals = TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
assert_equal 3, new_intervals.length

assert_equal 1, new_intervals[0].count
assert_equal 3, new_intervals[1].count
assert_equal 2, new_intervals[2].count

assert_equal os_point_dates[0], new_intervals[0].interval_start
assert_equal os_point_dates[3], new_intervals[0].interval_end
assert_equal os_point_dates[3], new_intervals[1].interval_start
assert_equal os_point_dates[5], new_intervals[1].interval_end
assert_equal os_point_dates[5], new_intervals[2].interval_start
end

private

def create_trend_line(trend, values_line)
point_dates = []
point_date = Time.now.beginning_of_day
values_line.each do |value|
point_dates << point_date
FactoryGirl.create(:trend_counter, :trend => trend, :created_at => point_date, :updated_at => point_date, :count => value)
point_date += 10.minutes
end

point_dates
end
end
(3-3/3)