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| } end + ## Snippets ## Factory.define :snippet do |s| s.association :site, :factory => :site @@ -77,17 +88,20 @@ Factory.define :snippet do |s| s.value %{Acme} end + ## Theme assets ## Factory.define :theme_asset do |a| a.association :site end + ## Asset collections ## Factory.define :asset_collection do |s| s.association :site, :factory => :site s.name 'Trip to Chicago' end + ## Content types ## Factory.define :content_type do |t| t.association :site, :factory => :site