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.
Files changed (39) hide show
  1. data/.travis.yml +8 -0
  2. data/Gemfile +5 -2
  3. data/Gemfile.lock +20 -37
  4. data/README.md +7 -0
  5. data/Rakefile +5 -2
  6. data/app/assets/javascripts/crowdblog/templates/posts/edit.jst.eco +1 -1
  7. data/app/controllers/crowdblog/application_controller.rb +1 -11
  8. data/app/controllers/crowdblog/sessions_controller.rb +1 -21
  9. data/app/models/crowdblog/post.rb +53 -44
  10. data/app/models/crowdblog/user.rb +9 -13
  11. data/app/views/layouts/crowdblog/application.html.slim +1 -0
  12. data/config/cucumber.yml +4 -3
  13. data/config/routes.rb +1 -2
  14. data/crowdblog.gemspec +6 -2
  15. data/features/posts/listing.feature +16 -0
  16. data/features/posts/manage.feature +31 -0
  17. data/features/posts/publish.feature +17 -0
  18. data/features/step_definitions/global_steps.rb +19 -0
  19. data/features/step_definitions/navigation_steps.rb +45 -0
  20. data/features/step_definitions/posts_steps.rb +113 -20
  21. data/features/support/env.rb +18 -0
  22. data/lib/crowdblog/version.rb +1 -1
  23. data/script/build +5 -1
  24. data/spec/dummy/app/models/user.rb +12 -0
  25. data/spec/dummy/config/application.rb +9 -0
  26. data/spec/dummy/config/initializers/crowdblog.rb +24 -0
  27. data/spec/dummy/config/initializers/devise.rb +3 -4
  28. data/spec/dummy/config/routes.rb +1 -0
  29. data/spec/fabricators/posts_fabricator.rb +21 -0
  30. data/spec/fabricators/users_fabricator.rb +19 -0
  31. data/spec/models/post_spec.rb +152 -56
  32. data/spec/models/user_spec.rb +57 -0
  33. metadata +116 -60
  34. data/README.rdoc +0 -3
  35. data/app/controllers/crowdblog/users/omniauth_callbacks_controller.rb +0 -21
  36. data/features/posts/manage_posts.feature +0 -46
  37. data/features/step_definitions/index_steps.rb +0 -16
  38. data/features/step_definitions/interaction_steps.rb +0 -26
  39. data/features/step_definitions/session_steps.rb +0 -15
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ before_script:
5
+ - "export DISPLAY=:99.0"
6
+ - "sh -e /etc/init.d/xvfb start"
7
+ - "bundle exec rake db:migrate > /dev/null 2>&1"
8
+ - "RAILS_ENV=test bundle exec rake db:migrate > /dev/null 2>&1"
data/Gemfile CHANGED
@@ -12,8 +12,7 @@ gem 'carrierwave'
12
12
  gem 'devise'
13
13
  gem 'gravtastic'
14
14
  gem 'less-rails-bootstrap'
15
- gem 'omniauth-google-apps'
16
- gem 'omniauth-google-oauth2'
15
+ gem 'redcarpet'
17
16
  gem 'state_machine'
18
17
  gem 'slim_assets'
19
18
  gem 'slim-rails'
@@ -25,6 +24,10 @@ group :assets do
25
24
  gem 'uglifier'
26
25
  end
27
26
 
27
+ group :development, :test do
28
+ gem 'rake' # needed for Travis CI: http://bit.ly/xEgH8j
29
+ end
30
+
28
31
  # Declare any dependencies that are still in development here instead of in
29
32
  # your gemspec. These might include edge Rails or gems from your path or
30
33
  # Git. Remember to move these dependencies to your gemspec before releasing
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- crowdblog (0.0.1)
12
+ crowdblog (0.0.2)
13
13
  backbone-rails
14
14
  carrierwave
15
15
  devise
@@ -17,9 +17,8 @@ PATH
17
17
  gravtastic
18
18
  jquery-rails
19
19
  less-rails-bootstrap
20
- omniauth-google-apps
21
- omniauth-google-oauth2
22
20
  rails (~> 3.2)
21
+ redcarpet
23
22
  slim-rails
