fix: Return HTTP 422 when scheduled status time is less than 5 minutes (#30584)
This commit is contained in:
parent
9b6219c48f
commit
6cd9bd6ae1
3 changed files with 51 additions and 1 deletions
|
@ -171,7 +171,7 @@ class PostStatusService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
def scheduled_in_the_past?
|
def scheduled_in_the_past?
|
||||||
@scheduled_at.present? && @scheduled_at <= Time.now.utc + MIN_SCHEDULE_OFFSET
|
@scheduled_at.present? && @scheduled_at <= Time.now.utc
|
||||||
end
|
end
|
||||||
|
|
||||||
def bump_potential_friendship!
|
def bump_potential_friendship!
|
||||||
|
|
|
@ -182,6 +182,46 @@ RSpec.describe Api::V1::StatusesController do
|
||||||
expect(response.headers['X-RateLimit-Remaining']).to eq '0'
|
expect(response.headers['X-RateLimit-Remaining']).to eq '0'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with missing thread' do
|
||||||
|
subject { post :create, params: params }
|
||||||
|
|
||||||
|
let(:params) { { status: 'Hello world', in_reply_to_id: 0 } }
|
||||||
|
|
||||||
|
it 'returns http not found' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(response).to have_http_status(404)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when scheduling a status' do
|
||||||
|
subject { post :create, params: params }
|
||||||
|
|
||||||
|
let(:params) { { status: 'Hello world', scheduled_at: 10.minutes.from_now } }
|
||||||
|
let(:account) { user.account }
|
||||||
|
|
||||||
|
it 'returns HTTP 200' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(response).to have_http_status(200)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'creates a scheduled status' do
|
||||||
|
expect { subject }.to change { account.scheduled_statuses.count }.from(0).to(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the scheduling time is less than 5 minutes' do
|
||||||
|
let(:params) { { status: 'Hello world', scheduled_at: 4.minutes.from_now } }
|
||||||
|
|
||||||
|
it 'does not create a scheduled status', :aggregate_failures do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(response).to have_http_status(422)
|
||||||
|
expect(account.scheduled_statuses).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'DELETE #destroy' do
|
describe 'DELETE #destroy' do
|
||||||
|
|
|
@ -61,6 +61,16 @@ RSpec.describe PostStatusService, type: :service do
|
||||||
status2 = subject.call(account, text: 'test', idempotency: 'meepmeep', scheduled_at: future)
|
status2 = subject.call(account, text: 'test', idempotency: 'meepmeep', scheduled_at: future)
|
||||||
expect(status2.id).to eq status1.id
|
expect(status2.id).to eq status1.id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when scheduled_at is less than min offset' do
|
||||||
|
let(:invalid_scheduled_time) { 4.minutes.from_now }
|
||||||
|
|
||||||
|
it 'raises invalid record error' do
|
||||||
|
expect do
|
||||||
|
subject.call(account, text: 'Hi future!', scheduled_at: invalid_scheduled_time)
|
||||||
|
end.to raise_error(ActiveRecord::RecordInvalid)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates response to the original status of boost' do
|
it 'creates response to the original status of boost' do
|
||||||
|
|
Loading…
Reference in a new issue