crowdblog 0.0.1 → 0.0.2
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.
- data/.travis.yml +8 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +20 -37
- data/README.md +7 -0
- data/Rakefile +5 -2
- data/app/assets/javascripts/crowdblog/templates/posts/edit.jst.eco +1 -1
- data/app/controllers/crowdblog/application_controller.rb +1 -11
- data/app/controllers/crowdblog/sessions_controller.rb +1 -21
- data/app/models/crowdblog/post.rb +53 -44
- data/app/models/crowdblog/user.rb +9 -13
- data/app/views/layouts/crowdblog/application.html.slim +1 -0
- data/config/cucumber.yml +4 -3
- data/config/routes.rb +1 -2
- data/crowdblog.gemspec +6 -2
- data/features/posts/listing.feature +16 -0
- data/features/posts/manage.feature +31 -0
- data/features/posts/publish.feature +17 -0
- data/features/step_definitions/global_steps.rb +19 -0
- data/features/step_definitions/navigation_steps.rb +45 -0
- data/features/step_definitions/posts_steps.rb +113 -20
- data/features/support/env.rb +18 -0
- data/lib/crowdblog/version.rb +1 -1
- data/script/build +5 -1
- data/spec/dummy/app/models/user.rb +12 -0
- data/spec/dummy/config/application.rb +9 -0
- data/spec/dummy/config/initializers/crowdblog.rb +24 -0
- data/spec/dummy/config/initializers/devise.rb +3 -4
- data/spec/dummy/config/routes.rb +1 -0
- data/spec/fabricators/posts_fabricator.rb +21 -0
- data/spec/fabricators/users_fabricator.rb +19 -0
- data/spec/models/post_spec.rb +152 -56
- data/spec/models/user_spec.rb +57 -0
- metadata +116 -60
- data/README.rdoc +0 -3
- data/app/controllers/crowdblog/users/omniauth_callbacks_controller.rb +0 -21
- data/features/posts/manage_posts.feature +0 -46
- data/features/step_definitions/index_steps.rb +0 -16
- data/features/step_definitions/interaction_steps.rb +0 -26
- data/features/step_definitions/session_steps.rb +0 -15
@@ -1,35 +1,128 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
#*****************
|
2
|
+
# GIVEN steps
|
3
|
+
#-----------------
|
4
|
+
Given /^(a|\d+) Post.? from other User exists$/ do |number|
|
5
|
+
number = 1 if number.to_i < 1
|
6
|
+
|
7
|
+
number.times { Fabricate :post, author: Fabricate(:user) }
|
3
8
|
end
|
4
9
|
|
5
|
-
Given /^
|
6
|
-
|
10
|
+
Given /^(?:|the )Published Post exists$/ do
|
11
|
+
step 'Publisher User exists' unless @current_user
|
12
|
+
step 'Test User exists' unless @current_user
|
13
|
+
|
14
|
+
@published_post = Fabricate :post_published, author: @current_user, publisher: @publisher_user
|
15
|
+
end
|
16
|
+
|
17
|
+
Given /^(?:|the )Test Post exists$/ do
|
18
|
+
step 'Test User exists' unless @current_user
|
19
|
+
|
20
|
+
@post = Fabricate :post_test, author: @current_user
|
7
21
|
end
|
8
22
|
|
9
|
-
|
10
|
-
|
23
|
+
|
24
|
+
#*****************
|
25
|
+
# WHEN steps
|
26
|
+
#-----------------
|
27
|
+
When /^(?:|I )delete the Test Post$/ do
|
28
|
+
post = page.find('#posts table tr', text: 'This is a Test Post')
|
29
|
+
|
30
|
+
post.click_link 'Delete'
|
31
|
+
step 'confirm the popup dialog'
|
11
32
|
end
|
12
33
|
|
13
|
-
|
14
|
-
post =
|
15
|
-
|
34
|
+
When /^(?:|I )Draft a published Post$/ do
|
35
|
+
post = page.find('#posts table tr', text: 'This is a Published Post')
|
36
|
+
|
37
|
+
post.click_link 'Publish' # button should be 'Draft' ?
|
16
38
|
end
|
17
39
|
|
18
|
-
|
19
|
-
|
20
|
-
|
40
|
+
When /^(?:|I )edit the Test Post$/ do
|
41
|
+
fill_in 'Title', with: 'I just edited this Post'
|
42
|
+
fill_in 'Body', with: 'OMG, I changed the body of this post!'
|
43
|
+
click_button 'Save'
|
21
44
|
end
|
22
45
|
|
23
|
-
|
24
|
-
|
25
|
-
|
46
|
+
When /^(?:|I )Publish a drafted Post$/ do
|
47
|
+
post = page.find('#posts table tr', text: 'This is a Test Post')
|
48
|
+
|
49
|
+
post.click_link 'Publish'
|
26
50
|
end
|
27
51
|
|
28
|
-
|
29
|
-
|
52
|
+
When /^(?:|I )write a Post$/ do
|
53
|
+
fill_in 'Title', with: 'A Great Post Title'
|
54
|
+
fill_in 'Body', with: 'I just wrote a loooooooong Post'
|
55
|
+
click_button 'Save'
|
30
56
|
end
|
31
57
|
|
32
|
-
|
33
|
-
|
34
|
-
|
58
|
+
|
59
|
+
#*****************
|
60
|
+
# THEN steps
|
61
|
+
#-----------------
|
62
|
+
Then /^(?:|I )should not see the Test Post$/ do
|
63
|
+
posts = page.find('#posts table')
|
64
|
+
|
65
|
+
posts.should_not have_content 'This is a Test Post'
|
66
|
+
end
|
67
|
+
|
68
|
+
Then /^(?:|I )should only see my Posts$/ do
|
69
|
+
posts = page.find('#posts table')
|
70
|
+
|
71
|
+
posts.should have_content 'This is a Test Post'
|
72
|
+
posts.should_not have_content 'Random Post title'
|
73
|
+
end
|
74
|
+
|
75
|
+
Then /^(?:|I )should see my New Post$/ do
|
76
|
+
posts = page.find('#posts table')
|
77
|
+
|
78
|
+
posts.should have_content 'A Great Post Title' # Post Title
|
79
|
+
posts.should have_content 'test@crowdint.com' # Post Author
|
80
|
+
|
81
|
+
post = Crowdblog::Post.find_by_title('A Great Post Title')
|
82
|
+
post.reload.author.should == @current_user
|
83
|
+
post.permalink.should == 'a-great-post-title'
|
84
|
+
end
|
85
|
+
|
86
|
+
Then /^(?:|I )should see Posts for all Users$/ do
|
87
|
+
posts = page.find('#posts table')
|
88
|
+
|
89
|
+
posts.should have_content 'This is a Test Post'
|
90
|
+
posts.should have_content 'Random Post title'
|
91
|
+
end
|
92
|
+
|
93
|
+
Then /^(?:|I )should see the Edit Post page$/ do
|
94
|
+
page.should have_content 'Edit Post'
|
95
|
+
|
96
|
+
step 'should see the Post form'
|
97
|
+
end
|
98
|
+
|
99
|
+
Then /^(?:|I )should see the New Post page$/ do
|
100
|
+
page.should have_content 'New Post'
|
101
|
+
|
102
|
+
step 'should see the Post form'
|
103
|
+
end
|
104
|
+
|
105
|
+
Then /^(?:|I )should see the Post as Drafted$/ do
|
106
|
+
@post.reload.should be_drafted
|
107
|
+
end
|
108
|
+
|
109
|
+
Then /^(?:|I )should see the Post as Published$/ do
|
110
|
+
@post.reload.should be_published # Post is published
|
111
|
+
@post.publisher.should == @current_user # Post published by Publisher
|
112
|
+
end
|
113
|
+
|
114
|
+
Then /^(?:|I )should see the Post form$/ do
|
115
|
+
form = page.find('.container form')
|
116
|
+
|
117
|
+
form.should have_content 'Title'
|
118
|
+
form.should have_content 'Body'
|
119
|
+
form.should have_content 'Markdown syntax'
|
120
|
+
form.should have_content 'Save'
|
121
|
+
form.should have_content 'Cancel'
|
122
|
+
end
|
123
|
+
|
124
|
+
Then /^(?:|I )should see the Test Post changed$/ do
|
125
|
+
posts = page.find('#posts table')
|
126
|
+
|
127
|
+
posts.should have_content 'I just edited this Post'
|
35
128
|
end
|
data/features/support/env.rb
CHANGED
@@ -11,6 +11,10 @@ ENV["RAILS_ROOT"] ||= File.dirname(__FILE__) + "../../../spec/dummy"
|
|
11
11
|
|
12
12
|
require 'cucumber/rails'
|
13
13
|
|
14
|
+
# Headless tests: http://bit.ly/xve9YJ
|
15
|
+
require 'capybara/webkit'
|
16
|
+
Capybara.javascript_driver = ENV['DEBUG'] ? :selenium : :webkit
|
17
|
+
|
14
18
|
# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
|
15
19
|
# order to ease the transition to Capybara we set the default here. If you'd
|
16
20
|
# prefer to use XPath just remove this line and adjust any selectors in your
|
@@ -67,3 +71,17 @@ module EngineRoutesHelper
|
|
67
71
|
include Crowdblog::Engine.routes.url_helpers
|
68
72
|
end
|
69
73
|
World(EngineRoutesHelper)
|
74
|
+
|
75
|
+
# Wait for AJAX requests when using @javascript tags: http://bit.ly/zige8p
|
76
|
+
AfterStep('@javascript') do
|
77
|
+
begin
|
78
|
+
unless page.evaluate_script('typeof(jQuery)') == 'undefined' # only when JQuery is loaded
|
79
|
+
start_time = Time.now
|
80
|
+
until page.evaluate_script('jQuery.isReady&&jQuery.active==0') or (start_time + 5.seconds) < Time.now
|
81
|
+
page.evaluate_script('jQuery.isReady&&jQuery.active==0').class.should_not eql(String)
|
82
|
+
sleep 1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
rescue
|
86
|
+
end
|
87
|
+
end
|
data/lib/crowdblog/version.rb
CHANGED
data/script/build
CHANGED
@@ -16,9 +16,13 @@ which bundle || gem install bundler
|
|
16
16
|
echo "-- Install Gem dependencies"
|
17
17
|
bundle install
|
18
18
|
|
19
|
+
echo "-- Migrations"
|
20
|
+
# both rake db:migrates needed
|
21
|
+
bundle exec rake db:migrate
|
22
|
+
RAILS_ENV=test bundle exec rake db:migrate
|
23
|
+
|
19
24
|
echo "-- Build project"
|
20
25
|
export DISPLAY=:0.0
|
21
|
-
RAILS_ENV=test rake db:migrate
|
22
26
|
bundle exec rake
|
23
27
|
EXIT_CODE=$?
|
24
28
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class User < Crowdblog::User
|
2
|
+
|
3
|
+
# Include default devise modules. Others available are:
|
4
|
+
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
|
5
|
+
devise :database_authenticatable, :token_authenticatable, :trackable
|
6
|
+
|
7
|
+
# Setup accessible (or protected) attributes for your model
|
8
|
+
attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :is_publisher
|
9
|
+
|
10
|
+
validate :email, uniqueness: true
|
11
|
+
|
12
|
+
end
|
@@ -60,3 +60,12 @@ module Dummy
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
# Require and configure Fabrication for test and dev environments (not production)
|
64
|
+
unless Rails.env.production?
|
65
|
+
require 'fabrication'
|
66
|
+
require 'faker'
|
67
|
+
|
68
|
+
Fabrication.configure do |config|
|
69
|
+
config.fabricator_dir = '../../spec/fabricators'
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Crowdblog::Devise
|
2
|
+
|
3
|
+
module Sessions
|
4
|
+
def destroy
|
5
|
+
sign_out current_user
|
6
|
+
redirect_to root_url
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Auth
|
11
|
+
def authenticate!
|
12
|
+
# sign out the user if trying to sign another user
|
13
|
+
sign_out current_user if params['auth_token'] && current_user
|
14
|
+
|
15
|
+
# if no one signed in, use the default user
|
16
|
+
unless user_signed_in?
|
17
|
+
user = Crowdblog::User.find_by_email('foo@crowdint.com') || Crowdblog::User.create!(email: 'foo@crowdint.com', is_publisher: true)
|
18
|
+
sign_in user
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -213,10 +213,9 @@ Devise.setup do |config|
|
|
213
213
|
# Add a new OmniAuth provider. Check the wiki for more information on setting
|
214
214
|
# up on your models and hooks.
|
215
215
|
#config.omniauth :google_oauth2, '289799840893.apps.googleusercontent.com', '6DYqOtdhC8S5WARlkiOwS3zb'
|
216
|
-
config.omniauth :google_oauth2, ENV['GOOGLE_APP_ID'], ENV['GOOGLE_SECRET_KEY'],
|
217
|
-
|
218
|
-
|
219
|
-
config.omniauth :google_apps, :domain => 'crowdint.com'
|
216
|
+
#config.omniauth :google_oauth2, ENV['GOOGLE_APP_ID'], ENV['GOOGLE_SECRET_KEY'],
|
217
|
+
# {:client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}}
|
218
|
+
#config.omniauth :google_apps, :domain => 'crowdint.com'
|
220
219
|
|
221
220
|
|
222
221
|
# ==> Warden configuration
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
Fabricator :post, class_name: 'Crowdblog::Post' do
|
2
|
+
title { sequence { |i| "Random Post title #{i}" } }
|
3
|
+
body { Faker::Lorem.words(rand(10) + 1) }
|
4
|
+
state 'drafted'
|
5
|
+
author(fabricator: :user)
|
6
|
+
end
|
7
|
+
|
8
|
+
Fabricator :post_test, from: :post do
|
9
|
+
title 'This is a Test Post'
|
10
|
+
body 'A great post about how Crowd Interactive ROCKS!'
|
11
|
+
author(fabricator: :user_test)
|
12
|
+
end
|
13
|
+
|
14
|
+
Fabricator :post_published, from: :post do
|
15
|
+
title 'This is a Published Post'
|
16
|
+
body 'Published Post! *yeeei*'
|
17
|
+
state 'published'
|
18
|
+
published_at { 1.minute.ago }
|
19
|
+
publisher(fabricator: :user_publisher)
|
20
|
+
permalink { |post| post.title.parameterize }
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Fabricator :user, class_name: 'Crowdblog::User' do
|
2
|
+
email { sequence { |i| "user#{i}@crowdint.com" } }
|
3
|
+
name { Faker::Name.name }
|
4
|
+
is_publisher false
|
5
|
+
end
|
6
|
+
|
7
|
+
Fabricator :user_test, from: :user do
|
8
|
+
email 'test@crowdint.com'
|
9
|
+
name 'Test User'
|
10
|
+
is_publisher false
|
11
|
+
authentication_token 'user'
|
12
|
+
end
|
13
|
+
|
14
|
+
Fabricator :user_publisher, from: :user do
|
15
|
+
email 'publisher@crowdint.com'
|
16
|
+
name 'Publisher User'
|
17
|
+
is_publisher true
|
18
|
+
authentication_token 'publisher'
|
19
|
+
end
|
data/spec/models/post_spec.rb
CHANGED
@@ -1,94 +1,190 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
describe
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
module Crowdblog
|
4
|
+
describe Post do
|
5
|
+
describe 'Class Methods' do
|
6
|
+
describe '#self.all_posts_json' do
|
7
|
+
it 'convert ordered posts to JSON' do
|
8
|
+
Post.should_receive(:order_by_publish_date).and_return Post
|
9
|
+
Post.should_receive(:to_json)
|
10
|
+
Post.all_posts_json
|
11
|
+
end
|
12
|
+
end
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
describe '#self.last_published' do
|
15
|
+
it 'should find the last given post published, ordered' do
|
16
|
+
Post.should_receive(:published_and_ordered).and_return Post
|
17
|
+
Post.should_receive(:limit).with(11)
|
18
|
+
Post.last_published(11)
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
|
-
|
19
|
-
|
22
|
+
describe '#self.order_by_publish_date' do
|
23
|
+
it 'should order by published' do
|
24
|
+
Post.should_receive(:order).with('published_at DESC, created_at DESC, id DESC')
|
25
|
+
Post.order_by_publish_date
|
26
|
+
end
|
20
27
|
end
|
21
|
-
end
|
22
28
|
|
23
|
-
|
24
|
-
|
25
|
-
|
29
|
+
describe '#self.published' do
|
30
|
+
it 'should only find Published Posts' do
|
31
|
+
Post.should_receive(:where).with(state: 'published')
|
32
|
+
Post.published
|
33
|
+
end
|
26
34
|
end
|
27
35
|
|
28
|
-
|
29
|
-
|
36
|
+
describe '#self.published_and_ordered' do
|
37
|
+
it 'should find published posts and order them by published date (FILO)' do
|
38
|
+
Post.should_receive(:published).and_return Post
|
39
|
+
Post.should_receive(:order_by_publish_date).and_return Post
|
40
|
+
Post.should_receive(:includes).with(:author)
|
41
|
+
Post.published_and_ordered
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#self.scoped_for' do
|
46
|
+
let(:user) { mock_model User, is_publisher?: true }
|
47
|
+
|
48
|
+
context 'user is publisher' do
|
49
|
+
it 'should see all the Posts' do
|
50
|
+
Post.scoped_for(user).should == Post
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'user is not publisher' do
|
55
|
+
before { user.should_receive(:is_publisher?).and_return false }
|
56
|
+
|
57
|
+
it 'should see my own Posts only' do
|
58
|
+
user.should_receive(:authored_posts)
|
59
|
+
Post.scoped_for(user)
|
60
|
+
end
|
61
|
+
end
|
30
62
|
end
|
31
63
|
end
|
32
|
-
end
|
33
64
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
65
|
+
describe "#allowed_to_update_permalink?" do
|
66
|
+
context "post is published" do
|
67
|
+
before do
|
68
|
+
subject.state = 'published'
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns false" do
|
72
|
+
subject.allowed_to_update_permalink?.should be_false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "post is not published" do
|
77
|
+
before do
|
78
|
+
subject.state = 'draft'
|
79
|
+
end
|
80
|
+
|
81
|
+
it "returns true" do
|
82
|
+
subject.allowed_to_update_permalink?.should be_true
|
83
|
+
end
|
84
|
+
end
|
38
85
|
end
|
39
|
-
end
|
40
86
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
87
|
+
describe "#day" do
|
88
|
+
context "published at in february" do
|
89
|
+
before do
|
90
|
+
subject.published_at = stub(:day => 2)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "returns 02" do
|
94
|
+
subject.day.should == "02"
|
95
|
+
end
|
46
96
|
end
|
97
|
+
end
|
47
98
|
|
48
|
-
|
49
|
-
|
50
|
-
subject.
|
99
|
+
describe "#formatted_published_date" do
|
100
|
+
it "Formats the published_at date" do
|
101
|
+
subject.published_at = Time.zone.parse('2012/02/18')
|
102
|
+
subject.formatted_published_date.should == 'Feb 18, 2012'
|
51
103
|
end
|
104
|
+
end
|
52
105
|
|
53
|
-
|
54
|
-
|
55
|
-
|
106
|
+
describe '#html_body' do
|
107
|
+
before { subject.should_receive(:body).and_return '**w00t**' }
|
108
|
+
|
109
|
+
it 'should parse the Markdown in the body' do
|
110
|
+
subject.html_body.should =~ /<strong>w00t<\/strong>/
|
56
111
|
end
|
57
112
|
end
|
58
113
|
|
59
|
-
|
114
|
+
describe '#legacy' do
|
115
|
+
let(:string) { '2012-12-29-This_is_a_test' }
|
60
116
|
before do
|
61
|
-
|
117
|
+
subject.should_receive(:published_at=).with('2012-12-29')
|
118
|
+
User.should_receive(:find_by_email).and_return 'FOO'
|
119
|
+
subject.should_receive(:author=).with('FOO')
|
120
|
+
subject.should_receive(:save)
|
121
|
+
subject.should_receive(:publish)
|
122
|
+
subject.should_receive(:update_attribute).with(:permalink, 'This_is_a_test')
|
62
123
|
end
|
63
124
|
|
64
|
-
it
|
65
|
-
subject.
|
66
|
-
subject.publish_if_allowed('publish', user)
|
125
|
+
it 'should update a Post from legacy URL' do
|
126
|
+
subject.legacy(string, 'foo@bar.com')
|
67
127
|
end
|
68
128
|
end
|
69
|
-
end
|
70
129
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
130
|
+
describe "#month" do
|
131
|
+
context "published at in february" do
|
132
|
+
before do
|
133
|
+
subject.published_at = stub(:month => 2)
|
134
|
+
end
|
135
|
+
|
136
|
+
it "returns 02" do
|
137
|
+
subject.month.should == "02"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe "#publish_if_allowed" do
|
143
|
+
let(:user) { Crowdblog::User.new }
|
144
|
+
context "user is publisher" do
|
145
|
+
before do
|
146
|
+
user.is_publisher = true
|
147
|
+
end
|
148
|
+
|
149
|
+
it "changes its state" do
|
150
|
+
subject.should_receive('publish')
|
151
|
+
subject.publish_if_allowed('publish', user)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "sets the user as publisher" do
|
155
|
+
subject.publish_if_allowed('publish', user)
|
156
|
+
subject.publisher.should be(user)
|
157
|
+
end
|
75
158
|
end
|
76
159
|
|
77
|
-
|
78
|
-
|
160
|
+
context "user is not publisher" do
|
161
|
+
before do
|
162
|
+
user.is_publisher = false
|
163
|
+
end
|
164
|
+
|
165
|
+
it "does not change its state" do
|
166
|
+
subject.should_not_receive('publish')
|
167
|
+
subject.publish_if_allowed('publish', user)
|
168
|
+
end
|
79
169
|
end
|
80
170
|
end
|
81
|
-
end
|
82
171
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
subject.
|
172
|
+
describe "#regenerate_permalink" do
|
173
|
+
it "generates the permalink based on the post title" do
|
174
|
+
subject.title = 'A big long post title'
|
175
|
+
subject.regenerate_permalink
|
176
|
+
subject.permalink.should == 'a-big-long-post-title'
|
87
177
|
end
|
178
|
+
end
|
88
179
|
|
89
|
-
|
90
|
-
|
180
|
+
describe '#url_params' do
|
181
|
+
before { subject.stub(year: 'YEAR', month: 'MONTH',
|
182
|
+
day: 'DAY', permalink: 'PERMALINK') }
|
183
|
+
|
184
|
+
it 'should return the array for permalink (year/month/day/permalink)' do
|
185
|
+
subject.url_params.should == %w(YEAR MONTH DAY PERMALINK html)
|
91
186
|
end
|
92
187
|
end
|
188
|
+
|
93
189
|
end
|
94
190
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Crowdblog
|
4
|
+
describe User do
|
5
|
+
|
6
|
+
describe '#gravatar_email' do
|
7
|
+
context 'when using a Gravatar' do
|
8
|
+
before { subject.should_receive(:gravatar_alias).and_return 'GRAVATAR' }
|
9
|
+
|
10
|
+
it 'should use the alias' do
|
11
|
+
subject.gravatar_email.should == 'GRAVATAR'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when not using a Gravatar' do
|
16
|
+
before do
|
17
|
+
subject.should_receive(:gravatar_alias)
|
18
|
+
subject.should_receive(:email).and_return 'EMAIL'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should use the email' do
|
22
|
+
subject.gravatar_email.should == 'EMAIL'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#last_post_at' do
|
28
|
+
context 'when has posts' do
|
29
|
+
let(:post) { mock_model Post }
|
30
|
+
|
31
|
+
before do
|
32
|
+
subject.should_receive(:last_post).and_return post
|
33
|
+
post.should_receive(:published_at).and_return '2012-06-31'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should be the published post date' do
|
37
|
+
subject.last_post_at.should == '2012-06-31'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when no posts' do
|
42
|
+
it 'should be nil' do
|
43
|
+
subject.should_receive(:last_post)
|
44
|
+
subject.last_post_at.should be_nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#publisher!' do
|
50
|
+
it 'should make User a Publisher' do
|
51
|
+
subject.should_receive(:update_attribute).with(:is_publisher, true)
|
52
|
+
subject.publisher!
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|