From 9e7f03236e76c2a87c62e46055acb8526ca7628a Mon Sep 17 00:00:00 2001 From: zhitomirskiyi Date: Mon, 31 Jan 2011 18:31:32 -0800 Subject: [PATCH] persists open aspects across logins also fixed the status message controller spec broken in master --- app/controllers/aspects_controller.rb | 2 ++ app/controllers/home_controller.rb | 2 +- app/models/user.rb | 3 +++ ...20110201013408_add_open_aspects_to_user.rb | 9 ++++++++ db/schema.rb | 5 ++-- features/saved_state.feature | 23 ++++++++++++++----- features/step_definitions/user_steps.rb | 14 +++++++++++ spec/controllers/aspects_controller_spec.rb | 18 +++++++++++++++ spec/controllers/home_controller_spec.rb | 13 ++++++++++- .../status_message_controller_spec.rb | 2 +- 10 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 db/migrate/20110201013408_add_open_aspects_to_user.rb diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb index 46321e441..96fdceab1 100644 --- a/app/controllers/aspects_controller.rb +++ b/app/controllers/aspects_controller.rb @@ -15,6 +15,8 @@ class AspectsController < ApplicationController else @aspects = current_user.aspects.includes(:contacts => {:person => :profile}) end + current_user.open_aspects = params[:a_ids] + current_user.save # redirect to signup if current_user.getting_started == true || @aspects.blank? diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 60a53a381..d2f0bbcaf 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -6,7 +6,7 @@ class HomeController < ApplicationController def show if current_user - redirect_to aspects_path + redirect_to :controller => 'aspects', :action => 'index', :a_ids => current_user.open_aspects elsif is_mobile_device? redirect_to user_session_path else diff --git a/app/models/user.rb b/app/models/user.rb index 0f850180b..e303b248e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -38,6 +38,9 @@ class User < ActiveRecord::Base has_many :contact_people, :through => :contacts has_many :services + serialize :open_aspects, Array + + before_destroy :disconnect_everyone, :remove_person before_save do person.save if person diff --git a/db/migrate/20110201013408_add_open_aspects_to_user.rb b/db/migrate/20110201013408_add_open_aspects_to_user.rb new file mode 100644 index 000000000..ddc214129 --- /dev/null +++ b/db/migrate/20110201013408_add_open_aspects_to_user.rb @@ -0,0 +1,9 @@ +class AddOpenAspectsToUser < ActiveRecord::Migration + def self.up + add_column(:users, :open_aspects, :text) + end + + def self.down + remove_column(:users, :open_aspects) + end +end diff --git a/db/schema.rb b/db/schema.rb index 78e1b15fe..ad00b9575 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20110130072907) do +ActiveRecord::Schema.define(:version => 20110201013408) do create_table "aspect_memberships", :force => true do |t| t.integer "aspect_id", :null => false @@ -312,10 +312,8 @@ ActiveRecord::Schema.define(:version => 20110130072907) do t.boolean "unread", :default => true, :null => false t.datetime "created_at" t.datetime "updated_at" - t.string "mongo_id" end - add_index "notifications", ["mongo_id"], :name => "index_notifications_on_mongo_id" add_index "notifications", ["recipient_id"], :name => "index_notifications_on_recipient_id" add_index "notifications", ["target_id"], :name => "index_notifications_on_target_id" add_index "notifications", ["target_type", "target_id"], :name => "index_notifications_on_target_type_and_target_id" @@ -460,6 +458,7 @@ ActiveRecord::Schema.define(:version => 20110130072907) do t.string "mongo_id" t.string "invitation_service" t.string "invitation_identifier" + t.text "open_aspects" end add_index "users", ["email"], :name => "index_users_on_email" diff --git a/features/saved_state.feature b/features/saved_state.feature index 11e771229..5229c618b 100644 --- a/features/saved_state.feature +++ b/features/saved_state.feature @@ -1,18 +1,29 @@ @javascript Feature: saved state - Scenario: open aspects persist + Scenario: open aspects persist across sessions Given I am signed in And I have an aspect called "Open 1" And I have an aspect called "Closed 1" And I have an aspect called "Closed 2" And I have an aspect called "Open 2" + And I am on the aspects page When I follow "Open 1" And I follow "Open 2" - Then I should have aspects "Open 1", "Open 2" open + Then I should have aspect "Open 1" "selected" + Then I should have aspect "Open 2" "selected" + Then I should have aspect "Closed 1" "not selected" + Then I should have aspect "Closed 2" "not selected" + + And I click on my name in the header And I follow "logout" + + And I go to the new user session page - And I fill in "Username" with "ohai" - And I fill in "Password" with "secret" - Then I should be on the aspects page - Then I should have aspects "Open 1", "Open 2" open + And I am signed in + + Then I should be on the aspects page + Then I should have aspect "Open 1" "selected" + But I should have aspect "Open 2" "selected" + But I should have aspect "Closed 1" "not selected" + But I should have aspect "Closed 2" "not selected" diff --git a/features/step_definitions/user_steps.rb b/features/step_definitions/user_steps.rb index 76d6840b6..6c3c88e90 100644 --- a/features/step_definitions/user_steps.rb +++ b/features/step_definitions/user_steps.rb @@ -71,3 +71,17 @@ end When /^I click on the contact request$/ do find(".person.request.ui-draggable a").click end + +Then /^I should have aspect "([^"]*)" "([^"]*)"$/ do |arg1, arg2| + @aspect = Aspect.where(:name => arg1).first + + val = evaluate_script("$('#aspect_nav').children('li[data-guid=#{@aspect.id}]').hasClass('selected');") # + if arg2 == "selected" + val.should == true + elsif arg2 == "not selected" + val.should == false + else + raise "Aspect state should either be 'selected' or 'not selected'" + end +end + diff --git a/spec/controllers/aspects_controller_spec.rb b/spec/controllers/aspects_controller_spec.rb index 11fe163a3..9e20ff0c8 100644 --- a/spec/controllers/aspects_controller_spec.rb +++ b/spec/controllers/aspects_controller_spec.rb @@ -87,6 +87,23 @@ describe AspectsController do get :index, :a_ids => [@aspect0.id.to_s, @aspect1.id.to_s] assigns(:posts).length.should == 8 end + + context "storing state" do + before do + @index_params = {:a_ids => [@aspect0.id.to_s, @aspect1.id.to_s]} + end + it "stores the aspect params in the user" do + get :index, @index_params + @user.reload.open_aspects.should == @index_params[:a_ids] + end + + it "correctly stores the aspect params" do + @user.open_aspects = @index_params[:a_ids] + @user.save + get :index + @user.reload.open_aspects.should == nil + end + end end context 'performance' do @@ -319,6 +336,7 @@ describe AspectsController do describe "#hashes_for_posts" do it 'returns only distinct people' do + pending end end end diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb index fd151a0b4..aa476e343 100644 --- a/spec/controllers/home_controller_spec.rb +++ b/spec/controllers/home_controller_spec.rb @@ -23,7 +23,18 @@ describe HomeController do it 'redirects to aspects index if user is logged in' do sign_in @user get :show - response.should redirect_to aspects_path + response.should redirect_to( :controller => 'aspects', :action => 'index') + end + + it 'redirects to aspects index with stored aspects' do + sign_in @user + @aspect0 = @user.aspects.all[0] + @aspect1 = @user.aspects.create(:name => "Yeaaaah!") + @index_params = {:a_ids => [@aspect0.id.to_s, @aspect1.id.to_s]} + @user.open_aspects = @index_params[:a_ids] + @user.save + get :show + response.should redirect_to( :controller => 'aspects', :action => 'index', :a_ids => @index_params[:a_ids] ) end end diff --git a/spec/controllers/status_message_controller_spec.rb b/spec/controllers/status_message_controller_spec.rb index 62754b89e..86c92d5ac 100644 --- a/spec/controllers/status_message_controller_spec.rb +++ b/spec/controllers/status_message_controller_spec.rb @@ -30,7 +30,7 @@ describe StatusMessagesController do end it 'succeeds' do - get :show, "id" => message.id.to_s + get :show, "id" => @message.id.to_s response.should be_success end