GeekPark/gpk_account

View on GitHub
spec/controllers/users_controller_spec.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'rails_helper'

RSpec.describe UsersController, type: :controller do
  let(:user) { create(:basic_user) }

  describe 'GET #show' do
    context 'user not login' do
      it_behaves_like 'return 401 without login' do
        let(:subject) { get :show, format: :json }
      end

      it_behaves_like 'redirect_to login_url' do
        let(:subject) { get :show }
      end
    end

    context 'user logged in' do
      before { warden.set_user(user) }

      it 'shoud return user info after user login' do
        get :show, format: :json
        expect(response).to be_success
        expect(JSON.parse(response.body)['user']['email']).to eq('u****@geekpark.net')
      end

      it 'should return user authorizations' do
        create(:weibo_authorization, user_id: user.id)
        get :show, format: :json
        expect(response).to be_success
        expect(JSON.parse(response.body)['user']['authorizations'].first['provider']).to eq('weibo')
      end

      it 'should success' do
        get :show, format: :html
        expect(response).to be_success
        expect(response).to render_template(:show)
        expect(assigns(:data)[:user].id).to eq(user.id)
      end
    end
  end

  describe 'PATCH #update' do
    let(:user_attr) { attributes_for(:user) }

    context 'user not login' do
      it_behaves_like 'return 401 without login' do
        let(:subject) { patch :update, user: user_attr, format: :json }
      end
    end

    context 'user logged in' do
      before { warden.set_user(user) }

      it 'should success and return user info' do
        patch :update, user: user_attr, format: :json
        expect(response).to be_success
        expect(JSON.parse(response.body)['nickname']).to eq(user_attr[:nickname])
      end

      it 'can update avatar' do
        patch :update, user: attributes_for(:user, :with_avatar), format: :json
        expect(JSON.parse(response.body)['avatar_url']).not_to be_nil
      end
    end
  end

  describe 'GET #check_exist' do
    let(:subject) { JSON.parse(response.body) }
    let(:user_with_avatar) { create(:basic_user, :with_avatar) }

    it 'should return false user not exist' do
      get 'check_exist', user: attributes_for(:user, :with_email)
      expect(subject['exist']).to eq(false)
    end

    it 'should return true user exist' do
      get 'check_exist', user: { email: user_with_avatar.email }
      expect(subject['exist']).to eq(true)
      expect(subject['avatar_url']).to eq(user_with_avatar.avatar_url)
    end
  end

  describe 'GET #access_key' do
    it 'should return an access key for logged in user' do
      warden.set_user(user)
      get :access_key
      expect(response).to be_success
      result = JSON.parse(response.body)
      expect(result).not_to include('error')
      expect(result).to include('access_key')
    end
  end
end