fix ALL the cucumber tests + also solve a couple of UI bugs with the has_many and many_to_many relationships

This commit is contained in:
Didier Lafforgue 2012-03-01 11:07:22 +01:00
parent b994b87194
commit 50a3addf45
34 changed files with 243 additions and 219 deletions

View File

@ -44,7 +44,8 @@ class Locomotive.Models.ContentEntry extends Backbone.Model
_.each @get('has_many_custom_fields'), (field) => # include the has_many relationships
name = field[0]
hash["#{name}_attributes"] = @get(name).toMinJSON()
if @get(name).length > 0
hash["#{name}_attributes"] = @get(name).toMinJSON()
_.each @get('many_to_many_custom_fields'), (field) => # include the many_to_many relationships
name = field[0]; setter_name = field[1]

View File

@ -62,14 +62,15 @@ class Locomotive.Views.ContentEntries.FormView extends Locomotive.Views.Shared.F
@$("##{@model.paramRoot}_#{name}_input label").after(view.render().el)
enable_has_many_fields: ->
_.each @model.get('has_many_custom_fields'), (field) =>
name = field[0]; inverse_of = field[1]
new_entry = new Locomotive.Models.ContentEntry(@options["#{name}_new_entry"])
view = new Locomotive.Views.Shared.Fields.HasManyView model: @model, name: name, new_entry: new_entry, inverse_of: inverse_of
unless @model.isNew()
_.each @model.get('has_many_custom_fields'), (field) =>
name = field[0]; inverse_of = field[1]
new_entry = new Locomotive.Models.ContentEntry(@options["#{name}_new_entry"])
view = new Locomotive.Views.Shared.Fields.HasManyView model: @model, name: name, new_entry: new_entry, inverse_of: inverse_of
@_has_many_field_views.push(view)
@_has_many_field_views.push(view)
@$("##{@model.paramRoot}_#{name}_input label").after(view.render().el)
@$("##{@model.paramRoot}_#{name}_input label").after(view.render().el)
enable_many_to_many_fields: ->
_.each @model.get('many_to_many_custom_fields'), (field) =>

View File

@ -21,8 +21,6 @@ class Locomotive.Views.ContentEntries.PopupFormView extends Locomotive.Views.Con
entry = new Locomotive.Models.ContentEntry(response)
@options.parent_view.insert_or_update_entry(entry)
@close()
on_error: =>
@shake()
create_dialog: ->
@dialog = $(@el).dialog
@ -56,11 +54,9 @@ class Locomotive.Views.ContentEntries.PopupFormView extends Locomotive.Views.Con
close: (event) ->
event.stopPropagation() & event.preventDefault() if event?
@clear_errors()
$(@el).dialog('close')
shake: ->
$(@el).parents('.ui-dialog').effect('shake', { times: 4 }, 100)
center: ->
$(@el).dialog('option', 'position', 'center')
@ -73,5 +69,11 @@ class Locomotive.Views.ContentEntries.PopupFormView extends Locomotive.Views.Con
else
@refresh()
enable_has_many_fields: ->
# disabled in a popup form
enable_many_to_many_fields: ->
# disabled in a popup form
tinyMCE_settings: ->
window.Locomotive.tinyMCE.popupSettings

View File

@ -14,6 +14,8 @@ class Locomotive.Views.Sites.MembershipEntryView extends Backbone.View
$(@el).html(ich.membership_entry(data))
$(@el).attr('data-role', @model.get('role'))
@$('select').val(@model.get('role'))
return @

View File

@ -28,7 +28,7 @@ module Locomotive
def filter_attributes
unless can?(:manage, Locomotive::Membership)
params[:site].delete(:memberships_attributes)
params[:site].delete(:memberships_attributes) if params[:site]
end
end

View File

