spbtv_pickle 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +10 -0
- data/Gemfile +3 -0
- data/Gemfile.lock.development +158 -0
- data/History.txt +499 -0
- data/License.txt +20 -0
- data/README.md +566 -0
- data/Rakefile +20 -0
- data/Rakefile.d/cucumber.rake +27 -0
- data/Rakefile.d/release.rake +44 -0
- data/Rakefile.d/rspec.rake +3 -0
- data/Rakefile.d/yard.rake +5 -0
- data/Todo.txt +3 -0
- data/autotest/discover.rb +9 -0
- data/features/app/app.rb +128 -0
- data/features/app/blueprints.rb +6 -0
- data/features/app/fabricators.rb +6 -0
- data/features/app/factories.rb +25 -0
- data/features/app/views/notifier/email.erb +1 -0
- data/features/app/views/notifier/user_email.erb +6 -0
- data/features/email/email.feature +64 -0
- data/features/generator/generators.feature +59 -0
- data/features/path/models_page.feature +44 -0
- data/features/path/named_route_page.feature +10 -0
- data/features/pickle/create_from_active_record.feature +83 -0
- data/features/pickle/create_from_fabrication.feature +46 -0
- data/features/pickle/create_from_factory_girl.feature +66 -0
- data/features/pickle/create_from_machinist.feature +46 -0
- data/features/step_definitions/email_steps.rb +1 -0
- data/features/step_definitions/extra_email_steps.rb +12 -0
- data/features/step_definitions/fork_steps.rb +4 -0
- data/features/step_definitions/generator_steps.rb +52 -0
- data/features/step_definitions/path_steps.rb +14 -0
- data/features/step_definitions/pickle_steps.rb +1 -0
- data/features/step_definitions/raise_error_steps.rb +7 -0
- data/features/support/email.rb +1 -0
- data/features/support/env.rb +14 -0
- data/features/support/paths.rb +47 -0
- data/features/support/pickle.rb +27 -0
- data/features/support/pickle_app.rb +4 -0
- data/init.rb +0 -0
- data/lib/generators/pickle_generator.rb +44 -0
- data/lib/pickle.rb +26 -0
- data/lib/pickle/adapter.rb +183 -0
- data/lib/pickle/adapters/active_record.rb +67 -0
- data/lib/pickle/adapters/data_mapper.rb +42 -0
- data/lib/pickle/adapters/mongoid.rb +54 -0
- data/lib/pickle/config.rb +49 -0
- data/lib/pickle/email.rb +87 -0
- data/lib/pickle/email/parser.rb +18 -0
- data/lib/pickle/email/world.rb +13 -0
- data/lib/pickle/parser.rb +65 -0
- data/lib/pickle/parser/matchers.rb +87 -0
- data/lib/pickle/path.rb +45 -0
- data/lib/pickle/path/world.rb +5 -0
- data/lib/pickle/session.rb +244 -0
- data/lib/pickle/session/parser.rb +34 -0
- data/lib/pickle/version.rb +3 -0
- data/lib/pickle/world.rb +14 -0
- data/lib/spbtv_pickle.rb +1 -0
- data/rails_generators/pickle/pickle_generator.rb +31 -0
- data/rails_generators/pickle/templates/email.rb +21 -0
- data/rails_generators/pickle/templates/email_steps.rb +65 -0
- data/rails_generators/pickle/templates/paths.rb +47 -0
- data/rails_generators/pickle/templates/pickle.rb +29 -0
- data/rails_generators/pickle/templates/pickle_steps.rb +105 -0
- data/spbtv_pickle.gemspec +38 -0
- data/spec/pickle/adapter_spec.rb +203 -0
- data/spec/pickle/config_spec.rb +112 -0
- data/spec/pickle/email/parser_spec.rb +51 -0
- data/spec/pickle/email_spec.rb +187 -0
- data/spec/pickle/parser/matchers_spec.rb +70 -0
- data/spec/pickle/parser_spec.rb +165 -0
- data/spec/pickle/path_spec.rb +120 -0
- data/spec/pickle/session_spec.rb +448 -0
- data/spec/pickle_spec.rb +24 -0
- data/spec/spec_helper.rb +78 -0
- metadata +370 -0
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift File.expand_path('lib')
|
2
|
+
|
3
|
+
# load given tasks file, reporting errors without failing
|
4
|
+
def load_tasks(tasks)
|
5
|
+
load tasks
|
6
|
+
rescue Exception => exception
|
7
|
+
$stderr << "** loading #{tasks.sub(File.expand_path('.'),'')} failed: "
|
8
|
+
case exception
|
9
|
+
when LoadError
|
10
|
+
$stderr << "to use, install the gems it requires\n"
|
11
|
+
else
|
12
|
+
$stderr << ([exception.message] + exception.backtrace[0..2]).join("\n ") << "\n\n"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Dir["Rakefile.d/*.rake"].sort.each {|t| load_tasks t}
|
17
|
+
|
18
|
+
task :default => :spec
|
19
|
+
|
20
|
+
task :ci => ['rcov:verify', 'cucumber']
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'cucumber/rake/task'
|
2
|
+
|
3
|
+
desc "Run features"
|
4
|
+
Cucumber::Rake::Task.new(:cucumber => [:cucumber_test_app]) do |t|
|
5
|
+
t.cucumber_opts = ['--format', 'pretty', '--require', 'features']
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "setup a rails app for running cucumber"
|
9
|
+
file "cucumber_test_app" do
|
10
|
+
puts "** setting up cucumber test app **"
|
11
|
+
Rake::Task['cucumber:setup'].invoke
|
12
|
+
end
|
13
|
+
|
14
|
+
namespace :cucumber do
|
15
|
+
task :setup do
|
16
|
+
Bundler.with_clean_env do
|
17
|
+
gemfile = "cucumber_test_app/Gemfile"
|
18
|
+
rm_rf "cucumber_test_app"
|
19
|
+
sh "bundle exec rails new cucumber_test_app --skip-javascript --skip-sprockets"
|
20
|
+
sh "echo 'gem \"cucumber-rails\", :require => false' >> #{gemfile}"
|
21
|
+
sh "echo 'gem \"rspec-rails\", \"~>3.0\"' >> #{gemfile}"
|
22
|
+
sh "echo 'gem \"capybara\"' >> #{gemfile}"
|
23
|
+
sh "bundle install --gemfile=#{gemfile}"
|
24
|
+
sh "ln -s ../../.. cucumber_test_app/vendor/plugins/pickle"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# tasks for building and releasing the software
|
2
|
+
require 'git'
|
3
|
+
require 'pickle/version'
|
4
|
+
|
5
|
+
task :build do
|
6
|
+
system "gem build pickle.gemspec"
|
7
|
+
end
|
8
|
+
|
9
|
+
namespace :release do
|
10
|
+
task :rubygems => :pre do
|
11
|
+
system "gem push pickle-#{Pickle::VERSION}.gem"
|
12
|
+
end
|
13
|
+
|
14
|
+
task :github => :pre do
|
15
|
+
tag = "v#{Pickle::VERSION}"
|
16
|
+
git = Git.open('.')
|
17
|
+
|
18
|
+
if (git.tag(tag) rescue nil)
|
19
|
+
raise "** repo is already tagged with: #{tag}"
|
20
|
+
end
|
21
|
+
|
22
|
+
git.add_tag(tag)
|
23
|
+
git.push('origin', tag)
|
24
|
+
end
|
25
|
+
|
26
|
+
task :pre => [:spec, :cucumber, :build] do
|
27
|
+
git = Git.open('.')
|
28
|
+
|
29
|
+
if File.exists?("Gemfile.lock") && File.read("Gemfile.lock") != File.read("Gemfile.lock.development")
|
30
|
+
cp "Gemfile.lock", "Gemfile.lock.development"
|
31
|
+
raise "** Gemfile.lock.development has been updated, please commit these changes."
|
32
|
+
end
|
33
|
+
|
34
|
+
if (git.status.changed + git.status.added + git.status.deleted).any?
|
35
|
+
raise "** repo is not clean, try committing some files"
|
36
|
+
end
|
37
|
+
|
38
|
+
if git.object('HEAD').sha != git.object('origin/master').sha
|
39
|
+
raise "** origin does not match HEAD, have you pushed?"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
task :all => ['release:github', 'release:rubygems']
|
44
|
+
end
|
data/Todo.txt
ADDED
data/features/app/app.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# Routes
|
2
|
+
Rails.application.routes.draw do
|
3
|
+
resources :spoons, :controller => 'default'
|
4
|
+
resources :forks, :controller => 'default' do
|
5
|
+
resources :tines, :controller => 'default' do
|
6
|
+
resources :comments, :controller => 'default'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
resources :users, :controller => 'default'
|
10
|
+
end
|
11
|
+
|
12
|
+
# Migrations
|
13
|
+
ActiveRecord::Migration.suppress_messages do
|
14
|
+
ActiveRecord::Schema.define(:version => 0) do
|
15
|
+
create_table :forks, :force => true do |t|
|
16
|
+
t.string :name
|
17
|
+
end
|
18
|
+
|
19
|
+
create_table :spoons, :force => true do |t|
|
20
|
+
t.string :name
|
21
|
+
t.boolean :round, :default => true, :null => false
|
22
|
+
end
|
23
|
+
|
24
|
+
create_table :tines, :force => true do |t|
|
25
|
+
t.belongs_to :fork
|
26
|
+
t.boolean :rusty, :default => false, :null => false
|
27
|
+
end
|
28
|
+
|
29
|
+
create_table :users, :force => true do |t|
|
30
|
+
t.string :name, :status, :email
|
31
|
+
t.decimal :attitude_score, :precision => 4, :scale => 2
|
32
|
+
t.boolean :has_stale_password, :default => false
|
33
|
+
end
|
34
|
+
|
35
|
+
create_table :knives, :force => true do |t|
|
36
|
+
t.string :name
|
37
|
+
t.boolean :sharp, :null => false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# Factories for these Fork & Spoon
|
44
|
+
class Fork < ActiveRecord::Base
|
45
|
+
validates_presence_of :name
|
46
|
+
has_many :tines
|
47
|
+
|
48
|
+
def completely_rusty?
|
49
|
+
tines.map(&:rusty?).uniq == [true]
|
50
|
+
end
|
51
|
+
|
52
|
+
def fancy?
|
53
|
+
name =~ /fancy/i
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class Tine < ActiveRecord::Base
|
58
|
+
validates_presence_of :fork
|
59
|
+
belongs_to :fork
|
60
|
+
end
|
61
|
+
|
62
|
+
# Machinist blueprint for this
|
63
|
+
class Spoon < ActiveRecord::Base
|
64
|
+
validates_presence_of :name
|
65
|
+
end
|
66
|
+
|
67
|
+
# Fabricator class
|
68
|
+
class Knife < ActiveRecord::Base
|
69
|
+
validates_presence_of :name
|
70
|
+
end
|
71
|
+
|
72
|
+
# we don't want abstract classes getting in there
|
73
|
+
class AbstractUser < ActiveRecord::Base
|
74
|
+
self.abstract_class = true
|
75
|
+
end
|
76
|
+
|
77
|
+
# No factory or blueprint for this
|
78
|
+
class User < AbstractUser
|
79
|
+
validates_presence_of :name
|
80
|
+
|
81
|
+
def positive_person?
|
82
|
+
!no_attitude? && attitude_score > 0
|
83
|
+
end
|
84
|
+
|
85
|
+
def no_attitude?
|
86
|
+
attitude_score.nil?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# controllers
|
91
|
+
class DefaultController < ActionController::Base
|
92
|
+
def index
|
93
|
+
render :text => "index: I was invoked with #{request.path}"
|
94
|
+
end
|
95
|
+
|
96
|
+
def show
|
97
|
+
render :text => "show: I was invoked with #{request.path}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def new
|
101
|
+
render :text => "new: I was invoked with #{request.path}"
|
102
|
+
end
|
103
|
+
|
104
|
+
def edit
|
105
|
+
render :text => "edit: I was invoked with #{request.path}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# notifiers
|
110
|
+
class Notifier < ActionMailer::Base
|
111
|
+
include Rails.application.routes.url_helpers
|
112
|
+
|
113
|
+
# BC 2.1
|
114
|
+
self.view_paths = "#{File.dirname(__FILE__)}/views"
|
115
|
+
|
116
|
+
def user_email(user)
|
117
|
+
@recipients = user.email
|
118
|
+
@subject = 'A user email'
|
119
|
+
@user = user
|
120
|
+
@path = user_path(user)
|
121
|
+
end
|
122
|
+
|
123
|
+
def email(to, subject, body)
|
124
|
+
@recipients = to
|
125
|
+
@subject = subject
|
126
|
+
@body = body
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Factories
|
2
|
+
require 'factory_girl'
|
3
|
+
|
4
|
+
FactoryGirl.define do
|
5
|
+
sequence :fork_name do |n|
|
6
|
+
"fork %d04" % n
|
7
|
+
end
|
8
|
+
|
9
|
+
factory :fork do |f|
|
10
|
+
f.name { FactoryGirl.generate(:fork_name) }
|
11
|
+
end
|
12
|
+
|
13
|
+
factory :tine do |t|
|
14
|
+
t.association :fork
|
15
|
+
end
|
16
|
+
|
17
|
+
factory :rusty_tine, :class => Tine do |t|
|
18
|
+
t.association :fork
|
19
|
+
t.rusty true
|
20
|
+
end
|
21
|
+
|
22
|
+
factory :fancy_fork, :class => Fork do |t|
|
23
|
+
t.name { "Fancy " + FactoryGirl.generate(:fork_name) }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @body %>
|
@@ -0,0 +1,64 @@
|
|
1
|
+
Feature: I can test emails are sent
|
2
|
+
In order write features with emails as outcomes
|
3
|
+
As a feature writer
|
4
|
+
I want to easily see what emails have been delivered
|
5
|
+
|
6
|
+
Scenario: Deliver an email, and test it's properties
|
7
|
+
Given an email "Gday" with body: "Gday Mate" is delivered to fred@gmail.com
|
8
|
+
Then 1 email should be delivered
|
9
|
+
And the email should not be delivered to "frood@fmail.com"
|
10
|
+
And the email should have subject: "Gday", to: "fred@gmail.com"
|
11
|
+
And the email should contain "Mate"
|
12
|
+
And the email should not contain "Foo"
|
13
|
+
|
14
|
+
Scenario: Deliver some emails, restrict scope
|
15
|
+
Given an email "cool" with body: "body1" is delivered to fred@gmail.com
|
16
|
+
And an email "tasty" with body: "body2" is delivered to fred@gmail.com
|
17
|
+
And an email "cool" with body: "body3" is delivered to joe@gmail.com
|
18
|
+
|
19
|
+
Then 2 emails should be delivered to fred@gmail.com
|
20
|
+
And the 1st email should have subject: "cool"
|
21
|
+
And the 2nd email should have subject: "tasty"
|
22
|
+
|
23
|
+
And 2 emails should be delivered with subject: "cool"
|
24
|
+
And the 1st email should be delivered to fred@gmail.com
|
25
|
+
And the 2nd email should be delivered to joe@gmail.com
|
26
|
+
|
27
|
+
And 1 email should be delivered with subject: "cool", to: "fred@gmail.com"
|
28
|
+
|
29
|
+
Scenario: Deliver some emails, reset deliveries
|
30
|
+
Given an email "cool" with body: "body1" is delivered to fred@gmail.com
|
31
|
+
And all emails have been delivered
|
32
|
+
Then 0 emails should be delivered
|
33
|
+
|
34
|
+
Scenario: Deliver emails to user
|
35
|
+
Given a user exists with name: "Fred", email: "fred@gmail.com"
|
36
|
+
And the user's email is delivered
|
37
|
+
Then 1 email should be delivered to the user
|
38
|
+
And the email should contain "Dear Fred"
|
39
|
+
And the email should link to the user's page
|
40
|
+
|
41
|
+
Scenario: Following the first link in an email
|
42
|
+
Given a user exists with name: "Fred", email: "fred@gmail.com"
|
43
|
+
And an email with a link "example page" to the user's page is delivered to fred@gmail.com
|
44
|
+
Then 1 email should be delivered to the user
|
45
|
+
And I click the first link in the email
|
46
|
+
Then I should be at the user's page
|
47
|
+
|
48
|
+
Scenario: Following a link in an email by url
|
49
|
+
Given a user exists with name: "Fred", email: "fred@gmail.com"
|
50
|
+
And an email with a link "example page" to the user's page is delivered to fred@gmail.com
|
51
|
+
Then 1 email should be delivered to the user
|
52
|
+
And I follow "example.com/" in the email
|
53
|
+
Then I should be at the user's page
|
54
|
+
|
55
|
+
Scenario: Following a link in an email by the text
|
56
|
+
Given a user exists with name: "Fred", email: "fred@gmail.com"
|
57
|
+
And an email with a link "example page" to the user's page is delivered to fred@gmail.com
|
58
|
+
Then 1 email should be delivered to the user
|
59
|
+
And I follow "example page" in the email
|
60
|
+
Then I should be at the user's page
|
61
|
+
|
62
|
+
Scenario: Save and open email
|
63
|
+
Given an email "Gday" with body: "Gday Mate" is delivered to fred@gmail.com
|
64
|
+
Then show me the email
|
@@ -0,0 +1,59 @@
|
|
1
|
+
@gen
|
2
|
+
Feature: allow pickle to generate steps
|
3
|
+
In order to get going with pickle
|
4
|
+
As a dev
|
5
|
+
I want to be able to generate steps
|
6
|
+
|
7
|
+
Scenario: script/generate pickle on fresh cuke install
|
8
|
+
Given cucumber has been freshly generated
|
9
|
+
When I run "rails g pickle -f"
|
10
|
+
Then the file features/support/pickle.rb should exist
|
11
|
+
And the file features/support/pickle.rb should match /require 'pickle\/world'/
|
12
|
+
And the file features/step_definitions/pickle_steps.rb should be identical to the local step_definitions/pickle_steps.rb
|
13
|
+
|
14
|
+
Scenario: script/generate pickle path on fresh cuke install
|
15
|
+
Given cucumber has been freshly generated
|
16
|
+
When I run "rails g pickle --paths -f"
|
17
|
+
Then the file features/support/pickle.rb should exist
|
18
|
+
And the file features/support/pickle.rb should match /require 'pickle\/world'/
|
19
|
+
And the file features/support/pickle.rb should match /require 'pickle\/path\/world'/
|
20
|
+
And the file features/step_definitions/pickle_steps.rb should be identical to the local step_definitions/pickle_steps.rb
|
21
|
+
And the file features/support/paths.rb should be identical to the local support/paths.rb
|
22
|
+
|
23
|
+
Scenario: script/generate pickle email on fresh cuke install
|
24
|
+
Given cucumber has been freshly generated
|
25
|
+
When I run "rails g pickle --email -f"
|
26
|
+
Then the file features/support/pickle.rb should exist
|
27
|
+
And the file features/support/pickle.rb should match /require 'pickle\/world'/
|
28
|
+
And the file features/support/pickle.rb should match /require 'pickle\/email\/world'/
|
29
|
+
And the file features/step_definitions/pickle_steps.rb should be identical to the local step_definitions/pickle_steps.rb
|
30
|
+
And the file features/step_definitions/email_steps.rb should be identical to the local step_definitions/email_steps.rb
|
31
|
+
And the file features/support/email.rb should be identical to the local support/email.rb
|
32
|
+
|
33
|
+
Scenario: script/generate pickle path email on fresh cuke install
|
34
|
+
Given cucumber has been freshly generated
|
35
|
+
When I run "rails g pickle --paths --email -f"
|
36
|
+
Then the file features/support/pickle.rb should exist
|
37
|
+
And the file features/support/pickle.rb should be identical to the local support/pickle.rb
|
38
|
+
And the file features/support/pickle.rb should match /require 'pickle\/world'/
|
39
|
+
And the file features/support/pickle.rb should match /require 'pickle\/path\/world'/
|
40
|
+
And the file features/support/pickle.rb should match /require 'pickle\/email\/world'/
|
41
|
+
And the file features/step_definitions/pickle_steps.rb should be identical to the local step_definitions/pickle_steps.rb
|
42
|
+
And the file features/support/paths.rb should be identical to the local support/paths.rb
|
43
|
+
And the file features/step_definitions/email_steps.rb should be identical to the local step_definitions/email_steps.rb
|
44
|
+
And the file features/support/email.rb should be identical to the local support/email.rb
|
45
|
+
|
46
|
+
Scenario: regenerating pickle
|
47
|
+
Given cucumber has been freshly generated
|
48
|
+
And pickle path email has been freshly generated
|
49
|
+
When I run "rails g pickle --paths --email -f"
|
50
|
+
Then the file features/support/pickle.rb should match /require 'pickle\/world'/
|
51
|
+
And the file features/support/pickle.rb should match /require 'pickle\/path\/world'/
|
52
|
+
And the file features/support/pickle.rb should match /require 'pickle\/email\/world'/
|
53
|
+
And the file features/step_definitions/pickle_steps.rb should be identical to the local step_definitions/pickle_steps.rb
|
54
|
+
And the file features/support/paths.rb should be identical to the local support/paths.rb
|
55
|
+
And the file features/step_definitions/email_steps.rb should be identical to the local step_definitions/email_steps.rb
|
56
|
+
But the file features/support/pickle.rb should not match /require 'pickle\/world'.*require 'pickle\/world'/
|
57
|
+
And the file features/support/pickle.rb should not match /require 'pickle\/path\/world'.*require 'pickle\/path\/world'/
|
58
|
+
And the file features/support/pickle.rb should not match /require 'pickle\/email\/world'.*require 'pickle\/email\/world'/
|
59
|
+
And the file features/support/email.rb should be identical to the local support/email.rb
|
@@ -0,0 +1,44 @@
|
|
1
|
+
Feature: I can visit a page for a model
|
2
|
+
In order to easily go to pages for models I've created
|
3
|
+
As a feature writer
|
4
|
+
I want to be able visit pages their model
|
5
|
+
|
6
|
+
Scenario: create a spoon, go its page
|
7
|
+
Given a spoon exists
|
8
|
+
When I go to the spoon's page
|
9
|
+
Then I should be at the spoon's page
|
10
|
+
And the spoon's page should match route /spoons/:id
|
11
|
+
|
12
|
+
Scenario: create a spoon, go to its edit page, check lots of different refs to it
|
13
|
+
Given a spoon: "fred" exists
|
14
|
+
When I go to spoon: "fred"'s edit page
|
15
|
+
Then I should be at the 1st spoon's edit page
|
16
|
+
And the 1st spoon's edit page should match route /spoons/:id/edit
|
17
|
+
And the spoon's edit page should match route /spoons/:id/edit
|
18
|
+
And the spoon: "fred"'s edit page should match route /spoons/:id/edit
|
19
|
+
|
20
|
+
Scenario: go to a fork's nested tines page
|
21
|
+
Given a fork exists
|
22
|
+
When I go to the fork's tines page
|
23
|
+
Then I should be at the fork's tines page
|
24
|
+
And the fork's tines page should match route /forks/:fork_id/tines
|
25
|
+
|
26
|
+
Scenario: go to a fork's new tine page
|
27
|
+
Given a fork exists
|
28
|
+
When I go to the fork's new tine page
|
29
|
+
Then I should be at the fork's new tine page
|
30
|
+
And the fork's new tine page should match route /forks/:fork_id/tines/new
|
31
|
+
|
32
|
+
Scenario: go to a tine in fork context page
|
33
|
+
Given a fork exists
|
34
|
+
And a tine exists with fork: the fork
|
35
|
+
When I go to the fork's tine's page
|
36
|
+
Then I should be at the fork's tine's page
|
37
|
+
And the fork's tine's page should match route /forks/:fork_id/tines/:id
|
38
|
+
|
39
|
+
Scenario: go to a tine's comments in fork context
|
40
|
+
Given a fork exists
|
41
|
+
And a tine exists with fork: the fork
|
42
|
+
When I go to the fork's tine's comments page
|
43
|
+
Then I should be at the fork's tine's comments page
|
44
|
+
And the fork's tine's comments page should match route /forks/:fork_id/tines/:tine_id/comments
|