newsletter 3.0.2 → 3.2.0
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.
- checksums.yaml +5 -13
- data/.gitignore +6 -0
- data/.ruby-version +1 -1
- data/Gemfile +17 -5
- data/README.md +40 -0
- data/app/assets/images/newsletter/BottomRight.gif +0 -0
- data/app/assets/images/newsletter/MidRight.gif +0 -0
- data/app/assets/images/newsletter/TopCenter.gif +0 -0
- data/app/assets/images/newsletter/TopRight.gif +0 -0
- data/app/assets/images/newsletter/calendar_date_select/calendar.gif +0 -0
- data/app/assets/images/newsletter/iReach_logo.gif +0 -0
- data/app/assets/images/newsletter/spacer.gif +0 -0
- data/app/assets/images/newsletter/topMid.gif +0 -0
- data/app/assets/javascripts/newsletter/application.js +6 -0
- data/app/assets/stylesheets/newsletter/admin.css +261 -0
- data/app/assets/stylesheets/newsletter/application.css +3 -1
- data/app/assets/stylesheets/newsletter/nav.css +68 -0
- data/app/assets/stylesheets/newsletter/timepicker.css +54 -0
- data/app/controllers/newsletter/application_controller.rb +5 -26
- data/app/controllers/newsletter/areas_controller.rb +0 -38
- data/app/controllers/newsletter/designs_controller.rb +5 -2
- data/app/controllers/newsletter/elements_controller.rb +7 -7
- data/app/controllers/newsletter/fields_controller.rb +1 -46
- data/app/controllers/newsletter/newsletters_controller.rb +6 -24
- data/app/controllers/newsletter/pieces_controller.rb +8 -21
- data/app/helpers/newsletter/designs_helper.rb +1 -8
- data/app/helpers/newsletter/layout_helper.rb +43 -0
- data/app/helpers/newsletter/newsletters_helper.rb +9 -5
- data/app/models/newsletter/area.rb +1 -4
- data/app/models/newsletter/asset.rb +7 -1
- data/app/models/newsletter/design.rb +48 -34
- data/app/models/newsletter/element.rb +0 -42
- data/app/models/newsletter/field.rb +7 -10
- data/app/models/newsletter/field/inline_asset.rb +15 -2
- data/app/models/newsletter/newsletter.rb +18 -11
- data/app/models/newsletter/piece.rb +20 -24
- data/app/views/layouts/newsletter/application.html.erb +20 -116
- data/app/views/layouts/newsletter/layout.html.erb +15 -0
- data/app/views/newsletter/areas/_area.html.erb +1 -1
- data/app/views/newsletter/designs/_area_fields.html.erb +1 -1
- data/app/views/newsletter/designs/_form.html.erb +11 -29
- data/app/views/newsletter/designs/_newsletter_area.html.erb +2 -2
- data/app/views/newsletter/designs/edit.html.erb +3 -6
- data/app/views/newsletter/designs/index.html.erb +7 -6
- data/app/views/newsletter/designs/new.html.erb +2 -2
- data/app/views/newsletter/designs/show.html.erb +5 -5
- data/app/views/newsletter/elements/_field_fields.html.erb +12 -25
- data/app/views/newsletter/elements/_form.html.erb +38 -34
- data/app/views/newsletter/elements/edit.html.erb +2 -5
- data/app/views/newsletter/elements/index.html.erb +7 -7
- data/app/views/newsletter/elements/new.html.erb +2 -2
- data/app/views/newsletter/elements/show.html.erb +5 -5
- data/app/views/newsletter/fields/_inline_asset.html.erb +12 -32
- data/app/views/newsletter/fields/_text.html.erb +2 -4
- data/app/views/newsletter/fields/_text_area.html.erb +2 -7
- data/app/views/newsletter/newsletters/_form.html.erb +6 -16
- data/app/views/newsletter/newsletters/_head.html.erb +2 -3
- data/app/views/newsletter/newsletters/_newsletter.html.erb +11 -6
- data/app/views/newsletter/newsletters/archive.html.erb +1 -1
- data/app/views/newsletter/newsletters/edit.html.erb +8 -16
- data/app/views/newsletter/newsletters/index.html.erb +7 -7
- data/app/views/newsletter/newsletters/new.html.erb +2 -2
- data/app/views/newsletter/newsletters/show.html.erb +11 -6
- data/app/views/newsletter/pieces/_form.html.erb +1 -8
- data/app/views/newsletter/pieces/edit.html.erb +2 -4
- data/app/views/newsletter/pieces/new.html.erb +3 -5
- data/config/locales/newsletters.en.yml +27 -0
- data/config/routes.rb +4 -4
- data/designs/exports/Example.yml +202 -0
- data/designs/exports/example-export.yaml +481 -87
- data/lib/deleteable.rb +12 -14
- data/lib/newsletter/engine.rb +112 -6
- data/lib/newsletter/version.rb +1 -1
- data/lib/tasks/newsletter.rake +54 -41
- data/newsletter.gemspec +3 -1
- data/spec/test_app/.rspec +2 -0
- data/spec/test_app/app/controllers/application_controller.rb +5 -0
- data/spec/test_app/app/models/ability.rb +8 -0
- data/spec/test_app/app/models/user.rb +10 -0
- data/spec/test_app/app/views/layouts/application.html.erb +3 -1
- data/spec/test_app/config/database.postgres.yml +21 -0
- data/spec/test_app/config/initializers/carrierwave.rb +23 -0
- data/spec/test_app/config/newsletter.yml +6 -3
- data/spec/test_app/config/routes.rb +1 -2
- data/spec/test_app/db/migrate/20131222171230_create_users.rb +13 -0
- data/spec/test_app/db/schema.rb +13 -2
- data/spec/test_app/features/newsletter_management.feature +39 -0
- data/spec/test_app/features/piece_management.feature +20 -0
- data/spec/test_app/features/step_definitions/debugging_steps.rb +3 -0
- data/spec/test_app/features/step_definitions/design_steps.rb +3 -0
- data/spec/test_app/features/step_definitions/login_steps.rb +4 -0
- data/spec/test_app/features/step_definitions/newsletter_steps.rb +24 -0
- data/spec/test_app/features/step_definitions/piece_steps.rb +26 -0
- data/{features → spec/test_app/features}/step_definitions/webrat_steps.rb +10 -6
- data/spec/test_app/features/support/env.rb +36 -0
- data/spec/test_app/features/support/functions.rb +3 -0
- data/{features → spec/test_app/features}/support/paths.rb +10 -1
- data/spec/test_app/lib/debugging.rb +61 -0
- data/spec/test_app/script/full_suite +44 -0
- data/spec/test_app/script/rspec_multi_db +26 -0
- data/spec/test_app/spec/controllers/newsletter/pieces_controller_spec.rb +175 -0
- data/spec/test_app/spec/factories/_functions.rb +19 -0
- data/spec/test_app/spec/factories/assets.rb +8 -0
- data/spec/test_app/spec/factories/designs.rb +1 -1
- data/spec/test_app/spec/factories/newsletters.rb +68 -6
- data/spec/test_app/spec/factories/pieces.rb +8 -0
- data/spec/test_app/spec/factories/users.rb +13 -0
- data/spec/test_app/spec/features/newsletter/design_spec.rb +175 -0
- data/spec/test_app/spec/features/newsletter/element_spec.rb +53 -0
- data/spec/test_app/spec/features/newsletter/newsletter_spec.rb +99 -3
- data/spec/test_app/spec/helpers/newsletter/newsletters_helper_spec.rb +65 -0
- data/spec/test_app/spec/models/newsletter/asset_spec.rb +23 -0
- data/spec/test_app/spec/models/newsletter/design_spec.rb +23 -2
- data/spec/test_app/spec/models/newsletter/element_spec.rb +4 -0
- data/spec/test_app/spec/models/newsletter/inline_asset_spec.rb +43 -0
- data/spec/test_app/spec/models/newsletter/newsletter_spec.rb +102 -2
- data/spec/test_app/spec/models/newsletter/piece_spec.rb +33 -0
- data/spec/test_app/spec/rails_helper.rb +82 -0
- data/spec/test_app/spec/routing/newsletter/pieces_routing_spec.rb +28 -0
- data/spec/test_app/spec/spec_helper.rb +73 -64
- data/spec/test_app/spec/support/carrierwave.rb +7 -0
- data/spec/test_app/spec/support/continuances.rb +18 -0
- data/spec/test_app/spec/support/files/iReach_logo.gif +0 -0
- data/spec/test_app/spec/support/files/test.pdf +0 -0
- data/spec/test_app/spec/support/functions.rb +3 -0
- metadata +145 -726
- data/README +0 -243
- data/README.rdoc +0 -3
- data/app/views/newsletter/elements/_newsletter_field.html.erb +0 -37
- data/features/support/env.rb +0 -17
- data/lib/tasks/newsletter_tasks.rake +0 -4
- data/lib/tasks/rspec.rake +0 -158
- data/spec/spec_helper.rb +0 -55
- data/spec/test_app/db/structure.sql +0 -12
- data/spec/test_app/newsletters/designs/My_Design/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/My_Design/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/My_Design/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/Testo_Changeo/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/Testo_Changeo/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/enable_extensible_systems/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/integrate_mission-critical_systems/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/integrate_mission-critical_systems/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/transition_enterprise_systems/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/transition_enterprise_systems/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/layout.html.erb +0 -66
data/spec/test_app/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended to check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(:version =>
|
14
|
+
ActiveRecord::Schema.define(:version => 20150414102034) do
|
15
15
|
|
16
16
|
create_table "news_areas", :force => true do |t|
|
17
17
|
t.string "name", :null => false
|
@@ -31,7 +31,7 @@ ActiveRecord::Schema.define(:version => 20131222171229) do
|
|
31
31
|
create_table "news_assets", :force => true do |t|
|
32
32
|
t.integer "field_id"
|
33
33
|
t.integer "piece_id"
|
34
|
-
t.string "
|
34
|
+
t.string "image"
|
35
35
|
t.string "content_type"
|
36
36
|
t.integer "size"
|
37
37
|
t.integer "width"
|
@@ -113,4 +113,15 @@ ActiveRecord::Schema.define(:version => 20131222171229) do
|
|
113
113
|
t.datetime "updated_at", :null => false
|
114
114
|
end
|
115
115
|
|
116
|
+
create_table "users", :force => true do |t|
|
117
|
+
t.string "first_name"
|
118
|
+
t.string "last_name"
|
119
|
+
t.string "email"
|
120
|
+
t.string "phone"
|
121
|
+
t.datetime "created_at", :null => false
|
122
|
+
t.datetime "updated_at", :null => false
|
123
|
+
end
|
124
|
+
|
125
|
+
add_index "users", ["email"], :name => "index_users_on_email", :unique => true
|
126
|
+
|
116
127
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
Feature: Newsletter Management
|
2
|
+
In order to create newsletters
|
3
|
+
As a valid user
|
4
|
+
I want to create, modify, and publish newsletters
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am logged in and authorized for everything
|
8
|
+
And a design named "Bobo's Design" exists
|
9
|
+
|
10
|
+
Scenario: Create a new newsletter
|
11
|
+
When I go to the newsletters page
|
12
|
+
And I follow "New Newsletter"
|
13
|
+
And I fill in "Name" with "Bobo's first Newsletter"
|
14
|
+
And I press "Save"
|
15
|
+
Then a newsletter named "Bobo's first Newsletter" should exist
|
16
|
+
And that newsletter should have the design named "Bobo's Design"
|
17
|
+
|
18
|
+
Scenario: Edit a newsletter
|
19
|
+
Given a newsletter named "Bobo's first Newsletter" exists
|
20
|
+
When I go to the newsletters page
|
21
|
+
And I follow "Edit"
|
22
|
+
And I fill in "Name" with "Bobo's Great Newsletter"
|
23
|
+
And I press "Save"
|
24
|
+
Then a newsletter named "Bobo's Great Newsletter" should exist
|
25
|
+
|
26
|
+
Scenario: View a newsletter on the archive page
|
27
|
+
Given a newsletter named "Bobo's first Newsletter" exists
|
28
|
+
When I go to the newsletters page
|
29
|
+
And I follow "Publish"
|
30
|
+
And I go to the newsletter archive page
|
31
|
+
And I follow "Bobo's first Newsletter"
|
32
|
+
Then I should see "Bobo's first Newsletter"
|
33
|
+
|
34
|
+
Scenario: Newsletters have pagination
|
35
|
+
Given 50 newsletters exist
|
36
|
+
When I go to the newsletters page
|
37
|
+
Then I should see "Previous"
|
38
|
+
And I should see "Next"
|
39
|
+
When I follow "Next"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Feature: Piece Management
|
2
|
+
In order to add content to newsletters
|
3
|
+
As a valid user
|
4
|
+
I want to create, modify, delete pieces
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am logged in and authorized for everything
|
8
|
+
And a design named "Bobo's Design" exists
|
9
|
+
And a newsletter named "Bobo's Newsletter" exists with design named "Bobo's Design"
|
10
|
+
|
11
|
+
Scenario: Add an inline asset piece with a url
|
12
|
+
When I go to the newsletters page
|
13
|
+
And I follow "Edit"
|
14
|
+
And I select to add a "Left Column Image" from the "Left column" area
|
15
|
+
And I press the "Left column" area's "Add Element" button
|
16
|
+
Then I should be on newsletter named "Bobo's Newsletter"'s new piece page
|
17
|
+
And I fill in "Url:" with "http://www.google.com/favicon.ico"
|
18
|
+
And I press "Submit"
|
19
|
+
Then a "Left Column Image" should exist in "Bobo's Newsletter"'s "Left Column" are with an "image" url of "http://www.google.com/favicon.ico"
|
20
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Then(/^a newsletter named "(.*?)" should exist$/) do |name|
|
2
|
+
@newsletter = Newsletter::Newsletter.where(name: name).first
|
3
|
+
expect(@newsletter).not_to be nil
|
4
|
+
end
|
5
|
+
|
6
|
+
Then(/^that newsletter should have the design named "(.*?)"$/) do |name|
|
7
|
+
expect(@newsletter.design.name).to eq name
|
8
|
+
end
|
9
|
+
|
10
|
+
Given(/^a newsletter named "(.*?)" exists$/) do |name|
|
11
|
+
design = import_design
|
12
|
+
FactoryGirl.create(:newsletter, name: name, design: design)
|
13
|
+
end
|
14
|
+
|
15
|
+
Given(/^a newsletter named "(.*?)" exists with design named "(.*?)"$/) do |news_name, design_name|
|
16
|
+
design = Newsletter::Design.where(name: design_name).first
|
17
|
+
FactoryGirl.create(:newsletter, name: news_name, design: design)
|
18
|
+
end
|
19
|
+
|
20
|
+
Given(/^(\d+) newsletters exist$/) do |count|
|
21
|
+
design = import_design(nil,Faker::Company.bs)
|
22
|
+
count.to_i.times{FactoryGirl.create(:newsletter, design: design)}
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
When(/^I select to add a "(.*?)" from the "(.*?)" area$/) do |element_name, area_name|
|
2
|
+
area = Newsletter::Area.where(name: area_name.downcase.gsub(/ /,'_')).first
|
3
|
+
within(:css,"#add_element_for_area_#{area.id}") do
|
4
|
+
step %Q|I select "#{element_name}" from "Area: #{area.name.humanize}"|
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
When(/^I press the "(.*?)" area's "(.*?)" button$/) do |area_name, add_element|
|
9
|
+
area = Newsletter::Area.where(name: area_name.downcase.gsub(/ /,'_')).first
|
10
|
+
within(:css,"#add_element_for_area_#{area.id}") do
|
11
|
+
step %Q|I press "Add Element"|
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Then(/^a "(.*?)" should exist in "(.*?)"'s "(.*?)" are with an? "(.*)" ([^"]+) of "(.*?)"$/) do |element_name, newsletter_name, area_name, field_name, method, value|
|
16
|
+
newsletter = Newsletter::Newsletter.where(name: newsletter_name).last
|
17
|
+
area = newsletter.areas.detect{|a| a.name.eql?(underscore(area_name))}
|
18
|
+
element = area.elements.detect{|e| e.name.eql?(element_name)}
|
19
|
+
expect(newsletter.pieces.detect{|piece|
|
20
|
+
piece.area == area && piece.element == element &&
|
21
|
+
piece.locals[field_name.to_sym].send(method) == value
|
22
|
+
}).not_to be nil
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
|
@@ -4,11 +4,11 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "pat
|
|
4
4
|
# http://github.com/brynary/webrat
|
5
5
|
|
6
6
|
Given /^I am on (.+)$/ do |page_name|
|
7
|
-
visit path_to(page_name)
|
7
|
+
visit path_to(page_name,news)
|
8
8
|
end
|
9
9
|
|
10
10
|
When /^I go to (.+)$/ do |page_name|
|
11
|
-
visit path_to(page_name)
|
11
|
+
visit path_to(page_name,news)
|
12
12
|
end
|
13
13
|
|
14
14
|
When /^I press "([^\"]*)"$/ do |button|
|
@@ -16,13 +16,17 @@ When /^I press "([^\"]*)"$/ do |button|
|
|
16
16
|
end
|
17
17
|
|
18
18
|
When /^I follow "([^\"]*)"$/ do |link|
|
19
|
-
click_link(link)
|
19
|
+
click_link(link, match: :first)
|
20
20
|
end
|
21
21
|
|
22
22
|
When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
|
23
23
|
fill_in(field, :with => value)
|
24
24
|
end
|
25
25
|
|
26
|
+
Then(/^I fill in "(.*?)" with the file "(.*?)"$/) do |field_name, filename|
|
27
|
+
fill_in field_name, with: "file://spec/support/files/#{filename}"
|
28
|
+
end
|
29
|
+
|
26
30
|
When /^I select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
|
27
31
|
select(value, :from => field)
|
28
32
|
end
|
@@ -91,11 +95,11 @@ When /^I attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
|
|
91
95
|
end
|
92
96
|
|
93
97
|
Then /^I should see "([^\"]*)"$/ do |text|
|
94
|
-
|
98
|
+
expect(page.body).to have_content(text)
|
95
99
|
end
|
96
100
|
|
97
101
|
Then /^I should not see "([^\"]*)"$/ do |text|
|
98
|
-
|
102
|
+
expect(page.body).not_to have_content(text)
|
99
103
|
end
|
100
104
|
|
101
105
|
Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
|
@@ -111,5 +115,5 @@ Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
|
|
111
115
|
end
|
112
116
|
|
113
117
|
Then /^I should be on (.+)$/ do |page_name|
|
114
|
-
URI.parse(current_url).path.should == path_to(page_name)
|
118
|
+
URI.parse(current_url).path.should == path_to(page_name,news)
|
115
119
|
end
|
@@ -4,7 +4,41 @@
|
|
4
4
|
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
|
5
5
|
# files.
|
6
6
|
|
7
|
+
require 'simplecov'
|
8
|
+
pwd = File.expand_path( File.dirname(__FILE__) )
|
9
|
+
SimpleCov.root(File.join(pwd,'..','..','..','..'))
|
10
|
+
SimpleCov.command_name 'cucumber-' + ENV['DBADAPTER'].to_s
|
11
|
+
SimpleCov.start('rails') do
|
12
|
+
adapters.delete(:root_filter)
|
13
|
+
add_filter do |src|
|
14
|
+
!(src.filename =~ /^#{SimpleCov.root}/)
|
15
|
+
end
|
16
|
+
add_filter do |src|
|
17
|
+
src.filename =~ /test_app/
|
18
|
+
end
|
19
|
+
end
|
7
20
|
require 'cucumber/rails'
|
21
|
+
require 'factory_girl_rails'
|
22
|
+
|
23
|
+
require 'capybara/poltergeist'
|
24
|
+
require 'capybara/rspec'
|
25
|
+
require 'capybara/rails'
|
26
|
+
require File.join(pwd,'..','..',"lib","debugging")
|
27
|
+
#require 'rack_session_access/capybara'
|
28
|
+
Capybara.server_port = Newsletter.site_url.split(/:/).last
|
29
|
+
Capybara.app_host = Newsletter.site_url
|
30
|
+
|
31
|
+
Capybara.default_driver = :rack_test
|
32
|
+
Capybara.register_driver :poltergeist do |app|
|
33
|
+
options = {
|
34
|
+
inspector: 'open',
|
35
|
+
debug: false,
|
36
|
+
phantomjs_options: ['--load-images=no', '--ignore-ssl-errors=yes'],
|
37
|
+
js_errors: false
|
38
|
+
}
|
39
|
+
Capybara::Poltergeist::Driver.new(app, options)
|
40
|
+
end
|
41
|
+
Capybara.javascript_driver = :poltergeist
|
8
42
|
|
9
43
|
# Capybara defaults to CSS3 selectors rather than XPath.
|
10
44
|
# If you'd prefer to use XPath, just uncomment this line and adjust any
|
@@ -27,6 +61,8 @@ require 'cucumber/rails'
|
|
27
61
|
# recommended as it will mask a lot of errors for you!
|
28
62
|
#
|
29
63
|
ActionController::Base.allow_rescue = false
|
64
|
+
DatabaseCleaner.strategy = :truncation
|
65
|
+
DatabaseCleaner.clean
|
30
66
|
|
31
67
|
# Remove/comment out the lines below if your app doesn't have a database.
|
32
68
|
# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
|
@@ -5,7 +5,7 @@ module NavigationHelpers
|
|
5
5
|
#
|
6
6
|
# step definition in webrat_steps.rb
|
7
7
|
#
|
8
|
-
def path_to(page_name)
|
8
|
+
def path_to(page_name, routing=nil)
|
9
9
|
case page_name
|
10
10
|
|
11
11
|
when /the homepage/
|
@@ -16,7 +16,16 @@ module NavigationHelpers
|
|
16
16
|
#
|
17
17
|
# when /^(.*)'s profile page$/i
|
18
18
|
# user_profile_path(User.find_by_login($1))
|
19
|
+
# added by script/generate pickle path
|
20
|
+
when /the newsletter archive page/
|
21
|
+
"/newsletters/archive"
|
22
|
+
when /newsletter named "([^"]+)"'s new piece page$/
|
23
|
+
newsletter_name = $1
|
24
|
+
newsletter = Newsletter::Newsletter.where(name: newsletter_name).first
|
25
|
+
"/newsletter/newsletters/#{newsletter.id}/pieces/new"
|
19
26
|
|
27
|
+
when /^the (.+?) page$/ # translate to named route
|
28
|
+
routing.send("#{$1.downcase.gsub(' ','_')}_path")
|
20
29
|
else
|
21
30
|
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
|
22
31
|
"Now, go and add a mapping in #{__FILE__}"
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module ::Debugging
|
2
|
+
def self.with_pry_remote(timeout=5.minutes)
|
3
|
+
return unless block_given?
|
4
|
+
begin
|
5
|
+
yield
|
6
|
+
rescue StandardError, MiniTest::Assertion, Exception, RuntimeError => e
|
7
|
+
begin
|
8
|
+
Debugging::send_developer_im('chauboldt@bender.lnstar.com', "Error running test - #{e.message}: #{e.backtrace.join("\n")[0..80]} on #{`hostname`.strip} from #{`pwd`}")
|
9
|
+
Timeout::timeout(timeout) do
|
10
|
+
binding.pry_remote
|
11
|
+
end
|
12
|
+
rescue Exception, StandardError, RuntimeError => te
|
13
|
+
Rails.logger.warn "Uncaught/Unpried exception: #{te.message} #{te.backtrace.join("\n")}"
|
14
|
+
raise e
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.send_developer_im(recipient='chauboldt@bender.lnstar.com', message)
|
20
|
+
# include Jabber # Makes using it a bit easier as we don't need to prepend Jabber:: to everything
|
21
|
+
# def send_xmpp_message(recipient, message)
|
22
|
+
# (recipient,message) = ARGV
|
23
|
+
|
24
|
+
#Account info
|
25
|
+
account = 'nagios@bender.lnstar.com'
|
26
|
+
password = '10dole01'
|
27
|
+
|
28
|
+
|
29
|
+
# Jabber::debug = true # Uncomment this if you want to see what's being sent and received!
|
30
|
+
jid = Jabber::JID::new(account)
|
31
|
+
client = Jabber::Client::new(jid)
|
32
|
+
client.connect
|
33
|
+
client.auth(password)
|
34
|
+
client.send(Jabber::Message::new(recipient,message))
|
35
|
+
# end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.wait_until(timeout=nil, log=false)
|
39
|
+
timeout ||= ((Capybara.default_wait_time + 3) rescue 10.seconds)
|
40
|
+
require "timeout"
|
41
|
+
Timeout.timeout(timeout) do
|
42
|
+
Rails.logger.warn "Waiting for something.. timeout: #{timeout}" if log
|
43
|
+
sleep(0.1) until value = yield
|
44
|
+
value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.wait_until_success(timeout=nil, log=false)
|
49
|
+
timeout ||= ((Capybara.default_wait_time + 3) rescue 10.seconds)
|
50
|
+
wait_until(timeout) do
|
51
|
+
begin
|
52
|
+
Rails.logger.warn "Waiting for something.. trying: #{Kernel.caller[0..5].join("\n")}" if log
|
53
|
+
yield
|
54
|
+
true
|
55
|
+
rescue => e
|
56
|
+
Rails.logger.warn "Waiting for something.. failure: #{e.message} #{e.backtrace.join}"
|
57
|
+
false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
export RAILS_ENV=test
|
2
|
+
# RUN FOR SQLITE
|
3
|
+
cp config/database.sqlite.yml config/database.yml
|
4
|
+
|
5
|
+
bundle exec rake db:schema:load
|
6
|
+
|
7
|
+
export SQLITE_SUCCESS=0
|
8
|
+
export CUC_SQLITE_SUCCESS=0
|
9
|
+
|
10
|
+
DBADAPTER=sqlite bundle exec rspec spec && export SQLITE_SUCCESS=1
|
11
|
+
DBADAPTER=sqlite bundle exec cucumber features && export CUC_SQLITE_SUCCESS=1
|
12
|
+
|
13
|
+
if [ $POSTGRES -eq 1 ]; then
|
14
|
+
#RUN FOR Postgresql
|
15
|
+
cp config/database.postgres.local.yml config/database.yml
|
16
|
+
|
17
|
+
bundle exec rake db:schema:load
|
18
|
+
|
19
|
+
export PGSQL_SUCCESS=0
|
20
|
+
export CUCPGSQL_SUCCESS=0
|
21
|
+
|
22
|
+
DBADAPTER=pg bundle exec rspec spec && export PGSQL_SUCCESS=1
|
23
|
+
DBADAPTER=pg bundle exec cucumber features && export CUC_PGSQL_SUCCESS=1
|
24
|
+
fi
|
25
|
+
|
26
|
+
#RUN FOR MYSQL
|
27
|
+
cp config/database.mysql.local.yml config/database.yml
|
28
|
+
|
29
|
+
bundle exec rake db:schema:load
|
30
|
+
|
31
|
+
export MYSQL_SUCCESS=0
|
32
|
+
export CUCMYSQL_SUCCESS=0
|
33
|
+
|
34
|
+
DBADAPTER=mysql bundle exec rspec spec && export MYSQL_SUCCESS=1
|
35
|
+
DBADAPTER=mysql bundle exec cucumber features && export CUC_MYSQL_SUCCESS=1
|
36
|
+
|
37
|
+
unset RAILS_ENV
|
38
|
+
|
39
|
+
if [ $MYSQL_SUCCESS -eq 0 ] ; then echo "Rspec Mysql Failed" && exit 1; fi
|
40
|
+
if [ $PGSQL_SUCCESS -eq 0 ] ; then echo "Rspec Pgsql Failed" && exit 1; fi
|
41
|
+
if [ $SQLITE_SUCCESS -eq 0 ] ; then echo "Rspec SQLite Failed" && exit 1; fi
|
42
|
+
if [ $CUC_MYSQL_SUCCESS -eq 0 ] ; then echo "Cucumber Mysql Failed" && exit 1; fi
|
43
|
+
if [ $CUC_PGSQL_SUCCESS -eq 0 ] ; then echo "Cucumber Pgsql Failed" && exit 1; fi
|
44
|
+
if [ $CUC_SQLITE_SUCCESS -eq 0 ] ; then echo "Cucumber SQLite Failed" && exit 1; fi
|
@@ -0,0 +1,26 @@
|
|
1
|
+
export RAILS_ENV=test
|
2
|
+
|
3
|
+
# RUN FOR SQLITE
|
4
|
+
|
5
|
+
cp config/database.sqlite.yml config/database.yml
|
6
|
+
|
7
|
+
rm db/test.sqlite3
|
8
|
+
spring rake db:schema:load
|
9
|
+
|
10
|
+
export SQLITE_SUCCESS=0
|
11
|
+
|
12
|
+
DBADAPTER=sqlite bundle exec rspec spec && export SQLITE_SUCCESS=1
|
13
|
+
|
14
|
+
#RUN FOR MYSQL
|
15
|
+
cp config/database.local.yml config/database.yml
|
16
|
+
|
17
|
+
mysqladmin -f drop newsletter_test
|
18
|
+
mysqladmin -f create newsletter_test
|
19
|
+
spring rake db:schema:load
|
20
|
+
|
21
|
+
export MYSQL_SUCCESS=0
|
22
|
+
|
23
|
+
DBADAPTER=mysql bundle exec rspec spec && export MYSQL_SUCCESS=1
|
24
|
+
|
25
|
+
if [ $MYSQL_SUCCESS -eq 0 ] ; then exit 1; fi
|
26
|
+
if [ $SQLITE_SUCCESS -eq 0 ] ; then exit 1; fi
|