Commit f37c1062
Changed files (3)
app
models
spec
models
app/models/user_session.rb
@@ -1,5 +1,6 @@
class UserSession < ActiveRecord::Base
belongs_to :user
+ has_one :location, as: :locatable
before_create :set_unique_key
attr_readonly :key
scope :active, -> { where("accessed_at >= ?", 2.weeks.ago).where(revoked_at: nil).includes(:user) }
@@ -14,6 +15,7 @@ class UserSession < ActiveRecord::Base
self.ip = request.ip
self.user_agent = request.user_agent
apply_geo_location_information_for(request)
+ self.location = Location.build_from_ip(request.ip)
if save
{
value: key,
@@ -39,11 +41,6 @@ class UserSession < ActiveRecord::Base
end
def apply_geo_location_information_for(request)
- location = Location.build_from_ip(request.ip)
- return if location.nil?
- self.latitude = location.latitude
- self.longitude = location.longitude
- self.city = location.city
- self.country = location.country
+ self.location = Location.build_from_ip(request.ip)
end
end
spec/models/user_session_spec.rb
@@ -12,8 +12,13 @@ describe UserSession do
describe "#access" do
let(:request) { double(ip: '192.168.1.1', user_agent: 'blah') }
+ let(:location) { build(:location) }
let!(:because) { subject.access(request) }
+ before :each do
+ Location.stub(:build_from_ip).with('192.168.1.1').and_return(location)
+ end
+
it "records the time the session was accessed" do
expect(subject.accessed_at).to_not be_nil
end
@@ -26,6 +31,10 @@ describe UserSession do
expect(subject.user_agent).to eql(request.user_agent)
end
+ it 'records a location for the session' do
+ expect(subject.location).to_not be_nil
+ end
+
it "returns a hash to store in the cookie" do
expect(because[:value]).to eql(subject.key)
expect(because[:httponly]).to be_truthy
spec/factories.rb
@@ -58,4 +58,10 @@ FactoryGirl.define do
admin true
end
end
+ factory :location do
+ latitude "107"
+ longitude "99"
+ city "Calgary"
+ country "Canada"
+ end
end