From 09017dd8f063926738b253fe964a6b12faaa744f Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 5 Sep 2024 15:51:17 -0400 Subject: [PATCH 01/17] Add worker spec for annual report worker (#31778) --- .../generate_annual_report_worker_spec.rb | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 spec/workers/generate_annual_report_worker_spec.rb diff --git a/spec/workers/generate_annual_report_worker_spec.rb b/spec/workers/generate_annual_report_worker_spec.rb new file mode 100644 index 0000000000..69b0d4424b --- /dev/null +++ b/spec/workers/generate_annual_report_worker_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe GenerateAnnualReportWorker do + let(:worker) { described_class.new } + let(:account) { Fabricate :account } + + describe '#perform' do + it 'generates new report for the account' do + expect { worker.perform(account.id, Date.current.year) } + .to change(account_reports, :count).by(1) + end + + it 'returns true for non-existent record' do + result = worker.perform(123_123_123, Date.current.year) + + expect(result).to be(true) + end + + def account_reports + GeneratedAnnualReport + .where(account: account) + .where(year: Date.current.year) + end + end +end From 7efe0bde9dc363de57fc350dbcdb0b099bd1329a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 5 Sep 2024 16:05:38 -0400 Subject: [PATCH 02/17] Add `have_http_link_header` matcher and set header values as strings (#31010) --- .../concerns/account_controller_concern.rb | 2 +- app/controllers/concerns/api/pagination.rb | 2 +- app/controllers/statuses_controller.rb | 4 ++- .../account_controller_concern_spec.rb | 13 +++----- spec/requests/accounts_spec.rb | 3 +- spec/requests/api/v1/timelines/home_spec.rb | 5 +-- spec/requests/api/v1/timelines/list_spec.rb | 5 +-- spec/requests/link_headers_spec.rb | 24 +++----------- spec/support/matchers/api_pagination.rb | 2 +- spec/support/matchers/http_link_header.rb | 33 +++++++++++++++++++ 10 files changed, 54 insertions(+), 39 deletions(-) create mode 100644 spec/support/matchers/http_link_header.rb diff --git a/app/controllers/concerns/account_controller_concern.rb b/app/controllers/concerns/account_controller_concern.rb index d63bcc85c9..b75f3e3581 100644 --- a/app/controllers/concerns/account_controller_concern.rb +++ b/app/controllers/concerns/account_controller_concern.rb @@ -20,7 +20,7 @@ module AccountControllerConcern webfinger_account_link, actor_url_link, ] - ) + ).to_s end def webfinger_account_link diff --git a/app/controllers/concerns/api/pagination.rb b/app/controllers/concerns/api/pagination.rb index 7f06dc0202..b0b4ae4603 100644 --- a/app/controllers/concerns/api/pagination.rb +++ b/app/controllers/concerns/api/pagination.rb @@ -19,7 +19,7 @@ module Api::Pagination links = [] links << [next_path, [%w(rel next)]] if next_path links << [prev_path, [%w(rel prev)]] if prev_path - response.headers['Link'] = LinkHeader.new(links) unless links.empty? + response.headers['Link'] = LinkHeader.new(links).to_s unless links.empty? end def require_valid_pagination_options! diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index db7eddd78b..a0885b469b 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -56,7 +56,9 @@ class StatusesController < ApplicationController end def set_link_headers - response.headers['Link'] = LinkHeader.new([[ActivityPub::TagManager.instance.uri_for(@status), [%w(rel alternate), %w(type application/activity+json)]]]) + response.headers['Link'] = LinkHeader.new( + [[ActivityPub::TagManager.instance.uri_for(@status), [%w(rel alternate), %w(type application/activity+json)]]] + ).to_s end def set_status diff --git a/spec/controllers/concerns/account_controller_concern_spec.rb b/spec/controllers/concerns/account_controller_concern_spec.rb index 3eee46d7b9..384406a0ea 100644 --- a/spec/controllers/concerns/account_controller_concern_spec.rb +++ b/spec/controllers/concerns/account_controller_concern_spec.rb @@ -54,17 +54,12 @@ RSpec.describe AccountControllerConcern do it 'Prepares the account, returns success, and sets link headers' do get 'success', params: { account_username: account.username } - expect(response).to have_http_status(200) - expect(response.headers['Link'].to_s).to eq(expected_link_headers) + expect(response) + .to have_http_status(200) + .and have_http_link_header('http://test.host/.well-known/webfinger?resource=acct%3Ausername%40cb6e6126.ngrok.io').for(rel: 'lrdd', type: 'application/jrd+json') + .and have_http_link_header('https://cb6e6126.ngrok.io/users/username').for(rel: 'alternate', type: 'application/activity+json') expect(response.body) .to include(account.username) end - - def expected_link_headers - [ - '; rel="lrdd"; type="application/jrd+json"', - '; rel="alternate"; type="application/activity+json"', - ].join(', ') - end end end diff --git a/spec/requests/accounts_spec.rb b/spec/requests/accounts_spec.rb index d53816eff0..3615868d74 100644 --- a/spec/requests/accounts_spec.rb +++ b/spec/requests/accounts_spec.rb @@ -69,8 +69,7 @@ RSpec.describe 'Accounts show response' do expect(response) .to have_http_status(200) .and render_template(:show) - - expect(response.headers['Link'].to_s).to include ActivityPub::TagManager.instance.uri_for(account) + .and have_http_link_header(ActivityPub::TagManager.instance.uri_for(account)).for(rel: 'alternate') end end diff --git a/spec/requests/api/v1/timelines/home_spec.rb b/spec/requests/api/v1/timelines/home_spec.rb index d158e0801c..9dd102fcb6 100644 --- a/spec/requests/api/v1/timelines/home_spec.rb +++ b/spec/requests/api/v1/timelines/home_spec.rb @@ -94,8 +94,9 @@ RSpec.describe 'Home', :inline_jobs do it 'returns http unprocessable entity', :aggregate_failures do subject - expect(response).to have_http_status(422) - expect(response.headers['Link']).to be_nil + expect(response) + .to have_http_status(422) + .and not_have_http_link_header end end end diff --git a/spec/requests/api/v1/timelines/list_spec.rb b/spec/requests/api/v1/timelines/list_spec.rb index 753c784866..eb4395d1f9 100644 --- a/spec/requests/api/v1/timelines/list_spec.rb +++ b/spec/requests/api/v1/timelines/list_spec.rb @@ -47,8 +47,9 @@ RSpec.describe 'API V1 Timelines List' do it 'returns http unprocessable entity' do get "/api/v1/timelines/list/#{list.id}", headers: headers - expect(response).to have_http_status(422) - expect(response.headers['Link']).to be_nil + expect(response) + .to have_http_status(422) + .and not_have_http_link_header end end end diff --git a/spec/requests/link_headers_spec.rb b/spec/requests/link_headers_spec.rb index 3116a54d6a..e20f5e79e5 100644 --- a/spec/requests/link_headers_spec.rb +++ b/spec/requests/link_headers_spec.rb @@ -6,28 +6,12 @@ RSpec.describe 'Link headers' do describe 'on the account show page' do let(:account) { Fabricate(:account, username: 'test') } - before do + it 'contains webfinger and activitypub urls in link header' do get short_account_path(username: account) - end - it 'contains webfinger url in link header' do - link_header = link_header_with_type('application/jrd+json') - - expect(link_header.href).to eq 'https://cb6e6126.ngrok.io/.well-known/webfinger?resource=acct%3Atest%40cb6e6126.ngrok.io' - expect(link_header.attr_pairs.first).to eq %w(rel lrdd) - end - - it 'contains activitypub url in link header' do - link_header = link_header_with_type('application/activity+json') - - expect(link_header.href).to eq 'https://cb6e6126.ngrok.io/users/test' - expect(link_header.attr_pairs.first).to eq %w(rel alternate) - end - - def link_header_with_type(type) - LinkHeader.parse(response.headers['Link'].to_s).links.find do |link| - link.attr_pairs.any?(['type', type]) - end + expect(response) + .to have_http_link_header('https://cb6e6126.ngrok.io/.well-known/webfinger?resource=acct%3Atest%40cb6e6126.ngrok.io').for(rel: 'lrdd', type: 'application/jrd+json') + .and have_http_link_header('https://cb6e6126.ngrok.io/users/test').for(rel: 'alternate', type: 'application/activity+json') end end end diff --git a/spec/support/matchers/api_pagination.rb b/spec/support/matchers/api_pagination.rb index f7d552b242..1a4f53a84a 100644 --- a/spec/support/matchers/api_pagination.rb +++ b/spec/support/matchers/api_pagination.rb @@ -3,7 +3,7 @@ RSpec::Matchers.define :include_pagination_headers do |links| match do |response| links.map do |key, value| - response.headers['Link'].find_link(['rel', key.to_s]).href == value + expect(response).to have_http_link_header(value).for(rel: key.to_s) end.all? end diff --git a/spec/support/matchers/http_link_header.rb b/spec/support/matchers/http_link_header.rb new file mode 100644 index 0000000000..3e658071c9 --- /dev/null +++ b/spec/support/matchers/http_link_header.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +RSpec::Matchers.define :have_http_link_header do |href| + match do |response| + @response = response + + header_link&.href == href + end + + match_when_negated do |response| + response.headers['Link'].blank? + end + + chain :for do |attributes| + @attributes = attributes + end + + failure_message do |response| + "Expected `#{response.headers['Link']}` to include `href` value of `#{href}` for `#{@attributes}` but it did not." + end + + failure_message_when_negated do + "Expected response not to have a `Link` header but `#{response.headers['Link']}` is present." + end + + def header_link + LinkHeader + .parse(@response.headers['Link']) + .find_link(*@attributes.stringify_keys) + end +end + +RSpec::Matchers.define_negated_matcher :not_have_http_link_header, :have_http_link_header # Allow chaining From 60182db0ca49f863d8f81f50f31b22386f734c90 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 09:30:53 +0200 Subject: [PATCH 03/17] Update dependency tzinfo-data to v1.2024.2 (#31780) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index c70823d051..8577a52691 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -857,7 +857,7 @@ GEM unf (~> 0.1.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2024.1) + tzinfo-data (1.2024.2) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext From cc4865193a4454c8650bd6877c30dfec68d69d55 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 07:38:08 +0000 Subject: [PATCH 04/17] New Crowdin Translations (automated) (#31781) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/fi.json | 6 +++--- app/javascript/mastodon/locales/ga.json | 4 ++++ app/javascript/mastodon/locales/ru.json | 2 +- config/locales/fi.yml | 14 +++++++------- config/locales/fr-CA.yml | 2 ++ config/locales/fr.yml | 2 ++ config/locales/fy.yml | 1 + config/locales/ga.yml | 1 + config/locales/gd.yml | 1 + config/locales/pt-BR.yml | 10 +++++++++- config/locales/simple_form.fr-CA.yml | 1 + config/locales/simple_form.fr.yml | 1 + config/locales/zh-CN.yml | 1 + 13 files changed, 34 insertions(+), 12 deletions(-) diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 39df3e010f..79ca95a58c 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,6 +1,6 @@ { "about.blocks": "Moderoidut palvelimet", - "about.contact": "Yhteydenotto:", + "about.contact": "Yhteystiedot:", "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", "about.domain_blocks.preamble": "Mastodonin avulla voi yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", @@ -304,7 +304,7 @@ "filter_modal.select_filter.title": "Suodata tämä julkaisu", "filter_modal.title.status": "Suodata julkaisu", "filter_warning.matches_filter": "Vastaa suodatinta ”{title}”", - "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Ei keneltäkään, jonka} one {1 käyttäjältä, jonka} other {# käyttäjältä, jotka}} saatat tuntea", + "filtered_notifications_banner.pending_requests": "{count, plural, =0 {Ei keneltäkään, jonka} one {Yhdeltä käyttäjältä, jonka} other {# käyttäjältä, jotka}} saatat tuntea", "filtered_notifications_banner.title": "Suodatetut ilmoitukset", "firehose.all": "Kaikki", "firehose.local": "Tämä palvelin", @@ -370,7 +370,7 @@ "home.show_announcements": "Näytä tiedotteet", "ignore_notifications_modal.disclaimer": "Mastodon ei voi ilmoittaa käyttäjille, että olet sivuuttanut heidän ilmoituksensa. Ilmoitusten sivuuttaminen ei lopeta itse viestien lähetystä.", "ignore_notifications_modal.filter_instead": "Suodata sen sijaan", - "ignore_notifications_modal.filter_to_act_users": "Voit silti hyväksyä, hylätä tai raportoida käyttäjiä", + "ignore_notifications_modal.filter_to_act_users": "Voit kuitenkin yhä hyväksyä, hylätä tai raportoida käyttäjiä", "ignore_notifications_modal.filter_to_avoid_confusion": "Suodatus auttaa välttämään mahdollisia sekaannuksia", "ignore_notifications_modal.filter_to_review_separately": "Voit käydä suodatettuja ilmoituksia läpi erikseen", "ignore_notifications_modal.ignore": "Sivuuta ilmoitukset", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 71577be955..b51d4adf68 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -97,6 +97,8 @@ "block_modal.title": "An bhfuil fonn ort an t-úsáideoir a bhlocáil?", "block_modal.you_wont_see_mentions": "Ní fheicfidh tú postálacha a luann iad.", "boost_modal.combo": "Is féidir leat {combo} a bhrú chun é seo a scipeáil an chéad uair eile", + "boost_modal.reblog": "An post a threisiú?", + "boost_modal.undo_reblog": "An deireadh a chur le postáil?", "bundle_column_error.copy_stacktrace": "Cóipeáil tuairisc earráide", "bundle_column_error.error.body": "Ní féidir an leathanach a iarradh a sholáthar. Seans gurb amhlaidh mar gheall ar fhabht sa chód, nó mar gheall ar mhíréireacht leis an mbrabhsálaí.", "bundle_column_error.error.title": "Ó, níl sé sin go maith!", @@ -467,6 +469,7 @@ "mute_modal.you_wont_see_mentions": "Ní fheicfidh tú postálacha a luann iad.", "mute_modal.you_wont_see_posts": "Is féidir leo do phoist a fheiceáil go fóill, ach ní fheicfidh tú a gcuid postanna.", "navigation_bar.about": "Maidir le", + "navigation_bar.administration": "Riarachán", "navigation_bar.advanced_interface": "Oscail i gcomhéadan gréasáin chun cinn", "navigation_bar.blocks": "Cuntais bhactha", "navigation_bar.bookmarks": "Leabharmharcanna", @@ -483,6 +486,7 @@ "navigation_bar.follows_and_followers": "Ag leanúint agus do do leanúint", "navigation_bar.lists": "Liostaí", "navigation_bar.logout": "Logáil Amach", + "navigation_bar.moderation": "Measarthacht", "navigation_bar.mutes": "Úsáideoirí balbhaithe", "navigation_bar.opened_in_classic_interface": "Osclaítear poist, cuntais agus leathanaigh shonracha eile de réir réamhshocraithe sa chomhéadan gréasáin clasaiceach.", "navigation_bar.personal": "Pearsanta", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index cd64e8b8e5..4439b8dc0a 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -48,7 +48,7 @@ "account.moved_to": "У {name} теперь новый аккаунт:", "account.mute": "Игнорировать @{name}", "account.mute_notifications_short": "Отключить уведомления", - "account.mute_short": "Немой", + "account.mute_short": "Глохни!", "account.muted": "Игнорируется", "account.mutual": "Взаимно", "account.no_bio": "Описание не предоставлено.", diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 42d1977662..8f0c80f1df 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -442,9 +442,9 @@ fi: create: Lisää verkkotunnus resolve: Selvitä verkkotunnus title: Estä uusi sähköpostiverkkotunnus - no_email_domain_block_selected: Sähköpostin verkkotunnuksia ei muutettu, koska yhtään ei ollut valittuna + no_email_domain_block_selected: Sähköpostiverkkotunnusten estoja ei muutettu; yhtäkään ei ollut valittu not_permitted: Ei sallittu - resolved_dns_records_hint_html: Verkkotunnuksen nimi määräytyy seuraaviin MX-verkkotunnuksiin, jotka ovat viime kädessä vastuussa sähköpostin vastaanottamisesta. MX-verkkotunnuksen estäminen estää rekisteröitymisen mistä tahansa sähköpostiosoitteesta, joka käyttää samaa MX-verkkotunnusta, vaikka näkyvä verkkotunnuksen nimi olisikin erilainen. Varo estämästä suuria sähköpostin palveluntarjoajia. + resolved_dns_records_hint_html: Verkkotunnusnimi kytkeytyy seuraaviin MX-verkkotunnuksiin, jotka ovat viime kädessä vastuussa sähköpostin vastaanottamisesta. MX-verkkotunnuksen estäminen estää rekisteröitymisen mistä tahansa sähköpostiosoitteesta, joka käyttää samaa MX-verkkotunnusta, vaikka näkyvä verkkotunnuksen nimi olisikin erilainen. Varo estämästä suuria sähköpostipalvelujen tarjoajia. resolved_through_html: Ratkaistu verkkotunnuksen %{domain} kautta title: Estetyt sähköpostiverkkotunnukset export_domain_allows: @@ -600,7 +600,7 @@ fi: resolve_description_html: Ilmoitettua tiliä kohtaan ei ryhdytä toimiin, varoitusta ei kirjata ja raportti suljetaan. silence_description_html: Tili näkyy vain niille, jotka jo seuraavat sitä tai etsivät sen manuaalisesti, mikä rajoittaa merkittävästi sen tavoitettavuutta. Voidaan perua milloin vain. Sulkee kaikki tiliin kohdistuvat raportit. suspend_description_html: Tili ja mikään sen sisältö eivät ole käytettävissä, ja lopulta ne poistetaan ja vuorovaikutus tilin kanssa on mahdotonta. Peruttavissa 30 päivän ajan. Sulkee kaikki tiliin kohdistuvat raportit. - actions_description_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Jos ryhdyt rangaistustoimeen ilmoitettua tiliä kohtaan, hänelle lähetetään sähköposti-ilmoitus, paitsi jos Roskaposti-luokka on valittuna. + actions_description_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Jos ryhdyt rangaistustoimeen ilmoitettua tiliä kohtaan, hänelle lähetetään sähköpostitse ilmoitus asiasta, paitsi jos valittuna on Roskaposti-luokka. actions_description_remote_html: Päätä, mihin toimiin ryhdyt tämän raportin ratkaisemiseksi. Tämä vaikuttaa vain siihen, miten sinun palvelimesi viestii tämän etätilin kanssa ja käsittelee sen sisältöä. add_to_report: Lisää raporttiin already_suspended_badges: @@ -977,7 +977,7 @@ fi: used_by_over_week: one: Käyttänyt yksi käyttäjä viimeisen viikon aikana other: Käyttänyt %{count} käyttäjää viimeisen viikon aikana - title: Suositukset ja trendit + title: Suositukset ja suuntaukset trending: Trendaus warning_presets: add_new: Lisää uusi @@ -1135,7 +1135,7 @@ fi: security: Turvallisuus set_new_password: Aseta uusi salasana setup: - email_below_hint_html: Tarkista roskapostikansiosi tai pyydä uusi viesti. Voit korjata sähköpostiosoitteesi, jos se oli väärin. + email_below_hint_html: Tarkista roskapostikansiosi tai pyydä uusi viesti. Voit myös korjata sähköpostiosoitteesi tarvittaessa. email_settings_hint_html: Napsauta lähettämäämme linkkiä vahvistaaksesi osoitteen %{email}. Odotamme täällä. link_not_received: Etkö saanut linkkiä? new_confirmation_instructions_sent: Saat pian uuden vahvistuslinkin sisältävän sähköpostiviestin! @@ -1195,8 +1195,8 @@ fi: caches: Muiden palvelinten välimuistiinsa tallentamaa sisältöä voi säilyä data_removal: Julkaisusi ja muut tietosi poistetaan pysyvästi email_change_html: Voit muuttaa sähköpostiosoitettasi poistamatta tiliäsi - email_contact_html: Jos ei saavu perille, voit pyytää apua sähköpostilla %{email} - email_reconfirmation_html: Jos et saa vahvistuksen sähköpostia, niin voit pyytää sitä uudelleen + email_contact_html: Mikäli viesti ei vieläkään saavu perille, voit pyytää apua sähköpostitse osoitteella %{email} + email_reconfirmation_html: Jos et saa vahvistussähköpostiviestiä, voit pyytää sitä uudelleen irreversible: Et voi palauttaa tiliäsi etkä aktivoida sitä uudelleen more_details_html: Tarkempia tietoja saat tietosuojakäytännöstämme. username_available: Käyttäjänimesi tulee saataville uudelleen diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 45c6baece9..140bc94344 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -132,6 +132,7 @@ fr-CA: resubscribe: Se réabonner role: Rôle search: Rechercher + search_same_email_domain: Autres utilisateurs avec le même domaine de courriel search_same_ip: Autres utilisateur·rice·s avec la même IP security: Sécurité security_measures: @@ -1428,6 +1429,7 @@ fr-CA: media_attachments: validations: images_and_video: Impossible de joindre une vidéo à un message contenant déjà des images + not_found: Média %{ids} introuvable ou déjà attaché à un autre message not_ready: Impossible de joindre les fichiers en cours de traitement. Réessayez dans un instant ! too_many: Impossible de joindre plus de 4 fichiers migrations: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 4434a16531..5646877d23 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -132,6 +132,7 @@ fr: resubscribe: Se réabonner role: Rôle search: Rechercher + search_same_email_domain: Autres utilisateurs avec le même domaine de courriel search_same_ip: Autres utilisateur·rice·s avec la même IP security: Sécurité security_measures: @@ -1428,6 +1429,7 @@ fr: media_attachments: validations: images_and_video: Impossible de joindre une vidéo à un message contenant déjà des images + not_found: Média %{ids} introuvable ou déjà attaché à un autre message not_ready: Impossible de joindre les fichiers en cours de traitement. Réessayez dans un instant ! too_many: Impossible de joindre plus de 4 fichiers migrations: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index d0127f77b1..de7495dd55 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1454,6 +1454,7 @@ fy: media_attachments: validations: images_and_video: In fideo kin net oan in berjocht mei ôfbyldingen keppele wurde + not_found: Media %{ids} net fûn of al tafoege oan in oar berjocht not_ready: Kin gjin bestannen tafoegje dy’t noch net ferwurke binne. Probearje it letter opnij! too_many: Der kinne net mear as 4 ôfbyldingen tafoege wurde migrations: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 27237bf3a4..ad9ee21d3e 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1532,6 +1532,7 @@ ga: media_attachments: validations: images_and_video: Ní féidir físeán a cheangal le postáil a bhfuil íomhánna ann cheana féin + not_found: Meán %{ids} gan aimsiú nó ceangailte le postáil eile cheana not_ready: Ní féidir comhaid nach bhfuil próiseáil críochnaithe acu a cheangal. Bain triail eile as i gceann nóiméad! too_many: Ní féidir níos mó ná 4 chomhad a cheangal migrations: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index ef4add838e..2af647ab9c 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1506,6 +1506,7 @@ gd: media_attachments: validations: images_and_video: Chan urrainn dhut video a cheangal ri post sa bheil dealbh mu thràth + not_found: Cha deach na meadhanan %{ids} a lorg no chaidh an ceangal ri post eile mu thràth not_ready: Chan urrainn dhuinn faidhlichean a cheangal ris nach eil air am pròiseasadh fhathast. Feuch ris a-rithist an ceann greis! too_many: Chan urrainn dhut barrachd air 4 faidhlichean a ceangal ris migrations: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 579dbd967f..18496b9e1d 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -203,7 +203,7 @@ pt-BR: disable_sign_in_token_auth_user: Desativar autenticação via Token de Email para Usuário disable_user: Desativar usuário enable_custom_emoji: Ativar emoji personalizado - enable_sign_in_token_auth_user: Desativar autenticação via token por e-mail para o usuário + enable_sign_in_token_auth_user: Ativar autenticação via Token de Email para Usuário enable_user: Ativar usuário memorialize_account: Converter conta em memorial promote_user: Promover usuário @@ -442,6 +442,7 @@ pt-BR: create: Adicionar domínio resolve: Resolver domínio title: Bloquear novo domínio de e-mail + no_email_domain_block_selected: Nenhum bloco de domínio de email foi alterado, pois, nenhum foi selecionado not_permitted: Não permitido resolved_dns_records_hint_html: O nome de domínio é associado aos seguintes domínios MX, que são responsáveis por aceitar e-mails. Ao bloquear um domínio MX, você bloqueará as inscrições de qualquer endereço de e-mail que use o mesmo domínio MX, mesmo que o nome de domínio visível seja diferente. Tenha cuidado para não bloquear os principais provedores de e-mail. resolved_through_html: Resolvido através de %{domain} @@ -1440,6 +1441,13 @@ pt-BR: action: Sim, cancelar subscrição complete: Desinscrito confirmation_html: Tem certeza que deseja cancelar a assinatura de %{type} para Mastodon no %{domain} para o seu endereço de e-mail %{email}? Você sempre pode se inscrever novamente nas configurações de notificação de email. + emails: + notification_emails: + favourite: emails de notificação favoritos + follow: seguir emails de notificação + follow_request: emails de seguidores pendentes + mention: emails de notificação de menções + reblog: emails de notificação de boosts resubscribe_html: Se você cancelou sua inscrição por engano, você pode se inscrever novamente em suas configurações de notificações por e-mail. success_html: Você não mais receberá %{type} no Mastodon em %{domain} ao seu endereço de e-mail %{email}. title: Cancelar inscrição diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index e8aafa4b1c..640d7e344a 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -81,6 +81,7 @@ fr-CA: bootstrap_timeline_accounts: Ces comptes seront épinglés en tête de liste des recommandations pour les nouveaux utilisateurs. closed_registrations_message: Affiché lorsque les inscriptions sont fermées custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. + favicon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. mascot: Remplace l'illustration dans l'interface Web avancée. media_cache_retention_period: Les fichiers médias des messages publiés par des utilisateurs distants sont mis en cache sur votre serveur. Lorsque cette valeur est positive, les médias sont supprimés au terme du nombre de jours spécifié. Si les données des médias sont demandées après leur suppression, elles seront téléchargées à nouveau, dans la mesure où le contenu source est toujours disponible. En raison des restrictions concernant la fréquence à laquelle les cartes de prévisualisation des liens interrogent des sites tiers, il est recommandé de fixer cette valeur à au moins 14 jours, faute de quoi les cartes de prévisualisation des liens ne seront pas mises à jour à la demande avant cette échéance. peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général. diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 315e22c5fb..04d48573a3 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -81,6 +81,7 @@ fr: bootstrap_timeline_accounts: Ces comptes seront épinglés en tête de liste des recommandations pour les nouveaux utilisateurs. closed_registrations_message: Affiché lorsque les inscriptions sont fermées custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. + favicon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. mascot: Remplace l'illustration dans l'interface Web avancée. media_cache_retention_period: Les fichiers médias des messages publiés par des utilisateurs distants sont mis en cache sur votre serveur. Lorsque cette valeur est positive, les médias sont supprimés au terme du nombre de jours spécifié. Si les données des médias sont demandées après leur suppression, elles seront téléchargées à nouveau, dans la mesure où le contenu source est toujours disponible. En raison des restrictions concernant la fréquence à laquelle les cartes de prévisualisation des liens interrogent des sites tiers, il est recommandé de fixer cette valeur à au moins 14 jours, faute de quoi les cartes de prévisualisation des liens ne seront pas mises à jour à la demande avant cette échéance. peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général. diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index c31a68926e..a8d401c7bb 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1428,6 +1428,7 @@ zh-CN: media_attachments: validations: images_and_video: 无法在嘟文中同时插入视频和图片 + not_found: 未发现媒体%{ids} 或已附在另一条嘟文中 not_ready: 不能附加还在处理中的文件。请稍后再试! too_many: 最多只能添加 4 张图片 migrations: From be77a1098bef771dffe85d94e8ed4ddeb53cc768 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 6 Sep 2024 03:49:38 -0400 Subject: [PATCH 05/17] Extract `Account::AUTOMATED_ACTOR_TYPES` for "bot" actor_type values (#31772) --- app/models/account.rb | 7 +++++-- lib/mastodon/cli/accounts.rb | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index c20b72658b..d773d33441 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -75,6 +75,8 @@ class Account < ApplicationRecord DISPLAY_NAME_LENGTH_LIMIT = 30 NOTE_LENGTH_LIMIT = 500 + AUTOMATED_ACTOR_TYPES = %w(Application Service).freeze + include Attachmentable # Load prior to Avatar & Header concerns include Account::Associations @@ -127,7 +129,8 @@ class Account < ApplicationRecord scope :without_silenced, -> { where(silenced_at: nil) } scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) } scope :recent, -> { reorder(id: :desc) } - scope :bots, -> { where(actor_type: %w(Application Service)) } + scope :bots, -> { where(actor_type: AUTOMATED_ACTOR_TYPES) } + scope :non_automated, -> { where.not(actor_type: AUTOMATED_ACTOR_TYPES) } scope :groups, -> { where(actor_type: 'Group') } scope :alphabetic, -> { order(domain: :asc, username: :asc) } scope :matches_uri_prefix, ->(value) { where(arel_table[:uri].matches("#{sanitize_sql_like(value)}/%", false, true)).or(where(uri: value)) } @@ -183,7 +186,7 @@ class Account < ApplicationRecord end def bot? - %w(Application Service).include? actor_type + AUTOMATED_ACTOR_TYPES.include?(actor_type) end def instance_actor? diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb index 0cdf68158f..8a138323d4 100644 --- a/lib/mastodon/cli/accounts.rb +++ b/lib/mastodon/cli/accounts.rb @@ -502,7 +502,7 @@ module Mastodon::CLI - not muted/blocked by us LONG_DESC def prune - query = Account.remote.where.not(actor_type: %i(Application Service)) + query = Account.remote.non_automated query = query.where('NOT EXISTS (SELECT 1 FROM mentions WHERE account_id = accounts.id)') query = query.where('NOT EXISTS (SELECT 1 FROM favourites WHERE account_id = accounts.id)') query = query.where('NOT EXISTS (SELECT 1 FROM statuses WHERE account_id = accounts.id)') From 6b6a80b407e03c31326deb9838bc9c199bab39ea Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 6 Sep 2024 05:58:46 -0400 Subject: [PATCH 06/17] Remove `body_as_json` in favor of built-in `response.parsed_body` for JSON response specs (#31749) --- .../collections_controller_spec.rb | 8 ++-- ...lowers_synchronizations_controller_spec.rb | 3 +- .../activitypub/outboxes_controller_spec.rb | 41 +++++++++++-------- .../activitypub/replies_controller_spec.rb | 2 +- .../auth/sessions_controller_spec.rb | 2 +- .../follower_accounts_controller_spec.rb | 37 +++++++++-------- .../following_accounts_controller_spec.rb | 37 +++++++++-------- spec/controllers/statuses_controller_spec.rb | 14 +++---- spec/requests/accounts_spec.rb | 8 ++-- .../api/v1/accounts/credentials_spec.rb | 6 +-- .../v1/accounts/familiar_followers_spec.rb | 2 +- .../api/v1/accounts/featured_tags_spec.rb | 4 +- .../api/v1/accounts/follower_accounts_spec.rb | 14 +++---- .../v1/accounts/following_accounts_spec.rb | 14 +++---- .../api/v1/accounts/relationships_spec.rb | 14 +++---- .../requests/api/v1/accounts/statuses_spec.rb | 6 +-- spec/requests/api/v1/accounts_spec.rb | 20 ++++----- spec/requests/api/v1/admin/accounts_spec.rb | 6 +-- .../v1/admin/canonical_email_blocks_spec.rb | 22 +++++----- spec/requests/api/v1/admin/dimensions_spec.rb | 2 +- .../api/v1/admin/domain_allows_spec.rb | 12 +++--- .../api/v1/admin/domain_blocks_spec.rb | 40 +++++++++--------- .../api/v1/admin/email_domain_blocks_spec.rb | 16 ++++---- spec/requests/api/v1/admin/ip_blocks_spec.rb | 14 +++---- spec/requests/api/v1/admin/measures_spec.rb | 2 +- spec/requests/api/v1/admin/reports_spec.rb | 16 ++++---- spec/requests/api/v1/admin/retention_spec.rb | 2 +- spec/requests/api/v1/admin/tags_spec.rb | 14 +++---- .../api/v1/admin/trends/links/links_spec.rb | 4 +- spec/requests/api/v1/annual_reports_spec.rb | 2 +- spec/requests/api/v1/apps/credentials_spec.rb | 12 +++--- spec/requests/api/v1/apps_spec.rb | 10 ++--- spec/requests/api/v1/blocks_spec.rb | 8 ++-- spec/requests/api/v1/bookmarks_spec.rb | 4 +- spec/requests/api/v1/conversations_spec.rb | 8 ++-- spec/requests/api/v1/custom_emojis_spec.rb | 4 +- spec/requests/api/v1/directories_spec.rb | 20 ++++----- spec/requests/api/v1/domain_blocks_spec.rb | 4 +- .../api/v1/emails/confirmations_spec.rb | 8 ++-- spec/requests/api/v1/endorsements_spec.rb | 4 +- spec/requests/api/v1/favourites_spec.rb | 4 +- .../api/v1/featured_tags/suggestions_spec.rb | 2 +- spec/requests/api/v1/featured_tags_spec.rb | 8 ++-- spec/requests/api/v1/filters_spec.rb | 2 +- spec/requests/api/v1/follow_requests_spec.rb | 8 ++-- spec/requests/api/v1/followed_tags_spec.rb | 4 +- spec/requests/api/v1/instance_spec.rb | 4 +- .../api/v1/instances/activity_spec.rb | 2 +- .../api/v1/instances/domain_blocks_spec.rb | 2 +- .../instances/extended_descriptions_spec.rb | 2 +- .../api/v1/instances/languages_spec.rb | 2 +- spec/requests/api/v1/instances/peers_spec.rb | 2 +- .../api/v1/instances/privacy_policies_spec.rb | 2 +- spec/requests/api/v1/instances/rules_spec.rb | 2 +- .../instances/translation_languages_spec.rb | 4 +- spec/requests/api/v1/lists/accounts_spec.rb | 4 +- spec/requests/api/v1/lists_spec.rb | 8 ++-- spec/requests/api/v1/markers_spec.rb | 4 +- spec/requests/api/v1/media_spec.rb | 4 +- spec/requests/api/v1/mutes_spec.rb | 8 ++-- .../api/v1/notifications/policies_spec.rb | 4 +- .../api/v1/notifications/requests_spec.rb | 4 +- spec/requests/api/v1/notifications_spec.rb | 28 ++++++------- spec/requests/api/v1/peers/search_spec.rb | 8 ++-- spec/requests/api/v1/polls_spec.rb | 2 +- spec/requests/api/v1/preferences_spec.rb | 2 +- .../api/v1/push/subscriptions_spec.rb | 4 +- spec/requests/api/v1/reports_spec.rb | 2 +- spec/requests/api/v1/scheduled_status_spec.rb | 4 +- .../api/v1/statuses/bookmarks_spec.rb | 6 +-- .../statuses/favourited_by_accounts_spec.rb | 8 ++-- .../api/v1/statuses/favourites_spec.rb | 6 +-- .../api/v1/statuses/histories_spec.rb | 2 +- spec/requests/api/v1/statuses/pins_spec.rb | 4 +- .../v1/statuses/reblogged_by_accounts_spec.rb | 8 ++-- spec/requests/api/v1/statuses/reblogs_spec.rb | 6 +-- spec/requests/api/v1/statuses/sources_spec.rb | 4 +- spec/requests/api/v1/statuses_spec.rb | 10 ++--- spec/requests/api/v1/suggestions_spec.rb | 4 +- spec/requests/api/v1/tags_spec.rb | 2 +- spec/requests/api/v1/timelines/home_spec.rb | 4 +- spec/requests/api/v1/timelines/link_spec.rb | 4 +- spec/requests/api/v1/timelines/public_spec.rb | 4 +- spec/requests/api/v1/timelines/tag_spec.rb | 4 +- spec/requests/api/v2/admin/accounts_spec.rb | 2 +- spec/requests/api/v2/filters/keywords_spec.rb | 6 +-- spec/requests/api/v2/filters/statuses_spec.rb | 6 +-- spec/requests/api/v2/filters_spec.rb | 9 ++-- spec/requests/api/v2/instance_spec.rb | 4 +- spec/requests/api/v2/media_spec.rb | 8 ++-- .../api/v2/notifications/policies_spec.rb | 4 +- spec/requests/api/v2/search_spec.rb | 4 +- spec/requests/api/v2/suggestions_spec.rb | 2 +- .../v2_alpha/notifications/accounts_spec.rb | 4 +- .../api/v2_alpha/notifications_spec.rb | 34 +++++++-------- spec/requests/api/web/embeds_spec.rb | 6 +-- spec/requests/emojis_spec.rb | 2 +- spec/requests/instance_actor_spec.rb | 2 +- spec/requests/invite_spec.rb | 2 +- spec/requests/log_out_spec.rb | 2 +- spec/requests/manifest_spec.rb | 2 +- spec/requests/oauth/token_spec.rb | 6 +-- spec/requests/signature_verification_spec.rb | 30 +++++++------- spec/requests/well_known/node_info_spec.rb | 4 +- .../well_known/oauth_metadata_spec.rb | 2 +- spec/requests/well_known/webfinger_spec.rb | 12 +++--- spec/spec_helper.rb | 4 -- 107 files changed, 422 insertions(+), 413 deletions(-) diff --git a/spec/controllers/activitypub/collections_controller_spec.rb b/spec/controllers/activitypub/collections_controller_spec.rb index 0880273853..408e0dd2f6 100644 --- a/spec/controllers/activitypub/collections_controller_spec.rb +++ b/spec/controllers/activitypub/collections_controller_spec.rb @@ -31,7 +31,7 @@ RSpec.describe ActivityPub::CollectionsController do .and have_cacheable_headers expect(response.media_type).to eq 'application/activity+json' - expect(body_as_json[:orderedItems]) + expect(response.parsed_body[:orderedItems]) .to be_an(Array) .and have_attributes(size: 3) .and include(ActivityPub::TagManager.instance.uri_for(private_pinned)) @@ -71,7 +71,7 @@ RSpec.describe ActivityPub::CollectionsController do expect(response.media_type).to eq 'application/activity+json' - expect(body_as_json[:orderedItems]) + expect(response.parsed_body[:orderedItems]) .to be_an(Array) .and have_attributes(size: 3) .and include(ActivityPub::TagManager.instance.uri_for(private_pinned)) @@ -94,7 +94,7 @@ RSpec.describe ActivityPub::CollectionsController do expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Cache-Control']).to include 'private' - expect(body_as_json[:orderedItems]) + expect(response.parsed_body[:orderedItems]) .to be_an(Array) .and be_empty end @@ -110,7 +110,7 @@ RSpec.describe ActivityPub::CollectionsController do expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Cache-Control']).to include 'private' - expect(body_as_json[:orderedItems]) + expect(response.parsed_body[:orderedItems]) .to be_an(Array) .and be_empty end diff --git a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb index c030078d43..cbd982f18f 100644 --- a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb +++ b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb @@ -34,7 +34,6 @@ RSpec.describe ActivityPub::FollowersSynchronizationsController do context 'with signature from example.com' do subject(:response) { get :show, params: { account_username: account.username } } - let(:body) { body_as_json } let(:remote_account) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/instance') } it 'returns http success and cache control and activity json types and correct items' do @@ -42,7 +41,7 @@ RSpec.describe ActivityPub::FollowersSynchronizationsController do expect(response.headers['Cache-Control']).to eq 'max-age=0, private' expect(response.media_type).to eq 'application/activity+json' - expect(body[:orderedItems]) + expect(response.parsed_body[:orderedItems]) .to be_an(Array) .and contain_exactly( follower_example_com_instance_actor.uri, diff --git a/spec/controllers/activitypub/outboxes_controller_spec.rb b/spec/controllers/activitypub/outboxes_controller_spec.rb index 26a52bad93..7ae28e8e09 100644 --- a/spec/controllers/activitypub/outboxes_controller_spec.rb +++ b/spec/controllers/activitypub/outboxes_controller_spec.rb @@ -19,7 +19,6 @@ RSpec.describe ActivityPub::OutboxesController do context 'without signature' do subject(:response) { get :show, params: { account_username: account.username, page: page } } - let(:body) { body_as_json } let(:remote_account) { nil } context 'with page not requested' do @@ -32,7 +31,7 @@ RSpec.describe ActivityPub::OutboxesController do expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Vary']).to be_nil - expect(body[:totalItems]).to eq 4 + expect(response.parsed_body[:totalItems]).to eq 4 end context 'when account is permanently suspended' do @@ -68,9 +67,11 @@ RSpec.describe ActivityPub::OutboxesController do expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Vary']).to include 'Signature' - expect(body[:orderedItems]).to be_an Array - expect(body[:orderedItems].size).to eq 2 - expect(body[:orderedItems].all? { |item| targets_public_collection?(item) }).to be true + expect(response.parsed_body) + .to include( + orderedItems: be_an(Array).and(have_attributes(size: 2)) + ) + expect(response.parsed_body[:orderedItems].all? { |item| targets_public_collection?(item) }).to be true end context 'when account is permanently suspended' do @@ -110,9 +111,11 @@ RSpec.describe ActivityPub::OutboxesController do expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Cache-Control']).to eq 'max-age=60, private' - expect(body_as_json[:orderedItems]).to be_an Array - expect(body_as_json[:orderedItems].size).to eq 2 - expect(body_as_json[:orderedItems].all? { |item| targets_public_collection?(item) }).to be true + expect(response.parsed_body) + .to include( + orderedItems: be_an(Array).and(have_attributes(size: 2)) + ) + expect(response.parsed_body[:orderedItems].all? { |item| targets_public_collection?(item) }).to be true end end @@ -127,9 +130,11 @@ RSpec.describe ActivityPub::OutboxesController do expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Cache-Control']).to eq 'max-age=60, private' - expect(body_as_json[:orderedItems]).to be_an Array - expect(body_as_json[:orderedItems].size).to eq 3 - expect(body_as_json[:orderedItems].all? { |item| targets_public_collection?(item) || targets_followers_collection?(item, account) }).to be true + expect(response.parsed_body) + .to include( + orderedItems: be_an(Array).and(have_attributes(size: 3)) + ) + expect(response.parsed_body[:orderedItems].all? { |item| targets_public_collection?(item) || targets_followers_collection?(item, account) }).to be true end end @@ -144,9 +149,10 @@ RSpec.describe ActivityPub::OutboxesController do expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Cache-Control']).to eq 'max-age=60, private' - expect(body_as_json[:orderedItems]) - .to be_an(Array) - .and be_empty + expect(response.parsed_body) + .to include( + orderedItems: be_an(Array).and(be_empty) + ) end end @@ -161,9 +167,10 @@ RSpec.describe ActivityPub::OutboxesController do expect(response.media_type).to eq 'application/activity+json' expect(response.headers['Cache-Control']).to eq 'max-age=60, private' - expect(body_as_json[:orderedItems]) - .to be_an(Array) - .and be_empty + expect(response.parsed_body) + .to include( + orderedItems: be_an(Array).and(be_empty) + ) end end end diff --git a/spec/controllers/activitypub/replies_controller_spec.rb b/spec/controllers/activitypub/replies_controller_spec.rb index c10c782c9a..27821b0d4e 100644 --- a/spec/controllers/activitypub/replies_controller_spec.rb +++ b/spec/controllers/activitypub/replies_controller_spec.rb @@ -66,7 +66,7 @@ RSpec.describe ActivityPub::RepliesController do context 'when status is public' do let(:parent_visibility) { :public } - let(:page_json) { body_as_json[:first] } + let(:page_json) { response.parsed_body[:first] } it 'returns http success and correct media type' do expect(response) diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index 9a94e5e1a1..3cc3460718 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -402,7 +402,7 @@ RSpec.describe Auth::SessionsController do end it 'instructs the browser to redirect to home, logs the user in, and updates the sign count' do - expect(body_as_json[:redirect_path]).to eq(root_path) + expect(response.parsed_body[:redirect_path]).to eq(root_path) expect(controller.current_user).to eq user diff --git a/spec/controllers/follower_accounts_controller_spec.rb b/spec/controllers/follower_accounts_controller_spec.rb index e84528d13e..e14ed00e60 100644 --- a/spec/controllers/follower_accounts_controller_spec.rb +++ b/spec/controllers/follower_accounts_controller_spec.rb @@ -39,8 +39,6 @@ RSpec.describe FollowerAccountsController do end context 'when format is json' do - subject(:body) { response.parsed_body } - let(:response) { get :index, params: { account_username: alice.username, page: page, format: :json } } context 'with page' do @@ -48,15 +46,15 @@ RSpec.describe FollowerAccountsController do it 'returns followers' do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( orderedItems: contain_exactly( include(follow_from_bob.account.username), include(follow_from_chris.account.username) - ) + ), + totalItems: eq(2), + partOf: be_present ) - expect(body['totalItems']).to eq 2 - expect(body['partOf']).to be_present end context 'when account is permanently suspended' do @@ -86,8 +84,11 @@ RSpec.describe FollowerAccountsController do it 'returns followers' do expect(response).to have_http_status(200) - expect(body['totalItems']).to eq 2 - expect(body['partOf']).to be_blank + expect(response.parsed_body) + .to include( + totalItems: eq(2) + ) + .and not_include(:partOf) end context 'when account hides their network' do @@ -95,15 +96,17 @@ RSpec.describe FollowerAccountsController do alice.update(hide_collections: true) end - it 'returns followers count' do - expect(body['totalItems']).to eq 2 - end - - it 'does not return items' do - expect(body['items']).to be_blank - expect(body['orderedItems']).to be_blank - expect(body['first']).to be_blank - expect(body['last']).to be_blank + it 'returns followers count but not any items' do + expect(response.parsed_body) + .to include( + totalItems: eq(2) + ) + .and not_include( + :items, + :orderedItems, + :first, + :last + ) end end diff --git a/spec/controllers/following_accounts_controller_spec.rb b/spec/controllers/following_accounts_controller_spec.rb index 1e01b9f494..fea4d4845c 100644 --- a/spec/controllers/following_accounts_controller_spec.rb +++ b/spec/controllers/following_accounts_controller_spec.rb @@ -39,8 +39,6 @@ RSpec.describe FollowingAccountsController do end context 'when format is json' do - subject(:body) { response.parsed_body } - let(:response) { get :index, params: { account_username: alice.username, page: page, format: :json } } context 'with page' do @@ -48,15 +46,15 @@ RSpec.describe FollowingAccountsController do it 'returns followers' do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( orderedItems: contain_exactly( include(follow_of_bob.target_account.username), include(follow_of_chris.target_account.username) - ) + ), + totalItems: eq(2), + partOf: be_present ) - expect(body['totalItems']).to eq 2 - expect(body['partOf']).to be_present end context 'when account is permanently suspended' do @@ -86,8 +84,11 @@ RSpec.describe FollowingAccountsController do it 'returns followers' do expect(response).to have_http_status(200) - expect(body['totalItems']).to eq 2 - expect(body['partOf']).to be_blank + expect(response.parsed_body) + .to include( + totalItems: eq(2) + ) + .and not_include(:partOf) end context 'when account hides their network' do @@ -95,15 +96,17 @@ RSpec.describe FollowingAccountsController do alice.update(hide_collections: true) end - it 'returns followers count' do - expect(body['totalItems']).to eq 2 - end - - it 'does not return items' do - expect(body['items']).to be_blank - expect(body['orderedItems']).to be_blank - expect(body['first']).to be_blank - expect(body['last']).to be_blank + it 'returns followers count but not any items' do + expect(response.parsed_body) + .to include( + totalItems: eq(2) + ) + .and not_include( + :items, + :orderedItems, + :first, + :last + ) end end diff --git a/spec/controllers/statuses_controller_spec.rb b/spec/controllers/statuses_controller_spec.rb index 289109a1fa..2d5ff0135b 100644 --- a/spec/controllers/statuses_controller_spec.rb +++ b/spec/controllers/statuses_controller_spec.rb @@ -81,7 +81,7 @@ RSpec.describe StatusesController do 'Content-Type' => include('application/activity+json'), 'Link' => satisfy { |header| header.to_s.include?('activity+json') } ) - expect(body_as_json) + expect(response.parsed_body) .to include(content: include(status.text)) end end @@ -186,7 +186,7 @@ RSpec.describe StatusesController do 'Content-Type' => include('application/activity+json'), 'Link' => satisfy { |header| header.to_s.include?('activity+json') } ) - expect(body_as_json) + expect(response.parsed_body) .to include(content: include(status.text)) end end @@ -230,7 +230,7 @@ RSpec.describe StatusesController do 'Content-Type' => include('application/activity+json'), 'Link' => satisfy { |header| header.to_s.include?('activity+json') } ) - expect(body_as_json) + expect(response.parsed_body) .to include(content: include(status.text)) end end @@ -296,7 +296,7 @@ RSpec.describe StatusesController do 'Content-Type' => include('application/activity+json'), 'Link' => satisfy { |header| header.to_s.include?('activity+json') } ) - expect(body_as_json) + expect(response.parsed_body) .to include(content: include(status.text)) end end @@ -387,7 +387,7 @@ RSpec.describe StatusesController do 'Content-Type' => include('application/activity+json'), 'Link' => satisfy { |header| header.to_s.include?('activity+json') } ) - expect(body_as_json) + expect(response.parsed_body) .to include(content: include(status.text)) end end @@ -431,7 +431,7 @@ RSpec.describe StatusesController do 'Link' => satisfy { |header| header.to_s.include?('activity+json') } ) - expect(body_as_json) + expect(response.parsed_body) .to include(content: include(status.text)) end end @@ -497,7 +497,7 @@ RSpec.describe StatusesController do 'Content-Type' => include('application/activity+json'), 'Link' => satisfy { |header| header.to_s.include?('activity+json') } ) - expect(body_as_json) + expect(response.parsed_body) .to include(content: include(status.text)) end end diff --git a/spec/requests/accounts_spec.rb b/spec/requests/accounts_spec.rb index 3615868d74..e657ae6060 100644 --- a/spec/requests/accounts_spec.rb +++ b/spec/requests/accounts_spec.rb @@ -134,7 +134,7 @@ RSpec.describe 'Accounts show response' do media_type: eq('application/activity+json') ) - expect(body_as_json).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :name, :summary) + expect(response.parsed_body).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :name, :summary) end context 'with authorized fetch mode' do @@ -163,7 +163,7 @@ RSpec.describe 'Accounts show response' do expect(response.headers['Cache-Control']).to include 'private' - expect(body_as_json).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :name, :summary) + expect(response.parsed_body).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :name, :summary) end end @@ -182,7 +182,7 @@ RSpec.describe 'Accounts show response' do media_type: eq('application/activity+json') ) - expect(body_as_json).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :name, :summary) + expect(response.parsed_body).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :name, :summary) end context 'with authorized fetch mode' do @@ -198,7 +198,7 @@ RSpec.describe 'Accounts show response' do expect(response.headers['Cache-Control']).to include 'private' expect(response.headers['Vary']).to include 'Signature' - expect(body_as_json).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :name, :summary) + expect(response.parsed_body).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :name, :summary) end end end diff --git a/spec/requests/api/v1/accounts/credentials_spec.rb b/spec/requests/api/v1/accounts/credentials_spec.rb index a3f552cada..cc82e1892e 100644 --- a/spec/requests/api/v1/accounts/credentials_spec.rb +++ b/spec/requests/api/v1/accounts/credentials_spec.rb @@ -20,7 +20,7 @@ RSpec.describe 'credentials API' do expect(response) .to have_http_status(200) - expect(body_as_json).to include({ + expect(response.parsed_body).to include({ source: hash_including({ discoverable: false, indexable: false, @@ -37,7 +37,7 @@ RSpec.describe 'credentials API' do expect(response).to have_http_status(200) - expect(body_as_json).to include({ + expect(response.parsed_body).to include({ locked: true, }) end @@ -93,7 +93,7 @@ RSpec.describe 'credentials API' do expect(response) .to have_http_status(200) - expect(body_as_json).to include({ + expect(response.parsed_body).to include({ source: hash_including({ discoverable: true, indexable: true, diff --git a/spec/requests/api/v1/accounts/familiar_followers_spec.rb b/spec/requests/api/v1/accounts/familiar_followers_spec.rb index 475f1b17e4..8edfa4c883 100644 --- a/spec/requests/api/v1/accounts/familiar_followers_spec.rb +++ b/spec/requests/api/v1/accounts/familiar_followers_spec.rb @@ -24,7 +24,7 @@ RSpec.describe 'Accounts Familiar Followers API' do account_ids = [account_a, account_b, account_b, account_a, account_a].map { |a| a.id.to_s } get '/api/v1/accounts/familiar_followers', params: { id: account_ids }, headers: headers - expect(body_as_json.pluck(:id)).to contain_exactly(account_a.id.to_s, account_b.id.to_s) + expect(response.parsed_body.pluck(:id)).to contain_exactly(account_a.id.to_s, account_b.id.to_s) end end end diff --git a/spec/requests/api/v1/accounts/featured_tags_spec.rb b/spec/requests/api/v1/accounts/featured_tags_spec.rb index bae7d448b6..f48ed01def 100644 --- a/spec/requests/api/v1/accounts/featured_tags_spec.rb +++ b/spec/requests/api/v1/accounts/featured_tags_spec.rb @@ -23,7 +23,7 @@ RSpec.describe 'account featured tags API' do subject expect(response).to have_http_status(200) - expect(body_as_json).to contain_exactly(a_hash_including({ + expect(response.parsed_body).to contain_exactly(a_hash_including({ name: 'bar', url: "https://cb6e6126.ngrok.io/@#{account.username}/tagged/bar", }), a_hash_including({ @@ -37,7 +37,7 @@ RSpec.describe 'account featured tags API' do subject expect(response).to have_http_status(200) - expect(body_as_json).to contain_exactly(a_hash_including({ + expect(response.parsed_body).to contain_exactly(a_hash_including({ name: 'bar', url: "https://cb6e6126.ngrok.io/@#{account.pretty_acct}/tagged/bar", }), a_hash_including({ diff --git a/spec/requests/api/v1/accounts/follower_accounts_spec.rb b/spec/requests/api/v1/accounts/follower_accounts_spec.rb index 400b1c7aff..2672615390 100644 --- a/spec/requests/api/v1/accounts/follower_accounts_spec.rb +++ b/spec/requests/api/v1/accounts/follower_accounts_spec.rb @@ -21,8 +21,8 @@ RSpec.describe 'API V1 Accounts FollowerAccounts' do get "/api/v1/accounts/#{account.id}/followers", params: { limit: 2 }, headers: headers expect(response).to have_http_status(200) - expect(body_as_json.size).to eq 2 - expect([body_as_json[0][:id], body_as_json[1][:id]]).to contain_exactly(alice.id.to_s, bob.id.to_s) + expect(response.parsed_body.size).to eq 2 + expect([response.parsed_body[0][:id], response.parsed_body[1][:id]]).to contain_exactly(alice.id.to_s, bob.id.to_s) end it 'does not return blocked users', :aggregate_failures do @@ -30,8 +30,8 @@ RSpec.describe 'API V1 Accounts FollowerAccounts' do get "/api/v1/accounts/#{account.id}/followers", params: { limit: 2 }, headers: headers expect(response).to have_http_status(200) - expect(body_as_json.size).to eq 1 - expect(body_as_json[0][:id]).to eq alice.id.to_s + expect(response.parsed_body.size).to eq 1 + expect(response.parsed_body[0][:id]).to eq alice.id.to_s end context 'when requesting user is blocked' do @@ -41,7 +41,7 @@ RSpec.describe 'API V1 Accounts FollowerAccounts' do it 'hides results' do get "/api/v1/accounts/#{account.id}/followers", params: { limit: 2 }, headers: headers - expect(body_as_json.size).to eq 0 + expect(response.parsed_body.size).to eq 0 end end @@ -52,8 +52,8 @@ RSpec.describe 'API V1 Accounts FollowerAccounts' do account.mute!(bob) get "/api/v1/accounts/#{account.id}/followers", params: { limit: 2 }, headers: headers - expect(body_as_json.size).to eq 2 - expect([body_as_json[0][:id], body_as_json[1][:id]]).to contain_exactly(alice.id.to_s, bob.id.to_s) + expect(response.parsed_body.size).to eq 2 + expect([response.parsed_body[0][:id], response.parsed_body[1][:id]]).to contain_exactly(alice.id.to_s, bob.id.to_s) end end end diff --git a/spec/requests/api/v1/accounts/following_accounts_spec.rb b/spec/requests/api/v1/accounts/following_accounts_spec.rb index b0bb5141ca..19105ebf2f 100644 --- a/spec/requests/api/v1/accounts/following_accounts_spec.rb +++ b/spec/requests/api/v1/accounts/following_accounts_spec.rb @@ -21,8 +21,8 @@ RSpec.describe 'API V1 Accounts FollowingAccounts' do get "/api/v1/accounts/#{account.id}/following", params: { limit: 2 }, headers: headers expect(response).to have_http_status(200) - expect(body_as_json.size).to eq 2 - expect([body_as_json[0][:id], body_as_json[1][:id]]).to contain_exactly(alice.id.to_s, bob.id.to_s) + expect(response.parsed_body.size).to eq 2 + expect([response.parsed_body[0][:id], response.parsed_body[1][:id]]).to contain_exactly(alice.id.to_s, bob.id.to_s) end it 'does not return blocked users', :aggregate_failures do @@ -30,8 +30,8 @@ RSpec.describe 'API V1 Accounts FollowingAccounts' do get "/api/v1/accounts/#{account.id}/following", params: { limit: 2 }, headers: headers expect(response).to have_http_status(200) - expect(body_as_json.size).to eq 1 - expect(body_as_json[0][:id]).to eq alice.id.to_s + expect(response.parsed_body.size).to eq 1 + expect(response.parsed_body[0][:id]).to eq alice.id.to_s end context 'when requesting user is blocked' do @@ -41,7 +41,7 @@ RSpec.describe 'API V1 Accounts FollowingAccounts' do it 'hides results' do get "/api/v1/accounts/#{account.id}/following", params: { limit: 2 }, headers: headers - expect(body_as_json.size).to eq 0 + expect(response.parsed_body.size).to eq 0 end end @@ -52,8 +52,8 @@ RSpec.describe 'API V1 Accounts FollowingAccounts' do account.mute!(bob) get "/api/v1/accounts/#{account.id}/following", params: { limit: 2 }, headers: headers - expect(body_as_json.size).to eq 2 - expect([body_as_json[0][:id], body_as_json[1][:id]]).to contain_exactly(alice.id.to_s, bob.id.to_s) + expect(response.parsed_body.size).to eq 2 + expect([response.parsed_body[0][:id], response.parsed_body[1][:id]]).to contain_exactly(alice.id.to_s, bob.id.to_s) end end end diff --git a/spec/requests/api/v1/accounts/relationships_spec.rb b/spec/requests/api/v1/accounts/relationships_spec.rb index 76b1830bbe..9570d1214c 100644 --- a/spec/requests/api/v1/accounts/relationships_spec.rb +++ b/spec/requests/api/v1/accounts/relationships_spec.rb @@ -29,7 +29,7 @@ RSpec.describe 'GET /api/v1/accounts/relationships' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Enumerable) .and contain_exactly( include( @@ -50,7 +50,7 @@ RSpec.describe 'GET /api/v1/accounts/relationships' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Enumerable) .and have_attributes( size: 2 @@ -70,7 +70,7 @@ RSpec.describe 'GET /api/v1/accounts/relationships' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Enumerable) .and have_attributes( size: 3 @@ -89,7 +89,7 @@ RSpec.describe 'GET /api/v1/accounts/relationships' do it 'removes duplicate account IDs from params' do subject - expect(body_as_json) + expect(response.parsed_body) .to be_an(Enumerable) .and have_attributes( size: 2 @@ -141,7 +141,7 @@ RSpec.describe 'GET /api/v1/accounts/relationships' do it 'returns JSON with correct data on previously cached requests' do # Initial request including multiple accounts in params get '/api/v1/accounts/relationships', headers: headers, params: { id: [simon.id, lewis.id] } - expect(body_as_json) + expect(response.parsed_body) .to have_attributes(size: 2) # Subsequent request with different id, should override cache from first request @@ -150,7 +150,7 @@ RSpec.describe 'GET /api/v1/accounts/relationships' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Enumerable) .and have_attributes( size: 1 @@ -172,7 +172,7 @@ RSpec.describe 'GET /api/v1/accounts/relationships' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Enumerable) .and contain_exactly( include( diff --git a/spec/requests/api/v1/accounts/statuses_spec.rb b/spec/requests/api/v1/accounts/statuses_spec.rb index 4a4d9383db..e056a78901 100644 --- a/spec/requests/api/v1/accounts/statuses_spec.rb +++ b/spec/requests/api/v1/accounts/statuses_spec.rb @@ -41,7 +41,7 @@ RSpec.describe 'API V1 Accounts Statuses' do it 'returns posts along with self replies', :aggregate_failures do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to have_attributes(size: 2) .and contain_exactly( include(id: status.id.to_s), @@ -102,7 +102,7 @@ RSpec.describe 'API V1 Accounts Statuses' do it 'lists the public status only' do get "/api/v1/accounts/#{account.id}/statuses", params: { pinned: true }, headers: headers - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly( a_hash_including(id: status.id.to_s) ) @@ -117,7 +117,7 @@ RSpec.describe 'API V1 Accounts Statuses' do it 'lists both the public and the private statuses' do get "/api/v1/accounts/#{account.id}/statuses", params: { pinned: true }, headers: headers - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly( a_hash_including(id: status.id.to_s), a_hash_including(id: private_status.id.to_s) diff --git a/spec/requests/api/v1/accounts_spec.rb b/spec/requests/api/v1/accounts_spec.rb index e31644352b..2ebe56fa7d 100644 --- a/spec/requests/api/v1/accounts_spec.rb +++ b/spec/requests/api/v1/accounts_spec.rb @@ -17,7 +17,7 @@ RSpec.describe '/api/v1/accounts' do get '/api/v1/accounts', headers: headers, params: { id: [account.id, other_account.id, 123_123] } expect(response).to have_http_status(200) - expect(body_as_json).to contain_exactly( + expect(response.parsed_body).to contain_exactly( hash_including(id: account.id.to_s), hash_including(id: other_account.id.to_s) ) @@ -32,7 +32,7 @@ RSpec.describe '/api/v1/accounts' do get "/api/v1/accounts/#{account.id}" expect(response).to have_http_status(200) - expect(body_as_json[:id]).to eq(account.id.to_s) + expect(response.parsed_body[:id]).to eq(account.id.to_s) end end @@ -41,7 +41,7 @@ RSpec.describe '/api/v1/accounts' do get '/api/v1/accounts/1' expect(response).to have_http_status(404) - expect(body_as_json[:error]).to eq('Record not found') + expect(response.parsed_body[:error]).to eq('Record not found') end end @@ -57,7 +57,7 @@ RSpec.describe '/api/v1/accounts' do subject expect(response).to have_http_status(200) - expect(body_as_json[:id]).to eq(account.id.to_s) + expect(response.parsed_body[:id]).to eq(account.id.to_s) end it_behaves_like 'forbidden for wrong scope', 'write:statuses' @@ -80,7 +80,7 @@ RSpec.describe '/api/v1/accounts' do subject expect(response).to have_http_status(200) - expect(body_as_json[:access_token]).to_not be_blank + expect(response.parsed_body[:access_token]).to_not be_blank user = User.find_by(email: 'hello@world.tld') expect(user).to_not be_nil @@ -114,7 +114,7 @@ RSpec.describe '/api/v1/accounts' do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( following: true, requested: false @@ -134,7 +134,7 @@ RSpec.describe '/api/v1/accounts' do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( following: false, requested: true @@ -157,7 +157,7 @@ RSpec.describe '/api/v1/accounts' do it 'changes reblogs option' do post "/api/v1/accounts/#{other_account.id}/follow", headers: headers, params: { reblogs: true } - expect(body_as_json).to include({ + expect(response.parsed_body).to include({ following: true, showing_reblogs: true, notifying: false, @@ -167,7 +167,7 @@ RSpec.describe '/api/v1/accounts' do it 'changes notify option' do post "/api/v1/accounts/#{other_account.id}/follow", headers: headers, params: { notify: true } - expect(body_as_json).to include({ + expect(response.parsed_body).to include({ following: true, showing_reblogs: false, notifying: true, @@ -177,7 +177,7 @@ RSpec.describe '/api/v1/accounts' do it 'changes languages option' do post "/api/v1/accounts/#{other_account.id}/follow", headers: headers, params: { languages: %w(en es) } - expect(body_as_json).to include({ + expect(response.parsed_body).to include({ following: true, showing_reblogs: false, notifying: false, diff --git a/spec/requests/api/v1/admin/accounts_spec.rb b/spec/requests/api/v1/admin/accounts_spec.rb index 1615581f0e..2dc45d5eb2 100644 --- a/spec/requests/api/v1/admin/accounts_spec.rb +++ b/spec/requests/api/v1/admin/accounts_spec.rb @@ -19,7 +19,7 @@ RSpec.describe 'Accounts' do subject expect(response).to have_http_status(200) - expect(body_as_json.pluck(:id)).to match_array(expected_results.map { |a| a.id.to_s }) + expect(response.parsed_body.pluck(:id)).to match_array(expected_results.map { |a| a.id.to_s }) end end @@ -93,7 +93,7 @@ RSpec.describe 'Accounts' do subject expect(response).to have_http_status(200) - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end end @@ -112,7 +112,7 @@ RSpec.describe 'Accounts' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: account.id.to_s, username: account.username, email: account.user.email) ) end diff --git a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb index 0cddf2c69e..dd7e119911 100644 --- a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb +++ b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb @@ -30,7 +30,7 @@ RSpec.describe 'Canonical Email Blocks' do it 'returns an empty list' do subject - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end @@ -41,7 +41,7 @@ RSpec.describe 'Canonical Email Blocks' do it 'returns the correct canonical email hashes' do subject - expect(body_as_json.pluck(:canonical_email_hash)).to match_array(expected_email_hashes) + expect(response.parsed_body.pluck(:canonical_email_hash)).to match_array(expected_email_hashes) end context 'with limit param' do @@ -50,7 +50,7 @@ RSpec.describe 'Canonical Email Blocks' do it 'returns only the requested number of canonical email blocks' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end @@ -62,7 +62,7 @@ RSpec.describe 'Canonical Email Blocks' do canonical_email_blocks_ids = canonical_email_blocks.pluck(:id).map(&:to_s) - expect(body_as_json.pluck(:id)).to match_array(canonical_email_blocks_ids[2..]) + expect(response.parsed_body.pluck(:id)).to match_array(canonical_email_blocks_ids[2..]) end end @@ -74,7 +74,7 @@ RSpec.describe 'Canonical Email Blocks' do canonical_email_blocks_ids = canonical_email_blocks.pluck(:id).map(&:to_s) - expect(body_as_json.pluck(:id)).to match_array(canonical_email_blocks_ids[..2]) + expect(response.parsed_body.pluck(:id)).to match_array(canonical_email_blocks_ids[..2]) end end end @@ -96,7 +96,7 @@ RSpec.describe 'Canonical Email Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( id: eq(canonical_email_block.id.to_s), canonical_email_hash: eq(canonical_email_block.canonical_email_hash) @@ -142,7 +142,7 @@ RSpec.describe 'Canonical Email Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json[0][:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) + expect(response.parsed_body.first[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) end end @@ -151,7 +151,7 @@ RSpec.describe 'Canonical Email Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end end @@ -173,7 +173,7 @@ RSpec.describe 'Canonical Email Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) + expect(response.parsed_body[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) end context 'when the required email param is not provided' do @@ -193,7 +193,7 @@ RSpec.describe 'Canonical Email Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json[:canonical_email_hash]).to eq(params[:canonical_email_hash]) + expect(response.parsed_body[:canonical_email_hash]).to eq(params[:canonical_email_hash]) end end @@ -204,7 +204,7 @@ RSpec.describe 'Canonical Email Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) + expect(response.parsed_body[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) end end diff --git a/spec/requests/api/v1/admin/dimensions_spec.rb b/spec/requests/api/v1/admin/dimensions_spec.rb index 43e2db00c5..a28c2a9e3e 100644 --- a/spec/requests/api/v1/admin/dimensions_spec.rb +++ b/spec/requests/api/v1/admin/dimensions_spec.rb @@ -27,7 +27,7 @@ RSpec.describe 'Admin Dimensions' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Array) end end diff --git a/spec/requests/api/v1/admin/domain_allows_spec.rb b/spec/requests/api/v1/admin/domain_allows_spec.rb index b8f0b0055c..26c962b347 100644 --- a/spec/requests/api/v1/admin/domain_allows_spec.rb +++ b/spec/requests/api/v1/admin/domain_allows_spec.rb @@ -30,7 +30,7 @@ RSpec.describe 'Domain Allows' do it 'returns an empty body' do subject - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end @@ -49,7 +49,7 @@ RSpec.describe 'Domain Allows' do it 'returns the correct allowed domains' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with limit param' do @@ -58,7 +58,7 @@ RSpec.describe 'Domain Allows' do it 'returns only the requested number of allowed domains' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end end @@ -79,7 +79,7 @@ RSpec.describe 'Domain Allows' do subject expect(response).to have_http_status(200) - expect(body_as_json[:domain]).to eq domain_allow.domain + expect(response.parsed_body[:domain]).to eq domain_allow.domain end context 'when the requested allowed domain does not exist' do @@ -107,7 +107,7 @@ RSpec.describe 'Domain Allows' do subject expect(response).to have_http_status(200) - expect(body_as_json[:domain]).to eq 'foo.bar.com' + expect(response.parsed_body[:domain]).to eq 'foo.bar.com' expect(DomainAllow.find_by(domain: 'foo.bar.com')).to be_present end end @@ -140,7 +140,7 @@ RSpec.describe 'Domain Allows' do it 'returns the existing allowed domain name' do subject - expect(body_as_json[:domain]).to eq(params[:domain]) + expect(response.parsed_body[:domain]).to eq(params[:domain]) end end end diff --git a/spec/requests/api/v1/admin/domain_blocks_spec.rb b/spec/requests/api/v1/admin/domain_blocks_spec.rb index 7f7b9aa48a..3f2cbbf113 100644 --- a/spec/requests/api/v1/admin/domain_blocks_spec.rb +++ b/spec/requests/api/v1/admin/domain_blocks_spec.rb @@ -30,7 +30,7 @@ RSpec.describe 'Domain Blocks' do it 'returns an empty list' do subject - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end @@ -64,7 +64,7 @@ RSpec.describe 'Domain Blocks' do it 'returns the expected domain blocks' do subject - expect(body_as_json).to match_array(expected_responde) + expect(response.parsed_body).to match_array(expected_responde) end context 'with limit param' do @@ -73,7 +73,7 @@ RSpec.describe 'Domain Blocks' do it 'returns only the requested number of domain blocks' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end end @@ -94,19 +94,17 @@ RSpec.describe 'Domain Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match( - { - id: domain_block.id.to_s, - domain: domain_block.domain, - digest: domain_block.domain_digest, - created_at: domain_block.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), - severity: domain_block.severity.to_s, - reject_media: domain_block.reject_media, - reject_reports: domain_block.reject_reports, - private_comment: domain_block.private_comment, - public_comment: domain_block.public_comment, - obfuscate: domain_block.obfuscate, - } + expect(response.parsed_body).to match( + id: domain_block.id.to_s, + domain: domain_block.domain, + digest: domain_block.domain_digest, + created_at: domain_block.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), + severity: domain_block.severity.to_s, + reject_media: domain_block.reject_media, + reject_reports: domain_block.reject_reports, + private_comment: domain_block.private_comment, + public_comment: domain_block.public_comment, + obfuscate: domain_block.obfuscate ) end @@ -134,7 +132,7 @@ RSpec.describe 'Domain Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match a_hash_including( + expect(response.parsed_body).to match a_hash_including( { domain: 'foo.bar.com', severity: 'silence', @@ -155,7 +153,7 @@ RSpec.describe 'Domain Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match a_hash_including( + expect(response.parsed_body).to match a_hash_including( { domain: 'foo.bar.com', severity: 'suspend', @@ -175,7 +173,7 @@ RSpec.describe 'Domain Blocks' do subject expect(response).to have_http_status(422) - expect(body_as_json[:existing_domain_block][:domain]).to eq('foo.bar.com') + expect(response.parsed_body[:existing_domain_block][:domain]).to eq('foo.bar.com') end end @@ -188,7 +186,7 @@ RSpec.describe 'Domain Blocks' do subject expect(response).to have_http_status(422) - expect(body_as_json[:existing_domain_block][:domain]).to eq('bar.com') + expect(response.parsed_body[:existing_domain_block][:domain]).to eq('bar.com') end end @@ -219,7 +217,7 @@ RSpec.describe 'Domain Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match a_hash_including( + expect(response.parsed_body).to match a_hash_including( { id: domain_block.id.to_s, domain: domain_block.domain, diff --git a/spec/requests/api/v1/admin/email_domain_blocks_spec.rb b/spec/requests/api/v1/admin/email_domain_blocks_spec.rb index 16656e0202..aa3073341a 100644 --- a/spec/requests/api/v1/admin/email_domain_blocks_spec.rb +++ b/spec/requests/api/v1/admin/email_domain_blocks_spec.rb @@ -31,7 +31,7 @@ RSpec.describe 'Email Domain Blocks' do it 'returns an empty list' do subject - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end @@ -42,7 +42,7 @@ RSpec.describe 'Email Domain Blocks' do it 'return the correct blocked email domains' do subject - expect(body_as_json.pluck(:domain)).to match_array(blocked_email_domains) + expect(response.parsed_body.pluck(:domain)).to match_array(blocked_email_domains) end context 'with limit param' do @@ -51,7 +51,7 @@ RSpec.describe 'Email Domain Blocks' do it 'returns only the requested number of email domain blocks' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end @@ -63,7 +63,7 @@ RSpec.describe 'Email Domain Blocks' do email_domain_blocks_ids = email_domain_blocks.pluck(:id).map(&:to_s) - expect(body_as_json.pluck(:id)).to match_array(email_domain_blocks_ids[2..]) + expect(response.parsed_body.pluck(:id)).to match_array(email_domain_blocks_ids[2..]) end end @@ -75,7 +75,7 @@ RSpec.describe 'Email Domain Blocks' do email_domain_blocks_ids = email_domain_blocks.pluck(:id).map(&:to_s) - expect(body_as_json.pluck(:id)).to match_array(email_domain_blocks_ids[..2]) + expect(response.parsed_body.pluck(:id)).to match_array(email_domain_blocks_ids[..2]) end end end @@ -97,7 +97,7 @@ RSpec.describe 'Email Domain Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json[:domain]).to eq(email_domain_block.domain) + expect(response.parsed_body[:domain]).to eq(email_domain_block.domain) end end @@ -125,7 +125,7 @@ RSpec.describe 'Email Domain Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json[:domain]).to eq(params[:domain]) + expect(response.parsed_body[:domain]).to eq(params[:domain]) end context 'when domain param is not provided' do @@ -176,7 +176,7 @@ RSpec.describe 'Email Domain Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty expect(EmailDomainBlock.find_by(id: email_domain_block.id)).to be_nil end diff --git a/spec/requests/api/v1/admin/ip_blocks_spec.rb b/spec/requests/api/v1/admin/ip_blocks_spec.rb index bd4015b2d9..b18f8f885c 100644 --- a/spec/requests/api/v1/admin/ip_blocks_spec.rb +++ b/spec/requests/api/v1/admin/ip_blocks_spec.rb @@ -30,7 +30,7 @@ RSpec.describe 'IP Blocks' do it 'returns an empty body' do subject - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end @@ -58,7 +58,7 @@ RSpec.describe 'IP Blocks' do it 'returns the correct blocked ips' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with limit param' do @@ -67,7 +67,7 @@ RSpec.describe 'IP Blocks' do it 'returns only the requested number of ip blocks' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end end @@ -89,7 +89,7 @@ RSpec.describe 'IP Blocks' do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( ip: eq("#{ip_block.ip}/#{ip_block.ip.prefix}"), severity: eq(ip_block.severity.to_s) @@ -120,7 +120,7 @@ RSpec.describe 'IP Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( ip: eq("#{params[:ip]}/32"), severity: eq(params[:severity]), @@ -185,7 +185,7 @@ RSpec.describe 'IP Blocks' do .and change_comment_value expect(response).to have_http_status(200) - expect(body_as_json).to match(hash_including({ + expect(response.parsed_body).to match(hash_including({ ip: "#{ip_block.ip}/#{ip_block.ip.prefix}", severity: 'sign_up_requires_approval', comment: 'Decreasing severity', @@ -220,7 +220,7 @@ RSpec.describe 'IP Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty expect(IpBlock.find_by(id: ip_block.id)).to be_nil end diff --git a/spec/requests/api/v1/admin/measures_spec.rb b/spec/requests/api/v1/admin/measures_spec.rb index 56a2c1eaee..de359a5ccd 100644 --- a/spec/requests/api/v1/admin/measures_spec.rb +++ b/spec/requests/api/v1/admin/measures_spec.rb @@ -44,7 +44,7 @@ RSpec.describe 'Admin Measures' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Array) end end diff --git a/spec/requests/api/v1/admin/reports_spec.rb b/spec/requests/api/v1/admin/reports_spec.rb index 4b0b7e1713..2c40f56dc8 100644 --- a/spec/requests/api/v1/admin/reports_spec.rb +++ b/spec/requests/api/v1/admin/reports_spec.rb @@ -29,7 +29,7 @@ RSpec.describe 'Reports' do it 'returns an empty list' do subject - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end @@ -64,7 +64,7 @@ RSpec.describe 'Reports' do it 'returns all unresolved reports' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with resolved param' do @@ -74,7 +74,7 @@ RSpec.describe 'Reports' do it 'returns only the resolved reports' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end end @@ -85,7 +85,7 @@ RSpec.describe 'Reports' do it 'returns all unresolved reports filed by the specified account' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end end @@ -96,7 +96,7 @@ RSpec.describe 'Reports' do it 'returns all unresolved reports targeting the specified account' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end end @@ -106,7 +106,7 @@ RSpec.describe 'Reports' do it 'returns only the requested number of reports' do subject - expect(body_as_json.size).to eq(1) + expect(response.parsed_body.size).to eq(1) end end end @@ -126,7 +126,7 @@ RSpec.describe 'Reports' do subject expect(response).to have_http_status(200) - expect(body_as_json).to include( + expect(response.parsed_body).to include( { id: report.id.to_s, action_taken: report.action_taken?, @@ -159,7 +159,7 @@ RSpec.describe 'Reports' do report.reload - expect(body_as_json).to include( + expect(response.parsed_body).to include( { id: report.id.to_s, action_taken: report.action_taken?, diff --git a/spec/requests/api/v1/admin/retention_spec.rb b/spec/requests/api/v1/admin/retention_spec.rb index 138959a0ab..c28fa6de81 100644 --- a/spec/requests/api/v1/admin/retention_spec.rb +++ b/spec/requests/api/v1/admin/retention_spec.rb @@ -27,7 +27,7 @@ RSpec.describe 'Admin Retention' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Array) end end diff --git a/spec/requests/api/v1/admin/tags_spec.rb b/spec/requests/api/v1/admin/tags_spec.rb index 031be17f52..2f730cdeb8 100644 --- a/spec/requests/api/v1/admin/tags_spec.rb +++ b/spec/requests/api/v1/admin/tags_spec.rb @@ -30,7 +30,7 @@ RSpec.describe 'Tags' do it 'returns an empty list' do subject - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end @@ -47,7 +47,7 @@ RSpec.describe 'Tags' do it 'returns the expected tags' do subject tags.each do |tag| - expect(body_as_json.find { |item| item[:id] == tag.id.to_s && item[:name] == tag.name }).to_not be_nil + expect(response.parsed_body.find { |item| item[:id] == tag.id.to_s && item[:name] == tag.name }).to_not be_nil end end @@ -57,7 +57,7 @@ RSpec.describe 'Tags' do it 'returns only the requested number of tags' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end end @@ -82,8 +82,8 @@ RSpec.describe 'Tags' do it 'returns expected tag content' do subject - expect(body_as_json[:id].to_i).to eq(tag.id) - expect(body_as_json[:name]).to eq(tag.name) + expect(response.parsed_body[:id].to_i).to eq(tag.id) + expect(response.parsed_body[:name]).to eq(tag.name) end context 'when the requested tag does not exist' do @@ -116,8 +116,8 @@ RSpec.describe 'Tags' do it 'returns updated tag' do subject - expect(body_as_json[:id].to_i).to eq(tag.id) - expect(body_as_json[:name]).to eq(tag.name.upcase) + expect(response.parsed_body[:id].to_i).to eq(tag.id) + expect(response.parsed_body[:name]).to eq(tag.name.upcase) end context 'when the updated display name is invalid' do diff --git a/spec/requests/api/v1/admin/trends/links/links_spec.rb b/spec/requests/api/v1/admin/trends/links/links_spec.rb index 082af785ab..c436b7081e 100644 --- a/spec/requests/api/v1/admin/trends/links/links_spec.rb +++ b/spec/requests/api/v1/admin/trends/links/links_spec.rb @@ -44,7 +44,7 @@ RSpec.describe 'Links' do end def expects_correct_link_data - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( url: preview_card.url, title: preview_card.title, @@ -98,7 +98,7 @@ RSpec.describe 'Links' do it 'returns the link data' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( url: preview_card.url, title: preview_card.title, diff --git a/spec/requests/api/v1/annual_reports_spec.rb b/spec/requests/api/v1/annual_reports_spec.rb index bab184787f..8051a65484 100644 --- a/spec/requests/api/v1/annual_reports_spec.rb +++ b/spec/requests/api/v1/annual_reports_spec.rb @@ -34,7 +34,7 @@ RSpec.describe 'API V1 Annual Reports' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present end end diff --git a/spec/requests/api/v1/apps/credentials_spec.rb b/spec/requests/api/v1/apps/credentials_spec.rb index b899999640..1cd6a4178f 100644 --- a/spec/requests/api/v1/apps/credentials_spec.rb +++ b/spec/requests/api/v1/apps/credentials_spec.rb @@ -18,7 +18,7 @@ RSpec.describe 'Credentials' do expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( id: token.application.id.to_s, name: token.application.name, @@ -37,8 +37,8 @@ RSpec.describe 'Credentials' do expect(response).to have_http_status(200) - expect(body_as_json[:client_id]).to_not be_present - expect(body_as_json[:client_secret]).to_not be_present + expect(response.parsed_body[:client_id]).to_not be_present + expect(response.parsed_body[:client_secret]).to_not be_present end end @@ -56,7 +56,7 @@ RSpec.describe 'Credentials' do it 'returns the app information correctly' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( id: token.application.id.to_s, name: token.application.name, @@ -95,7 +95,7 @@ RSpec.describe 'Credentials' do it 'returns the error in the json response' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( error: 'The access token was revoked' ) @@ -117,7 +117,7 @@ RSpec.describe 'Credentials' do it 'returns the error in the json response' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( error: 'The access token is invalid' ) diff --git a/spec/requests/api/v1/apps_spec.rb b/spec/requests/api/v1/apps_spec.rb index 81d6c68126..51a0c3fd0c 100644 --- a/spec/requests/api/v1/apps_spec.rb +++ b/spec/requests/api/v1/apps_spec.rb @@ -35,7 +35,7 @@ RSpec.describe 'Apps' do expect(app.scopes.to_s).to eq scopes expect(app.redirect_uris).to eq redirect_uris - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( id: app.id.to_s, client_id: app.uid, @@ -61,7 +61,7 @@ RSpec.describe 'Apps' do expect(response).to have_http_status(200) expect(Doorkeeper::Application.find_by(name: client_name)).to be_present - expect(body_as_json) + expect(response.parsed_body) .to include( scopes: Doorkeeper.config.default_scopes.to_a ) @@ -82,7 +82,7 @@ RSpec.describe 'Apps' do expect(app).to be_present expect(app.scopes.to_s).to eq 'read' - expect(body_as_json) + expect(response.parsed_body) .to include( scopes: %w(read) ) @@ -165,7 +165,7 @@ RSpec.describe 'Apps' do expect(app.redirect_uri).to eq redirect_uris expect(app.redirect_uris).to eq redirect_uris.split - expect(body_as_json) + expect(response.parsed_body) .to include( redirect_uri: redirect_uris, redirect_uris: redirect_uris.split @@ -187,7 +187,7 @@ RSpec.describe 'Apps' do expect(app.redirect_uri).to eq redirect_uris.join "\n" expect(app.redirect_uris).to eq redirect_uris - expect(body_as_json) + expect(response.parsed_body) .to include( redirect_uri: redirect_uris.join("\n"), redirect_uris: redirect_uris diff --git a/spec/requests/api/v1/blocks_spec.rb b/spec/requests/api/v1/blocks_spec.rb index 06d2c4d997..d2f1c46a5b 100644 --- a/spec/requests/api/v1/blocks_spec.rb +++ b/spec/requests/api/v1/blocks_spec.rb @@ -26,7 +26,7 @@ RSpec.describe 'Blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with limit param' do @@ -35,7 +35,7 @@ RSpec.describe 'Blocks' do it 'returns only the requested number of blocked accounts' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end it 'sets correct link header pagination' do @@ -55,7 +55,7 @@ RSpec.describe 'Blocks' do it 'queries the blocks in range according to max_id', :aggregate_failures do subject - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly(include(id: blocks.first.target_account.id.to_s)) end end @@ -66,7 +66,7 @@ RSpec.describe 'Blocks' do it 'queries the blocks in range according to since_id', :aggregate_failures do subject - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly(include(id: blocks[2].target_account.id.to_s)) end end diff --git a/spec/requests/api/v1/bookmarks_spec.rb b/spec/requests/api/v1/bookmarks_spec.rb index dc32820c89..95a71abcac 100644 --- a/spec/requests/api/v1/bookmarks_spec.rb +++ b/spec/requests/api/v1/bookmarks_spec.rb @@ -33,7 +33,7 @@ RSpec.describe 'Bookmarks' do it 'returns the bookmarked statuses' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with limit param' do @@ -42,7 +42,7 @@ RSpec.describe 'Bookmarks' do it 'paginates correctly', :aggregate_failures do subject - expect(body_as_json.size) + expect(response.parsed_body.size) .to eq(params[:limit]) expect(response) diff --git a/spec/requests/api/v1/conversations_spec.rb b/spec/requests/api/v1/conversations_spec.rb index f136e1f4e8..bd3cbfd0e7 100644 --- a/spec/requests/api/v1/conversations_spec.rb +++ b/spec/requests/api/v1/conversations_spec.rb @@ -31,8 +31,8 @@ RSpec.describe 'API V1 Conversations' do it 'returns conversations', :aggregate_failures do get '/api/v1/conversations', headers: headers - expect(body_as_json.size).to eq 2 - expect(body_as_json[0][:accounts].size).to eq 1 + expect(response.parsed_body.size).to eq 2 + expect(response.parsed_body.first[:accounts].size).to eq 1 end context 'with since_id' do @@ -40,7 +40,7 @@ RSpec.describe 'API V1 Conversations' do it 'returns conversations' do get '/api/v1/conversations', params: { since_id: Mastodon::Snowflake.id_at(1.hour.ago, with_random: false) }, headers: headers - expect(body_as_json.size).to eq 2 + expect(response.parsed_body.size).to eq 2 end end @@ -48,7 +48,7 @@ RSpec.describe 'API V1 Conversations' do it 'returns no conversation' do get '/api/v1/conversations', params: { since_id: Mastodon::Snowflake.id_at(1.hour.from_now, with_random: false) }, headers: headers - expect(body_as_json.size).to eq 0 + expect(response.parsed_body.size).to eq 0 end end end diff --git a/spec/requests/api/v1/custom_emojis_spec.rb b/spec/requests/api/v1/custom_emojis_spec.rb index 798d8e29ed..0942734ff3 100644 --- a/spec/requests/api/v1/custom_emojis_spec.rb +++ b/spec/requests/api/v1/custom_emojis_spec.rb @@ -19,7 +19,7 @@ RSpec.describe 'Custom Emojis' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and have_attributes( first: include(shortcode: 'coolcat') @@ -34,7 +34,7 @@ RSpec.describe 'Custom Emojis' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and have_attributes( first: include(shortcode: 'coolcat') diff --git a/spec/requests/api/v1/directories_spec.rb b/spec/requests/api/v1/directories_spec.rb index 94306c06ec..aa602a71cd 100644 --- a/spec/requests/api/v1/directories_spec.rb +++ b/spec/requests/api/v1/directories_spec.rb @@ -82,8 +82,8 @@ RSpec.describe 'Directories API' do get '/api/v1/directory', headers: headers expect(response).to have_http_status(200) - expect(body_as_json.size).to eq(2) - expect(body_as_json.pluck(:id)).to contain_exactly(eligible_remote_account.id.to_s, local_discoverable_account.id.to_s) + expect(response.parsed_body.size).to eq(2) + expect(response.parsed_body.pluck(:id)).to contain_exactly(eligible_remote_account.id.to_s, local_discoverable_account.id.to_s) end end @@ -101,8 +101,8 @@ RSpec.describe 'Directories API' do get '/api/v1/directory', headers: headers, params: { local: '1' } expect(response).to have_http_status(200) - expect(body_as_json.size).to eq(1) - expect(body_as_json.first[:id]).to include(local_account.id.to_s) + expect(response.parsed_body.size).to eq(1) + expect(response.parsed_body.first[:id]).to include(local_account.id.to_s) expect(response.body).to_not include(remote_account.id.to_s) end end @@ -115,9 +115,9 @@ RSpec.describe 'Directories API' do get '/api/v1/directory', headers: headers, params: { order: 'active' } expect(response).to have_http_status(200) - expect(body_as_json.size).to eq(2) - expect(body_as_json.first[:id]).to include(new_stat.account_id.to_s) - expect(body_as_json.second[:id]).to include(old_stat.account_id.to_s) + expect(response.parsed_body.size).to eq(2) + expect(response.parsed_body.first[:id]).to include(new_stat.account_id.to_s) + expect(response.parsed_body.second[:id]).to include(old_stat.account_id.to_s) end end @@ -130,9 +130,9 @@ RSpec.describe 'Directories API' do get '/api/v1/directory', headers: headers, params: { order: 'new' } expect(response).to have_http_status(200) - expect(body_as_json.size).to eq(2) - expect(body_as_json.first[:id]).to include(account_new.id.to_s) - expect(body_as_json.second[:id]).to include(account_old.id.to_s) + expect(response.parsed_body.size).to eq(2) + expect(response.parsed_body.first[:id]).to include(account_new.id.to_s) + expect(response.parsed_body.second[:id]).to include(account_old.id.to_s) end end end diff --git a/spec/requests/api/v1/domain_blocks_spec.rb b/spec/requests/api/v1/domain_blocks_spec.rb index 954497ebe1..8184c26bed 100644 --- a/spec/requests/api/v1/domain_blocks_spec.rb +++ b/spec/requests/api/v1/domain_blocks_spec.rb @@ -26,7 +26,7 @@ RSpec.describe 'Domain blocks' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match_array(blocked_domains) + expect(response.parsed_body).to match_array(blocked_domains) end context 'with limit param' do @@ -35,7 +35,7 @@ RSpec.describe 'Domain blocks' do it 'returns only the requested number of blocked domains' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end end diff --git a/spec/requests/api/v1/emails/confirmations_spec.rb b/spec/requests/api/v1/emails/confirmations_spec.rb index 8f5171ee78..0a419a10cf 100644 --- a/spec/requests/api/v1/emails/confirmations_spec.rb +++ b/spec/requests/api/v1/emails/confirmations_spec.rb @@ -111,7 +111,7 @@ RSpec.describe 'Confirmations' do subject expect(response).to have_http_status(200) - expect(body_as_json).to be false + expect(response.parsed_body).to be false end end @@ -122,7 +122,7 @@ RSpec.describe 'Confirmations' do subject expect(response).to have_http_status(200) - expect(body_as_json).to be true + expect(response.parsed_body).to be true end end end @@ -139,7 +139,7 @@ RSpec.describe 'Confirmations' do subject expect(response).to have_http_status(200) - expect(body_as_json).to be false + expect(response.parsed_body).to be false end end @@ -150,7 +150,7 @@ RSpec.describe 'Confirmations' do subject expect(response).to have_http_status(200) - expect(body_as_json).to be true + expect(response.parsed_body).to be true end end end diff --git a/spec/requests/api/v1/endorsements_spec.rb b/spec/requests/api/v1/endorsements_spec.rb index 255211a404..25917f527a 100644 --- a/spec/requests/api/v1/endorsements_spec.rb +++ b/spec/requests/api/v1/endorsements_spec.rb @@ -37,7 +37,7 @@ RSpec.describe 'Endorsements' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and have_attributes( first: include(acct: account_pin.target_account.acct) @@ -52,7 +52,7 @@ RSpec.describe 'Endorsements' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to_not be_present end end diff --git a/spec/requests/api/v1/favourites_spec.rb b/spec/requests/api/v1/favourites_spec.rb index b988ac99db..78e9d61551 100644 --- a/spec/requests/api/v1/favourites_spec.rb +++ b/spec/requests/api/v1/favourites_spec.rb @@ -33,7 +33,7 @@ RSpec.describe 'Favourites' do it 'returns the favourites' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with limit param' do @@ -42,7 +42,7 @@ RSpec.describe 'Favourites' do it 'returns only the requested number of favourites' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end it 'sets the correct pagination headers' do diff --git a/spec/requests/api/v1/featured_tags/suggestions_spec.rb b/spec/requests/api/v1/featured_tags/suggestions_spec.rb index 0a7bfe5cda..8815c65cf1 100644 --- a/spec/requests/api/v1/featured_tags/suggestions_spec.rb +++ b/spec/requests/api/v1/featured_tags/suggestions_spec.rb @@ -32,7 +32,7 @@ RSpec.describe 'Featured Tags Suggestions API' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly( include(name: used_tag.name) ) diff --git a/spec/requests/api/v1/featured_tags_spec.rb b/spec/requests/api/v1/featured_tags_spec.rb index 81e99e015b..423cc0c560 100644 --- a/spec/requests/api/v1/featured_tags_spec.rb +++ b/spec/requests/api/v1/featured_tags_spec.rb @@ -37,7 +37,7 @@ RSpec.describe 'FeaturedTags' do it 'returns an empty body' do get '/api/v1/featured_tags', headers: headers - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end end @@ -47,7 +47,7 @@ RSpec.describe 'FeaturedTags' do it 'returns only the featured tags belonging to the requesting user' do get '/api/v1/featured_tags', headers: headers - expect(body_as_json.pluck(:id)) + expect(response.parsed_body.pluck(:id)) .to match_array( user_featured_tags.pluck(:id).map(&:to_s) ) @@ -67,7 +67,7 @@ RSpec.describe 'FeaturedTags' do it 'returns the correct tag name' do post '/api/v1/featured_tags', headers: headers, params: params - expect(body_as_json) + expect(response.parsed_body) .to include( name: params[:name] ) @@ -141,7 +141,7 @@ RSpec.describe 'FeaturedTags' do it 'returns an empty body' do delete "/api/v1/featured_tags/#{id}", headers: headers - expect(body_as_json).to be_empty + expect(response.parsed_body).to be_empty end it 'deletes the featured tag', :inline_jobs do diff --git a/spec/requests/api/v1/filters_spec.rb b/spec/requests/api/v1/filters_spec.rb index deb6e74217..93ed78b346 100644 --- a/spec/requests/api/v1/filters_spec.rb +++ b/spec/requests/api/v1/filters_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'API V1 Filters' do it 'returns http success' do get '/api/v1/filters', headers: headers expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly( include(id: custom_filter_keyword.id.to_s) ) diff --git a/spec/requests/api/v1/follow_requests_spec.rb b/spec/requests/api/v1/follow_requests_spec.rb index a8898ccb3e..c143ccaec1 100644 --- a/spec/requests/api/v1/follow_requests_spec.rb +++ b/spec/requests/api/v1/follow_requests_spec.rb @@ -36,7 +36,7 @@ RSpec.describe 'Follow requests' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with limit param' do @@ -45,7 +45,7 @@ RSpec.describe 'Follow requests' do it 'returns only the requested number of follow requests' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end end @@ -66,7 +66,7 @@ RSpec.describe 'Follow requests' do it 'allows the requesting follower to follow', :aggregate_failures do expect { subject }.to change { follower.following?(user.account) }.from(false).to(true) expect(response).to have_http_status(200) - expect(body_as_json[:followed_by]).to be true + expect(response.parsed_body[:followed_by]).to be true end end @@ -88,7 +88,7 @@ RSpec.describe 'Follow requests' do expect(response).to have_http_status(200) expect(FollowRequest.where(target_account: user.account, account: follower)).to_not exist - expect(body_as_json[:followed_by]).to be false + expect(response.parsed_body[:followed_by]).to be false end end end diff --git a/spec/requests/api/v1/followed_tags_spec.rb b/spec/requests/api/v1/followed_tags_spec.rb index 3d2d82d5db..f7787cb763 100644 --- a/spec/requests/api/v1/followed_tags_spec.rb +++ b/spec/requests/api/v1/followed_tags_spec.rb @@ -37,7 +37,7 @@ RSpec.describe 'Followed tags' do it 'returns the followed tags correctly' do subject - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with limit param' do @@ -46,7 +46,7 @@ RSpec.describe 'Followed tags' do it 'returns only the requested number of follow tags' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end it 'sets the correct pagination headers' do diff --git a/spec/requests/api/v1/instance_spec.rb b/spec/requests/api/v1/instance_spec.rb index f0a4ceadb8..8d6ba572e0 100644 --- a/spec/requests/api/v1/instance_spec.rb +++ b/spec/requests/api/v1/instance_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'Instances' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and include(title: 'Mastodon') end @@ -28,7 +28,7 @@ RSpec.describe 'Instances' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and include(title: 'Mastodon') end diff --git a/spec/requests/api/v1/instances/activity_spec.rb b/spec/requests/api/v1/instances/activity_spec.rb index 4f2bc91ad6..72e3faeb65 100644 --- a/spec/requests/api/v1/instances/activity_spec.rb +++ b/spec/requests/api/v1/instances/activity_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'Activity' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and(be_an(Array)) .and(have_attributes(size: Api::V1::Instances::ActivityController::WEEKS_OF_ACTIVITY)) diff --git a/spec/requests/api/v1/instances/domain_blocks_spec.rb b/spec/requests/api/v1/instances/domain_blocks_spec.rb index 397ecff084..460d338607 100644 --- a/spec/requests/api/v1/instances/domain_blocks_spec.rb +++ b/spec/requests/api/v1/instances/domain_blocks_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'Domain Blocks' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and(be_an(Array)) .and(have_attributes(size: 1)) diff --git a/spec/requests/api/v1/instances/extended_descriptions_spec.rb b/spec/requests/api/v1/instances/extended_descriptions_spec.rb index 64982de686..bf6d58216a 100644 --- a/spec/requests/api/v1/instances/extended_descriptions_spec.rb +++ b/spec/requests/api/v1/instances/extended_descriptions_spec.rb @@ -10,7 +10,7 @@ RSpec.describe 'Extended Descriptions' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and include(:content) end diff --git a/spec/requests/api/v1/instances/languages_spec.rb b/spec/requests/api/v1/instances/languages_spec.rb index 8ab8bf99ce..79ea62c599 100644 --- a/spec/requests/api/v1/instances/languages_spec.rb +++ b/spec/requests/api/v1/instances/languages_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'Languages' do end it 'returns the supported languages' do - expect(body_as_json.pluck(:code)).to match_array LanguagesHelper::SUPPORTED_LOCALES.keys.map(&:to_s) + expect(response.parsed_body.pluck(:code)).to match_array LanguagesHelper::SUPPORTED_LOCALES.keys.map(&:to_s) end end end diff --git a/spec/requests/api/v1/instances/peers_spec.rb b/spec/requests/api/v1/instances/peers_spec.rb index 1a7975f8b7..1140612f0a 100644 --- a/spec/requests/api/v1/instances/peers_spec.rb +++ b/spec/requests/api/v1/instances/peers_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'Peers' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Array) end end diff --git a/spec/requests/api/v1/instances/privacy_policies_spec.rb b/spec/requests/api/v1/instances/privacy_policies_spec.rb index 24de98d880..93490542cd 100644 --- a/spec/requests/api/v1/instances/privacy_policies_spec.rb +++ b/spec/requests/api/v1/instances/privacy_policies_spec.rb @@ -10,7 +10,7 @@ RSpec.describe 'Privacy Policy' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and include(:content) end diff --git a/spec/requests/api/v1/instances/rules_spec.rb b/spec/requests/api/v1/instances/rules_spec.rb index 65b8d78c7d..620c991ae2 100644 --- a/spec/requests/api/v1/instances/rules_spec.rb +++ b/spec/requests/api/v1/instances/rules_spec.rb @@ -10,7 +10,7 @@ RSpec.describe 'Rules' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_an(Array) end end diff --git a/spec/requests/api/v1/instances/translation_languages_spec.rb b/spec/requests/api/v1/instances/translation_languages_spec.rb index e5a480c175..0de5ec3bc2 100644 --- a/spec/requests/api/v1/instances/translation_languages_spec.rb +++ b/spec/requests/api/v1/instances/translation_languages_spec.rb @@ -11,7 +11,7 @@ RSpec.describe 'Translation Languages' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to eq({}) end end @@ -25,7 +25,7 @@ RSpec.describe 'Translation Languages' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to match({ und: %w(en de), en: ['de'] }) end diff --git a/spec/requests/api/v1/lists/accounts_spec.rb b/spec/requests/api/v1/lists/accounts_spec.rb index de49982351..d147b21ee7 100644 --- a/spec/requests/api/v1/lists/accounts_spec.rb +++ b/spec/requests/api/v1/lists/accounts_spec.rb @@ -34,7 +34,7 @@ RSpec.describe 'Accounts' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end context 'with limit param' do @@ -43,7 +43,7 @@ RSpec.describe 'Accounts' do it 'returns only the requested number of accounts' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end end end diff --git a/spec/requests/api/v1/lists_spec.rb b/spec/requests/api/v1/lists_spec.rb index cf5ac28a56..2042a64d5c 100644 --- a/spec/requests/api/v1/lists_spec.rb +++ b/spec/requests/api/v1/lists_spec.rb @@ -43,7 +43,7 @@ RSpec.describe 'Lists' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match_array(expected_response) + expect(response.parsed_body).to match_array(expected_response) end end @@ -60,7 +60,7 @@ RSpec.describe 'Lists' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match({ + expect(response.parsed_body).to match({ id: list.id.to_s, title: list.title, replies_policy: list.replies_policy, @@ -100,7 +100,7 @@ RSpec.describe 'Lists' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match(a_hash_including(title: 'my list', replies_policy: 'none', exclusive: true)) + expect(response.parsed_body).to match(a_hash_including(title: 'my list', replies_policy: 'none', exclusive: true)) expect(List.where(account: user.account).count).to eq(1) end @@ -144,7 +144,7 @@ RSpec.describe 'Lists' do expect(response).to have_http_status(200) list.reload - expect(body_as_json).to match({ + expect(response.parsed_body).to match({ id: list.id.to_s, title: list.title, replies_policy: list.replies_policy, diff --git a/spec/requests/api/v1/markers_spec.rb b/spec/requests/api/v1/markers_spec.rb index 2dbb9d205a..a10d2dc3e2 100644 --- a/spec/requests/api/v1/markers_spec.rb +++ b/spec/requests/api/v1/markers_spec.rb @@ -18,7 +18,7 @@ RSpec.describe 'API Markers' do it 'returns markers', :aggregate_failures do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( home: include(last_read_id: '123'), notifications: include(last_read_id: '456') @@ -61,7 +61,7 @@ RSpec.describe 'API Markers' do it 'returns error json' do expect(response) .to have_http_status(409) - expect(body_as_json) + expect(response.parsed_body) .to include(error: /Conflict during update/) end end diff --git a/spec/requests/api/v1/media_spec.rb b/spec/requests/api/v1/media_spec.rb index c89c49afdf..d0af334825 100644 --- a/spec/requests/api/v1/media_spec.rb +++ b/spec/requests/api/v1/media_spec.rb @@ -26,7 +26,7 @@ RSpec.describe 'Media' do it 'returns the media information' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( id: media.id.to_s, description: media.description, @@ -83,7 +83,7 @@ RSpec.describe 'Media' do expect(MediaAttachment.first).to be_present expect(MediaAttachment.first).to have_attached_file(:file) - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: MediaAttachment.first.id.to_s, description: params[:description], type: media_type) ) end diff --git a/spec/requests/api/v1/mutes_spec.rb b/spec/requests/api/v1/mutes_spec.rb index 988bb3c399..6402c908ff 100644 --- a/spec/requests/api/v1/mutes_spec.rb +++ b/spec/requests/api/v1/mutes_spec.rb @@ -29,7 +29,7 @@ RSpec.describe 'Mutes' do muted_accounts = mutes.map(&:target_account) - expect(body_as_json.pluck(:id)).to match_array(muted_accounts.map { |account| account.id.to_s }) + expect(response.parsed_body.pluck(:id)).to match_array(muted_accounts.map { |account| account.id.to_s }) end context 'with limit param' do @@ -38,7 +38,7 @@ RSpec.describe 'Mutes' do it 'returns only the requested number of muted accounts' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end it 'sets the correct pagination headers', :aggregate_failures do @@ -58,7 +58,7 @@ RSpec.describe 'Mutes' do it 'queries mutes in range according to max_id', :aggregate_failures do subject - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly(include(id: mutes.first.target_account_id.to_s)) end end @@ -69,7 +69,7 @@ RSpec.describe 'Mutes' do it 'queries mutes in range according to since_id', :aggregate_failures do subject - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly(include(id: mutes[1].target_account_id.to_s)) end end diff --git a/spec/requests/api/v1/notifications/policies_spec.rb b/spec/requests/api/v1/notifications/policies_spec.rb index a73d4217be..8bafcad2fe 100644 --- a/spec/requests/api/v1/notifications/policies_spec.rb +++ b/spec/requests/api/v1/notifications/policies_spec.rb @@ -26,7 +26,7 @@ RSpec.describe 'Policies' do subject expect(response).to have_http_status(200) - expect(body_as_json).to include( + expect(response.parsed_body).to include( filter_not_following: false, filter_not_followers: false, filter_new_accounts: false, @@ -54,7 +54,7 @@ RSpec.describe 'Policies' do .to change { NotificationPolicy.find_or_initialize_by(account: user.account).for_not_following.to_sym }.from(:accept).to(:filter) expect(response).to have_http_status(200) - expect(body_as_json).to include( + expect(response.parsed_body).to include( filter_not_following: true, filter_not_followers: false, filter_new_accounts: false, diff --git a/spec/requests/api/v1/notifications/requests_spec.rb b/spec/requests/api/v1/notifications/requests_spec.rb index 45bb71adb0..dc125bc7aa 100644 --- a/spec/requests/api/v1/notifications/requests_spec.rb +++ b/spec/requests/api/v1/notifications/requests_spec.rb @@ -133,7 +133,7 @@ RSpec.describe 'Requests' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match({ merged: true }) + expect(response.parsed_body).to match({ merged: true }) end end @@ -146,7 +146,7 @@ RSpec.describe 'Requests' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match({ merged: false }) + expect(response.parsed_body).to match({ merged: false }) end end end diff --git a/spec/requests/api/v1/notifications_spec.rb b/spec/requests/api/v1/notifications_spec.rb index 84e6db1e51..b74adb5dff 100644 --- a/spec/requests/api/v1/notifications_spec.rb +++ b/spec/requests/api/v1/notifications_spec.rb @@ -31,7 +31,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 5 + expect(response.parsed_body[:count]).to eq 5 end end @@ -45,7 +45,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 2 + expect(response.parsed_body[:count]).to eq 2 end end @@ -56,7 +56,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 4 + expect(response.parsed_body[:count]).to eq 4 end end @@ -67,7 +67,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 2 + expect(response.parsed_body[:count]).to eq 2 end end @@ -80,7 +80,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq Api::V1::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT + expect(response.parsed_body[:count]).to eq Api::V1::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT end end end @@ -111,9 +111,9 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json.size).to eq 5 + expect(response.parsed_body.size).to eq 5 expect(body_json_types).to include('reblog', 'mention', 'favourite', 'follow') - expect(body_as_json.any? { |x| x[:filtered] }).to be false + expect(response.parsed_body.any? { |x| x[:filtered] }).to be false end end @@ -124,9 +124,9 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json.size).to eq 6 + expect(response.parsed_body.size).to eq 6 expect(body_json_types).to include('reblog', 'mention', 'favourite', 'follow') - expect(body_as_json.any? { |x| x[:filtered] }).to be true + expect(response.parsed_body.any? { |x| x[:filtered] }).to be true end end @@ -141,7 +141,7 @@ RSpec.describe 'Notifications' do end def body_json_account_ids - body_as_json.map { |x| x[:account][:id] } + response.parsed_body.map { |x| x[:account][:id] } end end @@ -152,7 +152,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json.size).to eq 0 + expect(response.parsed_body.size).to eq 0 end end @@ -163,7 +163,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json.size).to_not eq 0 + expect(response.parsed_body.size).to_not eq 0 expect(body_json_types.uniq).to_not include 'mention' end end @@ -187,7 +187,7 @@ RSpec.describe 'Notifications' do notifications = user.account.notifications.browserable.order(id: :asc) - expect(body_as_json.size) + expect(response.parsed_body.size) .to eq(params[:limit]) expect(response) @@ -199,7 +199,7 @@ RSpec.describe 'Notifications' do end def body_json_types - body_as_json.pluck(:type) + response.parsed_body.pluck(:type) end end diff --git a/spec/requests/api/v1/peers/search_spec.rb b/spec/requests/api/v1/peers/search_spec.rb index 87b0dc4f64..dc5f550d0e 100644 --- a/spec/requests/api/v1/peers/search_spec.rb +++ b/spec/requests/api/v1/peers/search_spec.rb @@ -23,7 +23,7 @@ RSpec.describe 'API Peers Search' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_blank end end @@ -34,7 +34,7 @@ RSpec.describe 'API Peers Search' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_blank end end @@ -49,9 +49,9 @@ RSpec.describe 'API Peers Search' do expect(response) .to have_http_status(200) - expect(body_as_json.size) + expect(response.parsed_body.size) .to eq(1) - expect(body_as_json.first) + expect(response.parsed_body.first) .to eq(account.domain) end end diff --git a/spec/requests/api/v1/polls_spec.rb b/spec/requests/api/v1/polls_spec.rb index 1c8a818d59..138a37a73c 100644 --- a/spec/requests/api/v1/polls_spec.rb +++ b/spec/requests/api/v1/polls_spec.rb @@ -23,7 +23,7 @@ RSpec.describe 'Polls' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( id: poll.id.to_s, voted: false, diff --git a/spec/requests/api/v1/preferences_spec.rb b/spec/requests/api/v1/preferences_spec.rb index 6508b51c04..d6991ca90c 100644 --- a/spec/requests/api/v1/preferences_spec.rb +++ b/spec/requests/api/v1/preferences_spec.rb @@ -34,7 +34,7 @@ RSpec.describe 'Preferences' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present end end diff --git a/spec/requests/api/v1/push/subscriptions_spec.rb b/spec/requests/api/v1/push/subscriptions_spec.rb index 6674b048e8..a9587f8d58 100644 --- a/spec/requests/api/v1/push/subscriptions_spec.rb +++ b/spec/requests/api/v1/push/subscriptions_spec.rb @@ -65,7 +65,7 @@ RSpec.describe 'API V1 Push Subscriptions' do access_token_id: eq(token.id) ) - expect(body_as_json.with_indifferent_access) + expect(response.parsed_body.with_indifferent_access) .to include( { endpoint: create_payload[:subscription][:endpoint], alerts: {}, policy: 'all' } ) @@ -124,7 +124,7 @@ RSpec.describe 'API V1 Push Subscriptions' do ) end - expect(body_as_json.with_indifferent_access) + expect(response.parsed_body.with_indifferent_access) .to include( endpoint: create_payload[:subscription][:endpoint], alerts: alerts_payload[:data][:alerts], diff --git a/spec/requests/api/v1/reports_spec.rb b/spec/requests/api/v1/reports_spec.rb index a72d9bbcd8..a176bd78a6 100644 --- a/spec/requests/api/v1/reports_spec.rb +++ b/spec/requests/api/v1/reports_spec.rb @@ -37,7 +37,7 @@ RSpec.describe 'Reports' do emails = capture_emails { subject } expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including( status_ids: [status.id.to_s], category: category, diff --git a/spec/requests/api/v1/scheduled_status_spec.rb b/spec/requests/api/v1/scheduled_status_spec.rb index b35d297a60..eb03827c9a 100644 --- a/spec/requests/api/v1/scheduled_status_spec.rb +++ b/spec/requests/api/v1/scheduled_status_spec.rb @@ -46,7 +46,7 @@ RSpec.describe 'Scheduled Statuses' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to_not be_present end end @@ -60,7 +60,7 @@ RSpec.describe 'Scheduled Statuses' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and have_attributes( first: include(id: scheduled_status.id.to_s) diff --git a/spec/requests/api/v1/statuses/bookmarks_spec.rb b/spec/requests/api/v1/statuses/bookmarks_spec.rb index d3007740a5..f1bcfda0ff 100644 --- a/spec/requests/api/v1/statuses/bookmarks_spec.rb +++ b/spec/requests/api/v1/statuses/bookmarks_spec.rb @@ -28,7 +28,7 @@ RSpec.describe 'Bookmarks' do it 'returns json with updated attributes' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: status.id.to_s, bookmarked: true) ) end @@ -103,7 +103,7 @@ RSpec.describe 'Bookmarks' do it 'returns json with updated attributes' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: status.id.to_s, bookmarked: false) ) end @@ -127,7 +127,7 @@ RSpec.describe 'Bookmarks' do it 'returns json with updated attributes' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: status.id.to_s, bookmarked: false) ) end diff --git a/spec/requests/api/v1/statuses/favourited_by_accounts_spec.rb b/spec/requests/api/v1/statuses/favourited_by_accounts_spec.rb index 2fd79f424b..24bd03d343 100644 --- a/spec/requests/api/v1/statuses/favourited_by_accounts_spec.rb +++ b/spec/requests/api/v1/statuses/favourited_by_accounts_spec.rb @@ -34,9 +34,9 @@ RSpec.describe 'API V1 Statuses Favourited by Accounts' do next: api_v1_status_favourited_by_index_url(limit: 2, max_id: Favourite.first.id) ) - expect(body_as_json.size) + expect(response.parsed_body.size) .to eq(2) - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly( include(id: alice.id.to_s), include(id: bob.id.to_s) @@ -48,9 +48,9 @@ RSpec.describe 'API V1 Statuses Favourited by Accounts' do subject - expect(body_as_json.size) + expect(response.parsed_body.size) .to eq 1 - expect(body_as_json.first[:id]).to eq(alice.id.to_s) + expect(response.parsed_body.first[:id]).to eq(alice.id.to_s) end end end diff --git a/spec/requests/api/v1/statuses/favourites_spec.rb b/spec/requests/api/v1/statuses/favourites_spec.rb index 22d0e4831f..f9f0ff6299 100644 --- a/spec/requests/api/v1/statuses/favourites_spec.rb +++ b/spec/requests/api/v1/statuses/favourites_spec.rb @@ -28,7 +28,7 @@ RSpec.describe 'Favourites', :inline_jobs do it 'returns json with updated attributes' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: status.id.to_s, favourites_count: 1, favourited: true) ) end @@ -95,7 +95,7 @@ RSpec.describe 'Favourites', :inline_jobs do it 'returns json with updated attributes' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: status.id.to_s, favourites_count: 0, favourited: false) ) end @@ -118,7 +118,7 @@ RSpec.describe 'Favourites', :inline_jobs do it 'returns json with updated attributes' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: status.id.to_s, favourites_count: 0, favourited: false) ) end diff --git a/spec/requests/api/v1/statuses/histories_spec.rb b/spec/requests/api/v1/statuses/histories_spec.rb index f13bf79867..4115a52fa8 100644 --- a/spec/requests/api/v1/statuses/histories_spec.rb +++ b/spec/requests/api/v1/statuses/histories_spec.rb @@ -18,7 +18,7 @@ RSpec.describe 'API V1 Statuses Histories' do it 'returns http success' do expect(response).to have_http_status(200) - expect(body_as_json.size).to_not be 0 + expect(response.parsed_body.size).to_not be 0 end end end diff --git a/spec/requests/api/v1/statuses/pins_spec.rb b/spec/requests/api/v1/statuses/pins_spec.rb index 3be1a16ee1..56e60c6d36 100644 --- a/spec/requests/api/v1/statuses/pins_spec.rb +++ b/spec/requests/api/v1/statuses/pins_spec.rb @@ -28,7 +28,7 @@ RSpec.describe 'Pins' do it 'return json with updated attributes' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: status.id.to_s, pinned: true) ) end @@ -96,7 +96,7 @@ RSpec.describe 'Pins' do it 'return json with updated attributes' do subject - expect(body_as_json).to match( + expect(response.parsed_body).to match( a_hash_including(id: status.id.to_s, pinned: false) ) end diff --git a/spec/requests/api/v1/statuses/reblogged_by_accounts_spec.rb b/spec/requests/api/v1/statuses/reblogged_by_accounts_spec.rb index 5fc54042f9..bd26c22f08 100644 --- a/spec/requests/api/v1/statuses/reblogged_by_accounts_spec.rb +++ b/spec/requests/api/v1/statuses/reblogged_by_accounts_spec.rb @@ -33,9 +33,9 @@ RSpec.describe 'API V1 Statuses Reblogged by Accounts' do next: api_v1_status_reblogged_by_index_url(limit: 2, max_id: alice.statuses.first.id) ) - expect(body_as_json.size) + expect(response.parsed_body.size) .to eq(2) - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly( include(id: alice.id.to_s), include(id: bob.id.to_s) @@ -47,9 +47,9 @@ RSpec.describe 'API V1 Statuses Reblogged by Accounts' do subject - expect(body_as_json.size) + expect(response.parsed_body.size) .to eq 1 - expect(body_as_json.first[:id]).to eq(alice.id.to_s) + expect(response.parsed_body.first[:id]).to eq(alice.id.to_s) end end end diff --git a/spec/requests/api/v1/statuses/reblogs_spec.rb b/spec/requests/api/v1/statuses/reblogs_spec.rb index 0978c890a4..8c7894d875 100644 --- a/spec/requests/api/v1/statuses/reblogs_spec.rb +++ b/spec/requests/api/v1/statuses/reblogs_spec.rb @@ -24,7 +24,7 @@ RSpec.describe 'API V1 Statuses Reblogs' do expect(user.account.reblogged?(status)).to be true - expect(body_as_json) + expect(response.parsed_body) .to include( reblog: include( id: status.id.to_s, @@ -60,7 +60,7 @@ RSpec.describe 'API V1 Statuses Reblogs' do expect(user.account.reblogged?(status)).to be false - expect(body_as_json) + expect(response.parsed_body) .to include( id: status.id.to_s, reblogs_count: 0, @@ -85,7 +85,7 @@ RSpec.describe 'API V1 Statuses Reblogs' do expect(user.account.reblogged?(status)).to be false - expect(body_as_json) + expect(response.parsed_body) .to include( id: status.id.to_s, reblogs_count: 0, diff --git a/spec/requests/api/v1/statuses/sources_spec.rb b/spec/requests/api/v1/statuses/sources_spec.rb index c7b1603824..eab19d64da 100644 --- a/spec/requests/api/v1/statuses/sources_spec.rb +++ b/spec/requests/api/v1/statuses/sources_spec.rb @@ -22,7 +22,7 @@ RSpec.describe 'Sources' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match({ + expect(response.parsed_body).to match({ id: status.id.to_s, text: status.text, spoiler_text: status.spoiler_text, @@ -51,7 +51,7 @@ RSpec.describe 'Sources' do subject expect(response).to have_http_status(200) - expect(body_as_json).to match({ + expect(response.parsed_body).to match({ id: status.id.to_s, text: status.text, spoiler_text: status.spoiler_text, diff --git a/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb index 1a211d14d8..057800a266 100644 --- a/spec/requests/api/v1/statuses_spec.rb +++ b/spec/requests/api/v1/statuses_spec.rb @@ -18,7 +18,7 @@ RSpec.describe '/api/v1/statuses' do get '/api/v1/statuses', headers: headers, params: { id: [status.id, other_status.id, 123_123] } expect(response).to have_http_status(200) - expect(body_as_json).to contain_exactly( + expect(response.parsed_body).to contain_exactly( hash_including(id: status.id.to_s), hash_including(id: other_status.id.to_s) ) @@ -52,7 +52,7 @@ RSpec.describe '/api/v1/statuses' do subject expect(response).to have_http_status(200) - expect(body_as_json[:filtered][0]).to include({ + expect(response.parsed_body[:filtered][0]).to include({ filter: a_hash_including({ id: user.account.custom_filters.first.id.to_s, title: 'filter1', @@ -75,7 +75,7 @@ RSpec.describe '/api/v1/statuses' do subject expect(response).to have_http_status(200) - expect(body_as_json[:filtered][0]).to include({ + expect(response.parsed_body[:filtered][0]).to include({ filter: a_hash_including({ id: user.account.custom_filters.first.id.to_s, title: 'filter1', @@ -97,7 +97,7 @@ RSpec.describe '/api/v1/statuses' do subject expect(response).to have_http_status(200) - expect(body_as_json[:reblog][:filtered][0]).to include({ + expect(response.parsed_body[:reblog][:filtered][0]).to include({ filter: a_hash_including({ id: user.account.custom_filters.first.id.to_s, title: 'filter1', @@ -154,7 +154,7 @@ RSpec.describe '/api/v1/statuses' do subject expect(response).to have_http_status(422) - expect(body_as_json[:unexpected_accounts].map { |a| a.slice(:id, :acct) }).to match [{ id: bob.id.to_s, acct: bob.acct }] + expect(response.parsed_body[:unexpected_accounts].map { |a| a.slice(:id, :acct) }).to match [{ id: bob.id.to_s, acct: bob.acct }] end end diff --git a/spec/requests/api/v1/suggestions_spec.rb b/spec/requests/api/v1/suggestions_spec.rb index b900c910df..8267bb92a0 100644 --- a/spec/requests/api/v1/suggestions_spec.rb +++ b/spec/requests/api/v1/suggestions_spec.rb @@ -32,7 +32,7 @@ RSpec.describe 'Suggestions' do it 'returns accounts' do subject - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly(include(id: bob.id.to_s), include(id: jeff.id.to_s)) end @@ -42,7 +42,7 @@ RSpec.describe 'Suggestions' do it 'returns only the requested number of accounts' do subject - expect(body_as_json.size).to eq 1 + expect(response.parsed_body.size).to eq 1 end end diff --git a/spec/requests/api/v1/tags_spec.rb b/spec/requests/api/v1/tags_spec.rb index db74a6f037..9637823d45 100644 --- a/spec/requests/api/v1/tags_spec.rb +++ b/spec/requests/api/v1/tags_spec.rb @@ -21,7 +21,7 @@ RSpec.describe 'Tags' do subject expect(response).to have_http_status(200) - expect(body_as_json[:name]).to eq(name) + expect(response.parsed_body[:name]).to eq(name) end end diff --git a/spec/requests/api/v1/timelines/home_spec.rb b/spec/requests/api/v1/timelines/home_spec.rb index 9dd102fcb6..afad2988ca 100644 --- a/spec/requests/api/v1/timelines/home_spec.rb +++ b/spec/requests/api/v1/timelines/home_spec.rb @@ -40,7 +40,7 @@ RSpec.describe 'Home', :inline_jobs do it 'returns the statuses of followed users' do subject - expect(body_as_json.pluck(:id)).to match_array(home_statuses.map { |status| status.id.to_s }) + expect(response.parsed_body.pluck(:id)).to match_array(home_statuses.map { |status| status.id.to_s }) end context 'with limit param' do @@ -49,7 +49,7 @@ RSpec.describe 'Home', :inline_jobs do it 'returns only the requested number of statuses' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end it 'sets the correct pagination headers', :aggregate_failures do diff --git a/spec/requests/api/v1/timelines/link_spec.rb b/spec/requests/api/v1/timelines/link_spec.rb index 67d8bca022..8999364703 100644 --- a/spec/requests/api/v1/timelines/link_spec.rb +++ b/spec/requests/api/v1/timelines/link_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'Link' do subject expect(response).to have_http_status(200) - expect(body_as_json.pluck(:id)).to match_array(expected_statuses.map { |status| status.id.to_s }) + expect(response.parsed_body.pluck(:id)).to match_array(expected_statuses.map { |status| status.id.to_s }) end end @@ -127,7 +127,7 @@ RSpec.describe 'Link' do subject expect(response).to have_http_status(200) - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end it 'sets the correct pagination headers', :aggregate_failures do diff --git a/spec/requests/api/v1/timelines/public_spec.rb b/spec/requests/api/v1/timelines/public_spec.rb index 1fc62b3932..759e236d05 100644 --- a/spec/requests/api/v1/timelines/public_spec.rb +++ b/spec/requests/api/v1/timelines/public_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'Public' do subject expect(response).to have_http_status(200) - expect(body_as_json.pluck(:id)).to match_array(expected_statuses.map { |status| status.id.to_s }) + expect(response.parsed_body.pluck(:id)).to match_array(expected_statuses.map { |status| status.id.to_s }) end end @@ -81,7 +81,7 @@ RSpec.describe 'Public' do subject expect(response).to have_http_status(200) - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end it 'sets the correct pagination headers', :aggregate_failures do diff --git a/spec/requests/api/v1/timelines/tag_spec.rb b/spec/requests/api/v1/timelines/tag_spec.rb index cfbfa0291c..03d34e59f1 100644 --- a/spec/requests/api/v1/timelines/tag_spec.rb +++ b/spec/requests/api/v1/timelines/tag_spec.rb @@ -19,7 +19,7 @@ RSpec.describe 'Tag' do expect(response) .to have_http_status(200) - expect(body_as_json.pluck(:id)) + expect(response.parsed_body.pluck(:id)) .to match_array(expected_statuses.map { |status| status.id.to_s }) .and not_include(private_status.id) end @@ -70,7 +70,7 @@ RSpec.describe 'Tag' do it 'returns only the requested number of statuses' do subject - expect(body_as_json.size).to eq(params[:limit]) + expect(response.parsed_body.size).to eq(params[:limit]) end it 'sets the correct pagination headers', :aggregate_failures do diff --git a/spec/requests/api/v2/admin/accounts_spec.rb b/spec/requests/api/v2/admin/accounts_spec.rb index 8f52c6a613..17c38e2e55 100644 --- a/spec/requests/api/v2/admin/accounts_spec.rb +++ b/spec/requests/api/v2/admin/accounts_spec.rb @@ -76,7 +76,7 @@ RSpec.describe 'API V2 Admin Accounts' do end def body_json_ids - body_as_json.map { |a| a[:id].to_i } + response.parsed_body.map { |a| a[:id].to_i } end context 'with limit param' do diff --git a/spec/requests/api/v2/filters/keywords_spec.rb b/spec/requests/api/v2/filters/keywords_spec.rb index 69eff5a064..a31accaa5c 100644 --- a/spec/requests/api/v2/filters/keywords_spec.rb +++ b/spec/requests/api/v2/filters/keywords_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'API V2 Filters Keywords' do it 'returns http success' do get "/api/v2/filters/#{filter.id}/keywords", headers: headers expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly( include(id: keyword.id.to_s) ) @@ -42,7 +42,7 @@ RSpec.describe 'API V2 Filters Keywords' do it 'creates a filter', :aggregate_failures do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( keyword: 'magic', whole_word: false @@ -73,7 +73,7 @@ RSpec.describe 'API V2 Filters Keywords' do it 'responds with the keyword', :aggregate_failures do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( keyword: 'foo', whole_word: false diff --git a/spec/requests/api/v2/filters/statuses_spec.rb b/spec/requests/api/v2/filters/statuses_spec.rb index 5969327829..aed8934a5e 100644 --- a/spec/requests/api/v2/filters/statuses_spec.rb +++ b/spec/requests/api/v2/filters/statuses_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'API V2 Filters Statuses' do it 'returns http success' do get "/api/v2/filters/#{filter.id}/statuses", headers: headers expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to contain_exactly( include(id: status_filter.id.to_s) ) @@ -43,7 +43,7 @@ RSpec.describe 'API V2 Filters Statuses' do it 'creates a filter', :aggregate_failures do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( status_id: status.id.to_s ) @@ -73,7 +73,7 @@ RSpec.describe 'API V2 Filters Statuses' do it 'responds with the filter', :aggregate_failures do expect(response).to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( status_id: status_filter.status.id.to_s ) diff --git a/spec/requests/api/v2/filters_spec.rb b/spec/requests/api/v2/filters_spec.rb index 036a6a65a9..850c773df3 100644 --- a/spec/requests/api/v2/filters_spec.rb +++ b/spec/requests/api/v2/filters_spec.rb @@ -32,7 +32,7 @@ RSpec.describe 'Filters' do subject expect(response).to have_http_status(200) - expect(body_as_json.pluck(:id)).to match_array(filters.map { |filter| filter.id.to_s }) + expect(response.parsed_body.pluck(:id)).to match_array(filters.map { |filter| filter.id.to_s }) end end @@ -58,7 +58,7 @@ RSpec.describe 'Filters' do it 'returns a filter with keywords', :aggregate_failures do subject - expect(body_as_json) + expect(response.parsed_body) .to include( title: 'magic', filter_action: 'hide', @@ -127,7 +127,10 @@ RSpec.describe 'Filters' do subject expect(response).to have_http_status(200) - expect(body_as_json[:id]).to eq(filter.id.to_s) + expect(response.parsed_body) + .to include( + id: filter.id.to_s + ) end context 'when the filter belongs to someone else' do diff --git a/spec/requests/api/v2/instance_spec.rb b/spec/requests/api/v2/instance_spec.rb index 2f01db5003..d484dc7c46 100644 --- a/spec/requests/api/v2/instance_spec.rb +++ b/spec/requests/api/v2/instance_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'Instances' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and include(title: 'Mastodon') .and include_api_versions @@ -30,7 +30,7 @@ RSpec.describe 'Instances' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_present .and include(title: 'Mastodon') .and include_api_versions diff --git a/spec/requests/api/v2/media_spec.rb b/spec/requests/api/v2/media_spec.rb index 97540413f1..06ce0053e8 100644 --- a/spec/requests/api/v2/media_spec.rb +++ b/spec/requests/api/v2/media_spec.rb @@ -21,7 +21,7 @@ RSpec.describe 'Media API', :attachment_processing do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to be_a(Hash) end end @@ -38,7 +38,7 @@ RSpec.describe 'Media API', :attachment_processing do expect(response) .to have_http_status(202) - expect(body_as_json) + expect(response.parsed_body) .to be_a(Hash) end end @@ -63,7 +63,7 @@ RSpec.describe 'Media API', :attachment_processing do expect(response) .to have_http_status(422) - expect(body_as_json) + expect(response.parsed_body) .to be_a(Hash) .and include(error: /File type/) end @@ -80,7 +80,7 @@ RSpec.describe 'Media API', :attachment_processing do expect(response) .to have_http_status(500) - expect(body_as_json) + expect(response.parsed_body) .to be_a(Hash) .and include(error: /processing/) end diff --git a/spec/requests/api/v2/notifications/policies_spec.rb b/spec/requests/api/v2/notifications/policies_spec.rb index f9860b5fb4..dc205b6ebb 100644 --- a/spec/requests/api/v2/notifications/policies_spec.rb +++ b/spec/requests/api/v2/notifications/policies_spec.rb @@ -26,7 +26,7 @@ RSpec.describe 'Policies' do subject expect(response).to have_http_status(200) - expect(body_as_json).to include( + expect(response.parsed_body).to include( for_not_following: 'accept', for_not_followers: 'accept', for_new_accounts: 'accept', @@ -56,7 +56,7 @@ RSpec.describe 'Policies' do .and change { NotificationPolicy.find_or_initialize_by(account: user.account).for_limited_accounts.to_sym }.from(:filter).to(:drop) expect(response).to have_http_status(200) - expect(body_as_json).to include( + expect(response.parsed_body).to include( for_not_following: 'filter', for_not_followers: 'accept', for_new_accounts: 'accept', diff --git a/spec/requests/api/v2/search_spec.rb b/spec/requests/api/v2/search_spec.rb index 039e7513cd..a59ec7ca6b 100644 --- a/spec/requests/api/v2/search_spec.rb +++ b/spec/requests/api/v2/search_spec.rb @@ -27,7 +27,7 @@ RSpec.describe 'Search API' do it 'returns all matching accounts' do get '/api/v2/search', headers: headers, params: params - expect(body_as_json[:accounts].pluck(:id)).to contain_exactly(bob.id.to_s, ana.id.to_s, tom.id.to_s) + expect(response.parsed_body[:accounts].pluck(:id)).to contain_exactly(bob.id.to_s, ana.id.to_s, tom.id.to_s) end context 'with truthy `resolve`' do @@ -80,7 +80,7 @@ RSpec.describe 'Search API' do it 'returns only the followed accounts' do get '/api/v2/search', headers: headers, params: params - expect(body_as_json[:accounts].pluck(:id)).to contain_exactly(ana.id.to_s) + expect(response.parsed_body[:accounts].pluck(:id)).to contain_exactly(ana.id.to_s) end end end diff --git a/spec/requests/api/v2/suggestions_spec.rb b/spec/requests/api/v2/suggestions_spec.rb index 8895efd23d..e92507ed66 100644 --- a/spec/requests/api/v2/suggestions_spec.rb +++ b/spec/requests/api/v2/suggestions_spec.rb @@ -22,7 +22,7 @@ RSpec.describe 'Suggestions API' do expect(response).to have_http_status(200) - expect(body_as_json).to match_array( + expect(response.parsed_body).to match_array( [bob, jeff].map do |account| hash_including({ source: 'staff', diff --git a/spec/requests/api/v2_alpha/notifications/accounts_spec.rb b/spec/requests/api/v2_alpha/notifications/accounts_spec.rb index 6a6ce043d3..3c5bcd8996 100644 --- a/spec/requests/api/v2_alpha/notifications/accounts_spec.rb +++ b/spec/requests/api/v2_alpha/notifications/accounts_spec.rb @@ -33,7 +33,7 @@ RSpec.describe 'Accounts in grouped notifications' do # The group we are interested in is only favorites notifications = user.account.notifications.where(type: 'favourite').reorder(id: :desc) - expect(body_as_json).to match( + expect(response.parsed_body).to match( [ a_hash_including( id: notifications.first.from_account_id.to_s @@ -58,7 +58,7 @@ RSpec.describe 'Accounts in grouped notifications' do # The group we are interested in is only favorites notifications = user.account.notifications.where(type: 'favourite').reorder(id: :desc) - expect(body_as_json).to match( + expect(response.parsed_body).to match( [ a_hash_including( id: notifications.first.from_account_id.to_s diff --git a/spec/requests/api/v2_alpha/notifications_spec.rb b/spec/requests/api/v2_alpha/notifications_spec.rb index 8009e7edce..b7821de561 100644 --- a/spec/requests/api/v2_alpha/notifications_spec.rb +++ b/spec/requests/api/v2_alpha/notifications_spec.rb @@ -31,7 +31,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 4 + expect(response.parsed_body[:count]).to eq 4 end end @@ -42,7 +42,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 5 + expect(response.parsed_body[:count]).to eq 5 end end @@ -56,7 +56,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 2 + expect(response.parsed_body[:count]).to eq 2 end end @@ -67,7 +67,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 3 + expect(response.parsed_body[:count]).to eq 3 end end @@ -78,7 +78,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq 2 + expect(response.parsed_body[:count]).to eq 2 end end @@ -91,7 +91,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:count]).to eq Api::V2Alpha::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT + expect(response.parsed_body[:count]).to eq Api::V2Alpha::NotificationsController::DEFAULT_NOTIFICATIONS_COUNT_LIMIT end end end @@ -125,7 +125,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:notification_groups]).to eq [] + expect(response.parsed_body[:notification_groups]).to eq [] end end @@ -145,7 +145,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:notification_groups]).to contain_exactly( + expect(response.parsed_body[:notification_groups]).to contain_exactly( a_hash_including( type: 'reblog', sample_account_ids: [bob.account_id.to_s] @@ -177,7 +177,7 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json.size).to_not eq 0 + expect(response.parsed_body.size).to_not eq 0 expect(body_json_types.uniq).to_not include 'mention' end end @@ -190,7 +190,7 @@ RSpec.describe 'Notifications' do expect(response).to have_http_status(200) expect(body_json_types.uniq).to eq ['mention'] - expect(body_as_json.dig(:notification_groups, 0, :page_min_id)).to_not be_nil + expect(response.parsed_body.dig(:notification_groups, 0, :page_min_id)).to_not be_nil end end @@ -201,7 +201,7 @@ RSpec.describe 'Notifications' do it 'returns the requested number of notifications paginated', :aggregate_failures do subject - expect(body_as_json[:notification_groups].size) + expect(response.parsed_body[:notification_groups].size) .to eq(params[:limit]) expect(response) @@ -221,7 +221,7 @@ RSpec.describe 'Notifications' do it 'returns the requested number of notifications paginated', :aggregate_failures do subject - expect(body_as_json[:notification_groups].size) + expect(response.parsed_body[:notification_groups].size) .to eq(2) expect(response) @@ -247,10 +247,10 @@ RSpec.describe 'Notifications' do subject expect(response).to have_http_status(200) - expect(body_as_json[:partial_accounts].size).to be > 0 - expect(body_as_json[:partial_accounts][0].keys.map(&:to_sym)).to contain_exactly(:acct, :avatar, :avatar_static, :bot, :id, :locked, :url) - expect(body_as_json[:partial_accounts].pluck(:id)).to_not include(recent_account.id.to_s) - expect(body_as_json[:accounts].pluck(:id)).to include(recent_account.id.to_s) + expect(response.parsed_body[:partial_accounts].size).to be > 0 + expect(response.parsed_body[:partial_accounts][0].keys.map(&:to_sym)).to contain_exactly(:acct, :avatar, :avatar_static, :bot, :id, :locked, :url) + expect(response.parsed_body[:partial_accounts].pluck(:id)).to_not include(recent_account.id.to_s) + expect(response.parsed_body[:accounts].pluck(:id)).to include(recent_account.id.to_s) end end @@ -265,7 +265,7 @@ RSpec.describe 'Notifications' do end def body_json_types - body_as_json[:notification_groups].pluck(:type) + response.parsed_body[:notification_groups].pluck(:type) end end diff --git a/spec/requests/api/web/embeds_spec.rb b/spec/requests/api/web/embeds_spec.rb index 0e6195204b..2b28502835 100644 --- a/spec/requests/api/web/embeds_spec.rb +++ b/spec/requests/api/web/embeds_spec.rb @@ -18,7 +18,7 @@ RSpec.describe '/api/web/embed' do subject expect(response).to have_http_status(200) - expect(body_as_json[:html]).to be_present + expect(response.parsed_body[:html]).to be_present end end @@ -71,7 +71,7 @@ RSpec.describe '/api/web/embed' do subject expect(response).to have_http_status(200) - expect(body_as_json[:html]).to be_present + expect(response.parsed_body[:html]).to be_present end context 'when the requesting user is blocked' do @@ -133,7 +133,7 @@ RSpec.describe '/api/web/embed' do subject expect(response).to have_http_status(200) - expect(body_as_json[:html]).to be_present + expect(response.parsed_body[:html]).to be_present end end diff --git a/spec/requests/emojis_spec.rb b/spec/requests/emojis_spec.rb index b2e4702f2d..644838dc65 100644 --- a/spec/requests/emojis_spec.rb +++ b/spec/requests/emojis_spec.rb @@ -11,7 +11,7 @@ RSpec.describe 'Emojis' do expect(response) .to have_http_status(200) - expect(body_as_json) + expect(response.parsed_body) .to include( name: ':coolcat:', type: 'Emoji' diff --git a/spec/requests/instance_actor_spec.rb b/spec/requests/instance_actor_spec.rb index bb294b04a4..b4a9b2ce6f 100644 --- a/spec/requests/instance_actor_spec.rb +++ b/spec/requests/instance_actor_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'Instance actor endpoint' do .and have_cacheable_headers expect(response.content_type) .to start_with('application/activity+json') - expect(body_as_json) + expect(response.parsed_body) .to include( id: instance_actor_url, type: 'Application', diff --git a/spec/requests/invite_spec.rb b/spec/requests/invite_spec.rb index 4ce6c78e94..ba04645389 100644 --- a/spec/requests/invite_spec.rb +++ b/spec/requests/invite_spec.rb @@ -12,7 +12,7 @@ RSpec.describe 'invites' do expect(response).to have_http_status(200) expect(response.media_type).to eq 'application/json' - expect(body_as_json[:invite_code]).to eq invite.code + expect(response.parsed_body[:invite_code]).to eq invite.code end end diff --git a/spec/requests/log_out_spec.rb b/spec/requests/log_out_spec.rb index 62ede0c106..25291fa796 100644 --- a/spec/requests/log_out_spec.rb +++ b/spec/requests/log_out_spec.rb @@ -24,7 +24,7 @@ RSpec.describe 'Log Out' do expect(response).to have_http_status(200) expect(response.media_type).to eq 'application/json' - expect(body_as_json[:redirect_to]).to eq '/auth/sign_in' + expect(response.parsed_body[:redirect_to]).to eq '/auth/sign_in' end end end diff --git a/spec/requests/manifest_spec.rb b/spec/requests/manifest_spec.rb index 69e308e3ce..8133c90ee5 100644 --- a/spec/requests/manifest_spec.rb +++ b/spec/requests/manifest_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'Manifest' do .and have_attributes( content_type: match('application/json') ) - expect(body_as_json) + expect(response.parsed_body) .to include( id: '/home', name: 'Mastodon' diff --git a/spec/requests/oauth/token_spec.rb b/spec/requests/oauth/token_spec.rb index 39ea9b35ff..18d232e5ab 100644 --- a/spec/requests/oauth/token_spec.rb +++ b/spec/requests/oauth/token_spec.rb @@ -34,7 +34,7 @@ RSpec.describe 'Obtaining OAuth Tokens' do subject expect(response).to have_http_status(200) - expect(body_as_json[:scope]).to eq 'read write' + expect(response.parsed_body[:scope]).to eq 'read write' end end @@ -76,7 +76,7 @@ RSpec.describe 'Obtaining OAuth Tokens' do subject expect(response).to have_http_status(200) - expect(body_as_json[:scope]).to eq('read') + expect(response.parsed_body[:scope]).to eq('read') end end @@ -88,7 +88,7 @@ RSpec.describe 'Obtaining OAuth Tokens' do subject expect(response).to have_http_status(200) - expect(body_as_json[:scope]).to eq 'read write' + expect(response.parsed_body[:scope]).to eq 'read write' end end diff --git a/spec/requests/signature_verification_spec.rb b/spec/requests/signature_verification_spec.rb index 580d028338..128e7c0787 100644 --- a/spec/requests/signature_verification_spec.rb +++ b/spec/requests/signature_verification_spec.rb @@ -50,7 +50,7 @@ RSpec.describe 'signature verification concern' do get '/activitypub/success' expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: false, signature_actor_id: nil, error: 'Request not signed' @@ -62,7 +62,7 @@ RSpec.describe 'signature verification concern' do get '/activitypub/signature_required' expect(response).to have_http_status(401) - expect(body_as_json).to match( + expect(response.parsed_body).to match( error: 'Request not signed' ) end @@ -87,7 +87,7 @@ RSpec.describe 'signature verification concern' do } expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: actor.id.to_s ) @@ -109,7 +109,7 @@ RSpec.describe 'signature verification concern' do } expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: actor.id.to_s ) @@ -131,7 +131,7 @@ RSpec.describe 'signature verification concern' do } expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: actor.id.to_s ) @@ -152,7 +152,7 @@ RSpec.describe 'signature verification concern' do 'Signature' => signature_header, } - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: anything @@ -168,7 +168,7 @@ RSpec.describe 'signature verification concern' do 'Signature' => 'keyId="https://remote.domain/users/bob#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="Z8ilar3J7bOwqZkMp7sL8sRs4B1FT+UorbmvWoE+A5UeoOJ3KBcUmbsh+k3wQwbP5gMNUrra9rEWabpasZGphLsbDxfbsWL3Cf0PllAc7c1c7AFEwnewtExI83/qqgEkfWc2z7UDutXc2NfgAx89Ox8DXU/fA2GG0jILjB6UpFyNugkY9rg6oI31UnvfVi3R7sr3/x8Ea3I9thPvqI2byF6cojknSpDAwYzeKdngX3TAQEGzFHz3SDWwyp3jeMWfwvVVbM38FxhvAnSumw7YwWW4L7M7h4M68isLimoT3yfCn2ucBVL5Dz8koBpYf/40w7QidClAwCafZQFC29yDOg=="', # rubocop:disable Layout/LineLength } - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: anything @@ -184,7 +184,7 @@ RSpec.describe 'signature verification concern' do 'Signature' => 'keyId="https://remote.domain/users/bob#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="Z8ilar3J7bOwqZkMp7sL8sRs4B1FT+UorbmvWoE+A5UeoOJ3KBcUmbsh+k3wQwbP5gMNUrra9rEWabpasZGphLsbDxfbsWL3Cf0PllAc7c1c7AFEwnewtExI83/qqgEkfWc2z7UDutXc2NfgAx89Ox8DXU/fA2GG0jILjB6UpFyNugkY9rg6oI31UnvfVi3R7sr3/x8Ea3I9thPvqI2byF6cojknSpDAwYzeKdngX3TAQEGzFHz3SDWwyp3jeMWfwvVVbM38FxhvAnSumw7YwWW4L7M7h4M68isLimoT3yfCn2ucBVL5Dz8koBpYf/40w7QidClAwCafZQFC29yDOg=="', # rubocop:disable Layout/LineLength } - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: anything @@ -206,7 +206,7 @@ RSpec.describe 'signature verification concern' do 'Signature' => signature_header, } - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: 'Invalid Date header: not RFC 2616 compliant date: "wrong date"' @@ -228,7 +228,7 @@ RSpec.describe 'signature verification concern' do 'Signature' => signature_header, } - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: 'Signed request date outside acceptable time window' @@ -254,7 +254,7 @@ RSpec.describe 'signature verification concern' do } expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: actor.id.to_s ) @@ -278,7 +278,7 @@ RSpec.describe 'signature verification concern' do 'Signature' => signature_header, } - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: 'Mastodon requires the Digest header to be signed when doing a POST request' @@ -303,7 +303,7 @@ RSpec.describe 'signature verification concern' do 'Signature' => signature_header, } - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: 'Invalid Digest value. Computed SHA-256 digest: wFNeS+K3n/2TKRMFQ2v4iTFOSj+uwF7P/Lt98xrZ5Ro=; given: ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=' @@ -321,7 +321,7 @@ RSpec.describe 'signature verification concern' do } expect(response).to have_http_status(200) - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: anything @@ -342,7 +342,7 @@ RSpec.describe 'signature verification concern' do 'Signature' => 'keyId="https://remote.domain/users/alice#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="Z8ilar3J7bOwqZkMp7sL8sRs4B1FT+UorbmvWoE+A5UeoOJ3KBcUmbsh+k3wQwbP5gMNUrra9rEWabpasZGphLsbDxfbsWL3Cf0PllAc7c1c7AFEwnewtExI83/qqgEkfWc2z7UDutXc2NfgAx89Ox8DXU/fA2GG0jILjB6UpFyNugkY9rg6oI31UnvfVi3R7sr3/x8Ea3I9thPvqI2byF6cojknSpDAwYzeKdngX3TAQEGzFHz3SDWwyp3jeMWfwvVVbM38FxhvAnSumw7YwWW4L7M7h4M68isLimoT3yfCn2ucBVL5Dz8koBpYf/40w7QidClAwCafZQFC29yDOg=="', # rubocop:disable Layout/LineLength } - expect(body_as_json).to match( + expect(response.parsed_body).to match( signed_request: true, signature_actor_id: nil, error: 'Unable to fetch key JSON at https://remote.domain/users/alice#main-key' diff --git a/spec/requests/well_known/node_info_spec.rb b/spec/requests/well_known/node_info_spec.rb index d02732c32b..3d5afc7e2d 100644 --- a/spec/requests/well_known/node_info_spec.rb +++ b/spec/requests/well_known/node_info_spec.rb @@ -13,7 +13,7 @@ RSpec.describe 'The well-known node-info endpoints' do media_type: 'application/json' ) - expect(body_as_json).to include( + expect(response.parsed_body).to include( links: be_an(Array).and( contain_exactly( include( @@ -39,7 +39,7 @@ RSpec.describe 'The well-known node-info endpoints' do expect(non_matching_hash) .to_not match_json_schema('nodeinfo_2.0') - expect(body_as_json) + expect(response.parsed_body) .to match_json_schema('nodeinfo_2.0') .and include( version: '2.0', diff --git a/spec/requests/well_known/oauth_metadata_spec.rb b/spec/requests/well_known/oauth_metadata_spec.rb index 378295b5a3..9c86dbedfe 100644 --- a/spec/requests/well_known/oauth_metadata_spec.rb +++ b/spec/requests/well_known/oauth_metadata_spec.rb @@ -21,7 +21,7 @@ RSpec.describe 'The /.well-known/oauth-authorization-server request' do grant_types_supported = Doorkeeper.configuration.grant_flows.dup grant_types_supported << 'refresh_token' if Doorkeeper.configuration.refresh_token_enabled? - expect(body_as_json).to include( + expect(response.parsed_body).to include( issuer: root_url(protocol: protocol), service_documentation: 'https://docs.joinmastodon.org/', authorization_endpoint: oauth_authorization_url(protocol: protocol), diff --git a/spec/requests/well_known/webfinger_spec.rb b/spec/requests/well_known/webfinger_spec.rb index e5ce352d50..6880ba4b58 100644 --- a/spec/requests/well_known/webfinger_spec.rb +++ b/spec/requests/well_known/webfinger_spec.rb @@ -24,7 +24,7 @@ RSpec.describe 'The /.well-known/webfinger endpoint' do expect(response.media_type).to eq 'application/jrd+json' - expect(body_as_json) + expect(response.parsed_body) .to include( subject: eq('acct:alice@cb6e6126.ngrok.io'), aliases: include('https://cb6e6126.ngrok.io/@alice', 'https://cb6e6126.ngrok.io/users/alice') @@ -129,7 +129,7 @@ RSpec.describe 'The /.well-known/webfinger endpoint' do end it 'returns links for the internal account' do - expect(body_as_json) + expect(response.parsed_body) .to include( subject: 'acct:mastodon.internal@cb6e6126.ngrok.io', aliases: ['https://cb6e6126.ngrok.io/actor'] @@ -168,7 +168,7 @@ RSpec.describe 'The /.well-known/webfinger endpoint' do it 'returns avatar in response' do perform_request! - avatar_link = get_avatar_link(body_as_json) + avatar_link = get_avatar_link(response.parsed_body) expect(avatar_link).to_not be_nil expect(avatar_link[:type]).to eq alice.avatar.content_type expect(avatar_link[:href]).to eq Addressable::URI.new(host: Rails.configuration.x.local_domain, path: alice.avatar.to_s, scheme: 'https').to_s @@ -182,7 +182,7 @@ RSpec.describe 'The /.well-known/webfinger endpoint' do it 'does not return avatar in response' do perform_request! - avatar_link = get_avatar_link(body_as_json) + avatar_link = get_avatar_link(response.parsed_body) expect(avatar_link).to be_nil end end @@ -197,7 +197,7 @@ RSpec.describe 'The /.well-known/webfinger endpoint' do it 'does not return avatar in response' do perform_request! - avatar_link = get_avatar_link(body_as_json) + avatar_link = get_avatar_link(response.parsed_body) expect(avatar_link).to be_nil end end @@ -212,7 +212,7 @@ RSpec.describe 'The /.well-known/webfinger endpoint' do end it 'does not return avatar in response' do - avatar_link = get_avatar_link(body_as_json) + avatar_link = get_avatar_link(response.parsed_body) expect(avatar_link).to be_nil end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 60bec918ea..2a27544407 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -34,10 +34,6 @@ RSpec.configure do |config| end end -def body_as_json - response.parsed_body -end - def serialized_record_json(record, serializer, adapter: nil) options = { serializer: serializer } options[:adapter] = adapter if adapter.present? From ebf09328d4b17ad199ecfe364b84aa9b3da3f9b3 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 6 Sep 2024 12:58:53 +0200 Subject: [PATCH 07/17] Disable codecov github annotations (#31783) --- .github/codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/codecov.yml b/.github/codecov.yml index 701ba3af8f..d9b43b2594 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -1,3 +1,4 @@ +annotations: false comment: false # Do not leave PR comments coverage: status: From 1fed11cfa77c12135c68d5eff8c0d8760605b2b2 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 6 Sep 2024 14:33:38 +0200 Subject: [PATCH 08/17] Target firefox all the way back to Firefox 78 (#31782) --- .browserslistrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.browserslistrc b/.browserslistrc index 0376af4bcc..6367e4d358 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -1,6 +1,7 @@ [production] defaults > 0.2% +firefox >= 78 ios >= 15.6 not dead not OperaMini all From fd7fc7bdc36ea559d70edfa8cc811bed18baefc9 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Fri, 6 Sep 2024 14:50:30 +0200 Subject: [PATCH 09/17] Disable actions on reports that have already been taken (#31773) --- app/models/admin/account_action.rb | 8 ++++++++ app/views/admin/account_actions/new.html.haml | 8 ++++++++ app/views/admin/reports/_actions.html.haml | 12 +++++++++--- config/locales/en.yml | 3 +++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb index 3700ce4cd6..4be58ba853 100644 --- a/app/models/admin/account_action.rb +++ b/app/models/admin/account_action.rb @@ -73,6 +73,14 @@ class Admin::AccountAction end end + def disabled_types_for_account(account) + if account.suspended? + %w(silence suspend) + elsif account.silenced? + %w(silence) + end + end + def i18n_scope :activerecord end diff --git a/app/views/admin/account_actions/new.html.haml b/app/views/admin/account_actions/new.html.haml index bce1c31760..5b98582d8c 100644 --- a/app/views/admin/account_actions/new.html.haml +++ b/app/views/admin/account_actions/new.html.haml @@ -1,6 +1,13 @@ - content_for :page_title do = t('admin.account_actions.title', acct: @account.pretty_acct) +- if @account.suspended? + .flash-message.alert + = t('admin.account_actions.already_suspended') +- elsif @account.silenced? + .flash-message.warn + = t('admin.account_actions.already_silenced') + = simple_form_for @account_action, url: admin_account_action_path(@account.id) do |f| = f.input :report_id, as: :hidden @@ -9,6 +16,7 @@ = f.input :type, as: :radio_buttons, collection: Admin::AccountAction.types_for_account(@account), + disabled: Admin::AccountAction.disabled_types_for_account(@account), hint: t('simple_form.hints.admin_account_action.type_html', acct: @account.pretty_acct), include_blank: false, label_method: ->(type) { account_action_type_label(type) }, diff --git a/app/views/admin/reports/_actions.html.haml b/app/views/admin/reports/_actions.html.haml index 5fb540931b..7317d401e7 100644 --- a/app/views/admin/reports/_actions.html.haml +++ b/app/views/admin/reports/_actions.html.haml @@ -17,21 +17,27 @@ .report-actions__item__button = form.button t('admin.reports.delete_and_resolve'), name: :delete, - class: 'button button--destructive' + class: 'button button--destructive', + disabled: statuses.empty?, + title: statuses.empty? ? t('admin.reports.actions_no_posts') : '' .report-actions__item__description = t('admin.reports.actions.delete_description_html') .report-actions__item .report-actions__item__button = form.button t('admin.accounts.silence'), name: :silence, - class: 'button button--destructive' + class: 'button button--destructive', + disabled: report.target_account.silenced? || report.target_account.suspended?, + title: report.target_account.silenced? ? t('admin.account_actions.already_silenced') : '' .report-actions__item__description = t('admin.reports.actions.silence_description_html') .report-actions__item .report-actions__item__button = form.button t('admin.accounts.suspend'), name: :suspend, - class: 'button button--destructive' + class: 'button button--destructive', + disabled: report.target_account.suspended?, + title: report.target_account.suspended? ? t('admin.account_actions.already_suspended') : '' .report-actions__item__description = t('admin.reports.actions.suspend_description_html') .report-actions__item diff --git a/config/locales/en.yml b/config/locales/en.yml index 267e04618b..217b1537f4 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -25,6 +25,8 @@ en: admin: account_actions: action: Perform action + already_silenced: This account has already been silenced. + already_suspended: This account has already been suspended. title: Perform moderation action on %{acct} account_moderation_notes: create: Leave note @@ -602,6 +604,7 @@ en: suspend_description_html: The account and all its contents will be inaccessible and eventually deleted, and interacting with it will be impossible. Reversible within 30 days. Closes all reports against this account. actions_description_html: Decide which action to take to resolve this report. If you take a punitive action against the reported account, an email notification will be sent to them, except when the Spam category is selected. actions_description_remote_html: Decide which action to take to resolve this report. This will only affect how your server communicates with this remote account and handle its content. + actions_no_posts: This report doesn't have any associated posts to delete add_to_report: Add more to report already_suspended_badges: local: Already suspended on this server From a9d0b48b6566f5e06337a84745cdd624a6b31426 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 6 Sep 2024 09:58:46 -0400 Subject: [PATCH 10/17] Set "admin" body class from `admin` nested layout (#31269) --- app/controllers/admin/base_controller.rb | 5 ----- app/controllers/auth/registrations_controller.rb | 5 ----- app/controllers/disputes/base_controller.rb | 5 ----- app/controllers/filters/statuses_controller.rb | 5 ----- app/controllers/filters_controller.rb | 5 ----- app/controllers/invites_controller.rb | 5 ----- .../oauth/authorized_applications_controller.rb | 5 ----- app/controllers/relationships_controller.rb | 5 ----- app/controllers/settings/base_controller.rb | 5 ----- app/controllers/severed_relationships_controller.rb | 5 ----- app/controllers/statuses_cleanup_controller.rb | 5 ----- app/helpers/application_helper.rb | 1 + app/views/layouts/admin.html.haml | 2 ++ spec/helpers/application_helper_spec.rb | 11 ++++++++++- 14 files changed, 13 insertions(+), 56 deletions(-) diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index 4b5afbe157..48685db17a 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -7,17 +7,12 @@ module Admin layout 'admin' - before_action :set_body_classes before_action :set_cache_headers after_action :verify_authorized private - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index c12960934e..4d94c80158 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -11,7 +11,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:create] before_action :set_sessions, only: [:edit, :update] before_action :set_strikes, only: [:edit, :update] - before_action :set_body_classes, only: [:new, :create, :edit, :update] before_action :require_not_suspended!, only: [:update] before_action :set_cache_headers, only: [:edit, :update] before_action :set_rules, only: :new @@ -104,10 +103,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController private - def set_body_classes - @body_classes = 'admin' if %w(edit update).include?(action_name) - end - def set_invite @invite = begin invite = Invite.find_by(code: invite_code) if invite_code.present? diff --git a/app/controllers/disputes/base_controller.rb b/app/controllers/disputes/base_controller.rb index 1054f3db80..dd24a1b740 100644 --- a/app/controllers/disputes/base_controller.rb +++ b/app/controllers/disputes/base_controller.rb @@ -7,16 +7,11 @@ class Disputes::BaseController < ApplicationController skip_before_action :require_functional! - before_action :set_body_classes before_action :authenticate_user! before_action :set_cache_headers private - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/filters/statuses_controller.rb b/app/controllers/filters/statuses_controller.rb index 94993f938b..7ada13f680 100644 --- a/app/controllers/filters/statuses_controller.rb +++ b/app/controllers/filters/statuses_controller.rb @@ -6,7 +6,6 @@ class Filters::StatusesController < ApplicationController before_action :authenticate_user! before_action :set_filter before_action :set_status_filters - before_action :set_body_classes before_action :set_cache_headers PER_PAGE = 20 @@ -42,10 +41,6 @@ class Filters::StatusesController < ApplicationController 'remove' if params[:remove] end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb index bd9964426b..8c4e867e93 100644 --- a/app/controllers/filters_controller.rb +++ b/app/controllers/filters_controller.rb @@ -5,7 +5,6 @@ class FiltersController < ApplicationController before_action :authenticate_user! before_action :set_filter, only: [:edit, :update, :destroy] - before_action :set_body_classes before_action :set_cache_headers def index @@ -52,10 +51,6 @@ class FiltersController < ApplicationController params.require(:custom_filter).permit(:title, :expires_in, :filter_action, context: [], keywords_attributes: [:id, :keyword, :whole_word, :_destroy]) end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index 9bc5164d59..070852695e 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -6,7 +6,6 @@ class InvitesController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_body_classes before_action :set_cache_headers def index @@ -47,10 +46,6 @@ class InvitesController < ApplicationController params.require(:invite).permit(:max_uses, :expires_in, :autofollow, :comment) end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 7bb22453ca..267409a9ce 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -6,7 +6,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio before_action :store_current_location before_action :authenticate_resource_owner! before_action :require_not_suspended!, only: :destroy - before_action :set_body_classes before_action :set_cache_headers before_action :set_last_used_at_by_app, only: :index, unless: -> { request.format == :json } @@ -23,10 +22,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio private - def set_body_classes - @body_classes = 'admin' - end - def store_current_location store_location_for(:user, request.url) end diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb index dd794f3199..d351afcfb7 100644 --- a/app/controllers/relationships_controller.rb +++ b/app/controllers/relationships_controller.rb @@ -6,7 +6,6 @@ class RelationshipsController < ApplicationController before_action :authenticate_user! before_action :set_accounts, only: :show before_action :set_relationships, only: :show - before_action :set_body_classes before_action :set_cache_headers helper_method :following_relationship?, :followed_by_relationship?, :mutual_relationship? @@ -68,10 +67,6 @@ class RelationshipsController < ApplicationController end end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb index f15140aa2b..188334ac23 100644 --- a/app/controllers/settings/base_controller.rb +++ b/app/controllers/settings/base_controller.rb @@ -4,15 +4,10 @@ class Settings::BaseController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_body_classes before_action :set_cache_headers private - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/severed_relationships_controller.rb b/app/controllers/severed_relationships_controller.rb index 168e85e3fe..965753a26f 100644 --- a/app/controllers/severed_relationships_controller.rb +++ b/app/controllers/severed_relationships_controller.rb @@ -4,7 +4,6 @@ class SeveredRelationshipsController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_body_classes before_action :set_cache_headers before_action :set_event, only: [:following, :followers] @@ -51,10 +50,6 @@ class SeveredRelationshipsController < ApplicationController account.local? ? account.local_username_and_domain : account.acct end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/statuses_cleanup_controller.rb b/app/controllers/statuses_cleanup_controller.rb index 4a3fc10ca4..e517bf3ae8 100644 --- a/app/controllers/statuses_cleanup_controller.rb +++ b/app/controllers/statuses_cleanup_controller.rb @@ -5,7 +5,6 @@ class StatusesCleanupController < ApplicationController before_action :authenticate_user! before_action :set_policy - before_action :set_body_classes before_action :set_cache_headers def show; end @@ -34,10 +33,6 @@ class StatusesCleanupController < ApplicationController params.require(:account_statuses_cleanup_policy).permit(:enabled, :min_status_age, :keep_direct, :keep_pinned, :keep_polls, :keep_media, :keep_self_fav, :keep_self_bookmark, :min_favs, :min_reblogs) end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7c91df8d4f..de00f76d36 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -159,6 +159,7 @@ module ApplicationHelper def body_classes output = body_class_string.split + output << content_for(:body_classes) output << "theme-#{current_theme.parameterize}" output << 'system-font' if current_account&.user&.setting_system_font_ui output << (current_account&.user&.setting_reduce_motion ? 'reduce-motion' : 'no-reduce-motion') diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index ebd236c628..3f7727cdfb 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -3,6 +3,8 @@ = javascript_pack_tag 'public', crossorigin: 'anonymous' = javascript_pack_tag 'admin', async: true, crossorigin: 'anonymous' +- content_for :body_classes, 'admin' + - content_for :content do .admin-wrapper .sidebar-wrapper diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index c2e618c7de..0f78dc82f5 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -8,7 +8,16 @@ RSpec.describe ApplicationHelper do before { helper.extend controller_helpers } it 'uses the controller body classes in the result' do - expect(helper.body_classes).to match(/modal-layout compose-standalone/) + expect(helper.body_classes) + .to match(/modal-layout compose-standalone/) + .and match(/theme-default/) + end + + it 'includes values set via content_for' do + helper.content_for(:body_classes) { 'admin' } + + expect(helper.body_classes) + .to match(/admin/) end private From c88ba523ee6eebb11413690639818ef1c926399c Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Fri, 6 Sep 2024 16:58:36 +0200 Subject: [PATCH 11/17] Fix sort order of moderation notes on Reports and Accounts (#31528) --- .../account_moderation_notes_controller.rb | 2 +- app/controllers/admin/accounts_controller.rb | 2 +- .../admin/report_notes_controller.rb | 2 +- app/controllers/admin/reports_controller.rb | 2 +- app/models/account_moderation_note.rb | 2 +- app/models/report_note.rb | 2 +- .../admin/accounts_controller_spec.rb | 17 ++++++++++ .../admin/reports_controller_spec.rb | 18 +++++++++++ .../account_moderation_note_fabricator.rb | 2 +- spec/fabricators/report_note_fabricator.rb | 2 +- spec/models/account_moderation_note_spec.rb | 31 +++++++++++++++++++ spec/models/report_note_spec.rb | 31 +++++++++++++++++++ 12 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 spec/models/account_moderation_note_spec.rb create mode 100644 spec/models/report_note_spec.rb diff --git a/app/controllers/admin/account_moderation_notes_controller.rb b/app/controllers/admin/account_moderation_notes_controller.rb index 8b6c1a4454..a3c4adf59a 100644 --- a/app/controllers/admin/account_moderation_notes_controller.rb +++ b/app/controllers/admin/account_moderation_notes_controller.rb @@ -13,7 +13,7 @@ module Admin redirect_to admin_account_path(@account_moderation_note.target_account_id), notice: I18n.t('admin.account_moderation_notes.created_msg') else @account = @account_moderation_note.target_account - @moderation_notes = @account.targeted_moderation_notes.latest + @moderation_notes = @account.targeted_moderation_notes.chronological.includes(:account) @warnings = @account.strikes.custom.latest render 'admin/accounts/show' diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index 9beb8fde6b..7b169ba26a 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -33,7 +33,7 @@ module Admin @deletion_request = @account.deletion_request @account_moderation_note = current_account.account_moderation_notes.new(target_account: @account) - @moderation_notes = @account.targeted_moderation_notes.latest + @moderation_notes = @account.targeted_moderation_notes.chronological.includes(:account) @warnings = @account.strikes.includes(:target_account, :account, :appeal).latest @domain_block = DomainBlock.rule_for(@account.domain) end diff --git a/app/controllers/admin/report_notes_controller.rb b/app/controllers/admin/report_notes_controller.rb index b5f04a1caa..6b16c29fc7 100644 --- a/app/controllers/admin/report_notes_controller.rb +++ b/app/controllers/admin/report_notes_controller.rb @@ -21,7 +21,7 @@ module Admin redirect_to after_create_redirect_path, notice: I18n.t('admin.report_notes.created_msg') else - @report_notes = @report.notes.includes(:account).order(id: :desc) + @report_notes = @report.notes.chronological.includes(:account) @action_logs = @report.history.includes(:target) @form = Admin::StatusBatchAction.new @statuses = @report.statuses.with_includes diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 00d200d7c8..aa877f1448 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -13,7 +13,7 @@ module Admin authorize @report, :show? @report_note = @report.notes.new - @report_notes = @report.notes.includes(:account).order(id: :desc) + @report_notes = @report.notes.chronological.includes(:account) @action_logs = @report.history.includes(:target) @form = Admin::StatusBatchAction.new @statuses = @report.statuses.with_includes diff --git a/app/models/account_moderation_note.rb b/app/models/account_moderation_note.rb index 79b8b4d25e..ca7f8e3d5f 100644 --- a/app/models/account_moderation_note.rb +++ b/app/models/account_moderation_note.rb @@ -18,7 +18,7 @@ class AccountModerationNote < ApplicationRecord belongs_to :account belongs_to :target_account, class_name: 'Account' - scope :latest, -> { reorder('created_at DESC') } + scope :chronological, -> { reorder(id: :asc) } validates :content, presence: true, length: { maximum: CONTENT_SIZE_LIMIT } end diff --git a/app/models/report_note.rb b/app/models/report_note.rb index 7361c97e67..9d3be52594 100644 --- a/app/models/report_note.rb +++ b/app/models/report_note.rb @@ -18,7 +18,7 @@ class ReportNote < ApplicationRecord belongs_to :account belongs_to :report, inverse_of: :notes, touch: true - scope :latest, -> { reorder(created_at: :desc) } + scope :chronological, -> { reorder(id: :asc) } validates :content, presence: true, length: { maximum: CONTENT_SIZE_LIMIT } end diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index ca399fbd9b..a182300106 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -55,6 +55,23 @@ RSpec.describe Admin::AccountsController do describe 'GET #show' do let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } + describe 'account moderation notes' do + let(:account) { Fabricate(:account) } + + it 'includes moderation notes' do + note1 = Fabricate(:account_moderation_note, target_account: account) + note2 = Fabricate(:account_moderation_note, target_account: account) + + get :show, params: { id: account.id } + expect(response).to have_http_status(200) + + moderation_notes = assigns(:moderation_notes).to_a + + expect(moderation_notes.size).to be 2 + expect(moderation_notes).to eq [note1, note2] + end + end + context 'with a remote account' do let(:account) { Fabricate(:account, domain: 'example.com') } diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb index d07468a37b..1252ceb1f4 100644 --- a/spec/controllers/admin/reports_controller_spec.rb +++ b/spec/controllers/admin/reports_controller_spec.rb @@ -47,6 +47,24 @@ RSpec.describe Admin::ReportsController do expect(response.body) .to include(report.comment) end + + describe 'account moderation notes' do + let(:report) { Fabricate(:report) } + + it 'includes moderation notes' do + note1 = Fabricate(:report_note, report: report) + note2 = Fabricate(:report_note, report: report) + + get :show, params: { id: report } + + expect(response).to have_http_status(200) + + report_notes = assigns(:report_notes).to_a + + expect(report_notes.size).to be 2 + expect(report_notes).to eq [note1, note2] + end + end end describe 'POST #resolve' do diff --git a/spec/fabricators/account_moderation_note_fabricator.rb b/spec/fabricators/account_moderation_note_fabricator.rb index 05a687bf4e..1ded862638 100644 --- a/spec/fabricators/account_moderation_note_fabricator.rb +++ b/spec/fabricators/account_moderation_note_fabricator.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true Fabricator(:account_moderation_note) do - content 'MyText' + content { Faker::Lorem.sentences } account { Fabricate.build(:account) } target_account { Fabricate.build(:account) } end diff --git a/spec/fabricators/report_note_fabricator.rb b/spec/fabricators/report_note_fabricator.rb index 080fad51ac..a5e9cc9009 100644 --- a/spec/fabricators/report_note_fabricator.rb +++ b/spec/fabricators/report_note_fabricator.rb @@ -3,5 +3,5 @@ Fabricator(:report_note) do report { Fabricate.build(:report) } account { Fabricate.build(:account) } - content 'Test Content' + content { Faker::Lorem.sentences } end diff --git a/spec/models/account_moderation_note_spec.rb b/spec/models/account_moderation_note_spec.rb new file mode 100644 index 0000000000..079774c492 --- /dev/null +++ b/spec/models/account_moderation_note_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AccountModerationNote do + describe 'chronological scope' do + it 'returns account moderation notes oldest to newest' do + account = Fabricate(:account) + note1 = Fabricate(:account_moderation_note, target_account: account) + note2 = Fabricate(:account_moderation_note, target_account: account) + + expect(account.targeted_moderation_notes.chronological).to eq [note1, note2] + end + end + + describe 'validations' do + it 'is invalid if the content is empty' do + report = Fabricate.build(:account_moderation_note, content: '') + expect(report.valid?).to be false + end + + it 'is invalid if content is longer than character limit' do + report = Fabricate.build(:account_moderation_note, content: comment_over_limit) + expect(report.valid?).to be false + end + + def comment_over_limit + Faker::Lorem.paragraph_by_chars(number: described_class::CONTENT_SIZE_LIMIT * 2) + end + end +end diff --git a/spec/models/report_note_spec.rb b/spec/models/report_note_spec.rb new file mode 100644 index 0000000000..417971c9a1 --- /dev/null +++ b/spec/models/report_note_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ReportNote do + describe 'chronological scope' do + it 'returns report notes oldest to newest' do + report = Fabricate(:report) + note1 = Fabricate(:report_note, report: report) + note2 = Fabricate(:report_note, report: report) + + expect(report.notes.chronological).to eq [note1, note2] + end + end + + describe 'validations' do + it 'is invalid if the content is empty' do + report = Fabricate.build(:report_note, content: '') + expect(report.valid?).to be false + end + + it 'is invalid if content is longer than character limit' do + report = Fabricate.build(:report_note, content: comment_over_limit) + expect(report.valid?).to be false + end + + def comment_over_limit + Faker::Lorem.paragraph_by_chars(number: described_class::CONTENT_SIZE_LIMIT * 2) + end + end +end From b530fc5267e14b4eab0322d63af94525e999fd39 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 6 Sep 2024 11:22:35 -0400 Subject: [PATCH 12/17] Update rails to version 7.1.4 (#31563) --- Gemfile.lock | 106 +++++++++--------- .../initializers/active_record_encryption.rb | 4 - 2 files changed, 53 insertions(+), 57 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8577a52691..a988ad3f21 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,35 +10,35 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) + actioncable (7.1.4) + actionpack (= 7.1.4) + activesupport (= 7.1.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.3.4) - actionpack (= 7.1.3.4) - activejob (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionmailbox (7.1.4) + actionpack (= 7.1.4) + activejob (= 7.1.4) + activerecord (= 7.1.4) + activestorage (= 7.1.4) + activesupport (= 7.1.4) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.3.4) - actionpack (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionmailer (7.1.4) + actionpack (= 7.1.4) + actionview (= 7.1.4) + activejob (= 7.1.4) + activesupport (= 7.1.4) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.3.4) - actionview (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionpack (7.1.4) + actionview (= 7.1.4) + activesupport (= 7.1.4) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -46,15 +46,15 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.3.4) - actionpack (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + actiontext (7.1.4) + actionpack (= 7.1.4) + activerecord (= 7.1.4) + activestorage (= 7.1.4) + activesupport (= 7.1.4) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.3.4) - activesupport (= 7.1.3.4) + actionview (7.1.4) + activesupport (= 7.1.4) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -64,22 +64,22 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (7.1.3.4) - activesupport (= 7.1.3.4) + activejob (7.1.4) + activesupport (= 7.1.4) globalid (>= 0.3.6) - activemodel (7.1.3.4) - activesupport (= 7.1.3.4) - activerecord (7.1.3.4) - activemodel (= 7.1.3.4) - activesupport (= 7.1.3.4) + activemodel (7.1.4) + activesupport (= 7.1.4) + activerecord (7.1.4) + activemodel (= 7.1.4) + activesupport (= 7.1.4) timeout (>= 0.4.0) - activestorage (7.1.3.4) - actionpack (= 7.1.3.4) - activejob (= 7.1.3.4) - activerecord (= 7.1.3.4) - activesupport (= 7.1.3.4) + activestorage (7.1.4) + actionpack (= 7.1.4) + activejob (= 7.1.4) + activerecord (= 7.1.4) + activesupport (= 7.1.4) marcel (~> 1.0) - activesupport (7.1.3.4) + activesupport (7.1.4) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -638,20 +638,20 @@ GEM rackup (1.0.0) rack (< 3) webrick - rails (7.1.3.4) - actioncable (= 7.1.3.4) - actionmailbox (= 7.1.3.4) - actionmailer (= 7.1.3.4) - actionpack (= 7.1.3.4) - actiontext (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activemodel (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + rails (7.1.4) + actioncable (= 7.1.4) + actionmailbox (= 7.1.4) + actionmailer (= 7.1.4) + actionpack (= 7.1.4) + actiontext (= 7.1.4) + actionview (= 7.1.4) + activejob (= 7.1.4) + activemodel (= 7.1.4) + activerecord (= 7.1.4) + activestorage (= 7.1.4) + activesupport (= 7.1.4) bundler (>= 1.15.0) - railties (= 7.1.3.4) + railties (= 7.1.4) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -666,9 +666,9 @@ GEM rails-i18n (7.0.9) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) + railties (7.1.4) + actionpack (= 7.1.4) + activesupport (= 7.1.4) irb rackup (>= 1.0.0) rake (>= 12.2) diff --git a/config/initializers/active_record_encryption.rb b/config/initializers/active_record_encryption.rb index a83ca80765..b7a874e404 100644 --- a/config/initializers/active_record_encryption.rb +++ b/config/initializers/active_record_encryption.rb @@ -38,8 +38,4 @@ Rails.application.configure do config.active_record.encryption.key_derivation_salt = ENV.fetch('ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT') config.active_record.encryption.primary_key = ENV.fetch('ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY') config.active_record.encryption.support_sha1_for_non_deterministic_encryption = true - - # TODO: https://github.com/rails/rails/issues/50604#issuecomment-1880990392 - # Remove after updating to Rails 7.1.4 - ActiveRecord::Encryption.configure(**config.active_record.encryption) end From 4f81ad249477ad25aea191b1987cddb4222e65ba Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 6 Sep 2024 12:46:25 -0400 Subject: [PATCH 13/17] Add coverage for `media#player`, move body class to view (#31790) --- app/controllers/media_controller.rb | 4 +--- app/views/media/player.html.haml | 2 ++ spec/system/media_spec.rb | 23 +++++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 spec/system/media_spec.rb diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb index 53eee40012..9d10468e69 100644 --- a/app/controllers/media_controller.rb +++ b/app/controllers/media_controller.rb @@ -19,9 +19,7 @@ class MediaController < ApplicationController redirect_to @media_attachment.file.url(:original) end - def player - @body_classes = 'player' - end + def player; end private diff --git a/app/views/media/player.html.haml b/app/views/media/player.html.haml index df02cc4110..6b6e566732 100644 --- a/app/views/media/player.html.haml +++ b/app/views/media/player.html.haml @@ -2,6 +2,8 @@ = render_initial_state = javascript_pack_tag 'public', crossorigin: 'anonymous' +- content_for :body_classes, 'player' + :ruby meta = @media_attachment.file.meta || {} diff --git a/spec/system/media_spec.rb b/spec/system/media_spec.rb new file mode 100644 index 0000000000..d014c7e88e --- /dev/null +++ b/spec/system/media_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Media' do + describe 'Player page' do + context 'when signed in' do + before { sign_in Fabricate(:user) } + + it 'visits the media player page and renders the media' do + status = Fabricate :status + media = Fabricate :media_attachment, type: :video + status.media_attachments << media + + visit medium_player_path(media) + + expect(page) + .to have_css('body', class: 'player') + .and have_css('div[data-component="Video"]') + end + end + end +end From 0a433d08fb51e0bfdd9e5f512af529f6abafa7a6 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 6 Sep 2024 12:46:55 -0400 Subject: [PATCH 14/17] Move shares/modal body class to layout (#31789) --- app/controllers/shares_controller.rb | 7 ------- app/views/layouts/modal.html.haml | 2 ++ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/app/controllers/shares_controller.rb b/app/controllers/shares_controller.rb index 6546b84978..1aa0ce5a0d 100644 --- a/app/controllers/shares_controller.rb +++ b/app/controllers/shares_controller.rb @@ -4,13 +4,6 @@ class SharesController < ApplicationController layout 'modal' before_action :authenticate_user! - before_action :set_body_classes def show; end - - private - - def set_body_classes - @body_classes = 'modal-layout compose-standalone' - end end diff --git a/app/views/layouts/modal.html.haml b/app/views/layouts/modal.html.haml index bbc9185f5b..91bcb7c422 100644 --- a/app/views/layouts/modal.html.haml +++ b/app/views/layouts/modal.html.haml @@ -1,6 +1,8 @@ - content_for :header_tags do = javascript_pack_tag 'public', crossorigin: 'anonymous' +- content_for :body_classes, 'modal-layout compose-standalone' + - content_for :content do - if user_signed_in? && !@hide_header .account-header From 7335a43b6dac0e82c305ce4dec9db4da114c769e Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 6 Sep 2024 12:52:35 -0400 Subject: [PATCH 15/17] Use async count in admin dashboard (#30606) --- app/controllers/admin/dashboard_controller.rb | 8 ++++---- app/views/admin/dashboard/index.html.haml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index 3a6df662ea..5b0867dcfb 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -7,12 +7,12 @@ module Admin def index authorize :dashboard, :index? + @pending_appeals_count = Appeal.pending.async_count + @pending_reports_count = Report.unresolved.async_count + @pending_tags_count = Tag.pending_review.async_count + @pending_users_count = User.pending.async_count @system_checks = Admin::SystemCheck.perform(current_user) @time_period = (29.days.ago.to_date...Time.now.utc.to_date) - @pending_users_count = User.pending.count - @pending_reports_count = Report.unresolved.count - @pending_tags_count = Tag.pending_review.count - @pending_appeals_count = Appeal.pending.count end end end diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 8430dd3c4f..27d8f4790b 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -56,19 +56,19 @@ .dashboard__item = link_to admin_reports_path, class: 'dashboard__quick-access' do - %span= t('admin.dashboard.pending_reports_html', count: @pending_reports_count) + %span= t('admin.dashboard.pending_reports_html', count: @pending_reports_count.value) = material_symbol 'chevron_right' = link_to admin_accounts_path(status: 'pending'), class: 'dashboard__quick-access' do - %span= t('admin.dashboard.pending_users_html', count: @pending_users_count) + %span= t('admin.dashboard.pending_users_html', count: @pending_users_count.value) = material_symbol 'chevron_right' = link_to admin_trends_tags_path(status: 'pending_review'), class: 'dashboard__quick-access' do - %span= t('admin.dashboard.pending_tags_html', count: @pending_tags_count) + %span= t('admin.dashboard.pending_tags_html', count: @pending_tags_count.value) = material_symbol 'chevron_right' = link_to admin_disputes_appeals_path(status: 'pending'), class: 'dashboard__quick-access' do - %span= t('admin.dashboard.pending_appeals_html', count: @pending_appeals_count) + %span= t('admin.dashboard.pending_appeals_html', count: @pending_appeals_count.value) = material_symbol 'chevron_right' .dashboard__item = react_admin_component :dimension, From b716248fc5bde4dc47b8104d092d092d87c50f1a Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 6 Sep 2024 19:21:49 +0200 Subject: [PATCH 16/17] Add link to `/admin/roles` in moderation interface when changing someone's role (#31791) --- app/views/admin/users/roles/show.html.haml | 3 ++- config/locales/en.yml | 1 + config/locales/simple_form.en.yml | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/admin/users/roles/show.html.haml b/app/views/admin/users/roles/show.html.haml index f26640f2a1..01b3830f4e 100644 --- a/app/views/admin/users/roles/show.html.haml +++ b/app/views/admin/users/roles/show.html.haml @@ -7,7 +7,8 @@ collection: UserRole.assignable, include_blank: I18n.t('admin.accounts.change_role.no_role'), label_method: :name, - wrapper: :with_block_label + wrapper: :with_block_label, + hint: safe_join([I18n.t('simple_form.hints.user.role'), ' ', link_to(I18n.t('admin.accounts.change_role.edit_roles'), admin_roles_path)]) .actions = f.button :button, diff --git a/config/locales/en.yml b/config/locales/en.yml index 217b1537f4..e8c9010486 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -48,6 +48,7 @@ en: title: Change email for %{username} change_role: changed_msg: Role successfully changed! + edit_roles: Manage user roles label: Change role no_role: No role title: Change role for %{username} diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index fee3a6151a..c1fae7e83e 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -130,7 +130,7 @@ en: name: You can only change the casing of the letters, for example, to make it more readable user: chosen_languages: When checked, only posts in selected languages will be displayed in public timelines - role: The role controls which permissions the user has + role: The role controls which permissions the user has. user_role: color: Color to be used for the role throughout the UI, as RGB in hex format highlighted: This makes the role publicly visible From af6ca96a4e1aa4fa718bc4929dab6618adf74c98 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 6 Sep 2024 20:00:19 +0200 Subject: [PATCH 17/17] Fix tests in glitch-soc --- spec/helpers/application_helper_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 50181fdb91..90dc0d36de 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -10,7 +10,8 @@ RSpec.describe ApplicationHelper do it 'uses the controller body classes in the result' do expect(helper.body_classes) .to match(/modal-layout compose-standalone/) - .and match(/theme-default/) + .and match(/flavour-glitch/) + .and match(/skin-default/) end it 'includes values set via content_for' do