Skip to content

Instantly share code, notes, and snippets.

@iSarCasm
Created April 4, 2018 15:57
Show Gist options
  • Save iSarCasm/36aa3d34a0fa036b5b237a475a7d2a5b to your computer and use it in GitHub Desktop.
Save iSarCasm/36aa3d34a0fa036b5b237a475a7d2a5b to your computer and use it in GitHub Desktop.
Specs example
require 'rails_helper'
RSpec.describe VideosController, type: :controller do
include Devise::Test::ControllerHelpers
before { stub_video }
describe '#show' do
context 'user opens one of videos' do
let(:user) { create :user }
let(:video) { create :video }
let!(:viewing_progress) { create :viewing_progress, user: user, video: video }
before do
sign_in user
end
it 'assigns @video' do
get :show, params: { id: video.id }
expect(assigns(:video)).to eq(video)
end
it 'assigns @progress' do
get :show, params: { id: video.id }
expect(assigns(:progress)).to eq viewing_progress
end
end
end
describe '#save_progress' do
context 'logged in' do
let(:user) { create :user }
let(:video) { create :video }
let(:viewing_progress) { user.viewing_progresses.where(video_id: video.id).take }
let(:progress_params) { { time: 10, id: video.id } }
before do
create :viewing_progress, user: user # noise
sign_in user
end
it 'creates ViewingProgress if there was none for given user and video' do
post :save_progress, params: progress_params
expect(viewing_progress).not_to be nil
end
context 'when new progress is behind persisted progress' do
before { create :viewing_progress, user: user, video: video, time: 30 }
it 'does not update ViewingProgress' do
expect{ post :save_progress, params: progress_params }
.to_not change{ viewing_progress.reload.time }
end
end
context 'when new progress is ahead of persisted progress' do
before { create :viewing_progress, user: user, video: video, time: 0 }
it 'updates time progress for given video' do
expect{ post :save_progress, params: progress_params }
.to change{ viewing_progress.reload.time }
end
it 'updates percent progress for given video' do
expect{ post :save_progress, params: progress_params }
.to change{ viewing_progress.reload.percent }
end
describe 'updates is_viewed for given video' do
it 'false when below 100%' do
expect do
post :save_progress,
params: { time: video.duration / 2, id: video.id }
end.not_to change{ viewing_progress.reload.is_viewed }
end
it 'true when 90% or more' do
expect do
post :save_progress,
params: { time: video.duration * 0.9, id: video.id }
end.to change{ viewing_progress.reload.is_viewed }
.from(false)
.to(true)
end
end
end
it 'returns json response' do
post :save_progress, params: progress_params
json_response = JSON.parse response.body
expect(json_response).to eq({
'success' => true,
'video_id' => video.id,
'time' => progress_params[:time]
})
end
end
context 'guest' do
it 'does not create ant ViewingProgresses' do
video = create :video
user = create :user
expect { post :save_progress, params: { time: 10, id: video.id } }
.not_to change{ ViewingProgress.count }
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment