summaryrefslogtreecommitdiff
path: root/qa/qa/page/project/issue/show.rb
blob: 6ec80b7c9cc4c04d263a931063ee8787a8432117 (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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# frozen_string_literal: true

module QA
  module Page
    module Project
      module Issue
        class Show < Page::Base
          include Page::Component::Issuable::Common
          include Page::Component::Note

          view 'app/assets/javascripts/notes/components/comment_form.vue' do
            element :comment_button
            element :comment_input
          end

          view 'app/assets/javascripts/notes/components/discussion_filter.vue' do
            element :discussion_filter, required: true
            element :filter_options
          end

          view 'app/assets/javascripts/notes/components/noteable_note.vue' do
            element :noteable_note_item
          end

          view 'app/assets/javascripts/sidebar/components/assignees/assignee_avatar.vue' do
            element :avatar_image
          end

          view 'app/assets/javascripts/sidebar/components/assignees/assignee_title.vue' do
            element :assignee_edit_link
            element :assignee_title
          end

          view 'app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue' do
            element :more_assignees_link
          end

          view 'app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue' do
            element :remove_related_issue_button
          end

          view 'app/helpers/dropdowns_helper.rb' do
            element :dropdown_input_field
          end

          view 'app/views/shared/issuable/_close_reopen_button.html.haml' do
            element :reopen_issue_button
          end

          view 'app/views/shared/issuable/_sidebar.html.haml' do
            element :assignee_block
            element :labels_block
            element :edit_link_labels
            element :dropdown_menu_labels
            element :milestone_link
          end

          view 'app/views/shared/notes/_form.html.haml' do
            element :new_note_form, 'new-note' # rubocop:disable QA/ElementWithPattern
            element :new_note_form, 'attr: :note' # rubocop:disable QA/ElementWithPattern
          end

          def assign(user)
            click_element(:assignee_edit_link)
            select_user(user.username)
            click_body
          end

          def assignee_title
            find_element(:assignee_title)
          end

          def avatar_image_count
            wait_assignees_block_finish_loading do
              all_elements(:avatar_image).count
            end
          end

          def click_milestone_link
            click_element(:milestone_link)
          end

          def click_remove_related_issue_button
            click_element(:remove_related_issue_button)
          end

          # Adds a comment to an issue
          # attachment option should be an absolute path
          def comment(text, attachment: nil, filter: :all_activities)
            method("select_#{filter}_filter").call
            fill_element :comment_input, text

            unless attachment.nil?
              QA::Page::Component::Dropzone.new(self, '.new-note')
                .attach_file(attachment)
            end

            click_element :comment_button
          end

          def has_comment?(comment_text)
            wait(reload: false) do
              has_element?(:noteable_note_item, text: comment_text)
            end
          end

          def more_assignees_link
            find_element(:more_assignees_link)
          end

          def noteable_note_item
            find_element(:noteable_note_item)
          end

          def select_all_activities_filter
            select_filter_with_text('Show all activity')
          end

          def select_comments_only_filter
            select_filter_with_text('Show comments only')
          end

          def select_history_only_filter
            select_filter_with_text('Show history only')
          end

          def select_labels_and_refresh(labels)
            Support::Retrier.retry_until do
              click_element(:edit_link_labels)
              has_element?(:dropdown_menu_labels, text: labels.first)
            end

            labels.each do |label|
              within_element(:dropdown_menu_labels, text: label) do
                send_keys_to_element(:dropdown_input_field, [label, :enter])
              end
            end

            click_body

            labels.each do |label|
              has_element?(:labels_block, text: label)
            end

            refresh
          end

          def text_of_labels_block
            find_element(:labels_block)
          end

          def toggle_more_assignees_link
            click_element(:more_assignees_link)
          end

          private

          def select_filter_with_text(text)
            retry_on_exception do
              click_body
              click_element :discussion_filter
              find_element(:filter_options, text: text).click
            end
          end

          def select_user(username)
            find("#{element_selector_css(:assignee_block)} input").set(username)

            dropdown_menu_user_link_selector = '.dropdown-menu-user-link'
            at_username = "@#{username}"
            ten_seconds = 10

            wait(reload: false, max: ten_seconds, interval: 1) do
              has_css?(dropdown_menu_user_link_selector, wait: ten_seconds, text: at_username)
            end
            find(dropdown_menu_user_link_selector, text: at_username).click
          end

          def wait_assignees_block_finish_loading
            within_element(:assignee_block) do
              wait(reload: false, max: 10, interval: 1) do
                finished_loading_block?
                yield
              end
            end
          end
        end
      end
    end
  end
end

QA::Page::Project::Issue::Show.prepend_if_ee('QA::EE::Page::Project::Issue::Show')