2019-10-12 21:52:04 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
require 'action_dispatch/testing/test_request'
require 'fileutils'
module JavaScriptFixturesHelpers
2019-07-07 11:18:12 +05:30
extend ActiveSupport :: Concern
2017-08-17 22:00:37 +05:30
include Gitlab :: Popen
2019-07-07 11:18:12 +05:30
extend self
2017-08-17 22:00:37 +05:30
2019-07-07 11:18:12 +05:30
included do | base |
2019-02-15 15:39:39 +05:30
base . around do | example |
# pick an arbitrary date from the past, so tests are not time dependent
Timecop . freeze ( Time . utc ( 2015 , 7 , 3 , 10 ) ) { example . run }
2019-09-04 21:01:54 +05:30
raise NoMethodError . new ( 'You need to set `response` for the fixture generator! This will automatically happen with `type: :controller` or `type: :request`.' , 'response' ) unless respond_to? ( :response )
store_frontend_fixture ( response , example . description )
2019-02-15 15:39:39 +05:30
end
end
2019-07-07 11:18:12 +05:30
def fixture_root_path
2019-10-12 21:52:04 +05:30
'tmp/tests/frontend/fixtures' + ( Gitlab . ee? ? '-ee' : '' )
2019-07-07 11:18:12 +05:30
end
2017-08-17 22:00:37 +05:30
# Public: Removes all fixture files from given directory
#
2019-07-07 11:18:12 +05:30
# directory_name - directory of the fixtures (relative to .fixture_root_path)
2017-08-17 22:00:37 +05:30
#
def clean_frontend_fixtures ( directory_name )
2019-07-07 11:18:12 +05:30
full_directory_name = File . expand_path ( directory_name , fixture_root_path )
Dir [ File . expand_path ( '*.html' , full_directory_name ) ] . each do | file_name |
2017-08-17 22:00:37 +05:30
FileUtils . rm ( file_name )
end
end
2019-09-04 21:01:54 +05:30
def remove_repository ( project )
Gitlab :: Shell . new . remove_repository ( project . repository_storage , project . disk_path )
end
2021-01-03 14:25:43 +05:30
# Public: Reads a GraphQL query from the filesystem as a string
#
# query_path - file path to the GraphQL query, relative to `app/assets/javascripts`
# fragment_paths - an optional array of file paths to any fragments the query uses,
# also relative to `app/assets/javascripts`
def get_graphql_query_as_string ( query_path , fragment_paths = [ ] )
[ query_path , * fragment_paths ] . map do | path |
File . read ( File . join ( Rails . root , '/app/assets/javascripts' , path ) )
end . join ( " \n " )
end
2019-09-04 21:01:54 +05:30
private
# Private: Store a response object as fixture file
2017-08-17 22:00:37 +05:30
#
# response - string or response object to store
2019-07-07 11:18:12 +05:30
# fixture_file_name - file name to store the fixture in (relative to .fixture_root_path)
2017-08-17 22:00:37 +05:30
#
def store_frontend_fixture ( response , fixture_file_name )
2019-07-07 11:18:12 +05:30
full_fixture_path = File . expand_path ( fixture_file_name , fixture_root_path )
2017-08-17 22:00:37 +05:30
fixture = response . respond_to? ( :body ) ? parse_response ( response ) : response
2019-07-07 11:18:12 +05:30
FileUtils . mkdir_p ( File . dirname ( full_fixture_path ) )
File . write ( full_fixture_path , fixture )
2017-08-17 22:00:37 +05:30
end
# Private: Prepare a response object for use as a frontend fixture
#
# response - response object to prepare
#
def parse_response ( response )
fixture = response . body
fixture . force_encoding ( " utf-8 " )
2020-03-13 15:44:24 +05:30
response_mime_type = Mime :: Type . lookup ( response . media_type )
2017-08-17 22:00:37 +05:30
if response_mime_type . html?
doc = Nokogiri :: HTML :: DocumentFragment . parse ( fixture )
link_tags = doc . css ( 'link' )
link_tags . remove
2019-12-21 20:55:43 +05:30
scripts = doc . css ( " script:not([type='text/template']):not([type='text/x-template']):not([type='application/json']) " )
2017-08-17 22:00:37 +05:30
scripts . remove
fixture = doc . to_html
# replace relative links
test_host = ActionDispatch :: TestRequest :: DEFAULT_ENV [ 'HTTP_HOST' ]
fixture . gsub! ( %r{ ="/ } , " = \" http:// #{ test_host } / " )
end
fixture
end
end