24
23
  slim_assets
25
24
  state_machine
@@ -54,7 +53,6 @@ GEM
54
53
  activesupport (3.2.1)
55
54
  i18n (~> 0.6)
56
55
  multi_json (~> 1.0)
57
- addressable (2.2.7)
58
56
  arel (3.0.2)
59
57
  backbone-rails (0.9.0)
60
58
  rails (>= 3.0.0)
@@ -67,6 +65,9 @@ GEM
67
65
  rack-test (>= 0.5.4)
68
66
  selenium-webdriver (~> 2.0)
69
67
  xpath (~> 0.1.4)
68
+ capybara-webkit (0.10.0)
69
+ capybara (>= 1.0.0, < 1.2)
70
+ json
70
71
  carrierwave (0.5.8)
71
72
  activesupport (~> 3.0)
72
73
  childprocess (0.3.1)
@@ -105,19 +106,21 @@ GEM
105
106
  erubis (2.7.0)
106
107
  execjs (1.3.0)
107
108
  multi_json (~> 1.0)
108
- faraday (0.7.6)
109
- addressable (~> 2.2)
110
- multipart-post (~> 1.1)
111
- rack (~> 1.1)
109
+ fabrication (1.3.1)
110
+ faker (1.0.1)
111
+ i18n (~> 0.4)
112
112
  ffi (1.0.11)
113
113
  fuubar (1.0.0)
114
114
  rspec (~> 2.0)
115
115
  rspec-instafail (~> 0.2.0)
116
116
  ruby-progressbar (~> 0.0.10)
117
+ fuubar-cucumber (0.0.15)
118
+ cucumber (>= 1.0.2)
119
+ ruby-progressbar (~> 0.0.10)
117
120
  gherkin (2.9.0)
118
121
  json (>= 1.4.6)
119
122
  gravtastic (3.2.6)
120
- hashie (1.2.0)
123
+ headless (0.2.2)
121
124
  hike (1.2.1)
122
125
  i18n (0.6.0)
123
126
  journey (1.0.2)
@@ -141,35 +144,12 @@ GEM
141
144
  treetop (~> 1.4.8)
142
145
  mime-types (1.17.2)
143
146
  multi_json (1.1.0)
144
- multipart-post (1.1.5)
145
147
  nokogiri (1.5.0)
146
- oauth2 (0.5.2)
147
- faraday (~> 0.7)
148
- multi_json (~> 1.0)
149
- omniauth (1.0.2)
150
- hashie (~> 1.2)
151
- rack
152
- omniauth-google-apps (0.0.1)
153
- omniauth (~> 1.0)
154
- omniauth-openid (~> 1.0)
155
- ruby-openid-apps-discovery (~> 1.2.0)
156
- omniauth-google-oauth2 (0.1.9)
157
- omniauth (~> 1.0)
158
- omniauth-oauth2
159
- omniauth-oauth2 (1.0.0)
160
- oauth2 (~> 0.5.0)
161
- omniauth (~> 1.0)
162
- omniauth-openid (1.0.1)
163
- omniauth (~> 1.0)
164
- rack-openid (~> 1.3.1)
165
148
  orm_adapter (0.0.6)
166
149
  polyglot (0.3.3)
167
150
  rack (1.4.1)
168
151
  rack-cache (1.1)
169
152
  rack (>= 0.4)
170
- rack-openid (1.3.1)
171
- rack (>= 1.1.0)
172
- ruby-openid (>= 2.1.8)
173
153
  rack-ssl (1.3.2)
174
154
  rack
175
155
  rack-test (0.6.1)
@@ -192,6 +172,7 @@ GEM
192
172
  rake (0.9.2.2)
193
173
  rdoc (3.12)
194
174
  json (~> 1.4)
175
+ redcarpet (2.1.0)
195
176
  rspec (2.8.0)
196
177
  rspec-core (~> 2.8.0)
197
178
  rspec-expectations (~> 2.8.0)
@@ -206,9 +187,6 @@ GEM
206
187
  activesupport (>= 3.0)
207
188
  railties (>= 3.0)
208
189
  rspec (~> 2.8.0)