@ -3,7 +3,7 @@ module Locomotive
def options_for_custom_field_type
%w(string text select boolean date file belongs_to has_many many_to_many).map do |type|
[t("custom_fields.types.#{type}"), type]
[t("custom_fields.type.#{type}"), type]
end
end
@ -53,8 +53,9 @@ module Locomotive
current_site.content_types.where(:'entries_custom_fields.type'.in => %w(belongs_to many_to_many)).each do |content_type|
content_type.entries_custom_fields.each do |field|
if %w(belongs_to many_to_many).include?(field.type)
hash[field.type] ||= []
hash[field.type] << {
type = field.type == 'belongs_to' ? 'has_many' : field.type
hash[type] ||= []
hash[type] << {
:label => field.label,
:name => field.name,
:class_name => content_type.klass_with_custom_fields(:entries).to_s

View File

@ -21,6 +21,10 @@ module Locomotive
end
end
def theme_assets_to_json(list)
return nil.to_json if list.nil?
list.map { |asset| asset.as_json(:ability => current_ability) }.to_json
end
end
end

View File

@ -33,6 +33,8 @@ module Locomotive
# @returns [ String ] The localized fullpath according to the current locale
#
def localized_page_fullpath(page, locale = nil)
return nil if page.fullpath_translations.blank?
locale = (locale || I18n.locale).to_s
fullpath = page.fullpath_translations[locale] || page.fullpath_translations[self.default_locale]

View File

@ -13,6 +13,7 @@ class Locomotive::BasePresenter
@source = object
@options = options || {}
@depth = options[:depth] || 0
@ability = options[:ability]
if @options[:current_account] && @options[:current_site]
@ability = Locomotive::Ability.new @options[:current_account], @options[:current_site]

View File

@ -1,7 +1,7 @@
module Locomotive
class ContentTypePresenter < BasePresenter
delegate :name, :description, :slug, :order_by, :order_direction, :highlighted_field_name, :group_by_field_name, :api_accounts, :to => :source
delegate :name, :description, :slug, :order_by, :order_direction, :label_field_name, :group_by_field_id, :public_submission_accounts, :to => :source
def entries_custom_fields
self.source.ordered_entries_custom_fields.collect(&:as_json)
@ -12,7 +12,7 @@ module Locomotive
end
def included_methods
super + %w(name description slug order_by order_direction highlighted_field_name group_by_field_name api_accounts entries_custom_fields klass_name)
super + %w(name description slug order_by order_direction label_field_name group_by_field_id public_submission_accounts entries_custom_fields klass_name)
end
end

View File

@ -23,8 +23,12 @@ module Locomotive
I18n.l(self.source.updated_at, :format => :short)
end
def can_be_deleted
self.ability.try(:can?, :destroy, self.source)
end
def included_methods
default_list = %w(content_type folder local_path url size dimensions updated_at)
default_list = %w(content_type folder local_path url size dimensions can_be_deleted updated_at)
default_list += %w(plain_text) if plain_text?
super + default_list
end

View File

@ -52,7 +52,7 @@
= form.inputs :name => :attributes do
- target_content_type.ordered_entries_custom_fields.each_with_index do |_field, index|
- next if _field.name == field.inverse_of || _field.type == 'has_many'
- next if _field.name == field.inverse_of || %w(has_many many_to_many).include?(_field.type)
= render "locomotive/custom_fields/types/#{_field.type}",
:f => form,

View File

@ -6,4 +6,6 @@
%span!= t('.updated_at')
%span.date {{updated_at}}
= link_to 'x', '#', :class => 'remove', :confirm => t('locomotive.messages.confirm')
{{#if can_be_deleted}}
= link_to 'x', '#', :class => 'remove', :confirm => t('locomotive.messages.confirm')
{{/if}}

View File

@ -17,10 +17,10 @@
- content_for :backbone_view_data do
:plain
snippets: #{can?(:manage, Locomotive::Snippet) ? @snippets.map { |snippet| snippet.to_presenter.as_json_for_html_view }.to_json : 'null'},
images: #{@assets[:images].to_json},
media: #{@assets[:media].to_json},
js_and_css_assets: #{can?(:manage, Locomotive::ThemeAsset) ? @js_and_css_assets.to_json : 'null'},
fonts: #{can?(:manage, Locomotive::ThemeAsset) ? @assets[:fonts].to_json : 'null'}
images: #{theme_assets_to_json(@assets[:images])},
media: #{theme_assets_to_json(@assets[:media])},
js_and_css_assets: #{can?(:manage, Locomotive::ThemeAsset) ? theme_assets_to_json(@js_and_css_assets) : 'null'},
fonts: #{can?(:manage, Locomotive::ThemeAsset) ? theme_assets_to_json(@assets[:fonts]) : 'null'}
- content_for :submenu do
= render_cell 'locomotive/settings_menu', :show

View File

@ -12,6 +12,7 @@ Background:
When I go to site settings
Then I should see "Log in"
@javascript
Scenario: Accessing site settings as an Admin
Given I am an authenticated "admin"
When I go to site settings
@ -25,6 +26,7 @@ Background:
And I should see delete on the "designer"
And I should see delete on the "author"
@javascript
Scenario: Accessing site settings as a Designer
Given I am an authenticated "designer"
When I go to site settings
@ -38,6 +40,7 @@ Background:
And I should not see delete on myself
And I should see delete on the "author"
@javascript
Scenario: Accessing site settings as an Author
Given I am an authenticated "author"
When I go to site settings

View File

@ -18,31 +18,28 @@ Feature: Inline frontend editing
Scenario: As an unauthenticated user
Given I am not authenticated
When I view the rendered page at "/about"
Then I should not see "edit"
When I view the rendered page at "/about/edit"
Then I should not see "Page Content"
Then I should not see "Admin"
When I view the rendered page at "/about/_admin"
Then I should not see "Editing mode"
And I should see "Log in"
Scenario: Inline editing as an Admin
Given I am an authenticated "admin"
When I view the rendered page at "/about"
Then I should see "admin"
And I should see "edit"
When I view the rendered page at "/about/edit"
Then I should see "Page Content"
Then I should see "Admin"
When I view the rendered page at "/about/_admin"
Then I should see "Editing mode"
Scenario: Inline editing as a Designer
Given I am an authenticated "designer"
When I view the rendered page at "/about"
Then I should see "admin"
And I should see "edit"
When I view the rendered page at "/about/edit"
Then I should see "Page Content"
Then I should see "Admin"
When I view the rendered page at "/about/_admin"
Then I should see "Editing mode"
Scenario: Inline editing as an Author
Given I am an authenticated "author"
When I view the rendered page at "/about"
Then I should see "admin"
And I should see "edit"
When I view the rendered page at "/about/edit"
Then I should see "Page Content"
Then I should see "Admin"
When I view the rendered page at "/about/_admin"
Then I should see "Editing mode"

View File

@ -13,6 +13,7 @@ Background:
When I go to theme assets
Then I should see "Log in"
@javascript
Scenario: Accessing theme assets as an Admin
Given I am an authenticated "admin"
When I go to theme assets
@ -22,8 +23,9 @@ Background:
And I should see "Style and javascript"
And I should see "Images"
And I should see "dog.png"
And I should see a delete image button
And I should see a delete link
@javascript
Scenario: Accessing theme assets as a Designer
Given I am an authenticated "designer"
When I go to theme assets
@ -33,8 +35,9 @@ Background:
And I should see "Style and javascript"
And I should see "Images"
And I should see "dog.png"
And I should see a delete image button
And I should see a delete link
@javascript
Scenario: Accessing theme assets as an Author
Given I am an authenticated "author"
When I go to theme assets
@ -44,4 +47,4 @@ Background:
And I should not see "Style and javascript"
And I should see "Images"
And I should see "dog.png"
And I should not see a delete image button
And I should not see a delete link

View File

@ -1,22 +0,0 @@
Feature: Manage Content Types
In order to manage custom content models
As an administrator
I want to add/edit/delete custom models of my site
Background:
Given I have the site: "test site" set up
And I have a custom model named "Projects" with
| label | type | required |
| Name | string | true |
| Description | text | false |
And I am an authenticated user
@javascript
Scenario: I do not want my content form to have n duplicated fields if I submit n times the content type form with errors (bug)
When I go to the "Projects" model edition page
And I fill in "Name" with ""
And I press "Save"
And I press "Save"
And I press "Save"
When I follow "new item"
Then I should see once the "Name" field

View File

@ -5,15 +5,16 @@ Feature: Create and manage has many relationships
Background:
Given I have the site: "test site" set up
And I have a custom model named "Projects" with
| label | type | required | target |
| Name | string | true | |
| Description | text | false | |
And I have a custom model named "Clients" with
| label | type | required | target |
| Name | string | true | |
| Description | string | false | |
| Projects | has_many | false | Projects |
And I have a custom model named "Projects" with
| label | type | required | target |
| Name | string | true | |
| Description | text | false | |
| Client | belongs_to | false | Clients |
And I set up a has_many relationship between "Clients" and "Projects"
And I have entries for "Clients" with
| name | description |
| Alpha, Inc | Description for Alpha, Inc |
@ -28,19 +29,33 @@ Background:
@javascript
Scenario: I view a client without any projects
When I go to the "Clients" model list page
When I go to the list of "Clients"
And I follow "Alpha, Inc"
And I wait until the has many selector is visible
Then I should see "Empty" within the list of items
Then I should see "The list is empty" within the list of entries
@javascript
Scenario: I add a project to a client
When I go to the "Clients" model list page
When I go to the list of "Projects"
And I follow "Fun project"
And I select "Alpha, Inc" from "Client"
And I press "Save"
Then I should see "Entry was successfully updated."
When I go to the list of "Clients"
And I follow "Alpha, Inc"
Then I should see "Fun project" within the list of entries
@javascript
Scenario: I add a project to a client from the client page
When I go to the list of "Clients"
And I follow "Beta, Inc"
And I wait until the has many selector is visible
Then "Fun project" should be an option for "label"
And I press "+ add"
When I press "Save"
And I wait until the has many selector is visible
Then I should see "Fun project" within the list of added items
And "Fun project" should not be an option for "label"
And I follow "+ Add a new entry"
Then I should see "Projects new entry"
When I press "Create" within the dialog popup
Then I should see "Entry was not created."
When I fill in "Name" with "Project X" within the dialog popup
And I fill in "Description" with "Lorem ipsum" within the dialog popup
And I sync my form with my backbone model because of Firefox
And I press "Create" within the dialog popup
Then I should see "Entry was successfully created."
And I should see "Project X" within the list of entries
And "p.empty" should not be visible within the list of entries

View File

@ -1,61 +0,0 @@
Feature: Set up a has many reverse relationship
In order to have a true 1:N relationship between 2 content types
As an administrator
I want to set up a reverse a has many relationship
Background:
Given I have the site: "test site" set up
And I have a custom model named "Clients" with
| label | type | required |
| Name | string | true |
| Description | string | false |
And I have a custom model named "Projects" with
| label | type | required | target |
| Name | string | true | |
| Description | text | false | |
| Client | has_one | false | Clients |
And I set up a reverse has_many relationship between "Clients" and "Projects"
And I have entries for "Clients" with
| name | description |
| Apple Inc | Lorem ipsum |
| NoCoffee | Lorem ipsum... |
And I have entries for "Projects" with
| name | description |
| My sexy project | Lorem ipsum |
| Foo project | Lorem ipsum... |
| Bar project | Lorem ipsum... |
And I am an authenticated user
@javascript
Scenario: I do not see the "Add Item" button for new parent
When I go to the "Clients" model creation page
Then "New item" should not be an option for "label"
@javascript
Scenario: I attach already created items for an existing parent and save it
When I go to the "Clients" model list page
And I follow "Apple Inc"
And I wait until the has many selector is visible
Then "My sexy project" should be an option for "label"
When I select "My sexy project" from "label"
And I press "+ add"
And "My sexy project" should not be an option for "label"
When I press "Save"
And I wait until the has many selector is visible
Then "My sexy project" should not be an option for "label"
@javascript
Scenario: I create a new item and attach it
When I go to the "Clients" model list page
And I follow "Apple Inc"
And I wait until the has many selector is visible
And I press "+ add"
Then I should see "Apple Inc » Projects new item"
And I should not see "Client" within the main form
When I fill in "Name" with "iPad"
And I press "Create"
Then I should see "Content was successfully created."
When I wait until the has many selector is visible
Then I should see "iPad"
And "iPad" should not be an option for "label"

View File

@ -0,0 +1,42 @@
Feature: Set up a many to many relationship
In order to have a N:N relationship between 2 content types
As an administrator
I want to set up a many to many relationship
Background:
Given I have the site: "test site" set up
And I have a custom model named "Articles" with
| label | type | required |
| Title | string | true |
| Body | string | false |
And I have a custom model named "Projects" with
| label | type | required | target |
| Name | string | true | |
| Description | text | false | |
And I set up a many_to_many relationship between "Articles" and "Projects"
And I have entries for "Articles" with
| title | body |
| Hello world | Lorem ipsum |
| Lorem ipsum | Lorem ipsum... |
And I have entries for "Projects" with
| name | description |
| My sexy project | Lorem ipsum |
| Foo project | Lorem ipsum... |
| Bar project | Lorem ipsum... |
And I am an authenticated user
@javascript
Scenario: I attach projects to an article
When I go to the list of "Articles"
And I follow "Hello world"
Then I should see "The list is empty. Add an entry from the select box below."
When I select "My sexy project" from "entry"
And I follow "+ add"
Then I should see "My sexy project" within the list of entries
And "p.empty" should not be visible within the list of entries
When I press "Save"
Then I should see "Entry was successfully updated."
When I go to the list of "Projects"
And I follow "My sexy project"
Then I should see "Hello world" within the list of entries

View File

@ -19,11 +19,11 @@ Background:
| Bar project | Lorem ipsum... | Design |
Scenario:
When I go to the "Projects" model list page
When I go to the list of "Projects"
Then I should see "My sexy project"
Scenario: Add a new entry
When I go to the "Projects" model list page
When I go to the list of "Projects"
And I follow "new entry"
Then I should see "Projects new entry"
When I fill in "Name" with "My other sexy project"
@ -32,39 +32,39 @@ Scenario: Add a new entry
Then I should see "Entry was successfully created."
Scenario: Add an invalid entry
When I go to the "Projects" model list page
When I go to the list of "Projects"
And I follow "new entry"
And I fill in "Description" with "Lorem ipsum...."
And I press "Create"
Then I should not see "Entry was successfully created."
Scenario: Update an existing entry
When I go to the "Projects" model list page
When I go to the list of "Projects"
And I follow "My sexy project"
When I fill in "Name" with "My other sexy project (UPDATED)"
And I press "Save"
Then I should see "Entry was successfully updated."
When I go to the "Projects" model list page
When I go to the list of "Projects"
Then I should see "My other sexy project (UPDATED)"
Scenario: Update an invalid entry
When I go to the "Projects" model list page
When I go to the list of "Projects"
And I follow "My sexy project"
When I fill in "Name" with ""
And I press "Save"
Then I should not see "Entry was successfully updated."
Scenario: Destroy an entry
When I go to the "Projects" model list page
When I go to the list of "Projects"
And I follow "x"
Then I should see "Entry was successfully deleted."
And I should not see "My sexy project"
Scenario: Group entries by category
When I go to the "Projects" model list page
When I go to the list of "Projects"
Then I should not see "Development"
And I should not see "Design"
When I change the presentation of the "Projects" model by grouping items by "Category"
And I go to the "Projects" model list page
And I go to the list of "Projects"
Then I should see "Development"
And I should see "Design"

View File

@ -19,6 +19,7 @@ Scenario: Creating a valid page
And I fill in "page_title" with "Test"
And I fill in "Slug" with "test"
And I select "Home page" from "Parent"
And I sync my form with my backbone model because of Firefox
And I press "Create"
Then I should see "Page was successfully created."
And I should have "{% extends 'parent' %}" in the test page

View File

@ -8,10 +8,10 @@ Background:
| label | type | required |
| Name | string | true |
And I have entries for "Projects" with
| name |
| Project 1 |
| Project 2 |
| Project 3 |
| name | _position |
| Project 1 | 1 |
| Project 2 | 2 |
| Project 3 | 3 |
Scenario: Use the tablerow tag
Given a page named "project-table" with the template:

View File

@ -1,10 +1,13 @@
Given %r{^I have a custom model named "([^"]*)" with$} do |name, fields|
site = Locomotive::Site.first
content_type = FactoryGirl.build(:content_type, :site => site, :name => name)
content_type = FactoryGirl.build(:content_type, :site => site, :name => name, :order_by => '_position')
fields.hashes.each do |field|
if (target_name = field.delete('target')).present?
target_content_type = site.content_types.where(:name => target_name).first
field['target'] = target_content_type.content_klass.to_s
# found a belongs_to association
if field['type'] == 'belongs_to'
target_name = field.delete('target')
target_model = @site.content_types.where(:name => target_name).first
field['class_name'] = target_model.klass_with_custom_fields(:entries).to_s
end
content_type.entries_custom_fields.build field
@ -13,22 +16,6 @@ Given %r{^I have a custom model named "([^"]*)" with$} do |name, fields|
content_type.save.should be_true
end
Given /^I set up a reverse has_many relationship between "([^"]*)" and "([^"]*)"$/ do |name_1, name_2|
site = Locomotive::Site.first
content_type_1 = site.content_types.where(:name => name_1).first
content_type_2 = site.content_types.where(:name => name_2).first
content_type_1.entries_custom_fields.build({
:label => name_2,
:type => 'has_many',
:target => content_type_2.content_klass.to_s,
:reverse_lookup => content_type_2.content_klass.custom_field_alias_to_name(name_1.downcase.singularize)
})
content_type_1.save.should be_true
end
Given %r{^I have "([^"]*)" as "([^"]*)" values of the "([^"]*)" model$} do |values, field, name|
content_type = Locomotive::ContentType.where(:name => name).first
field = content_type.entries_custom_fields.detect { |f| f.label == field }
@ -62,7 +49,3 @@ end
Then %r{^I should not see (\d+) times the "([^"]*)" field$} do |n, field|
page.all(:css, "#content_#{field.underscore.downcase}_input").size.should_not == n.to_i
end
Then %r{^I should see once the "([^"]*)" field$} do |field|
page.should have_css("#content_#{field.underscore.downcase}_input", :count => 1)
end

