Created
April 4, 2018 15:57
-
-
Save iSarCasm/36aa3d34a0fa036b5b237a475a7d2a5b to your computer and use it in GitHub Desktop.
Specs example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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