From 0b5e44f5af5d2c3c9ebc05d1794676f78a984626 Mon Sep 17 00:00:00 2001 From: Carl Woodward Date: Sun, 21 Sep 2014 16:21:55 +1000 Subject: [PATCH] Fix #288 - add provider user lookup. - Add controller to pick up /providers/:provider/:username. - Add service to look up user by provider. --- .../provider_user_lookups_controller.rb | 12 ++++++ app/services/provider_user_lookup_service.rb | 26 +++++++++++++ config/routes.rb | 2 + .../provider_user_lookups_controller_spec.rb | 34 +++++++++++++++++ .../provider_user_lookup_service_spec.rb | 38 +++++++++++++++++++ 5 files changed, 112 insertions(+) create mode 100644 app/controllers/provider_user_lookups_controller.rb create mode 100644 app/services/provider_user_lookup_service.rb create mode 100644 spec/controllers/provider_user_lookups_controller_spec.rb create mode 100644 spec/services/provider_user_lookup_service_spec.rb diff --git a/app/controllers/provider_user_lookups_controller.rb b/app/controllers/provider_user_lookups_controller.rb new file mode 100644 index 00000000..2eca74b3 --- /dev/null +++ b/app/controllers/provider_user_lookups_controller.rb @@ -0,0 +1,12 @@ +require Rails.root.join('app/services/provider_user_lookup_service') + +class ProviderUserLookupsController < ApplicationController + def show + service = Services::ProviderUserLookupService.new params[:provider], params[:username] + if user = service.lookup_user + redirect_to badge_path(user.username) + else + redirect_to root_path, flash: { notice: 'User not found' } + end + end +end diff --git a/app/services/provider_user_lookup_service.rb b/app/services/provider_user_lookup_service.rb new file mode 100644 index 00000000..b746760b --- /dev/null +++ b/app/services/provider_user_lookup_service.rb @@ -0,0 +1,26 @@ +module Services + class ProviderUserLookupService + def initialize(provider, username) + @provider = provider + @username = username + end + + def lookup_user + if valid_provider? && valid_username? + User.where(@provider.to_sym => @username).first + else + nil + end + end + + private + + def valid_provider? + @provider.present? && [:twitter, :github, :linkedin].include?(@provider.to_sym) + end + + def valid_username? + @username.present? + end + end +end diff --git a/config/routes.rb b/config/routes.rb index d9def756..5aa68c27 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -454,6 +454,8 @@ get '/roll-the-dice' => 'users#randomize', as: :random_wall + get '/providers/:provider/:username' => 'provider_user_lookups#show' + constraints ->(params, _) { params[:username] != 'admin' } do get '/:username' => 'users#show', as: :badge diff --git a/spec/controllers/provider_user_lookups_controller_spec.rb b/spec/controllers/provider_user_lookups_controller_spec.rb new file mode 100644 index 00000000..18c0ad7c --- /dev/null +++ b/spec/controllers/provider_user_lookups_controller_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +RSpec.describe ProviderUserLookupsController, :type => :controller do + let(:twitter_username) { 'birdy' } + let(:github_username) { 'birdy' } + let(:linked_in_username) { 'birdy' } + let(:attrs) do + { + twitter: twitter_username, + github: github_username, + linkedin: linked_in_username + } + end + let!(:user) { + Fabricate.create(:user, attrs) + } + + describe 'GET /providers/:provider/:username' do + describe 'known user' do + it 'redirects to the current user for twitter' do + get :show, provider: 'twitter', username: twitter_username + expect(response).to redirect_to(badge_path(user.username)) + end + end + + describe 'unknown user' do + it 'redirects to the current user for twitter' do + get :show, provider: 'twitter', username: 'unknown' + expect(response).to redirect_to(root_path) + expect(flash[:notice]).to eql('User not found') + end + end + end +end diff --git a/spec/services/provider_user_lookup_service_spec.rb b/spec/services/provider_user_lookup_service_spec.rb new file mode 100644 index 00000000..531974b3 --- /dev/null +++ b/spec/services/provider_user_lookup_service_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' + +RSpec.describe Services::ProviderUserLookupService do + let(:twitter_username) { 'birdy' } + let!(:user) { + Fabricate.create(:user, twitter: twitter_username) + } + + describe '#lookup_user' do + let(:provider) { 'twitter' } + let(:service) { Services::ProviderUserLookupService.new(provider, username) } + + describe 'unknown provider' do + let(:provider) { 'unknown' } + let(:username) { 'unknown' } + + it 'returns nil' do + expect(service.lookup_user).to be_nil + end + end + + describe 'unknown user' do + let(:username) { 'unknown' } + + it 'returns nil' do + expect(service.lookup_user).to be_nil + end + end + + describe 'known provider and user' do + let(:username) { twitter_username } + + it 'returns the user' do + expect(service.lookup_user).to eql(user) + end + end + end +end