summaryrefslogtreecommitdiff
path: root/spec/features/admin/admin_requests_profiles_spec.rb
blob: a962af4952bdd1f454d168a68203f6f92594e201 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
require 'spec_helper'

describe 'Admin::RequestsProfilesController' do
  before do
    FileUtils.mkdir_p(Gitlab::RequestProfiler::PROFILES_DIR)
    sign_in(create(:admin))
  end

  after do
    Gitlab::RequestProfiler.remove_all_profiles
  end

  describe 'GET /admin/requests_profiles' do
    it 'shows the current profile token' do
      allow(Rails).to receive(:cache).and_return(ActiveSupport::Cache::MemoryStore.new)

      visit admin_requests_profiles_path

      expect(page).to have_content("X-Profile-Token: #{Gitlab::RequestProfiler.profile_token}")
    end

    context 'when having multiple profiles' do
      let(:time1) { 1.hour.ago }
      let(:time2) { 2.hours.ago }

      let(:profiles) do
        [
          {
            request_path: '/gitlab-org/gitlab-ce',
            name: "|gitlab-org|gitlab-ce_#{time1.to_i}_execution.html",
            created: time1,
            profile_mode: 'Execution'
          },
          {
            request_path: '/gitlab-org/gitlab-ce',
            name: "|gitlab-org|gitlab-ce_#{time2.to_i}_execution.html",
            created: time2,
            profile_mode: 'Execution'
          },
          {
            request_path: '/gitlab-org/gitlab-ce',
            name: "|gitlab-org|gitlab-ce_#{time1.to_i}_memory.html",
            created: time1,
            profile_mode: 'Memory'
          },
          {
            request_path: '/gitlab-org/gitlab-ce',
            name: "|gitlab-org|gitlab-ce_#{time2.to_i}_memory.html",
            created: time2,
            profile_mode: 'Memory'
          },
          {
            request_path: '/gitlab-org/infrastructure',
            name: "|gitlab-org|infrastructure_#{time1.to_i}_execution.html",
            created: time1,
            profile_mode: 'Execution'
          },
          {
            request_path: '/gitlab-org/infrastructure',
            name: "|gitlab-org|infrastructure_#{time2.to_i}_memory.html",
            created: time2,
            profile_mode: 'Memory'
          }
        ]
      end

      before do
        profiles.each do |profile|
          FileUtils.touch(File.join(Gitlab::RequestProfiler::PROFILES_DIR, profile[:name]))
        end
      end

      it 'lists all available profiles' do
        visit admin_requests_profiles_path

        profiles.each do |profile|
          within('.card', text: profile[:request_path]) do
            expect(page).to have_selector(
              "a[href='#{admin_requests_profile_path(profile[:name])}']",
              text: "#{profile[:created].to_s(:long)} #{profile[:profile_mode]}")
          end
        end
      end
    end
  end

  describe 'GET /admin/requests_profiles/:profile' do
    context 'when a profile exists' do
      before do
        File.write("#{Gitlab::RequestProfiler::PROFILES_DIR}/#{profile}", content)
      end

      context 'when is valid call stack profile' do
        let(:content) { 'This is a call stack request profile' }
        let(:profile) { "|gitlab-org|gitlab-ce_#{Time.now.to_i}_execution.html" }

        it 'displays the content' do
          visit admin_requests_profile_path(profile)

          expect(page).to have_content(content)
        end
      end

      context 'when is valid memory profile' do
        let(:content) { 'This is a memory request profile' }
        let(:profile) { "|gitlab-org|gitlab-ce_#{Time.now.to_i}_memory.txt" }

        it 'displays the content' do
          visit admin_requests_profile_path(profile)

          expect(page).to have_content(content)
        end
      end
    end

    context 'when a profile does not exist' do
      it 'shows an error message' do
        visit admin_requests_profile_path('|non|existent_12345.html')

        expect(page).to have_content('Profile not found')
      end
    end
  end
end