View File

@ -1,9 +1,9 @@
Then /^I should see the role dropdown on the "([^"]*)"$/ do |user|
find(:css, "li.membership[data-role=#{user}] select").should be_present
find(:css, "#site_memberships_input div.entry[data-role=#{user}] select").should be_present
end
Then /^I should see the role dropdown on the "([^"]*)" without the "([^"]*)" option$/ do |user, option|
find(:css, "li.membership[data-role=#{user}] select").text.should_not include option
find(:css, "#site_memberships_input div.entry[data-role=#{user}] select").text.should_not include option
end
Then /^I should see the role dropdown on myself$/ do
@ -11,7 +11,7 @@ Then /^I should see the role dropdown on myself$/ do
end
Then /^I should not see the role dropdown on the "([^"]*)"$/ do |user|
page.has_css?("li.membership[data-role=#{user}] select").should be_false
page.has_css?("#site_memberships_input div.entry[data-role=#{user}] select").should be_false
end
Then /^I should not see the role dropdown on myself$/ do
@ -19,15 +19,15 @@ Then /^I should not see the role dropdown on myself$/ do
end
Then /^I should not see any role dropdowns$/ do
page.has_css?('li.membership select').should be_false
page.has_css?('#site_memberships_input div.entry select').should be_false
end
Then /^I should see delete on the "([^"]*)"$/ do |role|
page.has_css?("li.membership[data-role=#{role}] .actions a.remove").should be_true
page.has_css?("#site_memberships_input div.entry[data-role=#{role}] .actions a.remove").should be_true
end
Then /^I should not see delete on the "([^"]*)"$/ do |role|
page.has_css?("li.membership[data-role=#{role}] .actions a.remove").should be_false
page.has_css?("#site_memberships_input div.entry[data-role=#{role}] .actions a.remove").should be_false
end
Then /^I should not see delete on myself$/ do
@ -35,7 +35,7 @@ Then /^I should not see delete on myself$/ do
end
Then /^I should not see any delete buttons$/ do
page.has_css?('li.membership .actions a.remove').should be_false
page.has_css?('#site_memberships_input div.entry .actions a.remove').should be_false
end
When /^I select the "([^"]*)" role for the "author" user/ do |role|

