From df90f4aade7cb76af9cdb46767f29b3d4236b8cd Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 25 Jun 2018 15:49:56 -0400 Subject: [PATCH 1/3] add controller tests --- spec/controllers/errors_controller_spec.rb | 25 ++++++ spec/controllers/main_controller_spec.rb | 11 +++ spec/controllers/users_controller_spec.rb | 88 ++++++++++++++++++++++ spec/models/room_spec.rb | 4 +- spec/models/user_spec.rb | 10 ++- 5 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 spec/controllers/errors_controller_spec.rb create mode 100644 spec/controllers/main_controller_spec.rb create mode 100644 spec/controllers/users_controller_spec.rb diff --git a/spec/controllers/errors_controller_spec.rb b/spec/controllers/errors_controller_spec.rb new file mode 100644 index 00000000..ddc132ff --- /dev/null +++ b/spec/controllers/errors_controller_spec.rb @@ -0,0 +1,25 @@ +require "rails_helper" + +describe ErrorsController, type: :controller do + + describe "GET #not_found" do + it "returns not_found" do + get :not_found + expect(response).to have_http_status(404) + end + end + + describe "GET #unprocessable" do + it "returns unprocessable" do + get :unprocessable + expect(response).to have_http_status(422) + end + end + + describe "GET #internal_error" do + it "returns internal_error" do + get :internal_error + expect(response).to have_http_status(500) + end + end +end diff --git a/spec/controllers/main_controller_spec.rb b/spec/controllers/main_controller_spec.rb new file mode 100644 index 00000000..d4513060 --- /dev/null +++ b/spec/controllers/main_controller_spec.rb @@ -0,0 +1,11 @@ +require "rails_helper" + +describe MainController, type: :controller do + + describe "GET #index" do + it "returns success" do + get :index + expect(response).to be_successful + end + end +end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb new file mode 100644 index 00000000..f14639ba --- /dev/null +++ b/spec/controllers/users_controller_spec.rb @@ -0,0 +1,88 @@ +require "rails_helper" + +describe UsersController, type: :controller do + + let(:user_params) { + { + user: { + name: "Example", + email: "example@example.com", + password: "password", + password_confirmation: "password" + } + } + } + + let(:invalid_params) { + { + user: { + name: "Invalid", + email: "example.com", + password: "pass", + password_confirmation: "invalid" + } + } + } + + describe "GET #new" do + it "assigns a blank user to the view" do + get :new + expect(assigns(:user)).to be_a_new(User) + end + end + + describe "POST #create" do + it "redirects to user room on succesful create" do + post :create, params: user_params + + u = User.last + expect(u).to_not be_nil + expect(u.name).to eql("Example") + expect(response).to redirect_to(room_path(u.main_room)) + end + + it "redirects to main room if already authenticated" do + user = create(:user) + @request.session[:user_id] = user.id + + post :create, params: user_params + expect(response).to redirect_to(room_path(user.main_room)) + end + + it "user saves with greenlight provider" do + post :create, params: user_params + + u = User.last + expect(u.provider).to eql("greenlight") + end + + it "renders #new on unsuccessful save" do + post :create, params: invalid_params + + expect(response).to render_template(:new) + end + end + + describe "PATCH #update" do + it "properly updates user attributes" do + @user = create(:user) + + patch :update, params: user_params.merge!(user_uid: @user) + @user.reload + + expect(@user.name).to eql("Example") + expect(@user.email).to eql("example@example.com") + end + + it "properly updates user password" do + + end + + it "renders #edit on unsuccessful save" do + @user = create(:user) + + patch :update, params: invalid_params.merge!(user_uid: @user) + expect(response).to render_template(:edit) + end + end +end diff --git a/spec/models/room_spec.rb b/spec/models/room_spec.rb index 7e9361a0..c3f111df 100644 --- a/spec/models/room_spec.rb +++ b/spec/models/room_spec.rb @@ -3,10 +3,10 @@ require 'bigbluebutton_api' describe Room, type: :model do - before { + before do @user = create(:user) @room = @user.main_room - } + end context 'validations' do it { should validate_presence_of(:name) } diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index b5aef16c..7d211bcc 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1,7 +1,9 @@ require "rails_helper" describe User, type: :model do - before { @user = create(:user) } + before do + @user = create(:user) + end context 'validations' do it { should validate_presence_of(:name) } @@ -55,7 +57,7 @@ describe User, type: :model do end context '#from_omniauth' do - it "should create user from omniauth" do + let(:auth) { auth = { "uid" => "123456789", "provider" => "twitter", @@ -66,7 +68,9 @@ describe User, type: :model do "image" => "example.png" } } - + } + + it "should create user from omniauth" do expect { user = User.from_omniauth(auth) From a6b313f38e942f71e30e226553d2dbee99a150c2 Mon Sep 17 00:00:00 2001 From: Joshua Arts Date: Wed, 27 Jun 2018 17:00:37 -0400 Subject: [PATCH 2/3] test sessions controller and fix style --- Gemfile | 6 +- app/controllers/sessions_controller.rb | 9 +- spec/controllers/errors_controller_spec.rb | 3 +- spec/controllers/main_controller_spec.rb | 3 +- spec/controllers/rooms_controller_spec.rb | 7 ++ spec/controllers/sessions_controller_spec.rb | 92 ++++++++++++++++++++ spec/controllers/users_controller_spec.rb | 23 +++-- 7 files changed, 120 insertions(+), 23 deletions(-) create mode 100644 spec/controllers/rooms_controller_spec.rb create mode 100644 spec/controllers/sessions_controller_spec.rb diff --git a/Gemfile b/Gemfile index 97df7455..45513eed 100644 --- a/Gemfile +++ b/Gemfile @@ -58,6 +58,9 @@ gem 'tabler-rubygem' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development +# Ruby linting. +gem 'rubocop', require: false + group :production do # Use a postgres database in production. gem 'pg', '~> 0.18' @@ -69,9 +72,6 @@ group :development, :test do # Environment configuration. gem 'dotenv-rails' - - # Ruby linting. - gem 'rubocop' end group :test do diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 8f9b0028..c19a5546 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true class SessionsController < ApplicationController - # GET /users/login - def new - end - # GET /users/logout def destroy logout @@ -14,7 +10,7 @@ class SessionsController < ApplicationController # POST /users/login def create user = User.find_by(email: session_params[:email]) - if user.&authenticate(session_params[:password]) + if user&.authenticate(session_params[:password]) login(user) end end @@ -35,6 +31,9 @@ class SessionsController < ApplicationController def omniauth user = User.from_omniauth(request.env['omniauth.auth']) login(user) + rescue => e + logger.error "Error authenticating via omniauth: #{e}" + redirect_to root_path end # POST /auth/failure diff --git a/spec/controllers/errors_controller_spec.rb b/spec/controllers/errors_controller_spec.rb index ddc132ff..a64976de 100644 --- a/spec/controllers/errors_controller_spec.rb +++ b/spec/controllers/errors_controller_spec.rb @@ -1,7 +1,8 @@ +# frozen_string_literal: true + require "rails_helper" describe ErrorsController, type: :controller do - describe "GET #not_found" do it "returns not_found" do get :not_found diff --git a/spec/controllers/main_controller_spec.rb b/spec/controllers/main_controller_spec.rb index d4513060..722cf796 100644 --- a/spec/controllers/main_controller_spec.rb +++ b/spec/controllers/main_controller_spec.rb @@ -1,7 +1,8 @@ +# frozen_string_literal: true + require "rails_helper" describe MainController, type: :controller do - describe "GET #index" do it "returns success" do get :index diff --git a/spec/controllers/rooms_controller_spec.rb b/spec/controllers/rooms_controller_spec.rb new file mode 100644 index 00000000..8d751a35 --- /dev/null +++ b/spec/controllers/rooms_controller_spec.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe RoomsController, type: :controller do + +end diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb new file mode 100644 index 00000000..8713b215 --- /dev/null +++ b/spec/controllers/sessions_controller_spec.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe SessionsController, type: :controller do + before(:all) do + @user = create(:user, password: "example", password_confirmation: "example") + end + + describe "GET #destroy" do + before(:each) do + @request.session[:user_id] = @user.id + get :destroy + end + + it "should logout user" do + expect(@request.session[:user_id]).to be_nil + end + + it "should redirect to root" do + expect(response).to redirect_to(root_path) + end + end + + describe "POST #create" do + it "should login user in if credentials valid" do + post :create, params: { + session: { + email: @user.email, + password: "example", + }, + } + + expect(@request.session[:user_id]).to eql(@user.id) + end + + it "should not login user in if credentials invalid" do + post :create, params: { + session: { + email: @user.email, + password: "invalid", + }, + } + + expect(@request.session[:user_id]).to be_nil + end + end + + describe "GET/POST #omniauth" do + before(:all) do + OmniAuth.config.test_mode = true + + OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new( + provider: "twitter", + uid: "twitter-user", + info: { + email: "user@twitter.com", + name: "Twitter User", + nickname: "username", + image: "example.png", + }, + ) + + OmniAuth.config.on_failure = proc { |env| + OmniAuth::FailureEndpoint.new(env).redirect_to_failure + } + end + + it "should create and login user with omniauth" do + request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter] + get :omniauth, params: { provider: :twitter } + + u = User.last + expect(u.provider).to eql("twitter") + expect(u.email).to eql("user@twitter.com") + expect(@request.session[:user_id]).to eql(u.id) + end + + it "should redirect to root on invalid omniauth login" do + request.env["omniauth.auth"] = :invalid_credentials + get :omniauth, params: { provider: :twitter } + + expect(response).to redirect_to(root_path) + end + + it "should not create session without omniauth env set" do + get :omniauth, params: { provider: 'google' } + + expect(response).to redirect_to(root_path) + end + end +end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index f14639ba..d0fe4501 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -1,28 +1,29 @@ +# frozen_string_literal: true + require "rails_helper" describe UsersController, type: :controller do - - let(:user_params) { + let(:user_params) do { user: { name: "Example", email: "example@example.com", password: "password", - password_confirmation: "password" - } + password_confirmation: "password", + }, } - } + end - let(:invalid_params) { + let(:invalid_params) do { user: { name: "Invalid", email: "example.com", password: "pass", - password_confirmation: "invalid" - } + passwrd_confirmation: "invalid", + }, } - } + end describe "GET #new" do it "assigns a blank user to the view" do @@ -74,10 +75,6 @@ describe UsersController, type: :controller do expect(@user.email).to eql("example@example.com") end - it "properly updates user password" do - - end - it "renders #edit on unsuccessful save" do @user = create(:user) From 1acf901c68b81b12531374701129ef6e638cddd6 Mon Sep 17 00:00:00 2001 From: Joshua Arts Date: Thu, 28 Jun 2018 16:55:56 -0400 Subject: [PATCH 3/3] finish controller tests --- app/controllers/rooms_controller.rb | 2 +- app/models/room.rb | 1 - spec/controllers/rooms_controller_spec.rb | 182 ++++++++++++++++++++++ spec/controllers/users_controller_spec.rb | 50 +++--- spec/factories.rb | 2 +- 5 files changed, 212 insertions(+), 25 deletions(-) diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb index 5319d41d..218eea7e 100644 --- a/app/controllers/rooms_controller.rb +++ b/app/controllers/rooms_controller.rb @@ -155,7 +155,7 @@ class RoomsController < ApplicationController def bring_to_room if current_user # Redirect authenticated users to their room. - redirect_to room_path(current_user.room) + redirect_to room_path(current_user.main_room) else # Redirect unauthenticated users to root. redirect_to root_path diff --git a/app/models/room.rb b/app/models/room.rb index a83f4eed..197fd631 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -97,7 +97,6 @@ class Room < ApplicationRecord # Fetches all recordings for a room. def recordings res = bbb.get_recordings(meetingID: bbb_id) - # Format playbacks in a more pleasant way. res[:recordings].each do |r| next if r.key?(:error) diff --git a/spec/controllers/rooms_controller_spec.rb b/spec/controllers/rooms_controller_spec.rb index 8d751a35..90fc9893 100644 --- a/spec/controllers/rooms_controller_spec.rb +++ b/spec/controllers/rooms_controller_spec.rb @@ -3,5 +3,187 @@ require "rails_helper" describe RoomsController, type: :controller do + describe "GET #show" do + before do + @user = create(:user) + @owner = create(:user) + end + it "should fetch recordings and room state if user is owner" do + @request.session[:user_id] = @owner.id + + get :show, params: { room_uid: @owner.main_room } + + expect(assigns(:recordings)).to eql(@owner.main_room.recordings) + expect(assigns(:is_running)).to eql(@owner.main_room.running?) + end + + it "should render join if user is not owner" do + @request.session[:user_id] = @user.id + + get :show, params: { room_uid: @owner.main_room } + + expect(response).to render_template(:join) + end + + it "should raise if room is not valid" do + expect do + get :show, params: { room_uid: "non_existent" } + end.to raise_error(ActiveRecord::RecordNotFound) + end + end + + describe "POST #create" do + before do + @owner = create(:user) + end + + it "should create room with name" do + @request.session[:user_id] = @owner.id + name = Faker::Pokemon.name + post :create, params: { room: { name: name } } + + r = @owner.secondary_rooms.last + expect(r.name).to eql(name) + expect(r.owner).to eql(@owner) + expect(response).to redirect_to(r) + end + + it "it should redirect to root if not logged in" do + expect do + name = Faker::Pokemon.name + post :create, params: { room: { name: name } } + end.to change { Room.count }.by(0) + + expect(response).to redirect_to(root_path) + end + end + + describe "POST #join" do + before do + @user = create(:user) + @owner = create(:user) + @room = @owner.main_room + + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:get_meeting_info).and_return( + moderatorPW: "modpass", + attendeePW: "attpass", + ) + end + + it "should use account name if user is logged in and meeting running" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + + @request.session[:user_id] = @user.id + post :join, params: { room_uid: @room, join_name: @user.name } + + expect(response).to redirect_to(@user.main_room.join_path(@user.name, {}, @user.uid)) + end + + it "should use join name if user is not logged in and meeting running" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + + post :join, params: { room_uid: @room, join_name: "Join Name" } + + expect(response).to redirect_to(@user.main_room.join_path("Join Name", {})) + end + + it "should render wait if meeting isn't running" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(false) + + @request.session[:user_id] = @user.id + post :join, params: { room_uid: @room, join_name: @user.name } + + expect(response).to render_template(:wait) + end + + it "should join owner as moderator if meeting running" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:is_meeting_running?).and_return(true) + + @request.session[:user_id] = @owner.id + post :join, params: { room_uid: @room, join_name: @owner.name } + + expect(response).to redirect_to(@user.main_room.join_path(@owner.name, { user_is_moderator: true }, @owner.uid)) + end + end + + describe "DELETE #destroy" do + before do + @user = create(:user) + @secondary_room = create(:room, owner: @user) + end + + it "should delete room and redirect to main room" do + @request.session[:user_id] = @user.id + + expect do + delete :destroy, params: { room_uid: @secondary_room } + end.to change { Room.count }.by(-1) + + expect(response).to redirect_to(@user.main_room) + end + + it "should not delete room if not owner" do + random_user = create(:user) + @request.session[:user_id] = random_user.id + + expect do + delete :destroy, params: { room_uid: @user.main_room } + end.to change { Room.count }.by(0) + end + + it "should not delete room not logged in" do + expect do + delete :destroy, params: { room_uid: @user.main_room } + end.to change { Room.count }.by(0) + end + end + + describe "POST #start" do + before do + @user = create(:user) + @other_room = create(:room) + + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:get_meeting_info).and_return( + moderatorPW: "modpass", + attendeePW: "attpass", + ) + end + + it "should redirect to join path if owner" do + @request.session[:user_id] = @user.id + post :start, params: { room_uid: @user.main_room } + + expect(response).to redirect_to(@user.main_room.join_path(@user.name, { user_is_moderator: true }, @user.uid)) + end + + it "should bring to room if not owner" do + @request.session[:user_id] = @user.id + post :start, params: { room_uid: @other_room } + + expect(response).to redirect_to(@user.main_room) + end + + it "should bring to root if not authenticated" do + post :start, params: { room_uid: @other_room } + + expect(response).to redirect_to(root_path) + end + end + + describe "POST #home" do + before do + @user = create(:user) + @secondary_room = create(:room, owner: @user) + end + + it "should change users home room" do + @request.session[:user_id] = @user.id + post :home, params: { room_uid: @secondary_room } + @user.reload + + expect(@user.main_room).to eql(@secondary_room) + expect(response).to redirect_to(@secondary_room) + end + end end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index d0fe4501..6a4b8c10 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -2,18 +2,19 @@ require "rails_helper" -describe UsersController, type: :controller do - let(:user_params) do - { - user: { - name: "Example", - email: "example@example.com", - password: "password", - password_confirmation: "password", - }, - } - end +def random_valid_user_params + pass = Faker::Internet.password(8) + { + user: { + name: Faker::Name.first_name, + email: Faker::Internet.email, + password: pass, + password_confirmation: pass, + }, + } +end +describe UsersController, type: :controller do let(:invalid_params) do { user: { @@ -34,11 +35,13 @@ describe UsersController, type: :controller do describe "POST #create" do it "redirects to user room on succesful create" do - post :create, params: user_params + params = random_valid_user_params + post :create, params: params + + u = User.find_by(name: params[:user][:name], email: params[:user][:email]) - u = User.last expect(u).to_not be_nil - expect(u.name).to eql("Example") + expect(u.name).to eql(params[:user][:name]) expect(response).to redirect_to(room_path(u.main_room)) end @@ -46,14 +49,16 @@ describe UsersController, type: :controller do user = create(:user) @request.session[:user_id] = user.id - post :create, params: user_params + post :create, params: random_valid_user_params expect(response).to redirect_to(room_path(user.main_room)) end it "user saves with greenlight provider" do - post :create, params: user_params + params = random_valid_user_params + post :create, params: params + + u = User.find_by(name: params[:user][:name], email: params[:user][:email]) - u = User.last expect(u.provider).to eql("greenlight") end @@ -66,13 +71,14 @@ describe UsersController, type: :controller do describe "PATCH #update" do it "properly updates user attributes" do - @user = create(:user) + user = create(:user) - patch :update, params: user_params.merge!(user_uid: @user) - @user.reload + params = random_valid_user_params + patch :update, params: params.merge!(user_uid: user) + user.reload - expect(@user.name).to eql("Example") - expect(@user.email).to eql("example@example.com") + expect(user.name).to eql(params[:user][:name]) + expect(user.email).to eql(params[:user][:email]) end it "renders #edit on unsuccessful save" do diff --git a/spec/factories.rb b/spec/factories.rb index d99ff9d0..69a03c04 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -4,7 +4,7 @@ FactoryBot.define do factory :user do password = Faker::Internet.password(8) - provider { %w(greenlight google twitter).sample } + provider { %w(google twitter).sample } uid { rand(10**8) } name { Faker::Name.first_name } username { Faker::Internet.user_name }