209
- ruby-openid (2.1.8)
210
- ruby-openid-apps-discovery (1.2.0)
211
- ruby-openid (>= 2.1.7)
212
190
  ruby-progressbar (0.0.10)
213
191
  rubyzip (0.9.6.1)
214
192
  sass (3.1.15)
@@ -266,6 +244,7 @@ PLATFORMS
266
244
 
267
245
  DEPENDENCIES
268
246
  backbone-rails
247
+ capybara-webkit
269
248
  carrierwave
270
249
  coffee-rails
271
250
  crowdblog!
@@ -273,12 +252,16 @@ DEPENDENCIES
273
252
  database_cleaner
274
253
  devise
275
254
  eco
255
+ fabrication
256
+ faker
276
257
  fuubar
258
+ fuubar-cucumber
277
259
  gravtastic
260
+ headless
278
261
  jquery-rails
279
262
  less-rails-bootstrap
280
- omniauth-google-apps
281
- omniauth-google-oauth2
263
+ rake
264
+ redcarpet
282
265
  rspec-rails
283
266
  sass-rails
284
267
  simplecov
data/README.md ADDED
@@ -0,0 +1,7 @@
1
+ CrowdBlog
2
+ =======
3
+
4
+ CI:
5
+ [![Build Status](https://secure.travis-ci.org/crowdint/crowdblog.png?branch=master)](http://travis-ci.org/crowdint/crowdblog)
6
+
7
+ **This project rocks!**
data/Rakefile CHANGED
@@ -28,5 +28,8 @@ Bundler::GemHelper.install_tasks
28
28
  require 'rspec/core/rake_task'
29
29
  RSpec::Core::RakeTask.new(:spec)
30
30
 
31
- # RSpec as default
32
- task :default => :spec
31
+ # Alias for Cucumber
32
+ task :cucumber => 'app:cucumber'
33
+
34
+ # RSpec and Cucumber by default
35
+ task :default => [:spec, :cucumber]
@@ -1,4 +1,4 @@
1
- <h2><%= @isNew ? 'New' : 'Edit' %> Post</h2>
1
+ <h2><%= if @isNew then 'New' else 'Edit' %> Post</h2>
2
2
 
3
3
  <form accept-charset="UTF-8" action="/" class="form-horizontal" method="post">
4
4
  <fieldset>
@@ -1,16 +1,6 @@
1
1
  module Crowdblog
2
2
  class ApplicationController < ActionController::Base
3
+ include Crowdblog::Devise::Auth
3
4
  before_filter :authenticate!
4
-
5
- def authenticate!
6
- unless user_signed_in?
7
- current_user = User.find_by_email('foo@crowdint.com') || User.create!(email: 'foo@crowdint.com', is_publisher: true)
8
- sign_in current_user
9
- end
10
-
11
- #TODO: fix OAuth
12
- #redirect_to user_omniauth_authorize_path(:google_apps) unless current_user
13
- end
14
-
15
5
  end
16
6
  end
@@ -1,25 +1,5 @@
1
1
  module Crowdblog
2
2
  class SessionsController < ApplicationController
3
-
4
- def authenticate_user
5
- auth_hash = request.env['omniauth.auth']
6
-
7
- if allowed?
8
- Rails.logger.info auth_hash.info
9
- email = auth_hash.info['email']
10
- user = User.find_by_email(email)
11
- user ||= User.create!(email: email, name: auth_hash.info['name'])
12
- sign_in user
13
-
14
- redirect_to root_url
15
- else
16
- render :text => '401 Unauthorized', :status => 401
17
- end
18
- end
19
-
20
- def allowed?
21
- true
22
- end
23
-
3
+ include Crowdblog::Devise::Sessions
24
4
  end
25
5
  end
@@ -28,59 +28,66 @@ module Crowdblog
28
28
  post.published_at ||= Time.now
29
29
  end
30
30
 
31
- event :publish do
32
- transition drafted: :published
33
- end
34
-
35
31
  event :draft do
36
32
  transition published: :drafted
37
33
  end
38
- end
39
34
 
40
- def self.all_posts_json
41
- order('published_at desc, created_at desc').to_json only: [:id, :title, :state, :published_at],
42
- methods: [:author_email, :published?]
35
+ event :publish do
36
+ transition drafted: :published
37
+ end
43
38
  end
44
39
 
45
- def self.scoped_for(user)
46
- user.is_publisher? ? Post : user.authored_posts
47
- end
40
+ # CLASS METHODS
41
+ class << self
42
+ def all_posts_json
43
+ order_by_publish_date.to_json only: [:id, :title, :state, :published_at],
44
+ methods: [:author_email, :published?]
45
+ end
48
46
 
47
+ def last_published(number)
48
+ published_and_ordered.limit(number)
49
+ end
49
50
 
50
- def self.all_for_feed
51
- Post.published_and_ordered.limit(15)
52
- end
51
+ def order_by_publish_date
52
+ order('published_at DESC, created_at DESC, id DESC')
53
+ end
53
54
 
54
- def self.for_index
55
- Post.published_and_ordered.limit(3)
56
- end
55
+ def published
56
+ where(state: 'published')
57
+ end
57
58
 
58
- def self.for_history
59
- Post.published_and_ordered.limit(13)
60
- end
59
+ def published_and_ordered
60
+ published.order_by_publish_date.includes(:author)
61
+ end
61
62
 
62
- def self.published_and_ordered
63
- Post.where(state: 'published').order('published_at DESC').includes(:author)
63
+ def scoped_for(user)
64
+ user.is_publisher? ? Post : user.authored_posts
65
+ end
64
66
  end
65
67
 
66
- def regenerate_permalink
67
- self.permalink = title.parameterize
68
- end
68
+ # Must be after Class methods (otherwise a missing method error will raise)
69
+ scope :for_index, last_published(3)
70
+ scope :for_history, last_published(13)
71
+ scope :all_for_feed, last_published(15)
72
+
69
73
 
74
+ # INSTANCE METHODS
70
75
  def allowed_to_update_permalink?
71
76
  !self.published?
72
77
  end
73
78
 
74
- def formatted_published_date
75
- published_at.strftime("%b %d, %Y")
79
+ def day
80
+ "%02d" % published_at.day
76
81
  end
77
82
 
78
- def month
79
- "%02d" % published_at.month
83
+ def formatted_published_date
84
+ published_at.strftime("%b %d, %Y")
80
85
  end
81
86
 
82
- def day
83
- "%02d" % published_at.day
87
+ def html_body
88
+ @@renderer ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML,
89
+ :autolink => true, :space_after_headers => true)
90
+ @@renderer.render(self.body).html_safe
84
91
  end
85
92
 
86
93
  def legacy(string, email)
@@ -93,6 +100,21 @@ module Crowdblog
93
100
  self.update_attribute(:permalink, results[2])
94
101
  end
95
102
 
103
+ def month
104
+ "%02d" % published_at.month
105
+ end
106
+
107
+ def publish_if_allowed(transition, user)
108
+ if user.is_publisher?
109
+ self.publisher = user
110
+ self.send(transition)
111
+ end
112
+ end
113
+
114
+ def regenerate_permalink
115
+ self.permalink = title.parameterize
116
+ end
117
+
96
118
  #
97
119
  # Use this methods to generate the post url
98
120
  # always use with the splat
@@ -104,18 +126,5 @@ module Crowdblog
104
126
  def url_params
105
127
  [self.year, self.month, self.day, self.permalink, 'html']
106
128
  end
107
-
108
- def html_body
109
- @@renderer ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML,
110
- :autolink => true, :space_after_headers => true)
111
- @@renderer.render(self.body).html_safe
112
- end
113
-
114
- def publish_if_allowed(transition, user)
115
- if user.is_publisher?
116
- self.publisher = user
117
- self.send(transition)
118
- end
119
- end
120
129
  end
