diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index c602edbf..f1883438 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -7,6 +7,7 @@ class SessionsController < ApplicationController # GET /logout def destroy logout if current_user + head :no_content end # POST /login @@ -22,7 +23,7 @@ class SessionsController < ApplicationController end # GET/POST /auth/:provider/callback - def omniauth_session + def omniauth user = User.from_omniauth(request.env['omniauth.auth']) login(user) end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 98ae769e..c33a1c9a 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -8,6 +8,8 @@ class UsersController < ApplicationController # POST /signup def create user = User.new(user_params) + user.provider = "greenlight" + if user.save login(user) else @@ -18,6 +20,6 @@ class UsersController < ApplicationController private def user_params - params.require(:user).permit(:name, :email, :password, :password_confirmation) + params.require(:user).permit(:name, :email, :username, :password, :password_confirmation) end end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index cf61d8e2..1538d882 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,7 +22,7 @@ Rails.application.routes.draw do get '/logout', to: 'sessions#destroy' # Handles Omniauth authentication. - match '/auth/:provider/callback', to: 'sessions#omniauth_session', via: [:get, :post], as: :omniauth_session + match '/auth/:provider/callback', to: 'sessions#omniauth', via: [:get, :post], as: :omniauth_session get '/auth/failure', to: 'sessions#fail' root to: 'main#index' diff --git a/test/controllers/rooms_controller_test.rb b/test/controllers/rooms_controller_test.rb index 285e122b..e428bf98 100644 --- a/test/controllers/rooms_controller_test.rb +++ b/test/controllers/rooms_controller_test.rb @@ -1,7 +1,35 @@ require 'test_helper' class RoomsControllerTest < ActionDispatch::IntegrationTest - # test "the truth" do - # assert true - # end + + def setup + @steve = users(:steve) + @mark = users(:mark) + + @kitchen = rooms(:kitchen) + @garage = rooms(:garage) + + @steve.room = @kitchen + @mark.room = @garage + end + + test 'should redirect to root if not logged in.' do + get room_path(@kitchen.uid) + + assert_redirected_to root_path + end + + test 'should redirect to correct room if incorrect room.' do + post create_session_path, params: {session: {email: @mark.email, password: "mark12345"}} + get room_path(@kitchen.uid) + + assert_redirected_to room_path(@garage.uid) + end + + test 'should render room if user is owner.' do + post create_session_path, params: {session: {email: @steve.email, password: "steve12345"}} + get room_path(@kitchen.uid) + + assert_response :success + end end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 20386d58..f1259deb 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -3,27 +3,22 @@ require 'test_helper' class SessionsControllerTest < ActionDispatch::IntegrationTest def setup - @user = User.new( - name: "Example User", - username: "Username", - provider: "greenlight", - email: "user@example.com", - password: "example", - password_confirmation: "example" - ) + @steve = users(:steve) + @kitchen = rooms(:kitchen) - @user.save! + @steve.room = @kitchen + end + + test 'can get login page.' do + get login_path + assert_response :success end test 'can signin with greenlight account.' do - post create_session_path, params: {session: {email: @user.email, password: @user.password}} - - assert_redirected_to room_path(@user.room.uid) - assert @user.id, session[:user_id] - end - - test 'can signup for greenlight account.' do - + post create_session_path, params: {session: {email: @steve.email, password: "steve12345"}} + + assert_redirected_to room_path(@steve.room.uid) + assert @steve.id, session[:user_id] end test 'can signup/login with omniauth.' do @@ -49,15 +44,32 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest assert_not_nil user assert_redirected_to room_path(user.room.uid) - assert @user.id, session[:user_id] + assert user.id, session[:user_id] + end + + test 'handles omniauth failure.' do + OmniAuth.config.on_failure = Proc.new do |env| + OmniAuth::FailureEndpoint.new(env).redirect_to_failure + end + + OmniAuth.config.mock_auth[:twitter] = :invalid_credentials + + get "/auth/twitter" + + request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:twitter] + + assert_no_difference 'User.count' do + get omniauth_session_path(provider: "twitter") + end + + assert_redirected_to auth_failure_path(message: "invalid_credentials", strategy: "twitter") end test 'can logout.' do - post create_session_path, params: {session: {email: @user.email, password: @user.password}} - assert @user.id, session[:user_id] + post create_session_path, params: {session: {email: @steve.email, password: "steve12345"}} + assert @steve.id, session[:user_id] get logout_path - assert_not_equal @user.id, session[:user_id] + assert_not_equal @steve.id, session[:user_id] end - end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 3a4935ff..17e36be6 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,5 +1,22 @@ require 'test_helper' class UsersControllerTest < ActionDispatch::IntegrationTest - + + test 'can signup for greenlight account.' do + post signup_path, params: { + user: { + name: "Greenlight User", + username: "greenlight_user", + email: "greenlight@example.com", + password: "password", + password_confirmation: "password" + } + } + + user = User.find_by(email: "greenlight@example.com") + + assert_not_nil user + assert_redirected_to room_path(user.room.uid) + assert user.id, session[:user_id] + end end diff --git a/test/fixtures/meetings.yml b/test/fixtures/meetings.yml index 80aed36e..da376923 100644 --- a/test/fixtures/meetings.yml +++ b/test/fixtures/meetings.yml @@ -4,8 +4,6 @@ # model remove the '{}' from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value + +breakfast: + name: "Breakfast" \ No newline at end of file diff --git a/test/fixtures/rooms.yml b/test/fixtures/rooms.yml index 80aed36e..a42d3691 100644 --- a/test/fixtures/rooms.yml +++ b/test/fixtures/rooms.yml @@ -4,8 +4,9 @@ # model remove the '{}' from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value + +kitchen: + uid: "13579" + +garage: + uid: "02468" \ No newline at end of file diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 80aed36e..a529e736 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -4,8 +4,17 @@ # model remove the '{}' from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value + +steve: + name: "Steve User" + username: "steve" + provider: "greenlight" + email: "steve@example.com" + password_digest: <%= BCrypt::Password.create('steve12345') %> + +mark: + name: "Mark User" + username: "mark" + provider: "greenlight" + email: "mark@example.com" + password_digest: <%= BCrypt::Password.create('mark12345') %> diff --git a/test/models/meeting_test.rb b/test/models/meeting_test.rb index b67e0fc7..2d49828d 100644 --- a/test/models/meeting_test.rb +++ b/test/models/meeting_test.rb @@ -3,30 +3,21 @@ require 'test_helper' class MeetingTest < ActiveSupport::TestCase def setup - @user = User.new( - name: "Example User", - username: "Username", - provider: "greenlight", - email: "user@example.com", - password: "example", - password_confirmation: "example" - ) + @steve = users(:steve) - @room = Room.new(user: @user) + @kitchen = rooms(:kitchen) - @meeting = Meeting.new( - name: "Test Meeting", - room: @room - ) + @breakfast = meetings(:breakfast) + @breakfast.room = @kitchen end test "name should be present." do - @meeting.name = nil - assert_not @meeting.valid? + @breakfast.name = nil + assert_not @breakfast.valid? end test "should set uid on creation." do - @meeting.save - assert @meeting.uid + @breakfast.send(:generate_meeting_id) + assert @breakfast.uid end end diff --git a/test/models/room_test.rb b/test/models/room_test.rb index f671024d..0769db6f 100644 --- a/test/models/room_test.rb +++ b/test/models/room_test.rb @@ -3,37 +3,18 @@ require 'test_helper' class RoomTest < ActiveSupport::TestCase def setup - @user = User.new( - name: "Example User", - username: "Username", - provider: "greenlight", - email: "user@example.com", - password: "example", - password_confirmation: "example" - ) + @steve = users(:steve) + @mark = users(:mark) - @room = Room.new( - user: @user - ) + @kitchen = rooms(:kitchen) + @kitchen.user = @steve end test "#owned_by? should identify correct owner." do - assert @room.owned_by?(@user) + assert @kitchen.owned_by?(@steve) end test "#owned_by? should identify incorrect owner." do - diff_user = User.new( - name: "Different User", - username: "Diffname", - provider: "greenlight", - email: "diff@example.com", - ) - - assert_not @room.owned_by?(diff_user) - end - - test "should set uid on creation." do - @room.save - assert @room.uid + assert_not @kitchen.owned_by?(@mark) end end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 5a612194..ea80fd71 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -1,50 +1,48 @@ require 'test_helper' class UserTest < ActiveSupport::TestCase - + def setup - @user = User.new( - name: "Example User", - username: "Username", - provider: "greenlight", - email: "user@example.com", - password: "example", - password_confirmation: "example" - ) + @steve = users(:steve) end test "should be valid." do - assert @user.valid? + assert @steve.valid? end test "name should be present." do - @user.name = nil - assert_not @user.valid? + @steve.name = nil + assert_not @steve.valid? end test "email should be present." do - @user.email = nil - assert_not @user.valid? + @steve.email = nil + assert_not @steve.valid? end test "username should be present." do - @user.username = nil - assert_not @user.valid? + @steve.username = nil + assert_not @steve.valid? end test "provider should be present." do - @user.provider = nil - assert_not @user.valid? + @steve.provider = nil + assert_not @steve.valid? end test "should allow nil uid." do - @user.uid = nil - assert @user.valid? + @steve.uid = nil + assert @steve.valid? end test "should allow nil password." do - @user.password = @user.password_confirmation = nil - assert @user.valid? + @steve.password = @steve.password_confirmation = nil + assert @steve.valid? + end + + test "password should be longer than 6 characters if it exists." do + @steve.password = "short" + assert_not @steve.valid? end test "should create user from omniauth" do @@ -70,51 +68,51 @@ class UserTest < ActiveSupport::TestCase test "email addresses should be saved as lower-case." do mixed_case = "ExAmPlE@eXaMpLe.CoM" - @user.email = mixed_case - @user.save - assert_equal mixed_case.downcase, @user.email + @steve.email = mixed_case + @steve.save + assert_equal mixed_case.downcase, @steve.email end test "email validation should reject invalid addresses." do invalid_addresses = %w[user@example,com user_at_foo.org user.name@example. foo@bar_baz.com foo@bar+baz.com] invalid_addresses.each do |invalid_address| - @user.email = invalid_address - assert_not @user.valid?, "#{invalid_address.inspect} should be invalid." + @steve.email = invalid_address + assert_not @steve.valid?, "#{invalid_address.inspect} should be invalid." end end test "email should be unique." do - duplicate_user = @user.dup - duplicate_user.email = @user.email.upcase - @user.save + duplicate_user = @steve.dup + duplicate_user.email = @steve.email.upcase + @steve.save assert_not duplicate_user.valid? end test "name should not be too long." do - @user.name = "a" * 25 - assert_not @user.valid? + @steve.name = "a" * 25 + assert_not @steve.valid? end test "email should not be too long." do - @user.email = "a" * 50 + "@example.com" - assert_not @user.valid? + @steve.email = "a" * 50 + "@example.com" + assert_not @steve.valid? end test "password should have a minimum length." do - @user.password = @user.password_confirmation = "a" * 5 - assert_not @user.valid? + @steve.password = @steve.password_confirmation = "a" * 5 + assert_not @steve.valid? end test "should authenticate on valid password." do - assert_not_equal @user.authenticate('example'), false + assert @steve.authenticate("steve12345") end test "should not authenticate on invalid password." do - assert_not @user.authenticate('incorrect') + assert_not @steve.authenticate('incorrect') end - test "should create room when saved." do - @user.save - assert @user.room + test "#initialize_room should create room." do + @steve.send(:initialize_room) + assert @steve.room end end