tap/spec/models/user_spec.rb
2018-12-13 20:59:52 +01:00

165 lines
4.1 KiB
Ruby

# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# created_at :datetime
# updated_at :datetime
# remember_created_at :datetime
# admin :boolean default(FALSE)
# dagschotel_id :integer
# avatar_file_name :string
# avatar_content_type :string
# avatar_file_size :integer
# avatar_updated_at :datetime
# orders_count :integer default(0)
# koelkast :boolean default(FALSE)
# name :string
# private :boolean default(FALSE)
# frecency :integer default(0), not null
# quickpay_hidden :boolean
#
require 'webmock/rspec'
describe User do
before :each do
@user = create :user
end
it 'has a valid factory' do
expect(@user).to be_valid
end
############
# FIELDS #
############
describe 'fields' do
describe 'avatar' do
it 'should be present' do
@user.avatar = nil
expect(@user).to_not be_valid
end
end
describe 'orders_count' do
it 'should automatically cache the number of orders' do
balance = 5
stub_request(:get, /.*/).to_return(status: 200, body: JSON.dump({ balance: balance }))
expect{ create :order, user: @user }.to change{ @user.reload.orders_count }.by(1)
end
end
describe 'admin' do
it 'should be false by default' do
expect(@user.reload.admin).to be false
end
end
describe 'balance' do
before :all do
@api_url = "www.example.com/api.json"
end
it 'should be nil if offline' do
stub_request(:get, /.*/).to_return(status: 404)
expect(@user.balance).to be nil
end
it 'should be updated when online' do
balance = 5
stub_request(:get, /.*/).to_return(status: 200, body: JSON.dump({ balance: balance }))
expect(@user.balance).to eq balance
end
end
end
describe 'omniauth' do
it 'should be a new user' do
name = "yet-another-test-user"
omniauth = double(uid: name)
expect(User.from_omniauth(omniauth).name).to eq name
end
it 'should be the logged in user' do
second_user = create :user
omniauth = double(uid: second_user.name)
expect(User.from_omniauth(omniauth)).to eq second_user
end
end
describe 'static users' do
describe 'koelkast' do
it 'should be false by default' do
expect(@user.reload.koelkast).to be false
end
it 'should be true for koelkast' do
expect(User.koelkast.koelkast).to be true
end
it 'should not be an admin' do
expect(User.koelkast.admin).to be false
end
end
describe 'guest' do
it 'should not be an admin' do
expect(User.guest.admin).to be false
end
it 'should be public' do
expect(User.guest.private).to be false
end
it 'should be a guest' do
expect(User.guest.guest?).to be true
end
end
end
############
# SCOPES #
############
describe 'scopes' do
it 'members should return members' do
create :koelkast
user = create :user
expect(User.members).to eq([@user, user])
end
it 'publik should return publik members' do
user = create :user
create :user, private: true
expect(User.publik).to eq([@user, user])
end
end
describe 'frecency' do
before :each do
balance = 5
stub_request(:get, /.*/).to_return(status: 200, body: JSON.dump({ balance: balance }))
end
it 'should be recalculated on creating an order' do
expect(@user.frecency).to eq 0
create :order, user: @user
expect(@user.frecency).to_not eq 0
end
it 'should be valid' do
dates = [Date.today.to_time, Date.yesterday.to_time]
dates.each do |date|
create :order, user: @user, created_at: date
end
@user.reload
num_orders = Rails.application.config.frecency_num_orders
# On Travis the result is 10025938 cause floating points
expect(@user.frecency).to be_within(50).of(10025915)
end
end
end