Skip to content

Commit 839c1b6

Browse files
committed
Add tests for repository distribution logic
1 parent be2d6a6 commit 839c1b6

File tree

3 files changed

+181
-1
lines changed

3 files changed

+181
-1
lines changed

spec/factories/events/pull_requests.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
size { Faker::Number.within(range: 0..10_000) }
4848
state { 'open' }
4949
html_url { 'https://github.com/Codertocat/Hello-World/pull/2' }
50-
opened_at { Faker::Date.between(from: 1.month.ago, to: Time.zone.now) }
50+
opened_at { Faker::Time.between(from: 1.month.ago, to: Time.zone.now) }
5151
locked { false }
5252
draft { false }
5353
repository
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
require 'rails_helper'
2+
3+
RSpec.describe Builders::Distribution::PullRequests::ReviewCoverageRepository do
4+
describe '.call' do
5+
let(:from) { 4.weeks.ago }
6+
let(:to) { Time.zone.now }
7+
let(:repository_one) { create(:repository) }
8+
let(:repository_two) { create(:repository) }
9+
10+
let!(:first_pull_request) do
11+
create(:pull_request, :merged,
12+
repository: repository_one,
13+
html_url: 'test_pr_url_one',
14+
merged_at: 6.hours.ago)
15+
end
16+
17+
let!(:second_pull_request) do
18+
create(:pull_request, :merged,
19+
repository: repository_two,
20+
html_url: 'test_pr_url_two',
21+
merged_at: 14.hours.ago)
22+
end
23+
24+
let!(:third_pull_request) do
25+
create(:pull_request, :merged,
26+
repository: repository_one,
27+
html_url: 'test_pr_url_three',
28+
merged_at: 26.hours.ago)
29+
end
30+
31+
before do
32+
first_pull_request.review_coverage.update!(coverage_percentage: 0.25)
33+
second_pull_request.review_coverage.update!(coverage_percentage: 0.75)
34+
third_pull_request.review_coverage.update!(coverage_percentage: 0.50)
35+
end
36+
37+
context 'with correct params' do
38+
subject do
39+
described_class.call(
40+
repository_name: repository_one.name,
41+
from: from,
42+
to: to
43+
)
44+
end
45+
46+
it 'returns data for 0-25% coverage' do
47+
expect(subject).to have_key('20-40')
48+
expect(subject['20-40'].first[:value]).to eq(25.0)
49+
end
50+
51+
it 'returns data for 50-75% coverage' do
52+
expect(subject).to have_key('40-60')
53+
expect(subject['40-60'].first[:value]).to eq(50.0)
54+
end
55+
56+
it 'does not return data for 25-50% coverage' do
57+
expect(subject).not_to have_key('10-20')
58+
end
59+
end
60+
61+
context 'when pull request has html_url attribute nil' do
62+
let!(:pull_request_html_url_nil) do
63+
create(:pull_request, :merged,
64+
repository: repository_one,
65+
html_url: nil,
66+
merged_at: 40.hours.ago)
67+
end
68+
69+
before do
70+
pull_request_html_url_nil.review_coverage.update!(coverage_percentage: 0.90)
71+
end
72+
73+
subject do
74+
described_class.call(
75+
repository_name: repository_one.name,
76+
from: from,
77+
to: to
78+
)
79+
end
80+
81+
it 'does not add the pull request to the data' do
82+
expect(subject).not_to have_key('60-80')
83+
end
84+
end
85+
86+
context 'when pull request belongs to ignored user' do
87+
let(:ignored_user) { create(:user, login: 'ignored_user') }
88+
let!(:setting) { create(:setting, key: 'ignored_users', value: ignored_user.login) }
89+
90+
let!(:ignored_pull_request) do
91+
create(:pull_request, :merged,
92+
repository: repository_one,
93+
merged_at: 6.hours.ago,
94+
owner: ignored_user)
95+
end
96+
97+
before do
98+
ignored_pull_request.review_coverage.update!(coverage_percentage: 0.25)
99+
end
100+
101+
subject do
102+
described_class.call(
103+
repository_name: repository_one.name,
104+
from: from,
105+
to: to
106+
)
107+
end
108+
109+
it 'does not include pull requests from ignored users' do
110+
expect(subject['20-40'].pluck(:html_url)).not_to include('ignored_pr_url')
111+
end
112+
end
113+
end
114+
end
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
require 'rails_helper'
2+
3+
RSpec.describe Metrics::ReviewCoverage::PerRepository do
4+
describe '.call' do
5+
let(:subject) { described_class.call(repository.id) }
6+
let(:repository) { create(:repository) }
7+
let(:beginning_of_day) { Time.zone.today.beginning_of_day }
8+
let(:entity_type) { 'Repository' }
9+
let(:metric_name) { :review_coverage }
10+
11+
context 'when there is available data' do
12+
before do
13+
pull_request1 = create(
14+
:pull_request,
15+
:merged,
16+
repository: repository,
17+
merged_at: beginning_of_day + 1.hour
18+
)
19+
pull_request2 = create(
20+
:pull_request,
21+
:merged,
22+
repository: repository,
23+
merged_at: beginning_of_day + 3.hours
24+
)
25+
pull_request1.review_coverage.update!(coverage_percentage: 80.0)
26+
pull_request2.review_coverage.update!(coverage_percentage: 90.0)
27+
end
28+
29+
it 'returns the metric' do
30+
metrics = subject
31+
expect(metrics.count).to eq 1
32+
end
33+
34+
it 'returns the average value' do
35+
metric = subject.first
36+
expect(metric.value).to eq 85.0
37+
end
38+
39+
context 'when interval is set' do
40+
let(:interval) { 4.weeks.ago.beginning_of_week..Time.current.end_of_week }
41+
let(:subject) { described_class.call(repository.id, interval) }
42+
43+
before do
44+
pull_request = create(
45+
:pull_request,
46+
:merged,
47+
repository: repository,
48+
merged_at: 5.weeks.ago
49+
)
50+
pull_request.review_coverage.update!(coverage_percentage: 85.0)
51+
end
52+
53+
it 'does not change metric value' do
54+
metric = subject.first
55+
expect(metric.value).to eq 85.0
56+
end
57+
end
58+
end
59+
60+
context 'when no data is available' do
61+
it 'returns no metrics' do
62+
expect(subject).to be_empty
63+
end
64+
end
65+
end
66+
end

0 commit comments

Comments
 (0)