2019-06-17 14:51:17 -04:00
# coding: utf-8
2019-04-29 20:27:42 -04:00
# frozen_string_literal: true
2013-08-27 14:57:42 -04:00
describe ApplicationHelper do
2017-10-06 01:20:01 -04:00
describe " preload_script " do
2019-11-04 20:15:44 -05:00
def preload_link ( url )
<< ~ HTML
< link rel = " preload " href = " #{ url } " as = " script " >
< script src = " #{ url } " > < / script>
HTML
end
2022-04-06 06:09:12 -04:00
it " sends crawler content to old mobiles " do
controller . stubs ( :use_crawler_layout? ) . returns ( false )
helper . request . user_agent = " Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 "
expect ( helper . include_crawler_content? ) . to eq ( true )
end
it " does not send crawler content to new mobiles " do
controller . stubs ( :use_crawler_layout? ) . returns ( false )
helper . request . user_agent = " Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Mobile Safari/537.36 (compatible "
expect ( helper . include_crawler_content? ) . to eq ( false )
end
2017-10-06 01:20:01 -04:00
it " provides brotli links to brotli cdn " do
set_cdn_url " https://awesome.com "
helper . request . env [ " HTTP_ACCEPT_ENCODING " ] = 'br'
link = helper . preload_script ( 'application' )
DEV: Allow Ember CLI assets to be used by development Rails app (#16511)
Previously, accessing the Rails app directly in development mode would give you assets from our 'legacy' Ember asset pipeline. The only way to run with Ember CLI assets was to run ember-cli as a proxy. This was quite limiting when working on things which are bypassed when using the ember-cli proxy (e.g. changes to `application.html.erb`). Also, since `ember-auto-import` introduced chunking, visiting `/theme-qunit` under Ember CLI was failing to include all necessary chunks.
This commit teaches Sprockets about our Ember CLI assets so that they can be used in development mode, and are automatically collected up under `/public/assets` during `assets:precompile`. As a bonus, this allows us to remove all the custom manifest modification from `assets:precompile`.
The key changes are:
- Introduce a shared `EmberCli.enabled?` helper
- When ember-cli is enabled, add ember-cli `/dist/assets` as the top-priority Rails asset directory
- Have ember-cli output a `chunks.json` manifest, and teach `preload_script` to read it and append the correct chunks to their associated `afterFile`
- Remove most custom ember-cli logic from the `assets:precompile` step. Instead, rely on Rails to take care of pulling the 'precompiled' assets into the `public/assets` directory. Move the 'renaming' logic to runtime, so it can be used in development mode as well.
- Remove fingerprinting from `ember-cli-build`, and allow Rails to take care of things
Long-term, we may want to replace Sprockets with the lighter-weight Propshaft. The changes made in this commit have been made with that long-term goal in mind.
tldr: when you visit the rails app directly, you'll now be served the current ember-cli assets. To keep these up-to-date make sure either `ember serve`, or `ember build --watch` is running. If you really want to load the old non-ember-cli assets, then you should start the server with `EMBER_CLI_PROD_ASSETS=0`. (the legacy asset pipeline will be removed very soon)
2022-04-21 11:26:34 -04:00
expect ( link ) . to eq ( preload_link ( " https://awesome.com/brotli_asset/ #{ EmberCli . transform_name ( " application " ) } .js " ) )
2017-10-06 01:20:01 -04:00
end
context " with s3 CDN " do
before do
global_setting :s3_bucket , 'test_bucket'
global_setting :s3_region , 'ap-australia'
global_setting :s3_access_key_id , '123'
global_setting :s3_secret_access_key , '123'
global_setting :s3_cdn_url , 'https://s3cdn.com'
end
2018-08-21 22:31:13 -04:00
it " deals correctly with subfolder " do
2019-11-15 00:48:24 -05:00
set_subfolder " /community "
DEV: Allow Ember CLI assets to be used by development Rails app (#16511)
Previously, accessing the Rails app directly in development mode would give you assets from our 'legacy' Ember asset pipeline. The only way to run with Ember CLI assets was to run ember-cli as a proxy. This was quite limiting when working on things which are bypassed when using the ember-cli proxy (e.g. changes to `application.html.erb`). Also, since `ember-auto-import` introduced chunking, visiting `/theme-qunit` under Ember CLI was failing to include all necessary chunks.
This commit teaches Sprockets about our Ember CLI assets so that they can be used in development mode, and are automatically collected up under `/public/assets` during `assets:precompile`. As a bonus, this allows us to remove all the custom manifest modification from `assets:precompile`.
The key changes are:
- Introduce a shared `EmberCli.enabled?` helper
- When ember-cli is enabled, add ember-cli `/dist/assets` as the top-priority Rails asset directory
- Have ember-cli output a `chunks.json` manifest, and teach `preload_script` to read it and append the correct chunks to their associated `afterFile`
- Remove most custom ember-cli logic from the `assets:precompile` step. Instead, rely on Rails to take care of pulling the 'precompiled' assets into the `public/assets` directory. Move the 'renaming' logic to runtime, so it can be used in development mode as well.
- Remove fingerprinting from `ember-cli-build`, and allow Rails to take care of things
Long-term, we may want to replace Sprockets with the lighter-weight Propshaft. The changes made in this commit have been made with that long-term goal in mind.
tldr: when you visit the rails app directly, you'll now be served the current ember-cli assets. To keep these up-to-date make sure either `ember serve`, or `ember build --watch` is running. If you really want to load the old non-ember-cli assets, then you should start the server with `EMBER_CLI_PROD_ASSETS=0`. (the legacy asset pipeline will be removed very soon)
2022-04-21 11:26:34 -04:00
expect ( helper . preload_script ( " application " ) ) . to include ( " https://s3cdn.com/assets/ #{ EmberCli . transform_name ( " application " ) } .js " )
2018-08-21 22:31:13 -04:00
end
2019-06-17 14:51:17 -04:00
it " replaces cdn URLs with s3 cdn subfolder paths " do
global_setting :s3_cdn_url , 'https://s3cdn.com/s3_subpath'
set_cdn_url " https://awesome.com "
2019-11-15 00:48:24 -05:00
set_subfolder " /community "
DEV: Allow Ember CLI assets to be used by development Rails app (#16511)
Previously, accessing the Rails app directly in development mode would give you assets from our 'legacy' Ember asset pipeline. The only way to run with Ember CLI assets was to run ember-cli as a proxy. This was quite limiting when working on things which are bypassed when using the ember-cli proxy (e.g. changes to `application.html.erb`). Also, since `ember-auto-import` introduced chunking, visiting `/theme-qunit` under Ember CLI was failing to include all necessary chunks.
This commit teaches Sprockets about our Ember CLI assets so that they can be used in development mode, and are automatically collected up under `/public/assets` during `assets:precompile`. As a bonus, this allows us to remove all the custom manifest modification from `assets:precompile`.
The key changes are:
- Introduce a shared `EmberCli.enabled?` helper
- When ember-cli is enabled, add ember-cli `/dist/assets` as the top-priority Rails asset directory
- Have ember-cli output a `chunks.json` manifest, and teach `preload_script` to read it and append the correct chunks to their associated `afterFile`
- Remove most custom ember-cli logic from the `assets:precompile` step. Instead, rely on Rails to take care of pulling the 'precompiled' assets into the `public/assets` directory. Move the 'renaming' logic to runtime, so it can be used in development mode as well.
- Remove fingerprinting from `ember-cli-build`, and allow Rails to take care of things
Long-term, we may want to replace Sprockets with the lighter-weight Propshaft. The changes made in this commit have been made with that long-term goal in mind.
tldr: when you visit the rails app directly, you'll now be served the current ember-cli assets. To keep these up-to-date make sure either `ember serve`, or `ember build --watch` is running. If you really want to load the old non-ember-cli assets, then you should start the server with `EMBER_CLI_PROD_ASSETS=0`. (the legacy asset pipeline will be removed very soon)
2022-04-21 11:26:34 -04:00
expect ( helper . preload_script ( " application " ) ) . to include ( " https://s3cdn.com/s3_subpath/assets/ #{ EmberCli . transform_name ( " application " ) } .js " )
2019-06-17 14:51:17 -04:00
end
2017-10-06 01:20:01 -04:00
it " returns magic brotli mangling for brotli requests " do
helper . request . env [ " HTTP_ACCEPT_ENCODING " ] = 'br'
link = helper . preload_script ( 'application' )
DEV: Allow Ember CLI assets to be used by development Rails app (#16511)
Previously, accessing the Rails app directly in development mode would give you assets from our 'legacy' Ember asset pipeline. The only way to run with Ember CLI assets was to run ember-cli as a proxy. This was quite limiting when working on things which are bypassed when using the ember-cli proxy (e.g. changes to `application.html.erb`). Also, since `ember-auto-import` introduced chunking, visiting `/theme-qunit` under Ember CLI was failing to include all necessary chunks.
This commit teaches Sprockets about our Ember CLI assets so that they can be used in development mode, and are automatically collected up under `/public/assets` during `assets:precompile`. As a bonus, this allows us to remove all the custom manifest modification from `assets:precompile`.
The key changes are:
- Introduce a shared `EmberCli.enabled?` helper
- When ember-cli is enabled, add ember-cli `/dist/assets` as the top-priority Rails asset directory
- Have ember-cli output a `chunks.json` manifest, and teach `preload_script` to read it and append the correct chunks to their associated `afterFile`
- Remove most custom ember-cli logic from the `assets:precompile` step. Instead, rely on Rails to take care of pulling the 'precompiled' assets into the `public/assets` directory. Move the 'renaming' logic to runtime, so it can be used in development mode as well.
- Remove fingerprinting from `ember-cli-build`, and allow Rails to take care of things
Long-term, we may want to replace Sprockets with the lighter-weight Propshaft. The changes made in this commit have been made with that long-term goal in mind.
tldr: when you visit the rails app directly, you'll now be served the current ember-cli assets. To keep these up-to-date make sure either `ember serve`, or `ember build --watch` is running. If you really want to load the old non-ember-cli assets, then you should start the server with `EMBER_CLI_PROD_ASSETS=0`. (the legacy asset pipeline will be removed very soon)
2022-04-21 11:26:34 -04:00
expect ( link ) . to eq ( preload_link ( " https://s3cdn.com/assets/ #{ EmberCli . transform_name ( " application " ) } .br.js " ) )
2017-10-06 01:20:01 -04:00
end
it " gives s3 cdn if asset host is not set " do
link = helper . preload_script ( 'application' )
DEV: Allow Ember CLI assets to be used by development Rails app (#16511)
Previously, accessing the Rails app directly in development mode would give you assets from our 'legacy' Ember asset pipeline. The only way to run with Ember CLI assets was to run ember-cli as a proxy. This was quite limiting when working on things which are bypassed when using the ember-cli proxy (e.g. changes to `application.html.erb`). Also, since `ember-auto-import` introduced chunking, visiting `/theme-qunit` under Ember CLI was failing to include all necessary chunks.
This commit teaches Sprockets about our Ember CLI assets so that they can be used in development mode, and are automatically collected up under `/public/assets` during `assets:precompile`. As a bonus, this allows us to remove all the custom manifest modification from `assets:precompile`.
The key changes are:
- Introduce a shared `EmberCli.enabled?` helper
- When ember-cli is enabled, add ember-cli `/dist/assets` as the top-priority Rails asset directory
- Have ember-cli output a `chunks.json` manifest, and teach `preload_script` to read it and append the correct chunks to their associated `afterFile`
- Remove most custom ember-cli logic from the `assets:precompile` step. Instead, rely on Rails to take care of pulling the 'precompiled' assets into the `public/assets` directory. Move the 'renaming' logic to runtime, so it can be used in development mode as well.
- Remove fingerprinting from `ember-cli-build`, and allow Rails to take care of things
Long-term, we may want to replace Sprockets with the lighter-weight Propshaft. The changes made in this commit have been made with that long-term goal in mind.
tldr: when you visit the rails app directly, you'll now be served the current ember-cli assets. To keep these up-to-date make sure either `ember serve`, or `ember build --watch` is running. If you really want to load the old non-ember-cli assets, then you should start the server with `EMBER_CLI_PROD_ASSETS=0`. (the legacy asset pipeline will be removed very soon)
2022-04-21 11:26:34 -04:00
expect ( link ) . to eq ( preload_link ( " https://s3cdn.com/assets/ #{ EmberCli . transform_name ( " application " ) } .js " ) )
2017-10-06 01:20:01 -04:00
end
2019-07-16 10:05:37 -04:00
it " can fall back to gzip compression " do
helper . request . env [ " HTTP_ACCEPT_ENCODING " ] = 'gzip'
link = helper . preload_script ( 'application' )
DEV: Allow Ember CLI assets to be used by development Rails app (#16511)
Previously, accessing the Rails app directly in development mode would give you assets from our 'legacy' Ember asset pipeline. The only way to run with Ember CLI assets was to run ember-cli as a proxy. This was quite limiting when working on things which are bypassed when using the ember-cli proxy (e.g. changes to `application.html.erb`). Also, since `ember-auto-import` introduced chunking, visiting `/theme-qunit` under Ember CLI was failing to include all necessary chunks.
This commit teaches Sprockets about our Ember CLI assets so that they can be used in development mode, and are automatically collected up under `/public/assets` during `assets:precompile`. As a bonus, this allows us to remove all the custom manifest modification from `assets:precompile`.
The key changes are:
- Introduce a shared `EmberCli.enabled?` helper
- When ember-cli is enabled, add ember-cli `/dist/assets` as the top-priority Rails asset directory
- Have ember-cli output a `chunks.json` manifest, and teach `preload_script` to read it and append the correct chunks to their associated `afterFile`
- Remove most custom ember-cli logic from the `assets:precompile` step. Instead, rely on Rails to take care of pulling the 'precompiled' assets into the `public/assets` directory. Move the 'renaming' logic to runtime, so it can be used in development mode as well.
- Remove fingerprinting from `ember-cli-build`, and allow Rails to take care of things
Long-term, we may want to replace Sprockets with the lighter-weight Propshaft. The changes made in this commit have been made with that long-term goal in mind.
tldr: when you visit the rails app directly, you'll now be served the current ember-cli assets. To keep these up-to-date make sure either `ember serve`, or `ember build --watch` is running. If you really want to load the old non-ember-cli assets, then you should start the server with `EMBER_CLI_PROD_ASSETS=0`. (the legacy asset pipeline will be removed very soon)
2022-04-21 11:26:34 -04:00
expect ( link ) . to eq ( preload_link ( " https://s3cdn.com/assets/ #{ EmberCli . transform_name ( " application " ) } .gz.js " ) )
2019-07-16 10:05:37 -04:00
end
2017-10-06 01:20:01 -04:00
it " gives s3 cdn even if asset host is set " do
set_cdn_url " https://awesome.com "
link = helper . preload_script ( 'application' )
DEV: Allow Ember CLI assets to be used by development Rails app (#16511)
Previously, accessing the Rails app directly in development mode would give you assets from our 'legacy' Ember asset pipeline. The only way to run with Ember CLI assets was to run ember-cli as a proxy. This was quite limiting when working on things which are bypassed when using the ember-cli proxy (e.g. changes to `application.html.erb`). Also, since `ember-auto-import` introduced chunking, visiting `/theme-qunit` under Ember CLI was failing to include all necessary chunks.
This commit teaches Sprockets about our Ember CLI assets so that they can be used in development mode, and are automatically collected up under `/public/assets` during `assets:precompile`. As a bonus, this allows us to remove all the custom manifest modification from `assets:precompile`.
The key changes are:
- Introduce a shared `EmberCli.enabled?` helper
- When ember-cli is enabled, add ember-cli `/dist/assets` as the top-priority Rails asset directory
- Have ember-cli output a `chunks.json` manifest, and teach `preload_script` to read it and append the correct chunks to their associated `afterFile`
- Remove most custom ember-cli logic from the `assets:precompile` step. Instead, rely on Rails to take care of pulling the 'precompiled' assets into the `public/assets` directory. Move the 'renaming' logic to runtime, so it can be used in development mode as well.
- Remove fingerprinting from `ember-cli-build`, and allow Rails to take care of things
Long-term, we may want to replace Sprockets with the lighter-weight Propshaft. The changes made in this commit have been made with that long-term goal in mind.
tldr: when you visit the rails app directly, you'll now be served the current ember-cli assets. To keep these up-to-date make sure either `ember serve`, or `ember build --watch` is running. If you really want to load the old non-ember-cli assets, then you should start the server with `EMBER_CLI_PROD_ASSETS=0`. (the legacy asset pipeline will be removed very soon)
2022-04-21 11:26:34 -04:00
expect ( link ) . to eq ( preload_link ( " https://s3cdn.com/assets/ #{ EmberCli . transform_name ( " application " ) } .js " ) )
2017-10-06 01:20:01 -04:00
end
2021-07-14 15:52:35 -04:00
it " gives s3 cdn but without brotli/gzip extensions for theme tests assets " do
helper . request . env [ " HTTP_ACCEPT_ENCODING " ] = 'gzip, br'
link = helper . preload_script ( 'discourse/tests/theme_qunit_ember_jquery' )
expect ( link ) . to eq ( preload_link ( " https://s3cdn.com/assets/discourse/tests/theme_qunit_ember_jquery.js " ) )
end
2017-10-06 01:20:01 -04:00
end
end
2013-11-04 21:40:39 -05:00
describe " escape_unicode " do
it " encodes tags " do
2014-12-31 09:55:03 -05:00
expect ( helper . escape_unicode ( " <tag> " ) ) . to eq ( " \ u003ctag> " )
2013-11-04 21:40:39 -05:00
end
it " survives junk text " do
2014-12-31 09:55:03 -05:00
expect ( helper . escape_unicode ( " hello \xc3 \x28 world " ) ) . to match ( / hello.*world / )
2013-11-04 21:40:39 -05:00
end
end
2020-11-12 13:50:55 -05:00
describe " application_logo_url " do
context " when a dark color scheme is active " do
before do
dark_theme = Theme . create (
name : " Dark " ,
user_id : - 1 ,
color_scheme_id : ColorScheme . find_by ( base_scheme_id : " Dark " ) . id
)
2021-06-15 02:57:17 -04:00
helper . request . env [ :resolved_theme_id ] = dark_theme . id
2020-11-12 13:50:55 -05:00
end
context " on desktop " do
before do
session [ :mobile_view ] = '0'
end
context " when logo_dark is not set " do
it " will return site_logo_url instead " do
expect ( helper . application_logo_url ) . to eq ( SiteSetting . site_logo_url )
end
end
context " when logo_dark is set " do
before do
SiteSetting . logo_dark = Fabricate ( :upload , url : '/images/logo-dark.png' )
end
it " will return site_logo_dark_url " do
expect ( helper . application_logo_url ) . to eq ( SiteSetting . site_logo_dark_url )
end
end
end
context " on mobile " do
before do
session [ :mobile_view ] = '1'
end
context " when mobile_logo_dark is not set " do
it " will return site_mobile_logo_url instead " do
expect ( helper . application_logo_url ) . to eq ( SiteSetting . site_mobile_logo_url )
end
end
context " when mobile_logo_dark is set " do
before do
SiteSetting . mobile_logo_dark = Fabricate ( :upload , url : '/images/mobile-logo-dark.png' )
end
it " will return site_mobile_logo_dark_url " do
expect ( helper . application_logo_url ) . to eq ( SiteSetting . site_mobile_logo_dark_url )
end
end
end
end
end
2021-09-16 17:47:51 -04:00
describe " application_logo_dark_url " do
context " when dark theme is not present " do
context " when dark logo is not present " do
it " should return nothing " do
expect ( helper . application_logo_dark_url . present? ) . to eq ( false )
end
end
end
context " when dark theme is present " do
before do
dark_theme = Theme . create (
name : " Dark " ,
user_id : - 1 ,
color_scheme_id : ColorScheme . find_by ( base_scheme_id : " Dark " ) . id
)
end
context " when dark logo is not present " do
it " should return nothing " do
expect ( helper . application_logo_dark_url . present? ) . to eq ( false )
end
end
context " when dark logo is present " do
before do
SiteSetting . logo_dark = Fabricate ( :upload , url : '/images/logo-dark.png' )
end
it " should return correct url " do
expect ( helper . application_logo_dark_url ) . to eq ( SiteSetting . site_logo_dark_url )
end
end
end
context " when dark theme is present and selected " do
before do
dark_theme = Theme . create (
name : " Dark " ,
user_id : - 1 ,
color_scheme_id : ColorScheme . find_by ( base_scheme_id : " Dark " ) . id
)
helper . request . env [ :resolved_theme_id ] = dark_theme . id
SiteSetting . logo_dark = Fabricate ( :upload , url : '/images/logo-dark.png' )
end
it " should return nothing " do
expect ( helper . application_logo_url ) . to eq ( SiteSetting . site_logo_dark_url )
expect ( helper . application_logo_dark_url . present? ) . to eq ( false )
end
end
end
2013-12-18 14:47:22 -05:00
describe " mobile_view? " do
context " enable_mobile_theme is true " do
before do
2017-07-07 02:09:14 -04:00
SiteSetting . enable_mobile_theme = true
2013-12-18 14:47:22 -05:00
end
it " is true if mobile_view is '1' in the session " do
session [ :mobile_view ] = '1'
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to eq ( true )
2013-12-18 14:47:22 -05:00
end
it " is false if mobile_view is '0' in the session " do
session [ :mobile_view ] = '0'
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to eq ( false )
2013-12-18 14:47:22 -05:00
end
2019-02-22 13:43:40 -05:00
context " mobile_view session is cleared " do
before do
params [ :mobile_view ] = 'auto'
end
it " is false if user agent is not mobile " do
session [ :mobile_view ] = '1'
controller . request . stubs ( :user_agent ) . returns ( 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36' )
expect ( helper . mobile_view? ) . to be_falsey
end
it " is true for iPhone " do
session [ :mobile_view ] = '0'
controller . request . stubs ( :user_agent ) . returns ( 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13D15 Safari/601.1' )
expect ( helper . mobile_view? ) . to eq ( true )
end
end
2013-12-18 14:47:22 -05:00
context " mobile_view is not set " do
it " is false if user agent is not mobile " do
2016-03-27 13:28:18 -04:00
controller . request . stubs ( :user_agent ) . returns ( 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36' )
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to be_falsey
2013-12-18 14:47:22 -05:00
end
it " is true for iPhone " do
2016-03-27 13:28:18 -04:00
controller . request . stubs ( :user_agent ) . returns ( 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13D15 Safari/601.1' )
expect ( helper . mobile_view? ) . to eq ( true )
end
it " is true for Android Samsung Galaxy " do
controller . request . stubs ( :user_agent ) . returns ( 'Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-G925F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36' )
expect ( helper . mobile_view? ) . to eq ( true )
end
it " is true for Android Google Nexus 5X " do
controller . request . stubs ( :user_agent ) . returns ( 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5X Build/MDB08I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.43 Mobile Safari/537.36' )
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to eq ( true )
2013-12-18 14:47:22 -05:00
end
it " is false for iPad " do
2016-03-27 13:28:18 -04:00
controller . request . stubs ( :user_agent ) . returns ( " Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B14 3 Safari/601.1 " )
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to eq ( false )
2013-12-18 14:47:22 -05:00
end
it " is false for Nexus 10 tablet " do
2016-03-27 13:28:18 -04:00
controller . request . stubs ( :user_agent ) . returns ( " Mozilla/5.0 (Linux; Android 5.1.1; Nexus 10 Build/LMY49G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.91 Safari/537.36 " )
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to be_falsey
2013-12-18 14:47:22 -05:00
end
2016-03-27 13:28:18 -04:00
it " is false for Nexus 7 tablet " do
controller . request . stubs ( :user_agent ) . returns ( " Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MMB29Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.91 Safari/537.36 " )
expect ( helper . mobile_view? ) . to be_falsey
2013-12-18 14:47:22 -05:00
end
end
end
context " enable_mobile_theme is false " do
before do
2017-07-07 02:09:14 -04:00
SiteSetting . enable_mobile_theme = false
2013-12-18 14:47:22 -05:00
end
it " is false if mobile_view is '1' in the session " do
session [ :mobile_view ] = '1'
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to eq ( false )
2013-12-18 14:47:22 -05:00
end
it " is false if mobile_view is '0' in the session " do
session [ :mobile_view ] = '0'
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to eq ( false )
2013-12-18 14:47:22 -05:00
end
context " mobile_view is not set " do
it " is false if user agent is not mobile " do
controller . request . stubs ( :user_agent ) . returns ( 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36' )
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to eq ( false )
2013-12-18 14:47:22 -05:00
end
it " is false for iPhone " do
controller . request . stubs ( :user_agent ) . returns ( 'Mozilla/5.0 (iPhone; U; ru; CPU iPhone OS 4_2_1 like Mac OS X; ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5' )
2014-12-31 09:55:03 -05:00
expect ( helper . mobile_view? ) . to eq ( false )
2013-12-18 14:47:22 -05:00
end
end
end
end
2019-01-14 08:21:46 -05:00
describe '#html_classes' do
2019-05-06 23:12:20 -04:00
fab! ( :user ) { Fabricate ( :user ) }
2019-01-22 23:43:36 -05:00
2019-01-14 08:21:46 -05:00
it " includes 'rtl' when the I18n.locale is rtl " do
2016-02-06 14:49:39 -05:00
I18n . stubs ( :locale ) . returns ( :he )
2019-01-14 08:21:46 -05:00
expect ( helper . html_classes . split ( " " ) ) . to include ( 'rtl' )
2016-02-06 14:49:39 -05:00
end
it 'returns an empty string when the I18n.locale is not rtl' do
I18n . stubs ( :locale ) . returns ( :zh_TW )
2019-01-14 08:21:46 -05:00
expect ( helper . html_classes . split ( " " ) ) . not_to include ( 'rtl' )
end
2019-01-25 10:06:06 -05:00
describe 'text size' do
context " with a user option " do
before do
user . user_option . text_size = " larger "
user . user_option . save!
helper . request . env [ Auth :: DefaultCurrentUserProvider :: CURRENT_USER_KEY ] = user
end
it 'ignores invalid text sizes' do
helper . request . cookies [ " text_size " ] = " invalid "
expect ( helper . html_classes . split ( " " ) ) . to include ( 'text-size-larger' )
end
it 'ignores missing text size' do
helper . request . cookies [ " text_size " ] = nil
expect ( helper . html_classes . split ( " " ) ) . to include ( 'text-size-larger' )
end
2019-01-14 08:21:46 -05:00
2019-01-28 06:19:50 -05:00
it 'ignores cookies with lower sequence' do
user . user_option . update! ( text_size_seq : 2 )
helper . request . cookies [ " text_size " ] = " normal|1 "
expect ( helper . html_classes . split ( " " ) ) . to include ( 'text-size-larger' )
end
2019-01-25 10:06:06 -05:00
it 'prioritises the cookie specified text size' do
2019-01-28 06:19:50 -05:00
user . user_option . update! ( text_size_seq : 2 )
helper . request . cookies [ " text_size " ] = " largest|4 "
expect ( helper . html_classes . split ( " " ) ) . to include ( 'text-size-largest' )
2019-01-25 10:06:06 -05:00
end
it 'includes the user specified text size' do
helper . request . env [ Auth :: DefaultCurrentUserProvider :: CURRENT_USER_KEY ] = user
expect ( helper . html_classes . split ( " " ) ) . to include ( 'text-size-larger' )
end
end
it 'falls back to the default text size for anon' do
expect ( helper . html_classes . split ( " " ) ) . to include ( 'text-size-normal' )
SiteSetting . default_text_size = " largest "
expect ( helper . html_classes . split ( " " ) ) . to include ( 'text-size-largest' )
end
2016-02-06 14:49:39 -05:00
end
2019-01-22 23:43:36 -05:00
it " includes 'anon' for anonymous users and excludes when logged in " do
expect ( helper . html_classes . split ( " " ) ) . to include ( 'anon' )
helper . request . env [ Auth :: DefaultCurrentUserProvider :: CURRENT_USER_KEY ] = user
expect ( helper . html_classes . split ( " " ) ) . not_to include ( 'anon' )
end
2016-02-06 14:49:39 -05:00
end
2013-12-18 14:47:22 -05:00
2017-02-22 16:24:05 -05:00
describe 'gsub_emoji_to_unicode' do
it " converts all emoji to unicode " do
expect ( helper . gsub_emoji_to_unicode ( 'Boat Talk: my :sailboat: boat: why is it so slow? :snail:' ) ) . to eq ( " Boat Talk: my ⛵ boat: why is it so slow? 🐌 " )
end
end
2018-09-17 04:31:46 -04:00
describe 'preloaded_json' do
it 'returns empty JSON if preloaded is empty' do
@preloaded = nil
expect ( helper . preloaded_json ) . to eq ( '{}' )
end
it 'escapes and strips invalid unicode and strips in json body' do
@preloaded = { test : %{ ["< \x80 "] } }
expect ( helper . preloaded_json ) . to eq ( %{ { "test":"[ \\ " \\ u003c \ uFFFD \\ "]" } } )
end
end
2019-01-30 23:49:26 -05:00
2020-02-05 22:14:33 -05:00
describe " client_side_setup_data " do
context " when Rails.env.development? is true " do
before do
Rails . env . stubs ( :development? ) . returns ( true )
end
it " returns the correct service worker url " do
expect ( helper . client_side_setup_data [ :service_worker_url ] ) . to eq ( " service-worker.js " )
end
it " returns the svg_icon_list in the setup data " do
expect ( helper . client_side_setup_data [ :svg_icon_list ] ) . not_to eq ( nil )
end
it " does not return debug_preloaded_app_data without the env var " do
expect ( helper . client_side_setup_data . key? ( :debug_preloaded_app_data ) ) . to eq ( false )
end
context " if the DEBUG_PRELOADED_APP_DATA env var is provided " do
before do
ENV [ 'DEBUG_PRELOADED_APP_DATA' ] = 'true'
end
it " returns that key as true " do
expect ( helper . client_side_setup_data [ :debug_preloaded_app_data ] ) . to eq ( true )
end
end
end
end
2019-01-30 23:49:26 -05:00
describe 'crawlable_meta_data' do
context " opengraph image " do
2019-01-31 14:44:20 -05:00
it 'returns the correct image' do
2019-01-31 23:30:48 -05:00
SiteSetting . opengraph_image = Fabricate ( :upload ,
url : '/images/og-image.png'
)
2019-01-31 14:44:20 -05:00
2019-01-31 23:30:48 -05:00
SiteSetting . twitter_summary_large_image = Fabricate ( :upload ,
url : '/images/twitter.png'
)
2019-01-30 23:49:26 -05:00
2019-01-31 23:30:48 -05:00
SiteSetting . large_icon = Fabricate ( :upload ,
url : '/images/large_icon.png'
)
2019-01-31 14:44:20 -05:00
2019-01-31 23:30:48 -05:00
SiteSetting . apple_touch_icon = Fabricate ( :upload ,
url : '/images/default-apple-touch-icon.png'
)
2019-01-31 14:44:20 -05:00
2019-01-31 23:30:48 -05:00
SiteSetting . logo = Fabricate ( :upload , url : '/images/d-logo-sketch.png' )
2019-01-30 23:49:26 -05:00
2019-01-31 23:30:48 -05:00
expect (
helper . crawlable_meta_data ( image : " some-image.png " )
) . to include ( " some-image.png " )
expect ( helper . crawlable_meta_data ) . to include (
2019-03-13 05:39:07 -04:00
SiteSetting . site_opengraph_image_url
2019-01-31 23:30:48 -05:00
)
SiteSetting . opengraph_image = nil
expect ( helper . crawlable_meta_data ) . to include (
SiteSetting . site_twitter_summary_large_image_url
)
SiteSetting . twitter_summary_large_image = nil
expect ( helper . crawlable_meta_data ) . to include (
SiteSetting . site_large_icon_url
)
SiteSetting . large_icon = nil
2019-05-01 09:44:45 -04:00
SiteSetting . logo_small = nil
2019-01-31 23:30:48 -05:00
expect ( helper . crawlable_meta_data ) . to include ( SiteSetting . site_logo_url )
SiteSetting . logo = nil
2019-01-31 14:44:20 -05:00
2019-05-01 09:44:45 -04:00
expect ( helper . crawlable_meta_data ) . to include ( Upload . find ( SiteIconManager :: SKETCH_LOGO_ID ) . url )
2019-01-30 23:49:26 -05:00
end
end
end
2020-08-03 22:57:10 -04:00
describe 'discourse_color_scheme_stylesheets' do
2020-08-06 09:45:37 -04:00
fab! ( :user ) { Fabricate ( :user ) }
2020-08-03 22:57:10 -04:00
it 'returns a stylesheet link tag by default' do
cs_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( cs_stylesheets ) . to include ( " stylesheets/color_definitions " )
end
it 'returns two color scheme link tags when dark mode is enabled' do
2021-07-01 22:03:54 -04:00
SiteSetting . default_dark_mode_color_scheme_id = ColorScheme . where ( name : " Dark " ) . pluck_first ( :id )
2020-08-03 22:57:10 -04:00
cs_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( cs_stylesheets ) . to include ( " (prefers-color-scheme: dark) " )
expect ( cs_stylesheets . scan ( " stylesheets/color_definitions " ) . size ) . to eq ( 2 )
end
2020-08-06 09:45:37 -04:00
2020-08-07 08:52:47 -04:00
it 'handles a missing dark color scheme gracefully' do
scheme = ColorScheme . create! ( name : " pyramid " )
SiteSetting . default_dark_mode_color_scheme_id = scheme . id
scheme . destroy!
2020-08-06 09:45:37 -04:00
cs_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( cs_stylesheets ) . to include ( " stylesheets/color_definitions " )
expect ( cs_stylesheets ) . not_to include ( " (prefers-color-scheme: dark) " )
end
2020-08-28 10:36:52 -04:00
context " custom light scheme " do
before do
@new_cs = Fabricate ( :color_scheme , name : 'Flamboyant' )
user . user_option . color_scheme_id = @new_cs . id
user . user_option . save!
helper . request . env [ Auth :: DefaultCurrentUserProvider :: CURRENT_USER_KEY ] = user
end
it " returns color scheme from user option value " do
color_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( color_stylesheets ) . to include ( " color_definitions_flamboyant " )
end
it " returns color scheme from cookie value " do
cs = ColorScheme . where ( name : " Dark " ) . first
helper . request . cookies [ " color_scheme_id " ] = cs . id
color_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( color_stylesheets ) . to include ( " color_definitions_dark " )
expect ( color_stylesheets ) . not_to include ( " color_definitions_flamboyant " )
end
it " falls back to base scheme with invalid cookie value " do
helper . request . cookies [ " color_scheme_id " ] = - 50
color_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( color_stylesheets ) . not_to include ( " color_definitions_flamboyant " )
expect ( color_stylesheets ) . to include ( " color_definitions_base " )
end
end
context " dark scheme with user option and/or cookies " do
2020-08-06 09:45:37 -04:00
before do
user . user_option . dark_scheme_id = - 1
user . user_option . save!
helper . request . env [ Auth :: DefaultCurrentUserProvider :: CURRENT_USER_KEY ] = user
2020-08-28 10:36:52 -04:00
@new_cs = Fabricate ( :color_scheme , name : 'Custom Color Scheme' )
2020-08-06 09:45:37 -04:00
2021-07-01 22:03:54 -04:00
SiteSetting . default_dark_mode_color_scheme_id = ColorScheme . where ( name : " Dark " ) . pluck_first ( :id )
2020-08-06 09:45:37 -04:00
end
it " returns no dark scheme stylesheet when user has disabled that option " do
color_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( color_stylesheets ) . to include ( " stylesheets/color_definitions " )
expect ( color_stylesheets ) . not_to include ( " (prefers-color-scheme: dark) " )
end
it " returns user-selected dark color scheme stylesheet " do
2020-08-28 10:36:52 -04:00
user . user_option . update! ( dark_scheme_id : @new_cs . id )
color_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( color_stylesheets ) . to include ( " (prefers-color-scheme: dark) " )
expect ( color_stylesheets ) . to include ( " custom-color-scheme " )
end
it " respects cookie value over user option for dark color scheme " do
helper . request . cookies [ " dark_scheme_id " ] = @new_cs . id
2020-08-06 09:45:37 -04:00
color_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( color_stylesheets ) . to include ( " (prefers-color-scheme: dark) " )
expect ( color_stylesheets ) . to include ( " custom-color-scheme " )
end
2020-08-28 10:36:52 -04:00
it " returns no dark scheme with invalid cookie value " do
helper . request . cookies [ " dark_scheme_id " ] = - 10
color_stylesheets = helper . discourse_color_scheme_stylesheets
expect ( color_stylesheets ) . not_to include ( " (prefers-color-scheme: dark) " )
end
2020-08-06 09:45:37 -04:00
end
2020-08-03 22:57:10 -04:00
end
2020-08-20 14:23:18 -04:00
describe " dark_color_scheme? " do
2020-10-14 10:18:02 -04:00
it 'returns false for the base color scheme' do
2020-09-09 03:43:38 -04:00
expect ( helper . dark_color_scheme? ) . to eq ( false )
2020-08-20 14:23:18 -04:00
end
it 'works correctly for a dark scheme' do
2020-10-14 10:18:02 -04:00
dark_theme = Theme . create (
name : " Dark " ,
user_id : - 1 ,
color_scheme_id : ColorScheme . find_by ( base_scheme_id : " Dark " ) . id
)
2021-06-15 02:57:17 -04:00
helper . request . env [ :resolved_theme_id ] = dark_theme . id
2020-08-20 14:23:18 -04:00
expect ( helper . dark_color_scheme? ) . to eq ( true )
end
end
2021-02-10 10:12:09 -05:00
describe 'html_lang' do
fab! ( :user ) { Fabricate ( :user ) }
before do
I18n . locale = :de
SiteSetting . default_locale = :fr
end
it 'returns default locale if no request' do
helper . request = nil
expect ( helper . html_lang ) . to eq ( SiteSetting . default_locale )
end
it 'returns current user locale if request' do
helper . request . env [ Auth :: DefaultCurrentUserProvider :: CURRENT_USER_KEY ] = user
expect ( helper . html_lang ) . to eq ( I18n . locale . to_s )
end
end
2013-08-27 14:57:42 -04:00
end