respond_to :txt
def show
- if @account.subscription(api_subscription_url(@account.id)).valid?(params['hub.topic'])
- @account.update(subscription_expires_at: Time.now.utc + (params['hub.lease_seconds'] || 86_400).to_i.seconds)
- render plain: HTMLEntities.new.encode(params['hub.challenge']), status: 200
+ if subscription.valid?(params['hub.topic'])
+ @account.update(subscription_expires_at: future_expires)
+ render plain: encoded_challenge, status: 200
else
head 404
end
end
def update
- body = request.body.read
- subscription = @account.subscription(api_subscription_url(@account.id))
-
if subscription.verify(body, request.headers['HTTP_X_HUB_SIGNATURE'])
ProcessingWorker.perform_async(@account.id, body.force_encoding('UTF-8'))
end
private
+ def subscription
+ @_subscription ||= @account.subscription(
+ api_subscription_url(@account.id)
+ )
+ end
+
+ def body
+ @_body ||= request.body.read
+ end
+
+ def encoded_challenge
+ HTMLEntities.new.encode(params['hub.challenge'])
+ end
+
+ def future_expires
+ Time.now.utc + lease_seconds_or_default
+ end
+
+ def lease_seconds_or_default
+ (params['hub.lease_seconds'] || 86_400).to_i.seconds
+ end
+
def set_account
@account = Account.find(params[:id])
end
let(:account) { Fabricate(:account, username: 'gargron', domain: 'quitter.no', remote_url: 'topic_url', secret: 'abc') }
describe 'GET #show' do
- before do
- get :show, params: { :id => account.id, 'hub.topic' => 'topic_url', 'hub.challenge' => '456', 'hub.lease_seconds' => "#{86400 * 30}" }
- end
+ context 'with valid subscription' do
+ before do
+ get :show, params: { :id => account.id, 'hub.topic' => 'topic_url', 'hub.challenge' => '456', 'hub.lease_seconds' => "#{86400 * 30}" }
+ end
- it 'returns http success' do
- expect(response).to have_http_status(:success)
+ it 'returns http success' do
+ expect(response).to have_http_status(:success)
+ end
+
+ it 'echoes back the challenge' do
+ expect(response.body).to match '456'
+ end
end
- it 'echoes back the challenge' do
- expect(response.body).to match '456'
+ context 'with invalid subscription' do
+ before do
+ expect_any_instance_of(Account).to receive_message_chain(:subscription, :valid?).and_return(false)
+ get :show, params: { :id => account.id }
+ end
+
+ it 'returns http success' do
+ expect(response).to have_http_status(:missing)
+ end
end
end