diff --git a/doc/PICKLE_STEPS b/doc/PICKLE_STEPS
new file mode 100644
index 00000000..855cc048
--- /dev/null
+++ b/doc/PICKLE_STEPS
@@ -0,0 +1,139 @@
+== API
+
+==== Given steps
+
+"Given a model exists", e.g.
+
+ Given a user exists
+ Given a user: "fred" exists
+ Given the user exists
+
+"Given a model exists with fields", e.g.
+
+ Given a user exists with name: "Fred"
+ Given a user exists with name: "Fred", activated: false
+
+You can refer to other models in the fields
+
+ Given a user exists
+ And a post exists with author: the user
+
+ Given a person: "fred" exists
+ And a person: "ethel" exists
+ And a fatherhood exists with parent: user "fred", child: user "ethel"
+
+"Given n models exist", e.g.
+
+ Given 10 users exist
+
+"Given n models exist with fields", examples:
+
+ Given 10 users exist with activated: false
+
+"Given the following models exist:", examples:
+
+ Given the following users exist
+ | name | activated |
+ | Fred | false |
+ | Ethel | true |
+
+==== Then steps
+
+===== Asserting existence of models
+
+"Then a model should exist", e.g.
+
+ Then a user should exist
+
+"Then a model should exist with fields", e.g.
+
+ Then a user: "fred" should exist with name: "Fred" # we can label the found user for later use
+
+You can use other models, booleans, numerics, and strings as fields
+
+ Then a person should exist with child: person "ethel"
+ Then a user should exist with activated: false
+ Then a user should exist with activated: true, email: "fred@gmail.com"
+
+"Then n models should exist", e.g.
+
+ Then 10 events should exist
+
+"Then n models should exist with fields", e.g.
+
+ Then 2 people should exist with father: person "fred"
+
+"Then the following models exist". This allows the creation of multiple models
+using a table syntax. Using a column with the singularized name of the model creates a referenceable model. E.g.
+
+ Then the following users exist:
+ | name | activated |
+ | Freddy | false |
+
+ Then the following users exist:
+ | user | name | activated |
+ | Fred | Freddy | false |
+
+===== Asserting associations
+
+One-to-one assocs: "Then a model should be other model's association", e.g.
+
+ Then the person: "fred" should be person: "ethel"'s father
+
+Many-to-one assocs: "Then a model should be [in|one of] other model's association", e.g.
+
+ Then the person: "ethel" should be one of person: "fred"'s children
+ Then the comment should be in the post's comments
+
+===== Asserting predicate methods
+
+"Then a model should [be|have] [a|an] predicate", e.g.
+
+ Then the user should have a status # => user.status.should be_present
+ Then the user should have a stale password # => user.should have_stale_password
+ Then the car: "batmobile" should be fast # => car.should be_fast
+
+"Then a model should not [be|have] [a|an] predicate", e.g.
+
+ Then person: "fred" should not be childless # => fred.should_not be_childless
+
+=== Regexps for use in your own steps
+
+By default you get some regexps available in the main namespace for use
+in creating your own steps: `capture_model`, `capture_fields`, and others (see lib/pickle.rb)
+
+(You can use any of the regexps that Pickle uses by using the Pickle.parser namespace, see
+Pickle::Parser::Matchers for the methods available)
+
+*capture_model*
+
+ Given /^#{capture_model} exists$/ do |model_name|
+ model(model_name).should_not == nil
+ end
+
+ Then /^I should be at the (.*?) page$/ |page|
+ if page =~ /#{capture_model}'s/
+ url_for(model($1))
+ else
+ # ...
+ end
+ end
+
+ Then /^#{capture_model} should be one of #{capture_model}'s posts$/ do |post, forum|
+ post = model!(post)
+ forum = model!(forum)
+ forum.posts.should include(post)
+ end
+
+*capture_fields*
+
+This is useful for setting attributes, and knows about pickle model names so that you
+can build up composite objects with ease
+
+ Given /^#{capture_model} exists with #{capture_fields}$/ do |model_name, fields|
+ create_model(model_name, fields)
+ end
+
+ # example of use
+ Given a user exists
+ And a post exists with author: the user # this step will assign the above user as :author on the post
\ No newline at end of file
diff --git a/features/admin/cross_domain_auth.feature b/features/admin/cross_domain_auth.feature
new file mode 100644
index 00000000..c56834a2
--- /dev/null
+++ b/features/admin/cross_domain_auth.feature
@@ -0,0 +1,26 @@
+Feature: Cross Domain Authentication
+ In order to manage a new site I created
+ As an administrator signed in another site of mine
+ I want to bypass the authentication
+
+ Background:
+ Given I have the site: "test site" set up
+ And I have the site: "another site" set up
+ And I am an authenticated user
+
+ Scenario: Successful authentication
+ When I go to pages
+ Then I should see "Locomotive test website"
+ When I select "Locomotive test website #2" from "target_id"
+ And I press "Switch"
+ Then I should see "Cross-domain authentication"
+ When I press "Go"
+ Then I should see "Locomotive test website #2"
+
+ Scenario: Failed authentication because of an outdated token
+ When I go to pages
+ And I select "Locomotive test website #2" from "target_id"
+ And I press "Switch"
+ And I forget to press the button on the cross-domain notice page
+ And I press "Go"
+ Then I should see "You need to sign in"
diff --git a/features/admin/cross_domain_authentication.feature b/features/admin/cross_domain_authentication.feature
deleted file mode 100644
index c3c3331e..00000000
--- a/features/admin/cross_domain_authentication.feature
+++ /dev/null
@@ -1,24 +0,0 @@
-@site_up
-@another_site_up
-@authenticated
-Feature:
- In order to manage a new site I created
- As an administrator signed in another site of mine
- I want to bypass the authentication
-
-Scenario: Successful authentication
- When I go to pages
- Then I should see "Locomotive test website"
- When I select "Locomotive test website #2" from "target_id"
- And I press "Switch"
- Then I should see "Cross-domain authentication"
- When I press "Go"
- Then I should see "Locomotive test website #2"
-
-Scenario: Failed authentication because of an outdated token
- When I go to pages
- And I select "Locomotive test website #2" from "target_id"
- And I press "Switch"
- And I forget to press the button on the cross-domain notice page
- And I press "Go"
- Then I should see "You need to sign in"
diff --git a/features/admin/login.feature b/features/admin/login.feature
index a87d6373..339479c6 100644
--- a/features/admin/login.feature
+++ b/features/admin/login.feature
@@ -1,19 +1,21 @@
-@site_up
Feature: Login
In order to access locomotive admin panel
As an administrator
I want to log in
-Scenario: Successful authentication
- When I go to login
- And I fill in "Email" with "admin@locomotiveapp.org"
- And I fill in "Password" with "easyone"
- And I press "Log in"
- Then I should see "Listing pages"
+ Background:
+ Given I have the site: "test site" set up
-Scenario: Failed authentication
- When I go to login
- And I fill in "Email" with "admin@locomotiveapp.org"
- And I fill in "Password" with ""
- And I press "Log in"
- Then I should not see "Listing pages"
\ No newline at end of file
+ Scenario: Successful authentication
+ When I go to login
+ And I fill in "Email" with "admin@locomotiveapp.org"
+ And I fill in "Password" with "easyone"
+ And I press "Log in"
+ Then I should see "Listing pages"
+
+ Scenario: Failed authentication
+ When I go to login
+ And I fill in "Email" with "admin@locomotiveapp.org"
+ And I fill in "Password" with ""
+ And I press "Log in"
+ Then I should not see "Listing pages"
\ No newline at end of file
diff --git a/features/admin/pages.feature b/features/admin/pages.feature
index 264fce9c..d78d1836 100644
--- a/features/admin/pages.feature
+++ b/features/admin/pages.feature
@@ -1,31 +1,33 @@
-@site_up
-@authenticated
Feature: Manage Pages
In order to manage pages
As an administrator
I want to add/edit/delete pages of my site
-Scenario: Pages list is not accessible for non authenticated accounts
- Given I am not authenticated
- When I go to pages
- Then I should see "Log in"
+ Background:
+ Given I have the site: "test site" set up
+ And I am an authenticated user
-Scenario: Creating a valid page
- When I go to pages
- And I follow "new page"
- And I fill in "Title" with "Test"
- And I fill in "Slug" with "test"
- And I select "Home page" from "Parent"
- And I fill in "Body" with "Lorem ipsum...."
- And I press "Create"
- Then I should see "Page was successfully created."
- And I should have "Lorem ipsum...." in the test page layout
+ Scenario: Pages list is not accessible for non authenticated accounts
+ Given I am not authenticated
+ When I go to pages
+ Then I should see "Log in"
-Scenario: Updating a valid page
- When I go to pages
- And I follow "Home page"
- And I fill in "Title" with "Home page !"
- And I fill in "Body" with "My new content is here"
- And I press "Update"
- Then I should see "Page was successfully updated."
- And I should have "My new content is here" in the index page layout
+ Scenario: Creating a valid page
+ When I go to pages
+ And I follow "new page"
+ And I fill in "Title" with "Test"
+ And I fill in "Slug" with "test"
+ And I select "Home page" from "Parent"
+ And I fill in "Body" with "Lorem ipsum...."
+ And I press "Create"
+ Then I should see "Page was successfully created."
+ And I should have "Lorem ipsum...." in the test page layout
+
+ Scenario: Updating a valid page
+ When I go to pages
+ And I follow "Home page"
+ And I fill in "Title" with "Home page !"
+ And I fill in "Body" with "My new content is here"
+ And I press "Update"
+ Then I should see "Page was successfully updated."
+ And I should have "My new content is here" in the index page layout
diff --git a/features/render/engine.feature b/features/render/engine.feature
index 058272a7..0181d7e8 100644
--- a/features/render/engine.feature
+++ b/features/render/engine.feature
@@ -2,6 +2,9 @@ Feature: Engine
As a website user
I want to be able to view someones created locomotive pages
+ Background:
+ Given I have the site: "test site" set up with name: "Something2111"
+
@wip
Scenario: Simple Page
Given I have a page created at "/hello_world" with the content:
diff --git a/features/step_definitions/admin_steps.rb b/features/step_definitions/admin_steps.rb
index 49681659..c89e24c3 100644
--- a/features/step_definitions/admin_steps.rb
+++ b/features/step_definitions/admin_steps.rb
@@ -1,5 +1,4 @@
Before('@site_up') do
- create_site_and_admin_account
create_layout_samples
end
@@ -7,10 +6,6 @@ Before('@another_site_up') do
add_new_site
end
-Before('@authenticated') do
- Given %{I am an authenticated user}
-end
-
### Authentication
Given /^I am not authenticated$/ do
@@ -51,13 +46,6 @@ end
### Common
-def create_site_and_admin_account
- @site = Factory(:site, :name => 'Locomotive test website', :subdomain => 'test')
- @admin = Factory(:account, { :name => 'Admin', :email => 'admin@locomotiveapp.org' })
- @site.memberships.build :account => @admin, :admin => true
- @site.save
-end
-
def add_new_site
@another_site = Factory.build(:site, :name => 'Locomotive test website #2', :subdomain => 'test2')
@another_site.memberships.build :account => @admin, :admin => true
diff --git a/features/step_definitions/engine_steps.rb b/features/step_definitions/engine_steps.rb
new file mode 100644
index 00000000..17f97111
--- /dev/null
+++ b/features/step_definitions/engine_steps.rb
@@ -0,0 +1,4 @@
+
+Given /^I have a page created at "([^"]*)" with the content:$/ do |page, page_contents|
+ pending # express the regexp above with the code you wish you had
+end
\ No newline at end of file
diff --git a/features/step_definitions/site_steps.rb b/features/step_definitions/site_steps.rb
new file mode 100644
index 00000000..d8cdb8f8
--- /dev/null
+++ b/features/step_definitions/site_steps.rb
@@ -0,0 +1,14 @@
+# Creates a Site record
+#
+# examples:
+# - I have the site: "some site" set up
+# - I have the site: "some site" set up with name: "Something", domain: "test2"
+#
+Given /^I have the site: "([^"]*)" set up(?: with #{capture_fields})?$/ do |site_factory, fields|
+ @site = Factory(site_factory, parse_fields(fields))
+ @site.should_not be_nil
+
+ @admin = @site.memberships.first.account
+ @admin.should_not be_nil
+end
+
diff --git a/spec/factories.rb b/spec/factories.rb
index d7276da5..fe9f1bce 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -9,10 +9,16 @@ Factory.define "test site", :parent => :site do |s|
s.name 'Locomotive test website'
s.subdomain 'test'
s.after_build do |site_test|
- site_test.memberships.build :account => Factory("admin user"), :admin => true
+ site_test.memberships.build :account => Account.where(:name => "Admin").first || Factory("admin user"), :admin => true
end
end
+Factory.define "another site", :parent => "test site" do |s|
+ s.name "Locomotive test website #2"
+ s.subdomain "test2"
+end
+
+
# Accounts ##
Factory.define :account do |a|
a.name 'Bart Simpson'
@@ -33,12 +39,14 @@ Factory.define "frenchy user", :parent => :account do |a|
a.locale 'fr'
end
+
## Memberships ##
Factory.define :membership do |m|
m.association :account, :factory => :account
m.admin true
end
+
## Pages ##
Factory.define :page do |p|
p.association :site, :factory => :site
@@ -46,6 +54,7 @@ Factory.define :page do |p|
p.slug 'index'
end
+
## Liquid templates ##
Factory.define :liquid_template do |t|
t.association :site, :factory => :site
@@ -54,6 +63,7 @@ Factory.define :liquid_template do |t|
t.value %{simple liquid template}
end
+
## Layouts ##
Factory.define :layout do |l|
l.association :site, :factory => :site
@@ -69,6 +79,7 @@ Factory.define :layout do |l|