View File

@ -14,9 +14,20 @@ When /^I wait until ([^"]*) is visible$/ do |locator|
page.has_css?(selector_for(locator), :visible => true)
end
When /^I sync my form with my backbone model because of Firefox$/ do
page.execute_script("$(':input').trigger('change')")
end
Then /^"([^"]*)" should not be visible$/ do |text|
begin
assert page.find(text).visible? != true
rescue Capybara::ElementNotFound
end
end
Then /^"([^"]*)" should( not)? be an option for "([^"]*)"(?: within "([^\"]*)")?$/ do |value, negate, field, selector|
with_scope(selector) do
expectation = negate ? :should_not : :should
field_labeled(field).first(:xpath, ".//option[text() = '#{value}']").send(expectation, be_present)
end
end
end

View File

@ -15,9 +15,47 @@ Given %r{^I have an? "([^"]*)" model which has many "([^"]*)"$} do |parent_model
:class_name => @child_model.klass_with_custom_fields(:entries).to_s,
:inverse_of => parent_model.singularize.downcase
})
@parent_model.save
end
Given %r{^I set up a has_many relationship between "([^"]*)" and "([^"]*)"$} do |source_name, target_name|
source_model = @site.content_types.where(:name => source_name).first
target_model = @site.content_types.where(:name => target_name).first
source_model.entries_custom_fields.build({
:label => target_name,
:type => 'has_many',
:class_name => target_model.klass_with_custom_fields(:entries).to_s,
:inverse_of => source_name.singularize.downcase
})
source_model.save
end
Given %r{^I set up a many_to_many relationship between "([^"]*)" and "([^"]*)"$} do |first_name, last_name|
first_model = @site.content_types.where(:name => first_name).first
last_model = @site.content_types.where(:name => last_name).first
first_model.entries_custom_fields.build({
:label => last_name,
:type => 'many_to_many',
:class_name => last_model.klass_with_custom_fields(:entries).to_s,
:inverse_of => first_name.singularize.downcase
})
first_model.save
last_model.entries_custom_fields.build({
:label => first_name,
:type => 'many_to_many',
:class_name => first_model.klass_with_custom_fields(:entries).to_s,
:inverse_of => last_name.singularize.downcase
})
last_model.save
end
Then /^I should be able to view a paginaed list of a has many association$/ do
# Create models
step %{I have an "Articles" model which has many "Comments"}

View File

@ -17,10 +17,6 @@ When /^I change the snippet template to "([^"]*)"$/ do |code|
page.evaluate_script "window.application_view.view.editor.setValue('#{code}')"
end
# Then /^I should see "([^"]*)" as the snippet template$/ do |code|
# find(:css, "#theme_asset_plain_text").value.should == code
# end
# checks to see if a string is in the slug
Then /^I should have "(.*)" in the (.*) snippet/ do |content, snippet_slug|
snippet = @site.snippets.where(:slug => snippet_slug).first

