diff --git a/Gemfile b/Gemfile index 5cad48f2b..898762237 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,7 @@ source 'https://rubygems.org' +# Look for $WORKSPACE, otherwise use "workspace" as dev path. + +workspace = ENV["WORKSPACE"] || "~/workspace" gem 'rails', '3.2.8' gem 'jquery-rails', '2.0.2' @@ -8,8 +11,15 @@ gem 'faker', '1.0.1' gem 'will_paginate', '3.0.3' gem 'bootstrap-will_paginate', '0.0.6' +gem 'uuidtools', '2.1.2' +gem 'ruby-protocol-buffers', '1.2.2' +gem 'pg_migrate','0.1.5' #:path => "#{workspace}/pg_migrate_ruby" +gem 'jam_db', :path => "#{workspace}/jam-db/target/ruby_package" +gem 'jam_ruby', :path => "#{workspace}/jam-ruby" +gem 'jampb', :path => "#{workspace}/jam-pb/target/ruby/jampb" +gem 'pg', '0.14.0' + group :development, :test do - gem 'sqlite3', '1.3.5' gem 'rspec-rails', '2.11.0' gem 'guard-rspec', '0.5.5' end @@ -34,6 +44,3 @@ group :test do # gem 'growl', '1.0.3' end -group :production do - gem 'pg', '0.12.2' -end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index d639575d7..9fbb92a0f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,19 @@ +PATH + remote: ~/workspace/jam-db/target/ruby_package + specs: + jam_db (0.0.1) + pg_migrate (= 0.1.5) + +PATH + remote: ~/workspace/jam-pb/target/ruby/jampb + specs: + jampb (0.0.1) + +PATH + remote: ~/workspace/jam-ruby + specs: + jam_ruby (0.0.1) + GEM remote: https://rubygems.org/ specs: @@ -42,8 +58,8 @@ GEM rack-test (>= 0.5.4) selenium-webdriver (~> 2.0) xpath (~> 0.1.4) - childprocess (0.3.2) - ffi (~> 1.0.6) + childprocess (0.3.5) + ffi (~> 1.0, >= 1.0.6) coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) @@ -51,10 +67,10 @@ GEM coffee-script-source execjs coffee-script-source (1.3.3) - cucumber (1.2.0) + cucumber (1.2.1) builder (>= 2.1.2) diff-lcs (>= 1.1.3) - gherkin (~> 2.10.0) + gherkin (~> 2.11.0) json (>= 1.4.6) cucumber-rails (1.2.1) capybara (>= 1.1.2) @@ -72,10 +88,10 @@ GEM railties (>= 3.0.0) faker (1.0.1) i18n (~> 0.4) - ffi (1.0.11) - gherkin (2.10.0) + ffi (1.1.5) + gherkin (2.11.2) json (>= 1.4.6) - guard (1.1.1) + guard (1.3.2) listen (>= 0.4.2) thor (>= 0.14.6) guard-rspec (0.5.5) @@ -89,15 +105,18 @@ GEM jquery-rails (2.0.2) railties (>= 3.2.0, < 5.0) thor (~> 0.14) - json (1.7.4) + json (1.7.5) launchy (2.1.0) addressable (~> 2.2.6) - libwebsocket (0.1.3) + libwebsocket (0.1.5) addressable - listen (0.4.2) + listen (0.4.7) rb-fchange (~> 0.0.5) rb-fsevent (~> 0.9.1) rb-inotify (~> 0.8.8) + little-plugger (1.1.3) + logging (1.7.2) + little-plugger (>= 1.1.3) mail (2.4.4) i18n (>= 0.4.0) mime-types (~> 1.16) @@ -105,7 +124,11 @@ GEM mime-types (1.19) multi_json (1.3.6) nokogiri (1.5.5) - pg (0.12.2) + pg (0.14.0) + pg_migrate (0.1.5) + logging (= 1.7.2) + pg (= 0.14.0) + thor (= 0.15.4) polyglot (0.3.3) rack (1.4.1) rack-cache (1.2) @@ -150,15 +173,15 @@ GEM activesupport (>= 3.0) railties (>= 3.0) rspec (~> 2.11.0) - rubyzip (0.9.8) + ruby-protocol-buffers (1.2.2) + rubyzip (0.9.9) sass (3.2.1) sass-rails (3.2.5) railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) - selenium-webdriver (2.22.2) + selenium-webdriver (2.25.0) childprocess (>= 0.2.5) - ffi (~> 1.0) libwebsocket (~> 0.1.3) multi_json (~> 1.0) rubyzip @@ -167,7 +190,6 @@ GEM hike (~> 1.2) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - sqlite3 (1.3.5) thor (0.15.4) tilt (1.3.3) treetop (1.4.10) @@ -177,6 +199,7 @@ GEM uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) + uuidtools (2.1.2) will_paginate (3.0.3) xpath (0.1.4) nokogiri (~> 1.3) @@ -196,13 +219,18 @@ DEPENDENCIES faker (= 1.0.1) guard-rspec (= 0.5.5) guard-spork (= 0.3.2) + jam_db! + jam_ruby! + jampb! jquery-rails (= 2.0.2) launchy (= 2.1.0) - pg (= 0.12.2) + pg (= 0.14.0) + pg_migrate (= 0.1.5) rails (= 3.2.8) rspec-rails (= 2.11.0) + ruby-protocol-buffers (= 1.2.2) sass-rails (= 3.2.5) spork (= 0.9.0) - sqlite3 (= 1.3.5) uglifier (= 1.2.3) + uuidtools (= 2.1.2) will_paginate (= 3.0.3) diff --git a/spec/controllers/relationships_controller_spec.rb b/spec/controllers/relationships_controller_spec.rb deleted file mode 100644 index e0c4e9794..000000000 --- a/spec/controllers/relationships_controller_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require 'spec_helper' - -describe RelationshipsController do - - let(:user) { FactoryGirl.create(:user) } - let(:other_user) { FactoryGirl.create(:user) } - - before { sign_in user } - - describe "creating a relationship with Ajax" do - - it "should increment the Relationship count" do - expect do - xhr :post, :create, relationship: { followed_id: other_user.id } - end.to change(Relationship, :count).by(1) - end - - it "should respond with success" do - xhr :post, :create, relationship: { followed_id: other_user.id } - response.should be_success - end - end - - describe "destroying a relationship with Ajax" do - - before { user.follow!(other_user) } - let(:relationship) { user.relationships.find_by_followed_id(other_user) } - - it "should decrement the Relationship count" do - expect do - xhr :delete, :destroy, id: relationship.id - end.to change(Relationship, :count).by(-1) - end - - it "should respond with success" do - xhr :delete, :destroy, id: relationship.id - response.should be_success - end - end -end \ No newline at end of file diff --git a/spec/factories.rb b/spec/factories.rb index 1f10f28be..eafc46312 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -10,8 +10,4 @@ FactoryGirl.define do end end - factory :micropost do - content "Lorem ipsum" - user - end -end \ No newline at end of file +end diff --git a/spec/models/micropost_spec.rb b/spec/models/micropost_spec.rb deleted file mode 100644 index c0478c2fb..000000000 --- a/spec/models/micropost_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'spec_helper' - -describe Micropost do - - let(:user) { FactoryGirl.create(:user) } - before { @micropost = user.microposts.build(content: "Lorem ipsum") } - - subject { @micropost } - - it { should respond_to(:content) } - it { should respond_to(:user_id) } - it { should respond_to(:user) } - its(:user) { should == user } - - it { should be_valid } - - describe "accessible attributes" do - it "should not allow access to user_id" do - expect do - Micropost.new(user_id: user.id) - end.to raise_error(ActiveModel::MassAssignmentSecurity::Error) - end - end - - describe "when user_id is not present" do - before { @micropost.user_id = nil } - it { should_not be_valid } - end - - describe "when user_id is not present" do - before { @micropost.user_id = nil } - it { should_not be_valid } - end - - describe "with blank content" do - before { @micropost.content = " " } - it { should_not be_valid } - end - - describe "with content that is too long" do - before { @micropost.content = "a" * 141 } - it { should_not be_valid } - end -end \ No newline at end of file diff --git a/spec/models/relationship_spec.rb b/spec/models/relationship_spec.rb deleted file mode 100644 index 26cf93eb0..000000000 --- a/spec/models/relationship_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'spec_helper' - -describe Relationship do - - let(:follower) { FactoryGirl.create(:user) } - let(:followed) { FactoryGirl.create(:user) } - let(:relationship) { follower.relationships.build(followed_id: followed.id) } - - subject { relationship } - - it { should be_valid } - - describe "accessible attributes" do - it "should not allow access to follower_id" do - expect do - Relationship.new(follower_id: follower.id) - end.to raise_error(ActiveModel::MassAssignmentSecurity::Error) - end - end - - describe "follower methods" do - it { should respond_to(:follower) } - it { should respond_to(:followed) } - its(:follower) { should == follower } - its(:followed) { should == followed } - end - - describe "when followed id is not present" do - before { relationship.followed_id = nil } - it { should_not be_valid } - end - - describe "when follower id is not present" do - before { relationship.follower_id = nil } - it { should_not be_valid } - end -end \ No newline at end of file diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb deleted file mode 100644 index 35e51fcd9..000000000 --- a/spec/models/user_spec.rb +++ /dev/null @@ -1,214 +0,0 @@ -require 'spec_helper' - -describe User do - - before do - @user = User.new(name: "Example User", email: "user@example.com", - password: "foobar", password_confirmation: "foobar") - end - - subject { @user } - - it { should respond_to(:name) } - it { should respond_to(:email) } - it { should respond_to(:password_digest) } - it { should respond_to(:password) } - it { should respond_to(:password_confirmation) } - it { should respond_to(:remember_token) } - it { should respond_to(:admin) } - it { should respond_to(:authenticate) } - it { should respond_to(:microposts) } - it { should respond_to(:feed) } - it { should respond_to(:relationships) } - it { should respond_to(:followed_users) } - it { should respond_to(:reverse_relationships) } - it { should respond_to(:followers) } - it { should respond_to(:following?) } - it { should respond_to(:follow!) } - it { should respond_to(:unfollow!) } - - it { should be_valid } - it { should_not be_admin } - - describe "accessible attributes" do - it "should not allow access to admin" do - expect do - User.new(admin: true) - end.to raise_error(ActiveModel::MassAssignmentSecurity::Error) - end - end - - describe "with admin attribute set to 'true'" do - before do - @user.save! - @user.toggle!(:admin) - end - - it { should be_admin } - end - - describe "when name is not present" do - before { @user.name = " " } - it { should_not be_valid } - end - - describe "when email is not present" do - before { @user.email = " " } - it { should_not be_valid } - end - - describe "when name is too long" do - before { @user.name = "a" * 51 } - it { should_not be_valid } - end - - describe "when email format is invalid" do - it "should be invalid" do - addresses = %w[user@foo,com user_at_foo.org example.user@foo.] - addresses.each do |invalid_address| - @user.email = invalid_address - @user.should_not be_valid - end - end - end - - describe "when email format is valid" do - it "should be valid" do - addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn] - addresses.each do |valid_address| - @user.email = valid_address - @user.should be_valid - end - end - end - - describe "when email address is already taken" do - before do - user_with_same_email = @user.dup - user_with_same_email.email = @user.email.upcase - user_with_same_email.save - end - - it { should_not be_valid } - end - - describe "email address with mixed case" do - let(:mixed_case_email) { "Foo@ExAMPle.CoM" } - - it "should be saved as all lower-case" do - @user.email = mixed_case_email - @user.save - @user.reload.email.should == mixed_case_email.downcase - end - end - - describe "when password is not present" do - before { @user.password = @user.password_confirmation = " " } - it { should_not be_valid } - end - - describe "when password doesn't match confirmation" do - before { @user.password_confirmation = "mismatch" } - it { should_not be_valid } - end - - describe "when password confirmation is nil" do - before { @user.password_confirmation = nil } - it { should_not be_valid } - end - - describe "with a password that's too short" do - before { @user.password = @user.password_confirmation = "a" * 5 } - it { should be_invalid } - end - - describe "return value of authenticate method" do - before { @user.save } - let(:found_user) { User.find_by_email(@user.email) } - - describe "with valid password" do - it { should == found_user.authenticate(@user.password) } - end - - describe "with invalid password" do - let(:user_for_invalid_password) { found_user.authenticate("invalid") } - - it { should_not == user_for_invalid_password } - specify { user_for_invalid_password.should be_false } - end - end - - describe "remember token" do - before { @user.save } - its(:remember_token) { should_not be_blank } - end - - - describe "micropost associations" do - - before { @user.save } - let!(:older_micropost) do - FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago) - end - let!(:newer_micropost) do - FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago) - end - - it "should have the right microposts in the right order" do - @user.microposts.should == [newer_micropost, older_micropost] - end - - it "should destroy associated microposts" do - microposts = @user.microposts - @user.destroy - microposts.each do |micropost| - Micropost.find_by_id(micropost.id).should be_nil - end - end - - describe "status" do - let(:unfollowed_post) do - FactoryGirl.create(:micropost, user: FactoryGirl.create(:user)) - end - - let(:followed_user) { FactoryGirl.create(:user) } - - before do - @user.follow!(followed_user) - 3.times { followed_user.microposts.create!(content: "Lorem ipsum") } - end - - its(:feed) { should include(newer_micropost) } - its(:feed) { should include(older_micropost) } - its(:feed) { should_not include(unfollowed_post) } - its(:feed) do - followed_user.microposts.each do |micropost| - should include(micropost) - end - end - end - end - - describe "following" do - let(:other_user) { FactoryGirl.create(:user) } - before do - @user.save - @user.follow!(other_user) - end - - it { should be_following(other_user) } - its(:followed_users) { should include(other_user) } - - describe "followed user" do - subject { other_user } - its(:followers) { should include(@user) } - end - - describe "and unfollowing" do - before { @user.unfollow!(other_user) } - - it { should_not be_following(other_user) } - its(:followed_users) { should_not include(other_user) } - end - end -end \ No newline at end of file diff --git a/spec/requests/micropost_pages_spec.rb b/spec/requests/micropost_pages_spec.rb deleted file mode 100644 index 7e66b1960..000000000 --- a/spec/requests/micropost_pages_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'spec_helper' - -describe "Micropost pages" do - - subject { page } - - let(:user) { FactoryGirl.create(:user) } - before { sign_in user } - - describe "micropost creation" do - before { visit root_path } - - describe "with invalid information" do - - it "should not create a micropost" do - expect { click_button "Post" }.not_to change(Micropost, :count) - end - - describe "error messages" do - before { click_button "Post" } - it { should have_content('error') } - end - end - - describe "with valid information" do - - before { fill_in 'micropost_content', with: "Lorem ipsum" } - it "should create a micropost" do - expect { click_button "Post" }.to change(Micropost, :count).by(1) - end - end - end - - describe "micropost destruction" do - before { FactoryGirl.create(:micropost, user: user) } - - describe "as correct user" do - before { visit root_path } - - it "should delete a micropost" do - expect { click_link "delete" }.to change(Micropost, :count).by(-1) - end - end - end -end \ No newline at end of file diff --git a/spec/requests/static_pages_spec.rb b/spec/requests/static_pages_spec.rb index c68281b19..560ed3fbf 100644 --- a/spec/requests/static_pages_spec.rb +++ b/spec/requests/static_pages_spec.rb @@ -14,28 +14,9 @@ describe "Static pages" do describe "for signed-in users" do let(:user) { FactoryGirl.create(:user) } before do - FactoryGirl.create(:micropost, user: user, content: "Lorem ipsum") - FactoryGirl.create(:micropost, user: user, content: "Dolor sit amet") sign_in user visit root_path end - - it "should render the user's feed" do - user.feed.each do |item| - page.should have_selector("li##{item.id}", text: item.content) - end - end - - describe "follower/following counts" do - let(:other_user) { FactoryGirl.create(:user) } - before do - other_user.follow!(user) - visit root_path - end - - it { should have_link("0 following", href: following_user_path(user)) } - it { should have_link("1 followers", href: followers_user_path(user)) } - end end end @@ -74,4 +55,4 @@ describe "Static pages" do click_link "sample app" page.should have_selector 'h1', text: 'Sample App' end -end \ No newline at end of file +end diff --git a/spec/requests/user_pages_spec.rb b/spec/requests/user_pages_spec.rb index 62e441c84..e591dd982 100644 --- a/spec/requests/user_pages_spec.rb +++ b/spec/requests/user_pages_spec.rb @@ -84,65 +84,6 @@ describe "User pages" do it { should have_selector('h1', text: user.name) } it { should have_selector('title', text: user.name) } - - describe "microposts" do - it { should have_content(m1.content) } - it { should have_content(m2.content) } - it { should have_content(user.microposts.count) } - end - - it { should have_selector('h1', text: user.name) } - it { should have_selector('title', text: user.name) } - - describe "follow/unfollow buttons" do - let(:other_user) { FactoryGirl.create(:user) } - before { sign_in user } - - describe "following a user" do - before { visit user_path(other_user) } - - it "should increment the followed user count" do - expect do - click_button "Follow" - end.to change(user.followed_users, :count).by(1) - end - - it "should increment the other user's followers count" do - expect do - click_button "Follow" - end.to change(other_user.followers, :count).by(1) - end - - describe "toggling the button" do - before { click_button "Follow" } - it { should have_selector('input', value: 'Unfollow') } - end - end - - describe "unfollowing a user" do - before do - user.follow!(other_user) - visit user_path(other_user) - end - - it "should decrement the followed user count" do - expect do - click_button "Unfollow" - end.to change(user.followed_users, :count).by(-1) - end - - it "should decrement the other user's followers count" do - expect do - click_button "Unfollow" - end.to change(other_user.followers, :count).by(-1) - end - - describe "toggling the button" do - before { click_button "Unfollow" } - it { should have_selector('input', value: 'Follow') } - end - end - end end describe "signup page" do @@ -232,32 +173,4 @@ describe "User pages" do specify { user.reload.email.should == new_email } end end - - describe "following/followers" do - let(:user) { FactoryGirl.create(:user) } - let(:other_user) { FactoryGirl.create(:user) } - before { user.follow!(other_user) } - - describe "followed users" do - before do - sign_in user - visit following_user_path(user) - end - - it { should have_selector('title', text: full_title('Following')) } - it { should have_selector('h3', text: 'Following') } - it { should have_link(other_user.name, href: user_path(other_user)) } - end - - describe "followers" do - before do - sign_in other_user - visit followers_user_path(other_user) - end - - it { should have_selector('title', text: full_title('Followers')) } - it { should have_selector('h3', text: 'Followers') } - it { should have_link(user.name, href: user_path(user)) } - end - end -end \ No newline at end of file +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d04e2a0f5..ce9db47b9 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,6 +3,14 @@ require 'spork' #uncomment the following line to use spork with the debugger #require 'spork/ext/ruby-debug' +require 'active_record' +require 'jam_db' +require 'spec_db' + +# recreate test database and migrate it +db_config = YAML::load(File.open('config/database.yml'))["test"] +SpecDb::recreate_database(db_config) + Spork.prefork do # Loading more in this block will cause your tests to run faster. However, # if you change any configuration or code from libraries loaded here, you'll