active_mocker 1.2.pre → 1.2.pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/active_mocker/version.rb +1 -1
- data/sample_app_rails_4/.idea/.generators +8 -0
- data/sample_app_rails_4/.idea/.name +1 -0
- data/sample_app_rails_4/.idea/.rakeTasks +7 -0
- data/sample_app_rails_4/.idea/dataSources.ids +141 -0
- data/sample_app_rails_4/.idea/dataSources.xml +36 -0
- data/sample_app_rails_4/.idea/dictionaries/zeisler.xml +3 -0
- data/sample_app_rails_4/.idea/encodings.xml +5 -0
- data/sample_app_rails_4/.idea/inspectionProfiles/Project_Default.xml +20 -0
- data/sample_app_rails_4/.idea/inspectionProfiles/profiles_settings.xml +7 -0
- data/sample_app_rails_4/.idea/misc.xml +5 -0
- data/sample_app_rails_4/.idea/modules.xml +10 -0
- data/sample_app_rails_4/.idea/runConfigurations/Development__sample_app_rails_4.xml +28 -0
- data/sample_app_rails_4/.idea/runConfigurations/Production__sample_app_rails_4.xml +28 -0
- data/sample_app_rails_4/.idea/runConfigurations/spec__sample_app_rails_4.xml +26 -0
- data/sample_app_rails_4/.idea/runConfigurations/test__sample_app_rails_4.xml +28 -0
- data/sample_app_rails_4/.idea/sample_app_rails_4.iml +262 -0
- data/sample_app_rails_4/.idea/scopes/scope_settings.xml +5 -0
- data/sample_app_rails_4/.idea/vcs.xml +7 -0
- data/sample_app_rails_4/.idea/workspace.xml +969 -0
- data/sample_app_rails_4/.rspec +1 -0
- data/sample_app_rails_4/.secret +1 -0
- data/sample_app_rails_4/Gemfile +53 -0
- data/sample_app_rails_4/Guardfile +53 -0
- data/sample_app_rails_4/LICENSE +21 -0
- data/sample_app_rails_4/README.md +25 -0
- data/sample_app_rails_4/README.nitrous.md +20 -0
- data/sample_app_rails_4/Rakefile +6 -0
- data/sample_app_rails_4/app/assets/images/rails.png +0 -0
- data/sample_app_rails_4/app/assets/javascripts/application.js +17 -0
- data/sample_app_rails_4/app/assets/javascripts/sessions.js.coffee +3 -0
- data/sample_app_rails_4/app/assets/javascripts/static_pages.js.coffee +3 -0
- data/sample_app_rails_4/app/assets/javascripts/users.js.coffee +3 -0
- data/sample_app_rails_4/app/assets/stylesheets/application.css +13 -0
- data/sample_app_rails_4/app/assets/stylesheets/custom.css.scss +246 -0
- data/sample_app_rails_4/app/assets/stylesheets/sessions.css.scss +3 -0
- data/sample_app_rails_4/app/assets/stylesheets/static_pages.css.scss +3 -0
- data/sample_app_rails_4/app/assets/stylesheets/users.css.scss +3 -0
- data/sample_app_rails_4/app/controllers/application_controller.rb +6 -0
- data/sample_app_rails_4/app/controllers/concerns/.keep +0 -0
- data/sample_app_rails_4/app/controllers/microposts_controller.rb +31 -0
- data/sample_app_rails_4/app/controllers/relationships_controller.rb +21 -0
- data/sample_app_rails_4/app/controllers/sessions_controller.rb +21 -0
- data/sample_app_rails_4/app/controllers/static_pages_controller.rb +18 -0
- data/sample_app_rails_4/app/controllers/users_controller.rb +80 -0
- data/sample_app_rails_4/app/helpers/application_helper.rb +12 -0
- data/sample_app_rails_4/app/helpers/sessions_helper.rb +49 -0
- data/sample_app_rails_4/app/helpers/static_pages_helper.rb +2 -0
- data/sample_app_rails_4/app/helpers/users_helper.rb +10 -0
- data/sample_app_rails_4/app/mailers/.keep +0 -0
- data/sample_app_rails_4/app/models/.keep +0 -0
- data/sample_app_rails_4/app/models/concerns/.keep +0 -0
- data/sample_app_rails_4/app/models/micropost.rb +14 -0
- data/sample_app_rails_4/app/models/relationship.rb +6 -0
- data/sample_app_rails_4/app/models/user.rb +47 -0
- data/sample_app_rails_4/app/views/layouts/_footer.html.erb +13 -0
- data/sample_app_rails_4/app/views/layouts/_header.html.erb +31 -0
- data/sample_app_rails_4/app/views/layouts/_shim.html.erb +3 -0
- data/sample_app_rails_4/app/views/layouts/application.html.erb +22 -0
- data/sample_app_rails_4/app/views/microposts/_micropost.html.erb +11 -0
- data/sample_app_rails_4/app/views/relationships/create.js.erb +2 -0
- data/sample_app_rails_4/app/views/relationships/destroy.js.erb +2 -0
- data/sample_app_rails_4/app/views/sessions/new.html.erb +19 -0
- data/sample_app_rails_4/app/views/shared/_error_messages.html.erb +12 -0
- data/sample_app_rails_4/app/views/shared/_feed.html.erb +6 -0
- data/sample_app_rails_4/app/views/shared/_feed_item.html.erb +15 -0
- data/sample_app_rails_4/app/views/shared/_micropost_form.html.erb +7 -0
- data/sample_app_rails_4/app/views/shared/_stats.html.erb +15 -0
- data/sample_app_rails_4/app/views/shared/_user_info.html.erb +12 -0
- data/sample_app_rails_4/app/views/static_pages/about.html.erb +8 -0
- data/sample_app_rails_4/app/views/static_pages/contact.html.erb +6 -0
- data/sample_app_rails_4/app/views/static_pages/help.html.erb +8 -0
- data/sample_app_rails_4/app/views/static_pages/home.html.erb +34 -0
- data/sample_app_rails_4/app/views/static_pages/show.html.erb +0 -0
- data/sample_app_rails_4/app/views/users/_follow.html.erb +5 -0
- data/sample_app_rails_4/app/views/users/_follow_form.html.erb +9 -0
- data/sample_app_rails_4/app/views/users/_unfollow.html.erb +5 -0
- data/sample_app_rails_4/app/views/users/_user.html.erb +8 -0
- data/sample_app_rails_4/app/views/users/edit.html.erb +27 -0
- data/sample_app_rails_4/app/views/users/index.html.erb +10 -0
- data/sample_app_rails_4/app/views/users/new.html.erb +24 -0
- data/sample_app_rails_4/app/views/users/show.html.erb +24 -0
- data/sample_app_rails_4/app/views/users/show_follow.html.erb +30 -0
- data/sample_app_rails_4/bin/bundle +3 -0
- data/sample_app_rails_4/bin/rails +4 -0
- data/sample_app_rails_4/bin/rake +4 -0
- data/sample_app_rails_4/config.ru +4 -0
- data/sample_app_rails_4/config/application.rb +31 -0
- data/sample_app_rails_4/config/boot.rb +4 -0
- data/sample_app_rails_4/config/cucumber.yml +8 -0
- data/sample_app_rails_4/config/database.yml +28 -0
- data/sample_app_rails_4/config/environment.rb +5 -0
- data/sample_app_rails_4/config/environments/development.rb +27 -0
- data/sample_app_rails_4/config/environments/production.rb +79 -0
- data/sample_app_rails_4/config/environments/test.rb +39 -0
- data/sample_app_rails_4/config/initializers/active_mocker.rb +10 -0
- data/sample_app_rails_4/config/initializers/backtrace_silencers.rb +7 -0
- data/sample_app_rails_4/config/initializers/filter_parameter_logging.rb +4 -0
- data/sample_app_rails_4/config/initializers/inflections.rb +16 -0
- data/sample_app_rails_4/config/initializers/mime_types.rb +5 -0
- data/sample_app_rails_4/config/initializers/secret_token.rb +22 -0
- data/sample_app_rails_4/config/initializers/session_store.rb +3 -0
- data/sample_app_rails_4/config/initializers/wrap_parameters.rb +14 -0
- data/sample_app_rails_4/config/locales/en.yml +23 -0
- data/sample_app_rails_4/config/routes.rb +17 -0
- data/sample_app_rails_4/db/development.sqlite3 +0 -0
- data/sample_app_rails_4/db/migrate/20130311191400_create_users.rb +10 -0
- data/sample_app_rails_4/db/migrate/20130311194153_add_index_to_users_email.rb +5 -0
- data/sample_app_rails_4/db/migrate/20130311201841_add_password_digest_to_users.rb +5 -0
- data/sample_app_rails_4/db/migrate/20130314184954_add_remember_token_to_users.rb +6 -0
- data/sample_app_rails_4/db/migrate/20130315015932_add_admin_to_users.rb +5 -0
- data/sample_app_rails_4/db/migrate/20130315175534_create_microposts.rb +11 -0
- data/sample_app_rails_4/db/migrate/20130315230445_create_relationships.rb +13 -0
- data/sample_app_rails_4/db/schema.rb +49 -0
- data/sample_app_rails_4/db/seeds.rb +7 -0
- data/sample_app_rails_4/db/test.sqlite3 +0 -0
- data/sample_app_rails_4/features/signing_in.feature +13 -0
- data/sample_app_rails_4/features/step_definitions/authentication_steps.rb +30 -0
- data/sample_app_rails_4/features/support/env.rb +59 -0
- data/sample_app_rails_4/lib/assets/.keep +0 -0
- data/sample_app_rails_4/lib/tasks/.keep +0 -0
- data/sample_app_rails_4/lib/tasks/cucumber.rake +65 -0
- data/sample_app_rails_4/lib/tasks/mocks.rake +10 -0
- data/sample_app_rails_4/lib/tasks/sample_data.rake +42 -0
- data/sample_app_rails_4/log/.keep +0 -0
- data/sample_app_rails_4/log/development.log +603 -0
- data/sample_app_rails_4/log/test.log +6727 -0
- data/sample_app_rails_4/public/404.html +27 -0
- data/sample_app_rails_4/public/422.html +26 -0
- data/sample_app_rails_4/public/500.html +26 -0
- data/sample_app_rails_4/public/assets/application-4962059d8f80f9bb096692bacc29c4e8.css +5091 -0
- data/sample_app_rails_4/public/assets/application-4962059d8f80f9bb096692bacc29c4e8.css.gz +0 -0
- data/sample_app_rails_4/public/assets/application-eeb856e3fe2c8f879c91d0e81d59cb40.js +12952 -0
- data/sample_app_rails_4/public/assets/application-eeb856e3fe2c8f879c91d0e81d59cb40.js.gz +0 -0
- data/sample_app_rails_4/public/assets/glyphicons-halflings-c806376f05e4ccabe2c5315a8e95667c.png +0 -0
- data/sample_app_rails_4/public/assets/glyphicons-halflings-white-62b67d9edee3db90d18833087f848d6e.png +0 -0
- data/sample_app_rails_4/public/assets/manifest-802de9eb1c853769101852422b620883.json +1 -0
- data/sample_app_rails_4/public/assets/rails-231a680f23887d9dd70710ea5efd3c62.png +0 -0
- data/sample_app_rails_4/public/favicon.ico +0 -0
- data/sample_app_rails_4/public/robots.txt +5 -0
- data/sample_app_rails_4/script/cucumber +10 -0
- data/sample_app_rails_4/spec/controllers/relationships_controller_spec.rb +42 -0
- data/sample_app_rails_4/spec/factories.rb +17 -0
- data/sample_app_rails_4/spec/helpers/application_helper_spec.rb +18 -0
- data/sample_app_rails_4/spec/models/micropost_spec.rb +30 -0
- data/sample_app_rails_4/spec/models/relationship_spec.rb +29 -0
- data/sample_app_rails_4/spec/models/user_spec.rb +194 -0
- data/sample_app_rails_4/spec/spec_helper.rb +49 -0
- data/sample_app_rails_4/spec/support/utilities.rb +21 -0
- data/sample_app_rails_4/vendor/assets/javascripts/.keep +0 -0
- data/sample_app_rails_4/vendor/assets/stylesheets/.keep +0 -0
- metadata +151 -1
|
Binary file
|
data/sample_app_rails_4/public/assets/glyphicons-halflings-c806376f05e4ccabe2c5315a8e95667c.png
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"files":{"rails-231a680f23887d9dd70710ea5efd3c62.png":{"logical_path":"rails.png","mtime":"2013-03-06T18:36:31-08:00","size":6646,"digest":"231a680f23887d9dd70710ea5efd3c62"},"application-eeb856e3fe2c8f879c91d0e81d59cb40.js":{"logical_path":"application.js","mtime":"2013-09-06T09:23:56-07:00","size":363970,"digest":"eeb856e3fe2c8f879c91d0e81d59cb40"},"application-4962059d8f80f9bb096692bacc29c4e8.css":{"logical_path":"application.css","mtime":"2013-09-06T13:20:19-07:00","size":134254,"digest":"4962059d8f80f9bb096692bacc29c4e8"},"glyphicons-halflings-white-62b67d9edee3db90d18833087f848d6e.png":{"logical_path":"glyphicons-halflings-white.png","mtime":"2013-06-24T16:40:09-07:00","size":8777,"digest":"62b67d9edee3db90d18833087f848d6e"},"glyphicons-halflings-c806376f05e4ccabe2c5315a8e95667c.png":{"logical_path":"glyphicons-halflings.png","mtime":"2013-06-24T16:40:09-07:00","size":12799,"digest":"c806376f05e4ccabe2c5315a8e95667c"}},"assets":{"rails.png":"rails-231a680f23887d9dd70710ea5efd3c62.png","application.js":"application-eeb856e3fe2c8f879c91d0e81d59cb40.js","application.css":"application-4962059d8f80f9bb096692bacc29c4e8.css","glyphicons-halflings-white.png":"glyphicons-halflings-white-62b67d9edee3db90d18833087f848d6e.png","glyphicons-halflings.png":"glyphicons-halflings-c806376f05e4ccabe2c5315a8e95667c.png"}}
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
|
|
4
|
+
if vendored_cucumber_bin
|
|
5
|
+
load File.expand_path(vendored_cucumber_bin)
|
|
6
|
+
else
|
|
7
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
|
8
|
+
require 'cucumber'
|
|
9
|
+
load Cucumber::BINARY
|
|
10
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe RelationshipsController do
|
|
4
|
+
|
|
5
|
+
let(:user) { FactoryGirl.create(:user) }
|
|
6
|
+
let(:other_user) { FactoryGirl.create(:user) }
|
|
7
|
+
|
|
8
|
+
before { sign_in user, no_capybara: true }
|
|
9
|
+
|
|
10
|
+
describe "creating a relationship with Ajax" do
|
|
11
|
+
|
|
12
|
+
it "should increment the Relationship count" do
|
|
13
|
+
expect do
|
|
14
|
+
xhr :post, :create, relationship: { followed_id: other_user.id }
|
|
15
|
+
end.to change(Relationship, :count).by(1)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should respond with success" do
|
|
19
|
+
xhr :post, :create, relationship: { followed_id: other_user.id }
|
|
20
|
+
expect(response).to be_success
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "destroying a relationship with Ajax" do
|
|
25
|
+
|
|
26
|
+
before { user.follow!(other_user) }
|
|
27
|
+
let(:relationship) do
|
|
28
|
+
user.relationships.find_by(followed_id: other_user.id)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should decrement the Relationship count" do
|
|
32
|
+
expect do
|
|
33
|
+
xhr :delete, :destroy, id: relationship.id
|
|
34
|
+
end.to change(Relationship, :count).by(-1)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should respond with success" do
|
|
38
|
+
xhr :delete, :destroy, id: relationship.id
|
|
39
|
+
expect(response).to be_success
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
FactoryGirl.define do
|
|
2
|
+
factory :user do
|
|
3
|
+
sequence(:name) { |n| "Person #{n}" }
|
|
4
|
+
sequence(:email) { |n| "person_#{n}@example.com"}
|
|
5
|
+
password "foobar"
|
|
6
|
+
password_confirmation "foobar"
|
|
7
|
+
|
|
8
|
+
factory :admin do
|
|
9
|
+
admin true
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
factory :micropost do
|
|
14
|
+
content "Lorem ipsum"
|
|
15
|
+
user
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ApplicationHelper do
|
|
4
|
+
|
|
5
|
+
describe "full_title" do
|
|
6
|
+
it "should include the page title" do
|
|
7
|
+
expect(full_title("foo")).to match(/foo/)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "should include the base title" do
|
|
11
|
+
expect(full_title("foo")).to match(/^Ruby on Rails Tutorial Sample App/)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should not include a bar for the home page" do
|
|
15
|
+
expect(full_title("")).not_to match(/\|/)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Micropost do
|
|
4
|
+
|
|
5
|
+
let(:user) { FactoryGirl.create(:user) }
|
|
6
|
+
before do
|
|
7
|
+
# This code is not idiomatically correct.
|
|
8
|
+
@micropost = Micropost.new(content: "Lorem ipsum", user_id: user.id)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
subject { @micropost }
|
|
12
|
+
|
|
13
|
+
it { should respond_to(:content) }
|
|
14
|
+
it { should respond_to(:user_id) }
|
|
15
|
+
|
|
16
|
+
describe "when user_id is not present" do
|
|
17
|
+
before { @micropost.user_id = nil }
|
|
18
|
+
it { should_not be_valid }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe "with blank content" do
|
|
22
|
+
before { @micropost.content = " " }
|
|
23
|
+
it { should_not be_valid }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "with content that is too long" do
|
|
27
|
+
before { @micropost.content = "a" * 141 }
|
|
28
|
+
it { should_not be_valid }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Relationship do
|
|
4
|
+
|
|
5
|
+
let(:follower) { FactoryGirl.create(:user) }
|
|
6
|
+
let(:followed) { FactoryGirl.create(:user) }
|
|
7
|
+
let(:relationship) { follower.relationships.build(followed_id: followed.id) }
|
|
8
|
+
|
|
9
|
+
subject { relationship }
|
|
10
|
+
|
|
11
|
+
it { should be_valid }
|
|
12
|
+
|
|
13
|
+
describe "follower methods" do
|
|
14
|
+
it { should respond_to(:follower) }
|
|
15
|
+
it { should respond_to(:followed) }
|
|
16
|
+
its(:follower) { should eq follower }
|
|
17
|
+
its(:followed) { should eq followed }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "when followed id is not present" do
|
|
21
|
+
before { relationship.followed_id = nil }
|
|
22
|
+
it { should_not be_valid }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "when follower id is not present" do
|
|
26
|
+
before { relationship.follower_id = nil }
|
|
27
|
+
it { should_not be_valid }
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe User do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
@user = User.new(name: "Example User", email: "user@example.com",
|
|
7
|
+
password: "foobar", password_confirmation: "foobar")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
subject { @user }
|
|
11
|
+
|
|
12
|
+
it { should respond_to(:name) }
|
|
13
|
+
it { should respond_to(:email) }
|
|
14
|
+
it { should respond_to(:password_digest) }
|
|
15
|
+
it { should respond_to(:password) }
|
|
16
|
+
it { should respond_to(:password_confirmation) }
|
|
17
|
+
it { should respond_to(:remember_token) }
|
|
18
|
+
it { should respond_to(:authenticate) }
|
|
19
|
+
it { should respond_to(:admin) }
|
|
20
|
+
it { should respond_to(:microposts) }
|
|
21
|
+
it { should respond_to(:feed) }
|
|
22
|
+
it { should respond_to(:relationships) }
|
|
23
|
+
it { should respond_to(:followed_users) }
|
|
24
|
+
it { should respond_to(:reverse_relationships) }
|
|
25
|
+
it { should respond_to(:followers) }
|
|
26
|
+
it { should respond_to(:following?) }
|
|
27
|
+
it { should respond_to(:follow!) }
|
|
28
|
+
it { should respond_to(:unfollow!) }
|
|
29
|
+
|
|
30
|
+
it { should be_valid }
|
|
31
|
+
it { should_not be_admin }
|
|
32
|
+
|
|
33
|
+
describe "with admin attribute set to 'true'" do
|
|
34
|
+
before do
|
|
35
|
+
@user.save!
|
|
36
|
+
@user.toggle!(:admin)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it { should be_admin }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe "when name is not present" do
|
|
43
|
+
before { @user.name = " " }
|
|
44
|
+
it { should_not be_valid }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "when email is not present" do
|
|
48
|
+
before { @user.email = " " }
|
|
49
|
+
it { should_not be_valid }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "when name is too long" do
|
|
53
|
+
before { @user.name = "a" * 51 }
|
|
54
|
+
it { should_not be_valid }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe "when email format is invalid" do
|
|
58
|
+
it "should be invalid" do
|
|
59
|
+
addresses = %w[user@foo,com user_at_foo.org example.user@foo.
|
|
60
|
+
foo@bar_baz.com foo@bar+baz.com foo@bar..com]
|
|
61
|
+
addresses.each do |invalid_address|
|
|
62
|
+
@user.email = invalid_address
|
|
63
|
+
expect(@user).not_to be_valid
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe "when email format is valid" do
|
|
69
|
+
it "should be valid" do
|
|
70
|
+
addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
|
|
71
|
+
addresses.each do |valid_address|
|
|
72
|
+
@user.email = valid_address
|
|
73
|
+
expect(@user).to be_valid
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "when email address is already taken" do
|
|
79
|
+
before do
|
|
80
|
+
user_with_same_email = @user.dup
|
|
81
|
+
user_with_same_email.email = @user.email.upcase
|
|
82
|
+
user_with_same_email.save
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it { should_not be_valid }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
describe "when password is not present" do
|
|
89
|
+
before do
|
|
90
|
+
@user = User.new(name: "Example User", email: "user@example.com",
|
|
91
|
+
password: " ", password_confirmation: " ")
|
|
92
|
+
end
|
|
93
|
+
it { should_not be_valid }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe "when password doesn't match confirmation" do
|
|
97
|
+
before { @user.password_confirmation = "mismatch" }
|
|
98
|
+
it { should_not be_valid }
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
describe "with a password that's too short" do
|
|
102
|
+
before { @user.password = @user.password_confirmation = "a" * 5 }
|
|
103
|
+
it { should be_invalid }
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
describe "return value of authenticate method" do
|
|
107
|
+
before { @user.save }
|
|
108
|
+
let(:found_user) { User.find_by(email: @user.email) }
|
|
109
|
+
|
|
110
|
+
describe "with valid password" do
|
|
111
|
+
it { should eq found_user.authenticate(@user.password) }
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
describe "with invalid password" do
|
|
115
|
+
let(:user_for_invalid_password) { found_user.authenticate("invalid") }
|
|
116
|
+
|
|
117
|
+
it { should_not eq user_for_invalid_password }
|
|
118
|
+
specify { expect(user_for_invalid_password).to be_false }
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
describe "remember token" do
|
|
123
|
+
before { @user.save }
|
|
124
|
+
its(:remember_token) { should_not be_blank }
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
describe "micropost associations" do
|
|
128
|
+
|
|
129
|
+
before { @user.save }
|
|
130
|
+
let!(:older_micropost) do
|
|
131
|
+
FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
|
|
132
|
+
end
|
|
133
|
+
let!(:newer_micropost) do
|
|
134
|
+
FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it "should have the right microposts in the right order" do
|
|
138
|
+
expect(@user.microposts.to_a).to eq [newer_micropost, older_micropost]
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "should destroy associated microposts" do
|
|
142
|
+
microposts = @user.microposts.to_a
|
|
143
|
+
@user.destroy
|
|
144
|
+
expect(microposts).not_to be_empty
|
|
145
|
+
microposts.each do |micropost|
|
|
146
|
+
expect(Micropost.where(id: micropost.id)).to be_empty
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
describe "status" do
|
|
151
|
+
let(:unfollowed_post) do
|
|
152
|
+
FactoryGirl.create(:micropost, user: FactoryGirl.create(:user))
|
|
153
|
+
end
|
|
154
|
+
let(:followed_user) { FactoryGirl.create(:user) }
|
|
155
|
+
|
|
156
|
+
before do
|
|
157
|
+
@user.follow!(followed_user)
|
|
158
|
+
3.times { followed_user.microposts.create!(content: "Lorem ipsum") }
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
its(:feed) { should include(newer_micropost) }
|
|
162
|
+
its(:feed) { should include(older_micropost) }
|
|
163
|
+
its(:feed) { should_not include(unfollowed_post) }
|
|
164
|
+
its(:feed) do
|
|
165
|
+
followed_user.microposts.each do |micropost|
|
|
166
|
+
should include(micropost)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
describe "following" do
|
|
173
|
+
let(:other_user) { FactoryGirl.create(:user) }
|
|
174
|
+
before do
|
|
175
|
+
@user.save
|
|
176
|
+
@user.follow!(other_user)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it { should be_following(other_user) }
|
|
180
|
+
its(:followed_users) { should include(other_user) }
|
|
181
|
+
|
|
182
|
+
describe "followed user" do
|
|
183
|
+
subject { other_user }
|
|
184
|
+
its(:followers) { should include(@user) }
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
describe "and unfollowing" do
|
|
188
|
+
before { @user.unfollow!(other_user) }
|
|
189
|
+
|
|
190
|
+
it { should_not be_following(other_user) }
|
|
191
|
+
its(:followed_users) { should_not include(other_user) }
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
|
|
3
|
+
ENV["RAILS_ENV"] ||= 'test'
|
|
4
|
+
require File.expand_path("../../config/environment", __FILE__)
|
|
5
|
+
require 'rspec/rails'
|
|
6
|
+
require 'rspec/autorun'
|
|
7
|
+
|
|
8
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
|
9
|
+
# in spec/support/ and its subdirectories.
|
|
10
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
|
11
|
+
|
|
12
|
+
# Checks for pending migrations before tests are run.
|
|
13
|
+
# If you are not using ActiveRecord, you can remove this line.
|
|
14
|
+
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
|
|
15
|
+
|
|
16
|
+
RSpec.configure do |config|
|
|
17
|
+
# ## Mock Framework
|
|
18
|
+
#
|
|
19
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
|
20
|
+
#
|
|
21
|
+
# config.mock_with :mocha
|
|
22
|
+
# config.mock_with :flexmock
|
|
23
|
+
# config.mock_with :rr
|
|
24
|
+
|
|
25
|
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
|
26
|
+
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
|
27
|
+
|
|
28
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
|
29
|
+
# examples within a transaction, remove the following line or assign false
|
|
30
|
+
# instead of true.
|
|
31
|
+
config.use_transactional_fixtures = true
|
|
32
|
+
|
|
33
|
+
# If true, the base class of anonymous controllers will be inferred
|
|
34
|
+
# automatically. This will be the default behavior in future versions of
|
|
35
|
+
# rspec-rails.
|
|
36
|
+
config.infer_base_class_for_anonymous_controllers = false
|
|
37
|
+
|
|
38
|
+
# Run specs in random order to surface order dependencies. If you find an
|
|
39
|
+
# order dependency and want to debug it, you can fix the order by providing
|
|
40
|
+
# the seed, which is printed after each run.
|
|
41
|
+
# --seed 1234
|
|
42
|
+
config.order = "random"
|
|
43
|
+
# Include the Capybara DSL so that specs in spec/requests still work.
|
|
44
|
+
config.include Capybara::DSL
|
|
45
|
+
# Disable the old-style object.should syntax.
|
|
46
|
+
config.expect_with :rspec do |c|
|
|
47
|
+
c.syntax = :expect
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
include ApplicationHelper
|
|
2
|
+
|
|
3
|
+
def sign_in(user, options={})
|
|
4
|
+
if options[:no_capybara]
|
|
5
|
+
# Sign in when not using Capybara as well.
|
|
6
|
+
remember_token = User.new_remember_token
|
|
7
|
+
cookies[:remember_token] = remember_token
|
|
8
|
+
user.update_attribute(:remember_token, User.digest(remember_token))
|
|
9
|
+
else
|
|
10
|
+
visit signin_path
|
|
11
|
+
fill_in "Email", with: user.email
|
|
12
|
+
fill_in "Password", with: user.password
|
|
13
|
+
click_button "Sign in"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
RSpec::Matchers.define :have_error_message do |message|
|
|
18
|
+
match do |page|
|
|
19
|
+
expect(page).to have_selector('div.alert.alert-error', text: message)
|
|
20
|
+
end
|
|
21
|
+
end
|