Skip to content

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.

Edited by Peter Leitzen

Merge request reports

Loading