Stub member access level in specs
What does this MR do and why?
This MR adds a spec helper stub_member_access_level
to allow stubbing member access on factory stubs like Project
or Group
.
It also adds development guidelines for this helper method and converts two specs to use stub_member_access_level
which improves spec runtime (see "Speed difference?" section).
Example
# Before - slow 🐢
let_it_be(:project) { create(:project) }
let_it_be(:maintainer) { create(:user) }
let(:policy) { ProjectPolicy.new(maintainer, project) }
it 'allows admin_project ability' do
project.add_maintainer(maintainer)
expect(policy).to be_allowed(:admin_project)
end
# After - fast ⚡
let(:project) { build_stubbed(:project) }
let(:maintainer) { build_stubbed(:user) }
let(:policy) { ProjectPolicy.new(maintainer, project) }
it 'allows admin_project ability' do
stub_member_access_level(project, maintainer: maintainer)
expect(policy).to be_allowed(:admin_project)
end
Closes #389247 (closed).
⚡
Speed difference? The main goal of add this stub is to improve spec speed by avoid creating database records.
Running:
bin/rspec spec/presenters/issue_email_participant_presenter_spec.rb spec/presenters/project_clusterable_presenter_spec.rb
Before
Finished in 14.72 seconds (files took 9.32 seconds to load)
16 examples, 0 failures
Randomized with seed 11517
[TEST PROF INFO] Time spent in factories: 00:06.349 (39.38% of total time)
[TEST PROF INFO] Factories usage
Total: 68
Total top-level: 25
Total time: 00:06.349 (out of 00:22.365)
Total uniq factories: 10
total top-level total time time per call top-level time name
19 6 1.8872s 0.0993s 0.8689s user
12 12 3.6497s 0.3041s 3.6497s project
12 0 1.3762s 0.1147s 0.0000s namespace
12 4 2.2075s 0.1840s 1.4823s cluster
4 0 0.4266s 0.1067s 0.0000s cluster_provider_gcp
4 0 0.4826s 0.1206s 0.0000s cluster_platform_kubernetes
2 2 0.0149s 0.0074s 0.0149s license
1 1 0.3333s 0.3333s 0.3333s group
1 0 0.0175s 0.0175s 0.0000s namespace_settings
1 0 0.0174s 0.0174s 0.0000s namespace_ci_cd_settings
After
Finished in 7.62 seconds (files took 20.45 seconds to load)
16 examples, 0 failures
Randomized with seed 26708
[TEST PROF INFO] Time spent in factories: 00:00.032 (0.16% of total time)
[TEST PROF INFO] Factories usage
Total: 2
Total top-level: 2
Total time: 00:00.032 (out of 00:26.185)
Total uniq factories: 1
total top-level total time time per call top-level time name
2 2 0.0326s 0.0163s 0.0326s license
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.
Edited by Peter Leitzen