2019-10-12 21:52:04 +05:30
# frozen_string_literal: true
2019-03-02 22:35:43 +05:30
require 'spec_helper'
2023-03-04 22:38:38 +05:30
RSpec . describe 'User views releases' , :js , feature_category : :continuous_delivery do
2021-01-29 00:20:46 +05:30
let_it_be ( :today ) { Time . zone . now }
let_it_be ( :yesterday ) { today - 1 . day }
let_it_be ( :tomorrow ) { today + 1 . day }
2020-04-22 19:07:51 +05:30
let_it_be ( :project ) { create ( :project , :repository , :private ) }
2021-01-29 00:20:46 +05:30
let_it_be ( :release_v1 ) { create ( :release , project : project , tag : 'v1' , name : 'The first release' , released_at : yesterday , created_at : today ) }
let_it_be ( :release_v2 ) { create ( :release , project : project , tag : 'v2-with-a/slash' , name : 'The second release' , released_at : today , created_at : yesterday ) }
let_it_be ( :release_v3 ) { create ( :release , project : project , tag : 'v3' , name : 'The third release' , released_at : tomorrow , created_at : tomorrow ) }
2020-04-22 19:07:51 +05:30
let_it_be ( :maintainer ) { create ( :user ) }
let_it_be ( :guest ) { create ( :user ) }
2019-03-02 22:35:43 +05:30
2021-09-30 23:02:18 +05:30
let_it_be ( :internal_link ) { create ( :release_link , release : release_v1 , name : 'An internal link' , url : " #{ project . web_url } /-/jobs/1/artifacts/download " , filepath : nil ) }
2023-01-13 00:05:48 +05:30
let_it_be ( :internal_link_with_redirect ) { create ( :release_link , release : release_v1 , name : 'An internal link with a redirect' , url : " #{ project . web_url } /-/jobs/2/artifacts/download " , filepath : '/binaries/linux-amd64' ) }
2021-09-30 23:02:18 +05:30
let_it_be ( :external_link ) { create ( :release_link , release : release_v1 , name : 'An external link' , url : " https://example.com/an/external/link " , filepath : nil ) }
2019-03-02 22:35:43 +05:30
before do
2020-04-22 19:07:51 +05:30
project . add_maintainer ( maintainer )
project . add_guest ( guest )
2021-09-30 23:02:18 +05:30
stub_default_url_options ( host : 'localhost' )
2019-03-02 22:35:43 +05:30
end
2022-06-21 17:19:12 +05:30
context ( 'when the user is a maintainer' ) do
before do
sign_in ( maintainer )
2019-03-02 22:35:43 +05:30
2022-06-21 17:19:12 +05:30
visit project_releases_path ( project )
2021-09-30 23:02:18 +05:30
2022-06-21 17:19:12 +05:30
wait_for_requests
end
2021-06-08 01:23:25 +05:30
2022-06-21 17:19:12 +05:30
it 'sees the release' do
page . within ( " # #{ release_v1 . tag } " ) do
expect ( page ) . to have_content ( release_v1 . name )
expect ( page ) . to have_content ( release_v1 . tag )
expect ( page ) . not_to have_content ( 'Upcoming Release' )
2020-11-24 15:15:51 +05:30
end
2022-06-21 17:19:12 +05:30
end
2020-04-22 19:07:51 +05:30
2022-06-21 17:19:12 +05:30
it 'renders the correct links' , :aggregate_failures do
page . within ( " # #{ release_v1 . tag } .js-assets-list " ) do
external_link_indicator_selector = '[data-testid="external-link-indicator"]'
2021-01-03 14:25:43 +05:30
2022-06-21 17:19:12 +05:30
expect ( page ) . to have_link internal_link . name , href : internal_link . url
2023-04-23 21:23:45 +05:30
expect ( find_link ( internal_link . name ) ) . to have_css ( external_link_indicator_selector )
2021-01-03 14:25:43 +05:30
2022-06-21 17:19:12 +05:30
expect ( page ) . to have_link internal_link_with_redirect . name , href : Gitlab :: Routing . url_helpers . project_release_url ( project , release_v1 ) << " /downloads #{ internal_link_with_redirect . filepath } "
2023-04-23 21:23:45 +05:30
expect ( find_link ( internal_link_with_redirect . name ) ) . to have_css ( external_link_indicator_selector )
2020-11-24 15:15:51 +05:30
2022-06-21 17:19:12 +05:30
expect ( page ) . to have_link external_link . name , href : external_link . url
expect ( find_link ( external_link . name ) ) . to have_css ( external_link_indicator_selector )
2019-03-02 22:35:43 +05:30
end
2022-06-21 17:19:12 +05:30
end
2019-09-30 21:07:59 +05:30
2022-06-21 17:19:12 +05:30
context 'with an upcoming release' do
it 'sees the upcoming tag' do
page . within ( " # #{ release_v3 . tag } " ) do
expect ( page ) . to have_content ( 'Upcoming Release' )
2020-11-24 15:15:51 +05:30
end
end
2022-06-21 17:19:12 +05:30
end
2020-11-24 15:15:51 +05:30
2022-06-21 17:19:12 +05:30
context 'with a tag containing a slash' do
it 'sees the release' do
page . within ( " # #{ release_v2 . tag . parameterize } " ) do
expect ( page ) . to have_content ( release_v2 . name )
expect ( page ) . to have_content ( release_v2 . tag )
2021-01-29 00:20:46 +05:30
end
end
2022-06-21 17:19:12 +05:30
end
2021-01-29 00:20:46 +05:30
2022-06-21 17:19:12 +05:30
context 'sorting' do
def sort_page ( by : , direction : )
within '[data-testid="releases-sort"]' do
find ( '.dropdown-toggle' ) . click
2020-04-22 19:07:51 +05:30
2022-06-21 17:19:12 +05:30
click_button ( by , class : 'dropdown-item' )
2020-11-24 15:15:51 +05:30
2022-06-21 17:19:12 +05:30
find ( '.sorting-direction-button' ) . click if direction == :ascending
2021-09-04 01:27:46 +05:30
end
2022-06-21 17:19:12 +05:30
end
2019-09-30 21:07:59 +05:30
2022-06-21 17:19:12 +05:30
shared_examples 'releases sort order' do
it " sorts the releases #{ description } " do
card_titles = page . all ( '.release-block .card-title' , minimum : expected_releases . count )
2020-11-24 15:15:51 +05:30
2022-06-21 17:19:12 +05:30
card_titles . each_with_index do | title , index |
expect ( title ) . to have_content ( expected_releases [ index ] . name )
2021-09-04 01:27:46 +05:30
end
2020-11-24 15:15:51 +05:30
end
2021-09-04 01:27:46 +05:30
end
2022-06-21 17:19:12 +05:30
context " when the page is sorted by the default sort order " do
let ( :expected_releases ) { [ release_v3 , release_v2 , release_v1 ] }
2021-09-04 01:27:46 +05:30
2022-06-21 17:19:12 +05:30
it_behaves_like 'releases sort order'
end
2021-09-04 01:27:46 +05:30
2022-06-21 17:19:12 +05:30
context " when the page is sorted by created_at ascending " do
let ( :expected_releases ) { [ release_v2 , release_v1 , release_v3 ] }
2021-06-08 01:23:25 +05:30
2022-06-21 17:19:12 +05:30
before do
sort_page by : 'Created date' , direction : :ascending
2021-09-04 01:27:46 +05:30
end
2022-06-21 17:19:12 +05:30
it_behaves_like 'releases sort order'
2020-04-22 19:07:51 +05:30
end
2019-09-30 21:07:59 +05:30
end
end
2020-01-12 00:16:45 +05:30
2022-06-21 17:19:12 +05:30
context ( 'when the user is a guest' ) do
2020-04-22 19:07:51 +05:30
before do
2022-06-21 17:19:12 +05:30
sign_in ( guest )
2020-04-22 19:07:51 +05:30
end
2022-06-21 17:19:12 +05:30
it 'renders release info except for Git-related data' do
visit project_releases_path ( project )
2021-06-08 01:23:25 +05:30
2022-06-21 17:19:12 +05:30
within ( '.release-block' , match : :first ) do
expect ( page ) . to have_content ( release_v3 . description )
expect ( page ) . to have_content ( release_v3 . tag )
expect ( page ) . to have_content ( release_v3 . name )
2021-09-04 01:27:46 +05:30
2022-06-21 17:19:12 +05:30
# The following properties (sometimes) include Git info,
# so they are not rendered for Guest users
expect ( page ) . not_to have_content ( release_v3 . commit . short_id )
end
end
2020-01-12 00:16:45 +05:30
end
2019-03-02 22:35:43 +05:30
end