summaryrefslogtreecommitdiff
path: root/spec/features/users/terms_spec.rb
blob: 7500f2fe59a3fbb1bc58a1f00a5661dd506028af (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'Users > Terms' do
  include TermsHelper

  let!(:term) { create(:term, terms: 'By accepting, you promise to be nice!') }

  before do
    stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
  end

  it 'shows the terms' do
    visit terms_path

    expect(page).to have_content('By accepting, you promise to be nice!')
  end

  it 'does not show buttons to accept, decline or sign out', :aggregate_failures do
    visit terms_path

    expect(page).not_to have_css('.footer-block')
    expect(page).not_to have_content('Accept terms')
    expect(page).not_to have_content('Decline and sign out')
    expect(page).not_to have_content('Continue')
  end

  context 'when user is a project bot' do
    let(:project_bot) { create(:user, :project_bot) }

    before do
      enforce_terms
    end

    it 'auto accepts the terms' do
      visit terms_path

      expect(page).not_to have_content('Accept terms')
      expect(project_bot.terms_accepted?).to be(true)
    end
  end

  context 'when signed in' do
    let(:user) { create(:user) }

    before do
      sign_in(user)
    end

    context 'declining the terms' do
      it 'returns the user to the app' do
        visit terms_path

        click_button 'Decline and sign out'

        expect(page).not_to have_content(term.terms)
        expect(user.reload.terms_accepted?).to be(false)
      end
    end

    context 'accepting the terms' do
      it 'returns the user to the app' do
        visit terms_path

        click_button 'Accept terms'

        expect(page).not_to have_content(term.terms)
        expect(user.reload.terms_accepted?).to be(true)
      end
    end

    context 'when the user has already accepted the terms' do
      before do
        accept_terms(user)
      end

      it 'allows the user to continue to the app' do
        visit terms_path

        expect(page).to have_content "You have already accepted the Terms of Service as #{user.to_reference}"

        click_link 'Continue'

        expect(current_path).to eq(root_path)
      end
    end

    context 'terms were enforced while session is active', :js do
      let(:project) { create(:project) }

      before do
        project.add_developer(user)
      end

      it 'redirects to terms and back to where the user was going' do
        visit project_path(project)

        enforce_terms

        # Application settings are cached for a minute
        Timecop.travel 2.minutes do
          within('.nav-sidebar') do
            click_link 'Issues'
          end

          expect_to_be_on_terms_page

          click_button('Accept terms')

          expect(current_path).to eq(project_issues_path(project))
        end
      end

      # Disabled until https://gitlab.com/gitlab-org/gitlab-foss/issues/37162 is solved properly
      xit 'redirects back to the page the user was trying to save' do
        visit new_project_issue_path(project)

        fill_in :issue_title, with: 'Hello world, a new issue'
        fill_in :issue_description, with: "We don't want to lose what the user typed"

        enforce_terms

        click_button 'Submit issue'

        expect(current_path).to eq(terms_path)

        click_button('Accept terms')

        expect(current_path).to eq(new_project_issue_path(project))
        expect(find_field('issue_title').value).to eq('Hello world, a new issue')
        expect(find_field('issue_description').value).to eq("We don't want to lose what the user typed")
      end
    end

    context 'when the terms are enforced' do
      before do
        enforce_terms
      end

      context 'signing out', :js do
        it 'allows the user to sign out without a response' do
          visit terms_path

          find('.header-user-dropdown-toggle').click
          click_link('Sign out')

          expect(page).to have_content('Sign in')
          expect(page).to have_content('Register')
        end
      end
    end
  end
end