121
130
  end
@@ -4,28 +4,24 @@ module Crowdblog
4
4
  include Gravtastic
5
5
 
6
6
  has_many :authored_posts, inverse_of: :author, foreign_key: 'author_id', class_name: 'Post'
7
+ has_one :last_post, class_name: 'Post', foreign_key: :author_id, conditions: ['state = ?', 'published'], order: 'published_at DESC, created_at DESC, id DESC'
7
8
 
8
- # Include default devise modules. Others available are:
9
- # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
10
- devise :database_authenticatable, :token_authenticatable, :trackable, :omniauthable
11
-
12
- # Setup accessible (or protected) attributes for your model
13
- attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :is_publisher
9
+ devise :database_authenticatable, :token_authenticatable
14
10
 
15
11
  gravtastic :gravatar_email
16
12
 
17
- validate :email, uniqueness: true
18
-
19
- def publisher!
20
- update_attribute(:is_publisher, true)
21
- end
22
13
 
14
+ # INSTANCE METHODS
23
15
  def gravatar_email
24
- (gravatar_alias || email)
16
+ gravatar_alias || email
25
17
  end
26
18
 
27
19
  def last_post_at
28
- authored_posts.published_and_ordered.first.try(:published_at)
20
+ last_post.try(:published_at)
21
+ end
22
+
23
+ def publisher!
24
+ update_attribute(:is_publisher, true)
29
25
  end