View File

@ -10,7 +10,6 @@ def create_plain_text_asset(name, type)
:performing_plain_text => true
})
# asset.should be_valid
asset.save!
end
@ -25,7 +24,7 @@ Given /^a stylesheet asset named "([^"]*)"$/ do |name|
end
Given /^I have an image theme asset named "([^"]*)"$/ do |name|
@asset = FactoryGirl.create(:theme_asset, :site => @site, :source => File.open(Rails.root.join('spec', 'fixtures', 'assets', '5k.png')))
@asset = FactoryGirl.create(:theme_asset, :site => @site, :source => File.open(Rails.root.join('..', 'fixtures', 'assets', '5k.png')))
@asset.source_filename = name
@asset.save!
end
@ -41,10 +40,10 @@ Then /^I should see "([^"]*)" as the theme asset code$/ do |code|
find(:css, "#theme_asset_plain_text").value.should == code
end
Then /^I should see a delete image button$/ do
page.has_css?("ul.theme-assets li .more a.remove").should be_true
Then /^I should see a delete link$/ do
page.has_css?(".box ul li .more a.remove").should be_true
end
Then /^I should not see a delete image button$/ do
page.has_css?("ul.theme-assets li .more a.remove").should be_false
Then /^I should not see a delete link$/ do
page.has_css?(".box ul li .more a.remove").should be_false
end

