Enable "zero monkey patching" mode in RSpec (#31614)

This commit is contained in:
Matt Jankowski 2024-09-04 01:12:25 -04:00 committed by GitHub
parent c9ea91f868
commit f1003b2560
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
439 changed files with 441 additions and 439 deletions

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'The account show page' do
RSpec.describe 'The account show page' do
it 'has valid opengraph tags' do
alice = Fabricate(:account, username: 'alice', display_name: 'Alice')
_status = Fabricate(:status, account: alice, text: 'Hello World')

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Accounts show response' do
RSpec.describe 'Accounts show response' do
let(:account) { Fabricate(:account) }
context 'with an unapproved account' do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Anonymous visits' do
RSpec.describe 'Anonymous visits' do
around do |example|
old = ActionController::Base.allow_forgery_protection
ActionController::Base.allow_forgery_protection = true

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Accounts Familiar Followers API' do
RSpec.describe 'Accounts Familiar Followers API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:follows' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Accounts FollowerAccounts' do
RSpec.describe 'API V1 Accounts FollowerAccounts' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:accounts' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Accounts FollowingAccounts' do
RSpec.describe 'API V1 Accounts FollowingAccounts' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:accounts' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Accounts Identity Proofs API' do
RSpec.describe 'Accounts Identity Proofs API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:accounts' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Accounts Lists API' do
RSpec.describe 'Accounts Lists API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:lists' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Accounts Lookup API' do
RSpec.describe 'Accounts Lookup API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:accounts' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Accounts Notes API' do
RSpec.describe 'Accounts Notes API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'write:accounts' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Accounts Pins API' do
RSpec.describe 'Accounts Pins API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'write:accounts' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'GET /api/v1/accounts/relationships' do
RSpec.describe 'GET /api/v1/accounts/relationships' do
subject do
get '/api/v1/accounts/relationships', headers: headers, params: params
end

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Accounts Search API' do
RSpec.describe 'Accounts Search API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:accounts' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Accounts Statuses' do
RSpec.describe 'API V1 Accounts Statuses' do
let(:user) { Fabricate(:user) }
let(:scopes) { 'read:statuses' }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe '/api/v1/accounts' do
RSpec.describe '/api/v1/accounts' do
let(:user) { Fabricate(:user) }
let(:scopes) { '' }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Admin Dimensions' do
RSpec.describe 'Admin Dimensions' do
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Admin Measures' do
RSpec.describe 'Admin Measures' do
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Admin Retention' do
RSpec.describe 'Admin Retention' do
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Links' do
RSpec.describe 'Links' do
let(:role) { UserRole.find_by(name: 'Admin') }
let(:user) { Fabricate(:user, role: role) }
let(:scopes) { 'admin:read admin:write' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Admin Trends Links Preview Card Providers' do
RSpec.describe 'API V1 Admin Trends Links Preview Card Providers' do
let(:role) { UserRole.find_by(name: 'Admin') }
let(:user) { Fabricate(:user, role: role) }
let(:scopes) { 'admin:read admin:write' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Admin Trends Statuses' do
RSpec.describe 'API V1 Admin Trends Statuses' do
let(:role) { UserRole.find_by(name: 'Admin') }
let(:user) { Fabricate(:user, role: role) }
let(:scopes) { 'admin:read admin:write' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Admin Trends Tags' do
RSpec.describe 'API V1 Admin Trends Tags' do
let(:role) { UserRole.find_by(name: 'Admin') }
let(:user) { Fabricate(:user, role: role) }
let(:scopes) { 'admin:read admin:write' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Annual Reports' do
RSpec.describe 'API V1 Annual Reports' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Credentials' do
RSpec.describe 'Credentials' do
describe 'GET /api/v1/apps/verify_credentials' do
subject do
get '/api/v1/apps/verify_credentials', headers: headers

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API namespace minimal Content-Security-Policy' do
RSpec.describe 'API namespace minimal Content-Security-Policy' do
before { stub_tests_controller }
after { Rails.application.reload_routes! }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Custom Emojis' do
RSpec.describe 'Custom Emojis' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Directories API' do
RSpec.describe 'Directories API' do
let(:user) { Fabricate(:user, confirmed_at: nil) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:follows' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Endorsements' do
RSpec.describe 'Endorsements' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Featured Tags Suggestions API' do
RSpec.describe 'Featured Tags Suggestions API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:accounts' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Instances' do
RSpec.describe 'Instances' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Translation Languages' do
RSpec.describe 'Translation Languages' do
describe 'GET /api/v1/instances/translation_languages' do
context 'when no translation service is configured' do
it 'returns empty language matrix', :aggregate_failures do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API Peers Search' do
RSpec.describe 'API Peers Search' do
describe 'GET /api/v1/peers/search' do
context 'when peers api is disabled' do
before do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Preferences' do
RSpec.describe 'Preferences' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Push Subscriptions' do
RSpec.describe 'API V1 Push Subscriptions' do
let(:user) { Fabricate(:user) }
let(:endpoint) { 'https://fcm.googleapis.com/fcm/send/fiuH06a27qE:APA91bHnSiGcLwdaxdyqVXNDR9w1NlztsHb6lyt5WDKOC_Z_Q8BlFxQoR8tWFSXUIDdkyw0EdvxTu63iqamSaqVSevW5LfoFwojws8XYDXv_NRRLH6vo2CdgiN4jgHv5VLt2A8ah6lUX' }
let(:keys) do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Scheduled Statuses' do
RSpec.describe 'Scheduled Statuses' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Statuses Histories' do
RSpec.describe 'API V1 Statuses Histories' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:statuses' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Statuses Mutes' do
RSpec.describe 'API V1 Statuses Mutes' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'write:mutes' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Pins' do
RSpec.describe 'Pins' do
let(:user) { Fabricate(:user) }
let(:scopes) { 'write:accounts' }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Statuses Reblogs' do
RSpec.describe 'API V1 Statuses Reblogs' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'write:statuses' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Statuses Translations' do
RSpec.describe 'API V1 Statuses Translations' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read:statuses' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe '/api/v1/statuses' do
RSpec.describe '/api/v1/statuses' do
context 'with an oauth token' do
let(:user) { Fabricate(:user) }
let(:client_app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Streaming' do
RSpec.describe 'API V1 Streaming' do
around do |example|
before = Rails.configuration.x.streaming_api_base_url
Rails.configuration.x.streaming_api_base_url = "wss://#{Rails.configuration.x.web_domain}"

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Home', :inline_jobs do
RSpec.describe 'Home', :inline_jobs do
let(:user) { Fabricate(:user) }
let(:scopes) { 'read:statuses' }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Link' do
RSpec.describe 'Link' do
let(:user) { Fabricate(:user) }
let(:scopes) { 'read:statuses' }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'API V1 Timelines List' do
RSpec.describe 'API V1 Timelines List' do
let(:user) { Fabricate(:user) }
let(:scopes) { 'read:statuses' }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Public' do
RSpec.describe 'Public' do
let(:user) { Fabricate(:user) }
let(:scopes) { 'read:statuses' }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Instances' do
RSpec.describe 'Instances' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Search API' do
RSpec.describe 'Search API' do
context 'with token' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Suggestions API' do
RSpec.describe 'Suggestions API' do
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:scopes) { 'read' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Backups' do
RSpec.describe 'Backups' do
include RoutingHelper
describe 'GET backups#download' do

View file

@ -118,7 +118,7 @@ module TestEndpoints
end
end
describe 'Caching behavior' do
RSpec.describe 'Caching behavior' do
shared_examples 'cachable response' do |http_success: false|
it 'does not set cookies or set public cache control', :aggregate_failures do
expect(response.cookies).to be_empty

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'The catch all route' do
RSpec.describe 'The catch all route' do
describe 'with a simple value' do
it 'returns a 404 page as html' do
get '/test'

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Content-Security-Policy' do
RSpec.describe 'Content-Security-Policy' do
before { allow(SecureRandom).to receive(:base64).with(16).and_return('ZbA+JmE7+bK8F5qvADZHuQ==') }
it 'sets the expected CSP headers' do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Custom CSS' do
RSpec.describe 'Custom CSS' do
include RoutingHelper
describe 'GET /custom.css' do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Custom stylesheets' do
RSpec.describe 'Custom stylesheets' do
describe 'GET /custom.css' do
before { get '/custom.css' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Disabled OAuth routes' do
RSpec.describe 'Disabled OAuth routes' do
# These routes are disabled via the doorkeeper configuration for
# `admin_authenticator`, as these routes should only be accessible by server
# administrators. For now, these routes are not properly designed and

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Emojis' do
RSpec.describe 'Emojis' do
describe 'GET /emojis/:id' do
let(:emoji) { Fabricate(:custom_emoji, shortcode: 'coolcat') }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Health check endpoint' do
RSpec.describe 'Health check endpoint' do
describe 'GET /health' do
it 'returns http success when server is functioning' do
get '/health'

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'invites' do
RSpec.describe 'invites' do
let(:invite) { Fabricate(:invite) }
context 'when requesting a JSON document' do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Link headers' do
RSpec.describe 'Link headers' do
describe 'on the account show page' do
let(:account) { Fabricate(:account, username: 'test') }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Localization' do
RSpec.describe 'Localization' do
around do |example|
I18n.with_locale(I18n.locale) do
example.run

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Log Out' do
RSpec.describe 'Log Out' do
include RoutingHelper
describe 'DELETE /auth/sign_out' do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Manifest' do
RSpec.describe 'Manifest' do
describe 'GET /manifest' do
before { get '/manifest' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Media Proxy' do
RSpec.describe 'Media Proxy' do
describe 'GET /media_proxy/:id' do
before { stub_attachment_request }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'OmniAuth callbacks' do
RSpec.describe 'OmniAuth callbacks' do
shared_examples 'omniauth provider callbacks' do |provider|
subject { post send :"user_#{provider}_omniauth_callback_path" }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Remote Interaction Helper' do
RSpec.describe 'Remote Interaction Helper' do
describe 'GET /remote_interaction_helper' do
it 'returns http success' do
get remote_interaction_helper_path

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Self-destruct mode' do
RSpec.describe 'Self-destruct mode' do
before do
allow(SelfDestructHelper).to receive(:self_destruct?).and_return(true)
end

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Settings / Exports / Blocked Accounts' do
RSpec.describe 'Settings / Exports / Blocked Accounts' do
describe 'GET /settings/exports/blocks' do
context 'with a signed in user who has blocked accounts' do
let(:user) { Fabricate :user }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Settings / Exports / Blocked Domains' do
RSpec.describe 'Settings / Exports / Blocked Domains' do
describe 'GET /settings/exports/domain_blocks' do
context 'with a signed in user who has blocked domains' do
let(:account) { Fabricate :account, domain: 'example.com' }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Settings / Exports / Bookmarks' do
RSpec.describe 'Settings / Exports / Bookmarks' do
describe 'GET /settings/exports/bookmarks' do
context 'with a signed in user who has bookmarks' do
let(:account) { Fabricate(:account, domain: 'foo.bar') }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Settings / Exports / Following Accounts' do
RSpec.describe 'Settings / Exports / Following Accounts' do
describe 'GET /settings/exports/follows' do
context 'with a signed in user who is following accounts' do
let(:user) { Fabricate :user }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Settings / Exports / Lists' do
RSpec.describe 'Settings / Exports / Lists' do
describe 'GET /settings/exports/lists' do
context 'with a signed in user who has lists' do
let(:account) { Fabricate(:account, username: 'test', domain: 'example.com') }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'Settings / Exports / Muted Accounts' do
RSpec.describe 'Settings / Exports / Muted Accounts' do
describe 'GET /settings/exports/mutes' do
context 'with a signed in user who has muted accounts' do
let(:user) { Fabricate :user }

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'signature verification concern' do
RSpec.describe 'signature verification concern' do
before do
stub_tests_controller

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'The /.well-known/change-password request' do
RSpec.describe 'The /.well-known/change-password request' do
it 'redirects to the change password page' do
get '/.well-known/change-password'

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'The /.well-known/host-meta request' do
RSpec.describe 'The /.well-known/host-meta request' do
it 'returns http success with valid XML response' do
get '/.well-known/host-meta'

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'The well-known node-info endpoints' do
RSpec.describe 'The well-known node-info endpoints' do
describe 'The /.well-known/node-info endpoint' do
it 'returns JSON document pointing to node info' do
get '/.well-known/nodeinfo'

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'The /.well-known/oauth-authorization-server request' do
RSpec.describe 'The /.well-known/oauth-authorization-server request' do
let(:protocol) { ENV.fetch('LOCAL_HTTPS', true) ? :https : :http }
before do

View file

@ -2,7 +2,7 @@
require 'rails_helper'
describe 'The /.well-known/webfinger endpoint' do
RSpec.describe 'The /.well-known/webfinger endpoint' do
subject(:perform_request!) { get webfinger_url(resource: resource) }
let(:alternate_domains) { [] }