docbrown/spec/services/billboard_event_rollup_spec.rb
Anna Buianova 963eea8126
Aliased DisplayAdEvent.display_ad_id to billboard_id (#19805)
* Aliased DisplayAdEvent.display_ad_id to billboard_id

* Allow :display_ad_id instead of :billboard_id for billboard_events in case of cache
2023-07-24 17:54:39 +03:00

116 lines
4.7 KiB
Ruby

require "rails_helper"
RSpec.describe BillboardEventRollup, type: :service do
let(:ad1) { create(:display_ad) }
let(:ad2) { create(:display_ad) }
let(:user1) { create(:user) }
let(:user2) { create(:user) }
def override_timestamps
DisplayAdEvent.record_timestamps = false
yield
DisplayAdEvent.record_timestamps = true
end
def days_ago_as_range(num)
(Date.current - num.days).all_day
end
it "fails if new attributes would be lost" do
attributes_considered = described_class::ATTRIBUTES_PRESERVED + described_class::ATTRIBUTES_DESTROYED
expect(DisplayAdEvent.column_names.map(&:to_sym)).to match_array(attributes_considered)
end
context "when compacting many rows" do
before do
override_timestamps do
create(:display_ad_event, created_at: Date.current - 2, billboard: ad1, user_id: nil, updated_at: Date.current)
create(:display_ad_event, created_at: Date.current - 2, billboard: ad1, user_id: nil, updated_at: Date.current)
create(:display_ad_event, created_at: Date.current - 2, billboard: ad1, user_id: nil, updated_at: Date.current)
create(:display_ad_event, created_at: Date.current - 2, billboard: ad1, user_id: user1.id,
updated_at: Date.current)
create(:display_ad_event, created_at: Date.current - 2, billboard: ad2, user_id: nil, updated_at: Date.current)
end
end
it "compacts one day's billboard_events" do
expect(DisplayAdEvent.where(created_at: days_ago_as_range(2)).count).to eq(5)
described_class.rollup(Date.current - 2)
expectations = [
[ad1.id, nil, 3],
[ad1.id, user1.id, 1],
[ad2.id, nil, 1],
]
results_mapped = DisplayAdEvent.where(created_at: days_ago_as_range(2)).map do |event|
[event.billboard_id, event.user_id, event.counts_for]
end
expect(results_mapped).to match_array(expectations)
end
end
# separate category
it "groups by category" do
create(:display_ad_event, category: "impression", billboard: ad1, user_id: nil)
create(:display_ad_event, category: "impression", billboard: ad1, user_id: nil)
create(:display_ad_event, category: "impression", billboard: ad1, user_id: nil)
create(:display_ad_event, category: "click", billboard: ad1, user_id: nil)
create(:display_ad_event, category: "click", billboard: ad1, user_id: nil)
described_class.rollup(Date.current)
results = DisplayAdEvent.where(created_at: Date.current.all_day)
by_category = results.index_by { |r| r["category"] }
expect(by_category["impression"]["counts_for"]).to eq(3)
expect(by_category["click"]["counts_for"]).to eq(2)
end
# separate billboard_id
it "groups by billboard_id" do
create(:display_ad_event, billboard: ad1, user_id: nil)
create(:display_ad_event, billboard: ad1, user_id: nil)
create(:display_ad_event, billboard: ad1, user_id: nil)
create(:display_ad_event, billboard: ad2, user_id: nil)
create(:display_ad_event, billboard: ad2, user_id: nil)
described_class.rollup(Date.current)
results = DisplayAdEvent.where(created_at: Date.current.all_day)
by_ad = results.index_by { |r| r["billboard_id"] }
expect(by_ad[ad1.id]["counts_for"]).to eq(3)
expect(by_ad[ad2.id]["counts_for"]).to eq(2)
end
# separate user_id / null
it "groups by user_id (including null / logged-out user)" do
create(:display_ad_event, billboard: ad1, user: user1)
create(:display_ad_event, billboard: ad1, user: user2)
create(:display_ad_event, billboard: ad1, user: user2)
create(:display_ad_event, billboard: ad1, user: nil)
create(:display_ad_event, billboard: ad1, user: nil)
create(:display_ad_event, billboard: ad1, user: nil)
create(:display_ad_event, billboard: ad1, user: nil)
create(:display_ad_event, billboard: ad1, user: nil)
described_class.rollup(Date.current)
results = DisplayAdEvent.where(created_at: Date.current.all_day)
by_user = results.index_by { |r| r["user_id"] }
expect(by_user[user1.id]["counts_for"]).to eq(1)
expect(by_user[user2.id]["counts_for"]).to eq(2)
expect(by_user[nil]["counts_for"]).to eq(5)
end
# sums counts_for > 1
it "counts previously crunched" do
create(:display_ad_event, billboard: ad1, counts_for: 10, user_id: nil)
create(:display_ad_event, billboard: ad1, counts_for: 15, user_id: nil)
create(:display_ad_event, billboard: ad1, user_id: nil)
create(:display_ad_event, billboard: ad1, user_id: nil)
create(:display_ad_event, billboard: ad1, user_id: nil)
described_class.rollup(Date.current)
results = DisplayAdEvent.where(created_at: Date.current.all_day)
expect(results.count).to eq(1)
expect(results.first.counts_for).to eq(28)
end
end