View File

@ -40,6 +40,8 @@ Capybara.configure do |config|
ensure_host_resolution(config.app_host)
end
Capybara.default_wait_time = 5
# Capybara.javascript_driver = :rack_test
# Stop endless errors like

View File

@ -21,7 +21,7 @@ module NavigationHelpers
when /new page/
new_page_path
when /"(.*)" edition page/
page = Site.first.pages.where(:slug => $1).first
page = Locomotive::Site.first.pages.where(:slug => $1).first
edit_page_path(page)
when /theme assets/
theme_assets_path
@ -29,15 +29,12 @@ module NavigationHelpers
edit_current_site_path
when /account settings/
edit_my_account_path
when /the "(.*)" model list page/
when /the list of "(.*)"/
content_type = Locomotive::Site.first.content_types.where(:name => $1).first
content_entries_path(content_type.slug)
when /the "(.*)" model creation page/
when /the "(.*)" model edition page/
content_type = Locomotive::Site.first.content_types.where(:name => $1).first
new_content_entry_path(content_type.slug)
# when /the "(.*)" model edition page/
# content_type = Locomotive::Site.first.content_types.where(:name => $1).first
# edit_content_entry_path(content_type)
edit_content_type_path(content_type)
# Add more mappings here.
# Here is an example that pulls values out of the Regexp:

View File

@ -8,24 +8,24 @@ module HtmlSelectorsHelpers
def selector_for(locator)
case locator
when "the page"
"html > body"
when 'the page'
'html > body'
when "the main form"
"form.formtastic"
when "the list of added items"
".has-many-selector li.item.added"
when "the list of items"
".has-many-selector"
when "the has many selector"
".has-many-selector ul li.template"
when 'the main form'
'form.formtastic'
when 'the dialog popup'
'.ui-dialog'
when 'the list of entries'
'li.input.relationship'
when 'the role'
'.role'
when 'the submit button'
'form.formtastic #local-actions-bottom-bar input[type=submit]'
# Add more mappings here.
# Here is an example that pulls values out of the Regexp:
#

View File

@ -102,7 +102,7 @@ module Locomotive
flash.discard
response.headers['Content-Type'] = 'text/html; charset=utf-8'
response.headers['Editable'] = 'true' unless self.editing_page?
response.headers['Editable'] = 'true' unless self.editing_page? || current_locomotive_account.nil?
if @page.with_cache?
fresh_when :etag => @page, :last_modified => @page.updated_at.utc, :public => true