Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- RSpec.describe 'POST /signup', type: :request do
- let(:url) { '/signup' }
- let(:params) do
- {
- user: {
- email: 'user@example.com',
- password: 'password'
- }
- }
- end
- context 'when user is unauthenticated' do
- before { post url, params: params }
- it 'returns 200' do
- expect(response.status).to eq 200
- end
- it 'returns a new user' do
- expect(response).to match_response_schema('user')
- end
- end
- context 'when user already exists' do
- before do
- Fabricate :user, email: params[:user][:email]
- post url, params: params
- end
- it 'returns bad request status' do
- expect(response.status).to eq 400
- end
- it 'returns validation errors' do
- expect(json['errors'].first['title']).to eq('Bad Request')
- end
- end
- class RegistrationsController < Devise::RegistrationsController
- respond_to :json
- def create
- build_resource(sign_up_params)
- resource.save
- render_resource(resource)
- end
- end
- 3) POST /signup when user already exists returns validation errors
- Failure/Error: resource.save
- ActiveRecord::RecordNotUnique:
- SQLite3::ConstraintException: UNIQUE constraint failed: users.email:
- INSERT INTO "users" ("email", "encrypted_password") VALUES (?, ?)
- class ApplicationController < ActionController::API
- def render_resource(resource)
- if resource.errors.empty?
- render json: resource
- else
- validation_error(resource)
- end
- end
- def validation_error(resource)
- render json: {
- errors: [
- {
- status: '400',
- title: 'Bad Request',
- detail: resource.errors,
- code: '100'
- }
- ]
- }, status: :bad_request
- end
- end
- # add to app/models/user.rb
- validates :email, uniqueness: { case_sensitive: false }
Add Comment
Please, Sign In to add comment