2019-04-30 08:27:42 +08:00
# frozen_string_literal: true
2020-05-07 23:04:12 +08:00
# rubocop:disable Discourse/NoJsonParseResponse
2019-04-30 08:27:42 +08:00
2016-02-14 02:29:53 +08:00
require 'rails_helper'
RSpec . describe MetadataController do
2019-05-07 11:12:20 +08:00
2018-06-14 11:13:28 +08:00
describe 'manifest.webmanifest' do
2019-05-01 21:44:45 +08:00
before do
SiteIconManager . enable
end
let ( :upload ) do
UploadCreator . new ( file_from_fixtures ( " smallest.png " ) , 'logo.png' ) . create_for ( Discourse . system_user . id )
end
2016-02-14 02:29:53 +08:00
it 'returns the right output' do
title = 'MyApp'
SiteSetting . title = title
2019-05-01 21:44:45 +08:00
SiteSetting . manifest_icon = upload
2017-11-03 13:19:31 +08:00
2018-06-14 11:13:28 +08:00
get " /manifest.webmanifest "
2018-06-07 13:08:28 +08:00
expect ( response . status ) . to eq ( 200 )
2019-09-12 08:41:50 +08:00
expect ( response . media_type ) . to eq ( 'application/manifest+json' )
2020-07-01 10:58:02 +08:00
expect ( response . headers [ " Cache-Control " ] ) . to eq ( 'max-age=60, private' )
2017-11-03 13:19:31 +08:00
manifest = JSON . parse ( response . body )
expect ( manifest [ " name " ] ) . to eq ( title )
2018-11-14 15:03:02 +08:00
expect ( manifest [ " icons " ] . first [ " src " ] ) . to eq (
2019-05-01 21:44:45 +08:00
UrlHelper . absolute ( SiteSetting . site_manifest_icon_url )
2018-11-14 15:03:02 +08:00
)
2016-02-14 02:29:53 +08:00
end
2018-05-18 03:10:35 +08:00
it 'can guess mime types' do
2019-05-01 21:44:45 +08:00
upload = UploadCreator . new ( file_from_fixtures ( " logo.jpg " ) , 'logo.jpg' ) . create_for ( Discourse . system_user . id )
2018-11-14 15:03:02 +08:00
2019-05-01 21:44:45 +08:00
SiteSetting . manifest_icon = upload
2018-06-14 11:13:28 +08:00
get " /manifest.webmanifest "
2018-11-14 15:03:02 +08:00
2018-06-07 13:08:28 +08:00
expect ( response . status ) . to eq ( 200 )
2018-05-18 03:10:35 +08:00
manifest = JSON . parse ( response . body )
2018-05-18 05:43:22 +08:00
expect ( manifest [ " icons " ] . first [ " type " ] ) . to eq ( " image/jpeg " )
2018-05-18 03:10:35 +08:00
end
it 'defaults to png' do
2019-05-01 21:44:45 +08:00
SiteSetting . manifest_icon = upload
2018-06-14 11:13:28 +08:00
get " /manifest.webmanifest "
2018-06-07 13:08:28 +08:00
expect ( response . status ) . to eq ( 200 )
2018-05-18 03:10:35 +08:00
manifest = JSON . parse ( response . body )
expect ( manifest [ " icons " ] . first [ " type " ] ) . to eq ( " image/png " )
end
2018-10-27 00:47:22 +08:00
it 'defaults to display standalone for Android' do
get " /manifest.webmanifest " , params : { } , headers : { 'USER-AGENT' = > 'Mozilla/5.0 (Linux; Android 7.0; SM-G892A Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 Mobile Safari/537.36' }
manifest = JSON . parse ( response . body )
expect ( manifest [ " display " ] ) . to eq ( " standalone " )
end
2020-04-08 03:58:21 +08:00
it 'defaults to display standalone for iPhone' do
2018-10-27 00:47:22 +08:00
get " /manifest.webmanifest " , params : { } , headers : { 'USER-AGENT' = > 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' }
manifest = JSON . parse ( response . body )
2020-04-08 03:58:21 +08:00
expect ( manifest [ " display " ] ) . to eq ( " standalone " )
2018-10-27 00:47:22 +08:00
end
2020-04-08 03:58:21 +08:00
it 'can be changed to display browser for iPhones using a site setting' do
SiteSetting . pwa_display_browser_regex = " iPhone "
2018-10-27 00:47:22 +08:00
get " /manifest.webmanifest " , params : { } , headers : { 'USER-AGENT' = > 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' }
manifest = JSON . parse ( response . body )
2020-04-08 03:58:21 +08:00
expect ( manifest [ " display " ] ) . to eq ( " browser " )
2018-10-27 00:47:22 +08:00
end
2018-11-28 21:55:52 +08:00
it 'uses the short_title if it is set' do
2020-02-05 01:46:33 +08:00
title = 'FooBarBaz Forum'
SiteSetting . title = title
2018-11-28 21:55:52 +08:00
get " /manifest.webmanifest "
expect ( response . status ) . to eq ( 200 )
manifest = JSON . parse ( response . body )
2020-02-05 01:46:33 +08:00
expect ( manifest [ " short_name " ] ) . to eq ( " FooBarBaz " )
2018-11-28 21:55:52 +08:00
SiteSetting . short_title = " foo "
get " /manifest.webmanifest "
expect ( response . status ) . to eq ( 200 )
manifest = JSON . parse ( response . body )
expect ( manifest [ " short_name " ] ) . to eq ( " foo " )
end
2020-05-12 23:24:33 +08:00
it 'contains valid shortcuts by default' do
get " /manifest.webmanifest "
expect ( response . status ) . to eq ( 200 )
manifest = JSON . parse ( response . body )
expect ( manifest [ " shortcuts " ] . size ) . to be > 0
expect { URI . parse ( manifest [ " shortcuts " ] [ 0 ] [ " icons " ] [ 0 ] [ " src " ] ) } . not_to raise_error
end
2016-02-14 02:29:53 +08:00
end
describe 'opensearch.xml' do
2019-05-10 18:59:31 +08:00
fab! ( :upload ) { Fabricate ( :upload ) }
2019-05-01 21:44:45 +08:00
2016-02-14 02:29:53 +08:00
it 'returns the right output' do
title = 'MyApp'
SiteSetting . title = title
2018-11-14 15:03:02 +08:00
SiteSetting . favicon = upload
2018-06-07 13:08:28 +08:00
get " /opensearch.xml "
2018-11-14 15:03:02 +08:00
2020-07-01 10:58:02 +08:00
expect ( response . headers [ " Cache-Control " ] ) . to eq ( 'max-age=60, private' )
2018-06-07 13:08:28 +08:00
expect ( response . status ) . to eq ( 200 )
2016-02-14 02:29:53 +08:00
expect ( response . body ) . to include ( title )
expect ( response . body ) . to include ( " /search?q={searchTerms} " )
expect ( response . body ) . to include ( 'image/png' )
2018-11-14 15:03:02 +08:00
expect ( response . body ) . to include ( UrlHelper . absolute ( upload . url ) )
2019-09-12 08:41:50 +08:00
expect ( response . media_type ) . to eq ( 'application/xml' )
2016-02-14 02:29:53 +08:00
end
end
2019-08-28 02:05:37 +08:00
describe '#app_association_android' do
it 'returns 404 by default' do
get " /.well-known/assetlinks.json "
expect ( response . status ) . to eq ( 404 )
end
it 'returns the right output' do
SiteSetting . app_association_android = << ~ EOF
[ {
" relation " : [ " delegate_permission/common.handle_all_urls " ] ,
" target " : { " namespace " : " android_app " , " package_name " : " com.example.app " ,
" sha256_cert_fingerprints " : [ " hash_of_app_certificate " ] }
} ]
EOF
get " /.well-known/assetlinks.json "
2020-07-01 10:58:02 +08:00
expect ( response . headers [ " Cache-Control " ] ) . to eq ( 'max-age=60, private' )
2019-08-28 02:05:37 +08:00
expect ( response . status ) . to eq ( 200 )
expect ( response . body ) . to include ( " hash_of_app_certificate " )
expect ( response . body ) . to include ( " com.example.app " )
2019-09-12 08:41:50 +08:00
expect ( response . media_type ) . to eq ( 'application/json' )
2019-08-28 02:05:37 +08:00
end
end
describe '#app_association_ios' do
it 'returns 404 by default' do
get " /apple-app-site-association "
expect ( response . status ) . to eq ( 404 )
end
it 'returns the right output' do
SiteSetting . app_association_ios = << ~ EOF
{
" applinks " : {
" apps " : [ ]
}
}
EOF
get " /apple-app-site-association "
expect ( response . status ) . to eq ( 200 )
expect ( response . body ) . to include ( " applinks " )
2019-09-12 08:41:50 +08:00
expect ( response . media_type ) . to eq ( 'application/json' )
2020-07-01 10:58:02 +08:00
expect ( response . headers [ " Cache-Control " ] ) . to eq ( 'max-age=60, private' )
2019-08-28 02:05:37 +08:00
get " /apple-app-site-association.json "
expect ( response . status ) . to eq ( 404 )
end
end
2016-02-14 02:29:53 +08:00
end