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 }