30
26
  end
31
27
  end
@@ -18,6 +18,7 @@ html
18
18
  = image_tag 'crowdblog/logo.png'
19
19
  .span3
20
20
  ul.nav
21
+ li.brand= current_user.email
21
22
  li= link_to 'Posts', posts_path
22
23
  li= link_to 'Authors', authors_path
23
24
  li= link_to 'Sign out', destroy_user_session_path
data/config/cucumber.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  <%
2
+ require 'fuubar-cucumber'
2
3
  rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
4
  rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
- std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --color --strict --tags ~@wip"
5
+ std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'fuubar'} --color --strict --tags ~@wip -r features/"
5
6
  %>
6
7
  default: <%= std_opts %> features
7
- wip: --color --tags @wip:3 --wip features
8
- rerun: <%= rerun_opts %> --color --format rerun --out rerun.txt --strict --tags ~@wip
8
+ wip: --color -r features/ --tags @wip:3 --wip features
9
+ rerun: <%= rerun_opts %> --color -r features/ --format rerun --out rerun.txt --strict --tags ~@wip
data/config/routes.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  Crowdblog::Engine.routes.draw do
2
2
 
3
- devise_for :users, class_name: 'Crowdblog::User',
4
- controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
3
+ devise_for :users, class_name: 'Crowdblog::User'
5
4
 
6
5
  resources :authors, only: :index
7
6
 
data/crowdblog.gemspec CHANGED
@@ -29,15 +29,19 @@ Gem::Specification.new do |s|
29
29
  s.add_dependency 'eco'
30
30
  s.add_dependency 'gravtastic'
31
31
  s.add_dependency 'less-rails-bootstrap'
32
- s.add_dependency 'omniauth-google-apps'
33
- s.add_dependency 'omniauth-google-oauth2'
32
+ s.add_dependency 'redcarpet'
34
33
  s.add_dependency 'slim_assets'
35
34
  s.add_dependency 'slim-rails'
36
35
  s.add_dependency 'state_machine'
37
36
 
37
+ s.add_development_dependency 'capybara-webkit'
38
38
  s.add_development_dependency 'cucumber-rails'
39
39
  s.add_development_dependency 'database_cleaner'
40
+ s.add_development_dependency 'fabrication'
41
+ s.add_development_dependency 'faker'
40
42
  s.add_development_dependency 'fuubar'
43
+ s.add_development_dependency 'fuubar-cucumber'
44
+ s.add_development_dependency 'headless'
41
45
  s.add_development_dependency 'rspec-rails'
42
46
  s.add_development_dependency 'simplecov'
43
47
  s.add_development_dependency 'simplecov-rcov-text'
@@ -0,0 +1,16 @@
1
+ @javascript
2
+ Feature: Posts Listing
3
+ As a User
4
+ I should only see my own posts
5
+
6
+ Background:
7
+ Given the Test Post exists
8
+ And a Post from other User exists
9
+
10
+ Scenario: Show only User Posts
11
+ When I am signed in as Test User
12
+ Then I should only see my Posts
13
+
14
+ Scenario: Publishers can see all Posts
15
+ When I am signed in as Publisher User
16
+ Then I should see Posts for all Users
@@ -0,0 +1,31 @@
1
+ @javascript
2
+ Feature: Manage Posts
3
+ As a User
4
+ I want to be able to manage Posts (CRUD)
5
+
6
+ Background:
7
+ Given the Test User exists
8
+ And the Test Post exists
9
+ And I am signed in as Test User
10
+
11
+ Scenario: New Post
12
+ Given I am on the New Post page
13
+ When I write a Post
14
+ Then I should see my New Post
15
+
16
+ Scenario: Edit Post
17
+ Given I am on the Edit Post page
18
+ When I edit the Test Post
19
+ Then I should see the Test Post changed
20
+
21
+ Scenario: Delete Posts
22
+ When I delete the Test Post
23
+ Then I should not see the Test Post
24
+
25
+ Scenario: Navigate to New Post
26
+ When I navigate to New Post
27
+ Then I should see the New Post page
28
+
29
+ Scenario: Navigate to Edit Post
30
+ When I navigate to Edit Post
31
+ Then I should see the Edit Post page
@@ -0,0 +1,17 @@
1
+ @javascript
2
+ Feature: Posts Publication
3
+ As a Publisher
4
+ I want to be able to publish drafted Posts
5
+
6
+ Background:
7
+ Given the Test Post exists
8
+ And the Published Post exists
9
+ And I am signed in as Publisher User
10
+
11
+ Scenario: Publish a Post
12
+ When I Publish a drafted Post
13
+ Then I should see the Post as Published
14
+
15
+ Scenario: Un-Publish a Post
16
+ When I Draft a published Post
17
+ Then I should see the Post as Drafted
@@ -0,0 +1,19 @@
1
+ Given /^(?:|I )am signed in as (Test|Publisher) User$/ do |user_type|
2
+ step "#{user_type} User exists"
3
+
4
+ @current_user.authentication_token.should be_present
5
+ visit crowdblog_path + "?auth_token=#{@current_user.authentication_token}"
6
+ end
7
+
8
+ Given /^(?:|the )Test User exists$/ do
9
+ @current_user = Crowdblog::User.find_by_email('test@crowdint.com')
10
+
11
+ @current_user = Fabricate(:user_test) unless @current_user
12
+ end
13
+
14
+ Given /^(?:|the )Publisher User exists$/ do
15
+ @current_user = Crowdblog::User.find_by_email('publisher@crowdint.com')
16
+
17
+ @current_user = Fabricate(:user_publisher) unless @current_user
18
+ @publisher_user = @current_user
19
+ end
@@ -0,0 +1,45 @@
1
+ #*****************
2
+ # GIVEN steps
3
+ #-----------------
4
+ Given /^(?:|I )(?:go to|am on) the posts page$/ do
5
+ visit posts_path
6
+ end
7
+
8
+ Given /^(?:|I )am on the Edit Post page$/ do
9
+ @post.should_not be_nil
10
+ visit posts_path + "#edit/#{@post.id}"
11
+ end
12
+
13
+ Given /^(?:|I )am on the New Post page$/ do
14
+ visit posts_path + '#new'
15
+ end
16
+
17
+
18
+ #*****************
19
+ # WHEN steps
20
+ #-----------------
21
+ When /^(?:|I )confirm the popup dialog$/ do
22
+ if Capybara.javascript_driver == :selenium
23
+ page.driver.browser.switch_to.alert.accept
24
+ else
25
+ page.execute_script 'window.confirm = function() { return true }'
26
+ end
27
+ end
28
+
29
+ When /^(?:|I )navigate to Edit Post$/ do
30
+ post = page.find('#posts table tr', text: 'This is a Test Post')
31
+
32
+ post.click_link 'Edit'
33
+ end
34
+
35
+ When /^(?:|I )navigate to New Post$/ do
36
+ click_link 'New Post'
37
+ end
38
+
39
+
40
+ #*****************
41
+ # THEN steps
42
+ #-----------------
43
+ #Then /^show me the page$/ do
44
+ # save_and_open_page
45
+ #end